# SQLite로 전문검색과 벡터검색의 하이브리드 구현하기

> Clean Markdown view of GeekNews topic #17405. Use the original source for factual precision when an external source URL is present.

## Metadata

- GeekNews HTML: [https://news.hada.io/topic?id=17405](https://news.hada.io/topic?id=17405)
- GeekNews Markdown: [https://news.hada.io/topic/17405.md](https://news.hada.io/topic/17405.md)
- Type: GN+
- Author: [neo](https://news.hada.io/@neo)
- Published: 2024-10-25T09:14:53+09:00
- Updated: 2024-10-25T09:14:53+09:00
- Original source: [alexgarcia.xyz](https://alexgarcia.xyz/blog/2024/sqlite-vec-hybrid-search/index.html)
- Points: 21
- Comments: 1

## Summary

SQLite를 활용한 전문검색 + 벡터검색 형태의 하이브리드 검색은 키워드 검색과 의미론적 검색을 결합하여 더 풍부하고 의미 있는 검색 결과를 제공할 수 있습니다. 외부 서비스 없이도 저렴하고 쉽게 실험과 프로토타입을 만들 수 있으며, 다양한 애플리케이션에서 유용하게 활용될 수 있습니다. 또한, 데이터 크기와 관계없이 강력한 검색 솔루션을 제공하여 기존 검색 시스템을 개선하거나 새로운 검색 애플리케이션 개발 시 고려할 만한 가치가 있습니다.

## Topic Body

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

## Comments



### Comment 30430

- Author: halfenif
- Created: 2024-10-27T07:46:36+09:00
- Points: 1

프로젝트에서 sqlite에 100만건(+)의 자료를 넣고 가공 하는 작업을 수행했습니다.  
  
데이터 양이 많다면 좋은 SSD가 필요하다고 생각됩니다. (SATA SSD를 사용했기 때문에 처리시간이 좀 늘어났다는 생각이 들더군요)
