로컬 우선 멀티홉 RAG: Chroma + 엔티티 그래프, 쿼리당 토큰 소모 0개
요약
Chroma와 엔티티 그래프를 결합하여 LLM 없이도 멀티홉 질문을 해결하는 로컬 우선 RAG 라이브러리 hubmesh를 소개합니다. spaCy NER과 Personalized PageRank를 활용해 토큰 비용 없이 빠르고 결정론적인 검색 성능을 제공합니다.
핵심 포인트
- LLM 없이 spaCy NER과 그래프 알고리즘으로 멀티홉 검색 구현
- 쿼리당 토큰 소모가 0이며 실행 시마다 동일한 결과를 보장
- Personalized PageRank와 코사인 유사도를 결합한 점수 산정 방식
- HotpotQA 및 MuSiQue 벤치마크에서 기존 방식 대비 높은 성능 입증
Chroma의 강점은 로컬 우선(local-first) 방식에 있습니다. 인프라 구축의 번거로움 없이 자신의 기기에서 문서를 임베딩(embed)하고 쿼리할 수 있습니다. 하지만 로컬 우선 RAG는 멀티홉(multi-hop) 질문에서 한계에 부딪힙니다.
"Polar Metrics를 인수한 회사의 창업자가 다녔던 대학교는 어디인가요?"
답변이 포함된 구절은 질문과 어휘가 거의 겹치지 않습니다. 질문은 인수, 창업자, 전기(biography)를 통해 답변과 연결되어 있지만, 유사도 검색(similarity search)은 이러한 연결 고리를 따라가지 못합니다. 일반적인 해결책은 검색 루프에 LLM을 넣어 질문을 분해하는 것이지만, 이는 로컬 우선 방식의 매력을 정확히 저해합니다. 이제 모든 쿼리마다 토큰 비용이 발생하고, 시간이 소요되며, 실행할 때마다 결과가 달라지게 됩니다.
hubmesh는 다른 길을 택합니다. 검색을 순수한 수학으로 유지하는 것입니다. 인덱싱(index) 시점에 spaCy NER(LLM 미사용, 토큰 미사용)을 사용하여 코퍼스(corpus)로부터 엔티티-문서 그래프(entity–document graph)를 구축합니다. 쿼리 시점에는 질문의 엔티티들을 기반으로 해당 그래프 위에서 개인화된 페이지랭크(Personalized PageRank)를 실행하고, 그 결과를 Chroma의 코사인 유사도(cosine scores)와 결합합니다. 전체 쿼리 경로는 numpy와 scipy로 이루어져 있어, 3만 개의 문서 코퍼스에서 오프라인으로 약 100ms 내에 실행되며, 실행 시마다 결과가 비트 단위로 동일(bit-identical)합니다. 이는 LLM 루프 기반의 검색기가 어떤 대가를 치르더라도 제공할 수 없는 세 가지 특성입니다.
설정 (Setup)
pip install "hubmesh[chroma,kg]"
python -m spacy download en_core_web_sm
인덱싱 (Index)
from hubmesh import Planner
from hubmesh.adapters import ChromaStore
from hubmesh.kg import build_entity_kg
...
쿼리 (Query)
result = planner.retrieve("Which university did the founder of the "
"company that acquired Polar Metrics study at?",
top_k=10)
...
작동 원리: 단순한 근접성이 아닌 교집합
점수 산정 복합체(scoring composite)는 세 부분으로 구성됩니다 — 코사인 유사도(cosine relevance), PPR 확산(PPR diffusion), 그리고 각 질문 엔티티(question entity)로부터의 확산을 개별적으로 기하 평균(geometric mean)하여 각 문서를 점수화하는 수렴(convergence) 항입니다. 멀티홉(multi-hop) 답변은 질문의 앵커(anchors)들이 교차하는 지점에 위치하며, 풀링된 유사도(pooled similarity)는 합집합을 계산합니다. 교차 지점이 바로 브릿지 문서(bridge documents)가 존재하는 곳입니다. (수식의 계보는 네트워크 토폴로지 논문인 NNSI, ICOMP'25에서 유래했습니다 — 동일한 아이디어이며, 그래프만 다릅니다.)
수치 (Numbers)
전체 HotpotQA dev 세트 (7,405개 질문): supporting-fact recall@10 기준 75.2% vs 동일한 임베딩(embeddings)을 사용한 단순 코사인(naive cosine) 방식의 69.3%. MuSiQue 2/3/4-hop: +6.0/+3.2/+5.0 포인트 상승. 정직한 트레이드오프(trade-off): 수렴(convergence) 항 사용 시 recall@2가 0.75포인트 하락합니다 (top-2 워크로드의 경우 비활성화하도록 문서에 플래그가 기록되어 있음). Harness 및 원본 JSON 파일은 리포지토리(repo)에 포함되어 있습니다.
에이전트 스토리 (The agent story)
pip install "hubmesh[mcp]"를 통해 에이전트 제어 가능 검색(agent-steerable retrieval) 기능이 포함된 MCP 서버(io.github.DemigodDSK/hubmesh로 공식 MCP 레지스트리에 등록됨)를 추가할 수 있습니다: seed_entities를 전달하여 다음 홉(hop)이 방금 읽은 내용을 목표로 하게 하거나, exclude_docs를 사용하여 새로운 영역을 탐색할 수 있습니다. 로컬 Chroma + 로컬 그래프
- 당신의 에이전트 추론: 시스템 내 유일한 LLM이 이미 당신이 실행 중인 모델뿐인 멀티홉 RAG.
Repo: github.com/DemigodDSK/hubmesh · MIT · 수치는 benchmarks/를 통해 재현 가능합니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기