21P by neo 1달전 | favorite | 댓글 1개
  • SQLite의 기본 전체 텍스트 검색(FTS5) 확장과 sqlite-vec 시맨틱 검색과 함께 사용하여 애플리케이션에서 '하이브리드 검색'을 만들 수 있음
    • 키워드 우선, 'semantic'에 의한 순위 재조정, 상호 순위 융합과 같은 다양한 방법을 사용하여 결과를 결합 가능
    • 무엇보다도 모든 것이 SQLite에 포함되어 있기 때문에 실험과 프로토타입을 저렴하고 쉽게 만들 수 있으며 외부 서비스가 필요하지 않음
  • sqlite-vec 및 다른 벡터 검색 도구의 주요 사용 사례는 텍스트 데이터에 "의미론적 검색"을 제공하는 것
    • 전문 검색(키워드 검색)만으로는 항상 좋은 결과를 제공하지 않음
      • "climate change" 를 검색했을 때, "global warming" 같은 문서를 리턴하지 않음
      • 시맨틱 검색을 사용하면 '분위기'로 결과를 조회하여 더 많은 의미가 담긴 풍부한 결과를 반환할 수 있음
    • 하지만 "의미론적 검색"만 사용하면 애플리케이션에 해로울 수 있음

데모: NBC 뉴스 헤드라인

  • 2024년 1월부터 8월까지 14,500개 이상의 헤드라인이 포함된 데이터셋 사용
  • 총 4.3MB의 텍스트 데이터로 매우 작은 데이터셋

FTS5 테이블 생성하기

  • fts_headlines 전문 검색 가상 테이블 생성
  • headline 열 선언
  • content=content_rowid= 옵션 구성
  • 기본 articles 테이블에서 직접 INSERT INTO
  • FTS5 테이블 쿼리하려면 단일 SELECT 문만 필요

sqlite-vec로 벡터 검색 구축하기

  • sqlite-vec은 벡터 저장 및 벡터 비교를 제공하지만 임베딩을 생성하지는 않음
  • 이 예제에서는 sqlite-lembed 확장과 Snowflake Artic Embed 1.5 모델 사용
  • 텍스트를 lembed()로 임베딩하고 vec0 가상 테이블에 저장
  • KNN 쿼리하려면 단일 SELECT 문만 필요

하이브리드 접근법 1: "키워드 우선"

  • 전문 검색 결과를 먼저 반환한 다음 나머지를 벡터 검색으로 보강
  • CTE로 구현할 수 있음
  • 결과를 UNION ALL로 결합

하이브리드 접근법 2: 상호 순위 융합(RRF)

  • FTS5와 벡터 매치인 결과에 순위 부여
  • 단일 SELECT 쿼리와 CTE로 구현 가능
  • :weight_fts 또는 :weight_vec를 변경하여 FTS5/벡터 결과를 다르게 순위 매기기 가능

하이브리드 접근법 3: 의미에 따라 재순위 매기기

  • FTS5 검색만 수행하지만 벡터 거리에 따라 결과 재정렬
  • 키워드 일치 결과만 얻지만 더 나은 의미적 일치가 상단으로 이동
  • BM25의 단점 해결에 도움

어떤 접근 방식을 선택해야 하나요?

  • 애플리케이션과 사용 사례에 따라 다름
  • 이메일 받은편지함에 검색 엔진 구축 시 키워드 우선 순위가 더 적합
  • 내부 회사 문서에 RAG 구축 시 RRF가 좋은 옵션
  • 웹앱에 "중복 게시물" 기능 구축 시 의미에 따라 재순위 매기기가 잘 작동

향후 개선 사항

  • FTS5 쿼리는 "강조"로 문서에서 일치하는 부분을 표시할 수 있지만 sqlite-vec은 쿼리 벡터와 문서 간 L2/코사인 거리만 반환
  • FTS5 쿼리에는 구문, NEAR 쿼리 및 부울 연산자와 같은 다른 기능이 있지만 벡터 검색 시 이를 사용하면 어색함
  • FTS5 + sqlite-vec로 하이브리드 검색을 확장하는 것이 어색할 수 있음
  • FTS5 테이블은 매번 전체 데이터 세트에서 전체 검색을 수행하여 메타데이터 필터링이나 단일 FTS5 인덱스 지원 불가
  • sqlite-vec도 마찬가지지만 파티셔닝 및 메타데이터 필터링에 대한 지원이 곧 제공될 예정

GN⁺의 의견

  • SQLite를 사용한 하이브리드 검색은 실험과 프로토타이핑이 쉬워 다양한 애플리케이션에서 유용할 것으로 보임. 데이터가 단일 파일에 저장되고, 여러 쿼리를 단일 SELECT 문으로 테스트할 수 있으며, 비용이 들지 않고 모든 프로그래밍 언어에서 작동하며 몇 줄의 코드로 쉽게 구현할 수 있다는 점이 장점
  • 다만 FTS5와 sqlite-vec 간에는 아직 개선할 부분이 있음. FTS5는 문서에서 일치하는 부분을 강조할 수 있지만 sqlite-vec은 쿼리 벡터와 문서 사이의 거리만 반환함. 또한 FTS5의 고급 기능 사용 시 벡터 검색과 조합하는 게 어색할 수 있음
  • 이런 제한사항에도 불구하고, SQLite를 사용한 하이브리드 검색은 데이터 크기와 애플리케이션 종류에 관계없이 키워드 검색과 의미론적 검색의 장점을 모두 활용할 수 있는 강력한 솔루션임
  • 비정형 데이터에서 정보를 추출하고 검색 가능한 형태로 만드는 것이 점점 더 중요해지는 상황에서, FTS5 같은 키워드 검색과 sqlite-vec 같은 벡터 검색을 결합하면 키워드 일치와 문맥적 관련성을 모두 고려한 정교한 검색이 가능해짐
  • 기존 검색 시스템에서 sqlite-vec를 추가하거나, 새로운 검색 애플리케이션 개발 시 SQLite 기반의 하이브리드 검색을 고려해볼 만함. 특히 임베딩 모델 자체를 커스터마이징할 수 있다는 점이 큰 장점

프로젝트에서 sqlite에 100만건(+)의 자료를 넣고 가공 하는 작업을 수행했습니다.

데이터 양이 많다면 좋은 SSD가 필요하다고 생각됩니다. (SATA SSD를 사용했기 때문에 처리시간이 좀 늘어났다는 생각이 들더군요)