- 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 기반의 하이브리드 검색을 고려해볼 만함. 특히 임베딩 모델 자체를 커스터마이징할 수 있다는 점이 큰 장점