콘텐츠로 이동

하이브리드 검색

처음이라면 세션을 넘나드는 기억 튜토리얼로 기본 검색 흐름을 먼저 경험해보세요.

memtomem의 하이브리드 검색은 키워드 검색과 시맨틱 검색을 결합하여, 정확한 용어 매칭과 의미 기반 유사도를 동시에 활용합니다.

키워드 검색은 mem_search, FastAPI 같은 고유 명칭을 정확히 찾아냅니다. 이러한 용어는 임베딩 공간에 의미가 분산되어 있지 않아 벡터 모델이 놓치기 쉽습니다. 반대로 시맨틱 검색은 “배포 방법”처럼 표현이 다른 문서까지 의미로 연결할 수 있습니다. 두 방식을 병렬 실행한 뒤 순위를 결합하면 양쪽 사례를 모두 포괄할 수 있습니다.

하이브리드 검색은 세 가지 검색 엔진을 병렬로 실행합니다:

검색 엔진기반강점
BM25SQLite 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.oversampleMEMTOMEM_RERANK__OVERSAMPLE2.0response_top_k 대비 풀 배수
rerank.min_poolMEMTOMEM_RERANK__MIN_POOL20하한선 — 리랭커가 받는 후보 수의 최소값
rerank.max_poolMEMTOMEM_RERANK__MAX_POOL200상한선 — 큰 top_k에서 비용 폭주 방지

런타임 튜닝은 mm config set rerank.oversample 3.0 같은 방식으로 가능합니다. rerank.top_k는 deprecated이며 min_pool로 대체하세요.

인덱싱 시 지원되는 문서를 구조 기반 의미 단위로 분할한 뒤 짧은 섹션 병합 단계를 실행합니다.

청커대상동작
Markdown.md 파일헤딩 레벨 기준 분할, 계층 구조 보존
구조화 데이터.json, .yaml, .yml, .toml 파일최상위 키 기준 분할, 설정으로 recursive 모드 사용 가능
코드.py, .js, .ts, .tsx, .jsx 파일code chunking extra 설치 시 함수 / 클래스 인식 분할

과도하게 짧은 섹션은 indexing.target_chunk_tokens(기본값 384) 한도 안에서 인접 형제 노드와 결합됩니다. 각 청크가 검색 대상으로 의미를 갖도록 유지하기 위한 동작입니다. target_chunk_tokens=0으로 설정하면 해당 결합 단계가 비활성화되며, 모든 소형 섹션이 독립 청크로 유지됩니다.

디렉터리 인덱싱은 확장자로 필터링됩니다. 활성 registry가 청킹하지 않는 파일 형식은 일반 텍스트로 강제 인덱싱되지 않고 건너뜁니다.

전체 재인덱싱 대신, 변경된 부분만 갱신합니다:

  1. 각 청크의 SHA-256 해시를 저장
  2. 재인덱싱 시 해시 비교로 변경분만 탐지
  3. 변경된 청크만 재임베딩하여 인덱스 업데이트

대규모 문서셋에서도 인덱싱 비용을 최소화합니다.

기억을 스코프별로 구분하여 관리합니다:

  • 폴더 이름에서 네임스페이스 자동 유도
  • 검색 시 특정 네임스페이스 필터링 가능
  • 멀티 에이전트 환경에서 에이전트별 격리와 공유 지원
  • 유사 중복 탐지 — 내용이 거의 같은 기억 자동 식별
  • 시간 기반 감쇠 — 오래된 기억의 검색 가중치 점진적 감소
  • TTL 만료 — 설정된 기간이 지난 기억 자동 삭제
  • 자동 태깅 — 콘텐츠 분석을 통한 태그 자동 부여