하이브리드 검색
처음이라면 세션을 넘나드는 기억에서 기억을 저장하고 다시 찾는 과정부터 확인하세요.
memtomem은 키워드 검색과 의미 기반 검색을 함께 사용합니다. 정확한 용어와 뜻이 비슷한 표현을 모두 찾을 수 있습니다.
왜 두 방식을 함께 사용하는가?
섹션 제목: “왜 두 방식을 함께 사용하는가?”키워드 검색은 mem_search, FastAPI 같은 고유 명칭을 정확히 찾습니다. 벡터 모델은 이런 짧은 이름을 놓칠 수 있습니다. 반대로 의미 기반 검색은 “배포 방법”과 “deployment checklist”처럼 표현이 달라도 뜻이 비슷한 문서를 찾습니다. 두 결과의 순위를 합치면 각 방식의 장점을 함께 활용할 수 있습니다.
검색 아키텍처
섹션 제목: “검색 아키텍처”하이브리드 검색은 다음 세 단계를 함께 실행합니다.
| 검색 엔진 | 기반 | 강점 |
|---|---|---|
| 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이면 후보 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 해시를 저장
- 재인덱싱 시 해시 비교로 변경분만 탐지
- 변경된 청크만 재임베딩하여 인덱스 업데이트
대규모 문서셋에서도 인덱싱 비용을 최소화합니다.
검색 범위와 유지보수
섹션 제목: “검색 범위와 유지보수”네임스페이스를 지정하면 검색 범위를 좁힐 수 있습니다. 폴더 이름으로 네임스페이스를 정하는 기능은 기본적으로 꺼져 있습니다(namespace.enable_auto_ns=false). 네임스페이스나 경로 규칙을 직접 지정하거나 이 기능을 켜야 합니다. AI 도구 전용 네임스페이스는 범위를 지정하지 않은 기본 검색에서 제외됩니다. 자세한 내용은 멀티 에이전트를 참고하세요.
구조화 검색 응답은 현재 score_scale(rrf, bm25, dense, none, rerank)을 표시합니다. 서로 다른 척도에 하나의 고정 임계값을 적용하면 안 되며, STM 같은 클라이언트는 이 메타데이터로 척도별 필터를 적용하거나 일시 중지합니다.
유사한 중복 찾기, 오래된 결과의 점수 낮추기, TTL 만료, 자동 태깅 설정은 설정 레퍼런스에서 확인할 수 있습니다.
검색 벤치마크 v2
섹션 제목: “검색 벤치마크 v2”현재 평가용 데이터셋(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회 반복 측정이
필요합니다.