하이브리드 검색
처음이라면 세션을 넘나드는 기억 튜토리얼로 기본 검색 흐름을 먼저 경험해보세요.
memtomem의 하이브리드 검색은 키워드 검색과 시맨틱 검색을 결합하여, 정확한 용어 매칭과 의미 기반 유사도를 동시에 활용합니다.
왜 두 방식을 함께 사용하는가?
섹션 제목: “왜 두 방식을 함께 사용하는가?”키워드 검색은 mem_search, FastAPI 같은 고유 명칭을 정확히 찾아냅니다. 이러한 용어는 임베딩 공간에 의미가 분산되어 있지 않아 벡터 모델이 놓치기 쉽습니다. 반대로 시맨틱 검색은 “배포 방법”처럼 표현이 다른 문서까지 의미로 연결할 수 있습니다. 두 방식을 병렬 실행한 뒤 순위를 결합하면 양쪽 사례를 모두 포괄할 수 있습니다.
검색 아키텍처
섹션 제목: “검색 아키텍처”하이브리드 검색은 세 가지 검색 엔진을 병렬로 실행합니다:
| 검색 엔진 | 기반 | 강점 |
|---|---|---|
| BM25 | SQLite FTS5 | 정확한 키워드/용어 매칭. “FastAPI”, “mem_search” 같은 고유 명칭에 강함 |
| 벡터 검색 | sqlite-vec + ONNX/Ollama/OpenAI 임베딩 | 의미적 유사도. “배포 방법” → “deployment checklist” 매칭 가능 |
| RRF 융합 | Reciprocal Rank Fusion | 두 검색 결과의 순위를 결합하여 최종 랭킹 산출 |
리랭커 풀 튜닝
섹션 제목: “리랭커 풀 튜닝”검색 결과를 관련도 순으로 다시 정렬해 정확도를 높이는 재정렬(리랭커) 단계의 고급 설정입니다. 기본값으로도 잘 동작하니, 결과 품질을 세밀하게 조정하고 싶을 때만 보면 됩니다.
재정렬을 켜면 후보 풀 크기는 max(min_pool, min(max_pool, int(oversample * response_top_k)))로 계산됩니다. 기본값(oversample 2.0, min_pool 20, max_pool 200)은 top_k=10에서 후보를 넉넉히 2배로 뽑고(풀 20), 더 큰 top_k 요청에서는 자연스럽게 늘어납니다.
| 키 | 환경 변수 | 기본값 | 비고 |
|---|---|---|---|
rerank.oversample | MEMTOMEM_RERANK__OVERSAMPLE | 2.0 | response_top_k 대비 풀 배수 |
rerank.min_pool | MEMTOMEM_RERANK__MIN_POOL | 20 | 하한선 — 리랭커가 받는 후보 수의 최소값 |
rerank.max_pool | MEMTOMEM_RERANK__MAX_POOL | 200 | 상한선 — 큰 top_k에서 비용 폭주 방지 |
런타임 튜닝은 mm config set rerank.oversample 3.0 같은 방식으로 가능합니다. 리랭커 모델 선택 등 나머지 rerank.* 키는 설정 레퍼런스에서 다룹니다.
시맨틱 청킹
섹션 제목: “시맨틱 청킹”인덱싱 시 지원되는 문서를 구조 기반 의미 단위로 분할한 뒤 짧은 섹션 병합 단계를 실행합니다.
| 청커 | 대상 | 동작 |
|---|---|---|
| Markdown | .md 파일 | 헤딩 레벨 기준 분할, 계층 구조 보존 |
| 구조화 데이터 | .json, .yaml, .yml, .toml 파일 | 최상위 키 기준 분할, 설정에서 recursive(재귀) 모드 사용 가능 |
| 코드 | .py, .js, .ts, .tsx, .jsx 파일 | 코드 청킹 확장(code) 설치 시 함수·클래스 단위로 분할 |
과도하게 짧은 섹션은 indexing.target_chunk_tokens(기본값 384) 한도 안에서 인접 형제 노드와 결합됩니다. 각 청크가 검색 대상으로 의미를 갖도록 유지하기 위한 동작입니다. target_chunk_tokens=0으로 설정하면 해당 결합 단계가 비활성화되며, 모든 소형 섹션이 독립 청크로 유지됩니다.
디렉터리 인덱싱은 확장자로 걸러집니다. 청킹 대상이 아닌 파일 형식은 일반 텍스트로 억지로 인덱싱하지 않고 건너뜁니다.
증분 인덱싱
섹션 제목: “증분 인덱싱”전체 재인덱싱 대신, 변경된 부분만 갱신합니다:
- 각 청크의 SHA-256 해시를 저장
- 재인덱싱 시 해시 비교로 변경분만 탐지
- 변경된 청크만 재임베딩하여 인덱스 업데이트
대규모 문서셋에서도 인덱싱 비용을 최소화합니다.
검색 범위와 유지보수
섹션 제목: “검색 범위와 유지보수”검색은 네임스페이스 단위로 범위를 좁힐 수 있습니다. 폴더 이름에서 네임스페이스가 자동 유도되며, 검색 시 특정 네임스페이스로 필터링하거나 에이전트별로 격리·공유할 수 있습니다. 자세한 내용은 멀티 에이전트를 참고합니다.
검색 품질에 영향을 주는 유지보수 동작 — 유사 중복 탐지, 시간 기반 감쇠, TTL 만료, 자동 태깅 — 은 설정 레퍼런스에서 환경 변수와 함께 설명합니다.
Retrieval benchmark v2
섹션 제목: “Retrieval benchmark v2”현재 holdout(평가 전용으로 분리해 둔 데이터셋)은 쿼리별 정답 문서 레이블(qrel)과 고정된 corpus/query 해시를 사용해 영문·한글·교차 언어 트랙의 이중 언어 쿼리 120개를 평가합니다. 기존 48개 파일·192개 청크· 100개 쿼리 회귀 포트폴리오를 대체하지 않고 보완합니다.
k 값을 단계별로 바꿔 가며 한 번 측정한 실험(staged k-sweep)에서는 제품
기본값 top_k=10, BM25/dense 후보 50/50, 결과 병합 계수 rrf_k=60,
재정렬(reranker) 비활성 상태를 유지했습니다. top_k=5에서 후보 폭 100은
후속 검증 후보일 뿐이며, 기본값을 바꾸기 전에 5회·10회 반복 검증이
필요합니다.