-
단순 벡터 RAG의 종말: FTS·그래프·임베딩을 결합한 에이전트 하이브리드 리콜 아키텍처
AI 2026. 10. 11. 14:14반응형단순 벡터 RAG의 종말: FTS·그래프·임베딩을 결합한 에이전트 하이브리드 리콜 아키텍처
핵심 요약: 많은 에이전트 시스템이 문서를 임베딩 모델에 넘겨 코사인 유사도로 청크를 꺼내오는 단일 벡터 RAG에 의존합니다. 고유명사 누락, 시간 순서 왜곡, 관계 추론 실패라는 벽에 부딪힙니다. 에이전트 기억 운영체제 Memento가 구현한 하이브리드 리콜(Hybrid Recall) 엔진을 분석합니다. 키워드(FTS)·임베딩 벡터·시맨틱 그래프(Entity-Predicate-Object)의 3축 병합, 스케일 불일치를 해소하는 신호 정규화, 다차원 인지 점수(관련성·최근성·중요도·절차 부스트) 융합 공식을 코드 레벨로 다룹니다.
1. 단일 벡터 RAG가 에이전트 환경에서 무너지는 이유
문서 요약 질의응답과 장기 실행 에이전트의 기억 검색은 요구 조건이 다릅니다. 문서를 청크로 쪼개 임베딩 벡터로 변환한 뒤 Top-K를 꺼내오는 전통적 벡터 RAG는 실전 에이전트 런타임에서 세 가지 구조적 결함을 드러냅니다.
[단일 벡터 RAG의 실패 지점] 1. 정밀 식별자 실패 ──► UUID, 함수명, 환경변수 토큰이 고차원 공간에서 분산 2. 시간성 무시 ──► 어제 결정한 규칙과 6개월 전 폐기된 규칙이 같은 유사도로 경쟁 3. 단절된 고립 청크 ──► A가 B를 참조한다는 인과 관계 유실1) 고유 식별자와 코드 심볼 왜곡
임베딩 공간은 '의미적 유사성'을 압축합니다.
ERR_AUTH_EXPIRED_TOKEN과ERR_AUTH_INVALID_TOKEN은 코사인 유사도 0.95 이상으로 묶입니다. 에이전트에게 필요한 정보는 두 에러의 철학적 유사성이 아닌 정확한 에러 코드 분기입니다. 프로젝트 경로, 포트 번호, 변수명 검색에서 밀집 임베딩(Dense Embedding)은 희소 키워드 매칭(Sparse FTS)보다 정확도가 떨어집니다.2) 시간 감쇄와 상태 역전
대화 세션이 누적되면 상반된 지식이 공존합니다. 지난달에는 "DB 라이브러리로 Prisma를 사용한다"고 적었고, 어제 "Drizzle로 전면 마이그레이션했다"고 기록했습니다. 두 문장은 의미 공간에서 매우 가깝습니다. 벡터 유사도만 측정하면 과거 데이터가 더 긴 본문을 가졌다는 이유로 상위에 랭크되어 에이전트가 낡은 코드를 생산합니다.
3) 1-Hop 인과 관계의 증발
"A 컴포넌트는 B API를 호출하며, B API는 C 캐시를 거친다"는 지식은 텍스트 덩어리가 아닌 관계 그래프입니다. 벡터 검색은 파편화된 청크 하나만 반환하므로 연결된 문맥을 읽으려면 에이전트가 도구를 반복 호출하며 왕복 지연(Round-trip Latency)을 일으킵니다.
2. 3축 리콜 파이프라인: FTS, Vector, Knowledge Graph
Memento는 단일 검색에 의존하지 않고 상호보완적인 3개 채널을 결합합니다.
┌──────────────────────┐ │ 에이전트 질의 (Query) │ └──────────┬───────────┘ │ ┌───────────────────┼───────────────────┐ ▼ ▼ ▼ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ │ Sparse FTS │ │ Dense Vector │ │ Semantic Graph │ │ (SQLite FTS5) │ │ (Cosine Sim) │ │ (Entity Triples)│ │ 키워드·식별자 │ │ 문맥·의미 유사 │ │ 1-Hop 인과 확장 │ └────────┬────────┘ └────────┬────────┘ └────────┬────────┘ │ │ │ └─────────────┬─────┴───────────────────┘ ▼ [후보군 합집합 병합 (Union)] │ ▼ [신호 정규화 및 점수 융합] │ ▼ [다차원 인지 가중치 적용] │ ▼ [최종 Re-ranking Top-K 반환]각 채널의 역할은 고유합니다.
- Sparse FTS (SQLite FTS5): 함수명, 이슈 번호, 설정 키, 정확한 인용구를 즉각 추출합니다.
- Dense Vector: 어휘 불일치(Vocabulary Mismatch)를 메웁니다. "배포 실패"를 검색할 때 "파이프라인 크래시" 기록을 건져 올립니다.
- Semantic Graph (Triples): 주어-서술어-목적어(Subject-Predicate-Object) 형태로 추출된 사실 관계를 추적하여 연관된 이웃 노드(Neighbors)를 즉시 보강합니다.
3. 스케일 불일치 해소: 신호 정규화와 융합 점수
하이브리드 검색을 구현할 때 흔히 저지르는 실수는 FTS 스코어와 벡터 유사도를 단순 가산하는 방식입니다.
FTS 점수는 BM25 기반으로 0부터 수십까지 치솟는 반면, 임베딩 코사인 유사도는 0.0에서 1.0(실무 환경에서는 주로 0.6~0.85 구간) 사이에 갇힙니다. 가중치만 곱해 더하면 FTS 점수의 편차가 벡터 신호를 완전히 압도합니다.
1) 융합 관련성(Fusion Relevance) 계산
Memento는 두 레인의 스코어를 독립 정규화한 뒤 가중 합산합니다. 결측값(0)을 유효한 점수로 취급하여 한쪽 레인에서만 잡힌 후보도 배제하지 않습니다.
export function hybridFusionRelevance( textScore: number | undefined, vectorScore: number | undefined, textWeight: number, vectorWeight: number, ): number { const text = typeof textScore === 'number' && Number.isFinite(textScore) ? textScore : 0; const vector = typeof vectorScore === 'number' && Number.isFinite(vectorScore) ? vectorScore : 0; return text * textWeight + vector * vectorWeight; }2) 관련성 신호 스케일링
무관한 문서 집합에서도 기본 임베딩 점수로 인해 융합 관련성이 0 아래로 떨어지지 않는 현상이 발생합니다. 신호 폭이 좁아지면 관련성 대신 시간(Recency)이나 중요도(Importance)가 순위를 왜곡합니다.
Memento는 신호 스케일 팩터를 도입해 점수 분포 폭을 인위적으로 확장합니다.
const fusionRelevance = applyRelevanceSignalScale( hybridFusionRelevance( result.textScore, result.vectorScore, weights.textWeight, weights.vectorWeight ), getRankingWeights().relevance_signal.scale );이 과정을 거쳐야 관련성 신호가 순위 결정의 주도권을 유지합니다.
4. 다차원 인지 랭킹 공식
관련성 점수만으로 에이전트의 기억 순위를 매기면 안 됩니다. 에이전트는 자주 쓰이는 지식, 방금 학습한 규칙, 사용자가 강제로 고정한 지침을 우대해야 합니다.
Memento의 복합 랭킹 엔진은 6개 인지 요소를 가중 합성합니다.
$$\text{FinalScore} = \alpha R + \beta T + \gamma I + \delta U - \epsilon D + \zeta_{fb}(F - 0.5) + P_{boost} + \theta A_{fit}$$
기호 변수명 기본 가중치 역할 설명 $R$ relevance($\alpha$)0.45 FTS와 Vector가 결합된 융합 관련성 $T$ recency($\beta$)0.20 반감기 곡선 기반 시간 감쇄 신호 $I$ importance($\gamma$)0.20 사용자 명시 중요도 및 핀(Pinned) 가중치 $U$ usage($\delta$)0.10 인용·참조 빈도 기반 강화 점수 $D$ duplication($\epsilon$)0.10 상위 선택 결과와의 의미 중복 감점 $F$ feedback($\zeta_{fb}$)0.05 에이전트 행동 피드백 순합(Net Score) 시그모이드 보정 $P_{boost}$ procedural_boost가산(최대 0.35) 워크플로·스킬명·트리거 조건 일치 가산점 $A_{fit}$ process_attribute_fit($\theta$)0.10 프로세스 문맥 적합도 가산점 실제 코어 랭킹 계산 코드는 아래와 같습니다.
export function calculateFinalScore( features: SearchFeatures, weights: SearchRankingWeights ): number { const relevanceScore = features.relevance; const zetaFb = weights.zeta_fb ?? 0.05; const feedbackNorm = features.feedback_score ?? 0.5; // 피드백 기본값(0.5)일 때 기여도 0 유지 const feedbackTerm = zetaFb * (feedbackNorm - 0.5); const finalScore = weights.relevance * relevanceScore + weights.recency * features.recency + weights.importance * features.importance + weights.usage * features.usage - weights.duplication_penalty * features.duplication_penalty + feedbackTerm; // 절차적 기억(Procedural Memory) 일치 가산 const proceduralBoost = calculateProceduralMemoryBoost(features); // 프로세스 속성 일치 가산 const processFitWeight = weights.process_attribute_fit ?? 0; const processFit = features.process_attribute_fit !== undefined ? processFitWeight * features.process_attribute_fit : 0; return finalScore + proceduralBoost + processFit; }절차적 기억(Procedural Memory) 부스트
명령어 실행 규칙이나 트러블슈팅 절차는 단순 지식보다 우선 순위가 높아야 합니다.
- 워크플로 이름 일치:+0.10
- 스킬 이름 일치:+0.10
- 트리거 조건 충족:+0.15조건을 충족하면 최대
0.35의 점수가 더해져 일반 텍스트 조각을 제치고 실행 지침이 최상단에 올라옵니다.
5. 1-Hop 맥락 복원: 이웃 탐색(Neighbors Fetch)
검색 결과 목록에 단편 카드만 나열되면 에이전트는 전후 사정을 파악하기 어렵습니다. Memento는 1차 랭킹 상위 항목에 대해 지식 그래프 이웃 노드를 비동기로 결합합니다.
const neighborPromises = topResults.map(async (item, index) => { const memoryId = item.id || item.memory_id; if (!memoryId) return { index, neighbors: [] }; const timeoutPromise = new Promise<{ index: number; neighbors: NeighborMemory[] }>( (_, reject) => setTimeout(() => reject(new Error('Timeout')), 2000) ); const neighborPromise = neighborService.getNeighbors(memoryId, { limit: neighborsPerItem, similarity_threshold: neighborsSimilarityThreshold }).then(result => ({ index, neighbors: result.neighbors })); return Promise.race([neighborPromise, timeoutPromise]); });검색된 기억이 "Redis 캐시 만료 설정"이라면, 연결된 "인증 세션 정책"과 "토큰 재발급 핸들러"가 이웃 기억으로 묶여 하나의 Envelope로 에이전트 컨텍스트에 들어갑니다. 추가 질의 없이 전체 흐름이 복원됩니다.
6. 품질 회귀 방지: 한국어 골드셋 CI 게이트
검색 알고리즘을 변경할 때 가장 큰 위험은 한쪽 질의의 정확도를 올리려다 다른 영역의 리콜을 깨뜨리는 회귀(Regression) 현상입니다. 형태소 분석 특성상 한국어 질의는 조사의 결합 방식에 따라 FTS 점수가 급격히 흔들립니다.
Memento는 벤치마크 테스트셋(Korean Recall Gold Set)을 구축해 CI 파이프라인에 품질 게이트를 배치했습니다.
[PR 제출] ──► Knip 정적 분석 ──► 단위 테스트 ──► 골드셋 검색 품질 검증 (nDCG@5 / MRR) │ [목표치 미달 시 빌드 차단]- 조사 분리 쿼리 확장(
prefix*와OR연산자 자동 결합) - nDCG@5 및 MRR(Mean Reciprocal Rank) 지표 자동 측정
- 랭킹 가중치(
ranking-weights.toml) 튜닝 시 품질 게이트 통과 의무화
경험적 감에 의존하지 않고 정량 지표로 검색 하이퍼파라미터를 검증합니다.
7. 아키텍처 비교 요약
비교 축 단일 벡터 RAG Memento 하이브리드 리콜 검색 엔진 Dense 임베딩 단독 Sparse FTS + Dense Vector + Graph Triples 식별자 검색 토큰 뭉개짐 발생 FTS5 토큰 인덱스로 100% 매칭 시간 감쇄 미반영 (유사도 위주) 에빙하우스 반감기 수식 기반 Recency 감쇄 맥락 연결 독립 청크 반환 1-Hop 지식 그래프 이웃 노드 자동 페칭 점수 산출 단순 코사인 유사도 다차원 인지 공식 ($\alpha, \beta, \gamma, \delta, \epsilon, \zeta_{fb}$) 품질 검증 육안 확인 한국어 골드셋 벤치마크 CI 게이트 반응형'AI' 카테고리의 다른 글
단순 메모 앱을 넘어 AI 지식 운영체제로: 옵시디언 LLM Wiki 아키텍처와 AKM 실전 패턴 (0) 2026.10.08 프레임워크 종속 없는 경량 개인 비서 에이전트: TypeScript·Bun 헥사고날 아키텍처와 결정론적 하네스 구현 가이드 (1) 2026.10.07 하네스가 곧 회사다: SaaS의 종말이 아닌 '비즈니스 하네스'로의 진화와 Top-Level 소유 전략 (0) 2026.10.05 AI 시대의 코드 리뷰 전략: 인지 부채(Cognitive Debt) 방지와 2단계 에이전틱 파이프라인 (0) 2026.10.04 Kev: Qwen 3.5 기반 1-Pass 오픈 의사결정 모델과 에이전트 도구 호출 60% 절감 아키텍처 (0) 2026.10.02 - 조사 분리 쿼리 확장(