Gemini를 활용한 4단계 병렬 RAG 파이프라인 구축
요약
Gemini 임베딩을 활용하여 오타와 의미적 유사성을 동시에 해결하는 4단계 병렬 RAG 파이프라인 구축 사례를 소개합니다. 의미 검색, 텍스트 검색, 정규식, 퍼지 매칭을 병렬로 실행하여 검색 정확도를 90%까지 높였습니다.
핵심 포인트
- 4가지 검색 전략(의미, 텍스트, 정규식, 퍼지)을 병렬로 실행하여 지연 시간 최소화
- Gemini-embedding-2를 활용한 3072차원 벡터 기반 의미 검색 구현
- 가중치 점수 함수를 통한 검색 결과 병합 및 최적화
- 검색 정확도 약 90% 달성 및 약 780ms의 낮은 지연 시간 확보
문제점
저희의 AI 노코드 챗봇 플랫폼인 BotForge를 구축하는 과정에서, 오타, 부분 구문, 의미적으로 유사하지만 단어는 다르게 표현된 실제 사용자 질의를 처리할 수 있는 검색 시스템이 필요했습니다.
단순한 벡터 검색만으로는 충분하지 않았습니다. 강력하기는 하지만, 어휘집 밖에 있는 용어나 정확한 키워드 조회에는 취약했기 때문입니다.
해결책: 4단계 병렬 검색 (Four-Tier Parallel Retrieval)
저희는 네 가지의 검색 전략을 Promise.all을 사용하여 동시에 실행한 다음, 가중치 점수 함수를 통해 결과를 병합했습니다.
javascript const [semanticResults, textResults, regexResults, fuzzyResults] = await Promise.all([ semanticSearch(query, embeddings), // weight 1.8x mongoFullTextSearch(query), // weight 1.5x regexKeywordSearch(query), // weight 1.0x fuzzyPerWordMatch(query), // weight 0.6x ])
1단계: 의미 검색 (Semantic Search) (가중치 1.8×)
Gemini의 gemini-embedding-2를 사용하여 3072차원 벡터를 생성하고, 이를 저장된 문서 임베딩과 코사인 유사도(cosine similarity)를 계산합니다. 이 방식은 단어 공유 여부와 관계없이 의미(
function mergeResults(tiers, weights) {
const scoreMap = new Map()
tiers.forEach((results, i) => {
results.forEach(({ id, score, chunk }) => {
const weighted = score * weights[i]
scoreMap.set(id, {
chunk,
total: (scoreMap.get(id)?.total || 0) + weighted,
})
})
})
return [...scoreMap.values()].sort((a, b) => b.total - a.total).slice(0, 5)
}
결과 (Results)
- 예비 테스트 질의에서 ~90% 검색 정확도 달성
- 종단 간(end-to-end) 평균 지연 시간 ~780ms (임베딩 생성 포함)
- 오타, 의역(paraphrasing), 도메인별 전문 용어에 강건함 (Robust)
병렬 아키텍처가 핵심 통찰력이었습니다. 네 가지 전략을 모두 동시에 실행함으로써 지연 시간이 개별 가장 느린 전략(의미 검색)에 가깝게 유지되며, 곱해지지 않습니다.
다르게 할 점 (What I'd Do Differently)
- 자주 묻는 질문에 대한 임베딩 캐싱
- 상위 10개 후보군에 재순위 지정 단계(cross-encoder) 추가
- 더 세밀한 점수화를 위해 ColBERT 스타일의 후기 상호작용(late interaction) 탐색
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기