콘텐츠로 이동

하이브리드 검색

처음이라면 세션을 넘나드는 기억에서 기억을 저장하고 다시 찾는 과정부터 확인하세요.

memtomem은 키워드 검색과 의미 기반 검색을 함께 사용합니다. 정확한 용어와 뜻이 비슷한 표현을 모두 찾을 수 있습니다.

키워드 검색은 mem_search, FastAPI 같은 고유 명칭을 정확히 찾습니다. 벡터 모델은 이런 짧은 이름을 놓칠 수 있습니다. 반대로 의미 기반 검색은 “배포 방법”과 “deployment checklist”처럼 표현이 달라도 뜻이 비슷한 문서를 찾습니다. 두 결과의 순위를 합치면 각 방식의 장점을 함께 활용할 수 있습니다.

하이브리드 검색은 다음 세 단계를 함께 실행합니다.

검색 엔진기반강점
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이면 후보 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.* 설정은 설정 레퍼런스를 참고하세요.

색인할 때 문서 구조에 맞춰 내용을 나누고, 너무 짧은 섹션은 서로 합칩니다.

청커대상동작
Markdown.md 파일헤딩 레벨 기준 분할, 계층 구조 보존
구조화 데이터.json, .yaml, .yml, .toml 파일최상위 키 기준 분할, 설정에서 recursive(재귀) 모드 사용 가능
코드.py, .js, .ts, .tsx, .jsx 파일코드 청킹 확장(code) 설치 시 함수·클래스 단위로 분할

너무 짧은 섹션은 indexing.target_chunk_tokens(기본값 384) 범위 안에서 같은 수준의 인접 섹션과 합칩니다. 각 청크가 검색 결과로서 충분한 내용을 갖게 하기 위한 동작입니다. target_chunk_tokens=0으로 설정하면 합치지 않고 모든 짧은 섹션을 별도 청크로 유지합니다.

디렉터리 인덱싱은 확장자로 걸러집니다. 청킹 대상이 아닌 파일 형식은 일반 텍스트로 억지로 인덱싱하지 않고 건너뜁니다.

전체를 다시 색인하지 않고 바뀐 부분만 갱신합니다.

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

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

네임스페이스를 지정하면 검색 범위를 좁힐 수 있습니다. 폴더 이름으로 네임스페이스를 정하는 기능은 기본적으로 꺼져 있습니다(namespace.enable_auto_ns=false). 네임스페이스나 경로 규칙을 직접 지정하거나 이 기능을 켜야 합니다. AI 도구 전용 네임스페이스는 범위를 지정하지 않은 기본 검색에서 제외됩니다. 자세한 내용은 멀티 에이전트를 참고하세요.

구조화 검색 응답은 현재 score_scale(rrf, bm25, dense, none, rerank)을 표시합니다. 서로 다른 척도에 하나의 고정 임계값을 적용하면 안 되며, STM 같은 클라이언트는 이 메타데이터로 척도별 필터를 적용하거나 일시 중지합니다.

유사한 중복 찾기, 오래된 결과의 점수 낮추기, TTL 만료, 자동 태깅 설정은 설정 레퍼런스에서 확인할 수 있습니다.

현재 평가용 데이터셋(holdout)은 검색어별 정답 문서 표시(qrel)와 고정된 문서·검색어 해시를 사용합니다. 영어·한국어·교차 언어 검색어 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회 반복 측정이 필요합니다.