Hybrid Search와 함께 Agentic RAG를 구축하는 방법
Source: Towards Data Science
번역을 진행하려면 번역하고자 하는 전체 텍스트를 제공해 주시겠어요?
텍스트를 알려주시면 원본 형식과 마크다운을 그대로 유지하면서 한국어로 번역해 드리겠습니다.
Retrieval‑Augmented Generation (RAG) 및 하이브리드 검색
RAG, 혹은 Hybrid Search 라고도 불리는 이 기술은 코퍼스에서 관련 문서를 검색하고 해당 청크를 대형 언어 모델(LLM)에 전달하여 사용자 질문에 답변하도록 하는 강력한 방법입니다.
전통적인 RAG 작동 방식
- 벡터 유사도를 사용해 의미적으로 유사한 문서 청크를 찾습니다.
- 가장 관련성이 높은 청크를 LLM에 전달하고, LLM이 응답을 생성합니다.
이 접근법은 의미적 유사성이 미묘한 의미까지 포착할 수 있기 때문에 많은 경우에 잘 작동합니다.
벡터 유사도가 한계에 부딪히는 경우
- 사용자가 특정 키워드, ID, 정확한 구문을 그대로 일치시켜야 할 때.
- 순수 의미 검색만으로는 이러한 정확한 일치를 놓칠 수 있어 답변이 불완전하거나 부정확해질 수 있습니다.
키워드(하이브리드) 검색 도입
하이브리드 검색은 다음을 결합합니다:
- 키워드 검색(정확 일치)
- 벡터 유사도(의미 기반 매칭)
두 방법을 모두 활용함으로써 정확한 용어가 필요할 때도 가장 관련성 높은 청크를 효과적으로 검색할 수 있습니다.
배울 내용
- 왜 하이브리드 검색이 키워드가 많은 시나리오에서 RAG 성능을 향상시키는지.
- 어떻게 키워드와 벡터 검색을 동적으로 선택하는 에이전트형 RAG 시스템을 구현할지.
- 실용적인 단계와 코드 스니펫을 통해 하이브리드 파이프라인을 구축하는 방법.
시각적 개요

이 기사 주요 내용을 요약한 인포그래픽. 이미지 제공: Gemini.
하이브리드 검색을 사용하는 이유?
벡터 유사도는 입력 프롬프트에 오타나 동의어가 포함되어 있어도(예: lift 대신 elevator) 코퍼스에서 관련 청크를 검색하는 강력한 도구입니다. 하지만 몇 가지 눈에 띄는 한계가 있습니다:
- 키워드 민감도: 벡터 모델은 개별 단어나 식별자에 특별한 가중치를 부여하지 않습니다. 그 결과, 키워드나 ID가 다른 의미적으로 관련된 용어에 의해 “묻혀” 순수 의미 검색만으로는 가장 관련성 높은 문서를 찾아내기 어렵습니다.
- 정확한 매칭: 사용자의 쿼리에 제품 코드, 일련 번호, 고유 이름과 같은 특정 용어가 포함된 경우, 벡터 유사도만으로는 해당 문서를 우선순위에 올리기 어렵습니다.
키워드 검색의 강점
전통적인 키워드 기반 방법(예: BM25)은 다음에 뛰어납니다:
- 정확한 용어 매칭: 특정 단어가 한 문서에만 등장한다면, 그 단어가 쿼리에 포함될 때 해당 문서는 높은 관련성 점수를 받습니다.
- 식별자 검색: 고유 ID나 코드를 직접 매칭하여 올바른 문서가 나타나도록 보장합니다.
하이브리드 접근 방식의 장점
벡터 유사도와 키워드 검색을 결합하면 두 세계의 장점을 모두 활용할 수 있습니다:
- 광범위한 커버리지 – 의미적 유사도는 패러프레이징이나 철자 오류가 있더라도 관련 콘텐츠를 포착합니다.
- 정밀한 검색 – 키워드 점수는 정확한 용어와 식별자가 간과되지 않도록 합니다.
- 높은 관련성 – 하이브리드 점수는 두 신호를 균형 있게 조합해, 상황에 맞으면서도 사용자의 의도에 정확히 부합하는 결과를 제공합니다.
핵심 요약: 퍼지하고 의미 기반인 쿼리 와 정확한 키워드 또는 식별자 조회를 모두 처리하고 싶을 때 하이브리드 검색을 사용하면 다양한 사용자 입력에 대해 보다 정확하고 유용한 결과를 얻을 수 있습니다.
Source: …
하이브리드 검색 구현 방법
하이브리드 검색은 시맨틱(벡터) 유사도와 키워드(BM25) 유사도를 결합하여 검색 품질을 향상시킵니다. 아래는 하이브리드 검색 시스템을 직접 구축할 수 있는 간결한 단계별 가이드입니다.
1. 벡터 검색 설정 (시맨틱 검색)
- 문서들을 언어 모델(예: OpenAI 임베딩, Sentence‑Transformers 등)을 사용해 밀집 벡터로 인코딩합니다.
- 벡터들을 벡터 데이터베이스(예: Pinecone, Weaviate, Milvus, 혹은 TurboPuffer)에 저장합니다.
- 쿼리: 사용자 질의를 벡터로 변환하고 코사인 유사도 또는 내적을 이용해 상위 k개의 가장 유사한 문서를 검색합니다.
벡터 인덱싱에 대한 자세한 내용은 이 가이드의 범위를 벗어납니다; 표준 벡터 검색 파이프라인이면 모두 작동합니다.
2. 키워드 검색 추가 (BM25)
- 동일한 코퍼스를 BM25 구현체(예: Elasticsearch, Apache Lucene, Whoosh, 혹은
rank_bm25파이썬 라이브러리)로 인덱싱합니다. - 쿼리: 원시 텍스트 질의를 BM25 인덱스에 실행해 각 문서에 대한 관련 점수를 얻습니다.
BM25는 TF‑IDF를 기반으로 하면서 더 견고한 스코어링 공식을 포함하고 있기 때문에 선호됩니다. 강력한 이유가 있다면 다른 키워드 검색 알고리즘으로 대체할 수 있습니다.
3. 두 점수 결합
하이브리드 스코어링은 일반적으로 시맨틱 점수와 키워드 점수의 가중합으로 계산됩니다:
[ \text{HybridScore}(d) = \alpha \times \text{SemanticScore}(d) + (1-\alpha) \times \text{KeywordScore}(d) ]
| 파라미터 | 설명 | 일반적인 범위 |
|---|---|---|
| α (alpha) | 시맨틱 유사도 구성 요소에 부여되는 가중치 | 0.0 – 1.0 (예: 0.6) |
| SemanticScore | 질의 벡터와 문서 벡터 간 코사인 유사도(또는 내적) | 0 – 1 |
| KeywordScore | BM25 관련 점수(보통 정규화됨) | 0 – 1 |
α 선택 팁
- 도메인‑특화 작업(예: 법률, 의료)에서는 정확한 용어 매칭이 중요하므로 키워드 가중치를 높이는 것이 유리합니다.
- 개방형 또는 대화형 질의는 시맨틱 가중치를 높이는 것이 일반적입니다.
- 동적 가중치: LLM 기반 에이전트가 질의 의도에 따라 α를 실시간으로 결정하도록 할 수 있습니다(예: “정확한 구문 찾기” → α 낮춤).
4. (선택) 기존 패키지 활용
모든 것을 처음부터 구축하고 싶지 않다면, 이미 하이브리드 검색 유틸리티를 제공하는 라이브러리들이 있습니다:
| 라이브러리 | 벡터 스토어 | 키워드 검색 | 비고 |
|---|---|---|---|
| TurboPuffer | 내장 벡터 저장소 | KeyboardSearch 패키지(BM25) | 두 모달리티를 결합하는 간단한 API |
| Haystack | 다중 백엔드(FAISS, Milvus 등) | Elasticsearch, OpenSearch | HybridRetriever를 기본 제공 |
| Vespa | 네이티브 벡터 및 BM25 지원 | — | 수십억 문서 규모 확장 가능 |
라이브러리를 사용하더라도 기본 메커니즘을 이해하는 것이 중요합니다—직접 파이프라인을 구현하면 가중치, 정규화, 랭킹 로직을 세밀하게 조정할 수 있습니다.
5. 평가 및 반복
- 테스트 세트를 만들어 질의와 해당 질의에 대한 정답 문서를 준비합니다.
- 하이브리드 파이프라인을 실행하고 Recall@k, NDCG, MRR 같은 지표를 계산합니다.
- α를 조정하거나(비선형 결합 시도) 원하는 정밀도와 재현율 사이의 균형을 얻을 때까지 반복합니다.
Summary
- Semantic search는 문맥적 관련성을 제공하고, BM25는 정확한 용어 매칭을 보장합니다.
- 두 방법을 각각 구현한 뒤, 가중치(α)를 조정하여 점수를 병합합니다.
- 파이프라인을 직접 구성하거나 TurboPuffer, Haystack, Vespa와 같은 기존 도구를 활용할 수 있습니다.
- 평가를 적절히 수행하는 것이 특정 사용 사례에 최적의 균형을 찾는 핵심입니다.
Hybrid search는 그리 복잡하지 않으며, 두 구성 요소를 갖추면 비교적 적은 추가 엔지니어링 노력으로도 검색 품질이 눈에 띄게 향상되는 것을 확인할 수 있습니다. 즐거운 검색 되세요!
에이전트형 하이브리드 검색
하이브리드 검색을 구현하면 Retrieval‑Augmented Generation (RAG) 시스템의 성능을 처음부터 크게 끌어올릴 수 있습니다. 하지만 하이브리드‑검색 RAG 파이프라인의 혜택을 최대화하고 싶다면 에이전트형으로 만드는 것이 좋습니다.
“에이전트형”이 의미하는 것
일반적인 RAG 흐름은 다음과 같습니다:
- 관련 문서 청크를 검색한다 (벡터 또는 키워드 검색).
- 해당 청크들을 LLM에 전달한다.
- LLM이 답을 생성한다.
에이전트형 RAG 시스템에서는 검색 단계가 도구로 노출되어 LLM이 필요에 따라 호출할 수 있습니다. 이제 LLM이 검색을 제어하게 되므로, 답변 품질을 향상시키는 여러 중요한 결정을 내릴 수 있습니다.
에이전트형 접근 방식이 강력한 이유
| 기능 | 에이전트가 돕는 방식 | 왜 중요한가 |
|---|---|---|
| 검색을 위한 프롬프트 재작성 | LLM이 사용자 질의를 벡터 스토어에 보내기 전에 재작성할 수 있다. | 질의 재작성은 더 관련성 높은 임베딩을 얻는 입증된 기법이다. |
| 반복적 페칭 | LLM이 첫 번째 검색을 수행하고 결과를 검토한 뒤, 추가 청크를 요청할지 결정한다. | 모델이 충분한 컨텍스트를 확보했는지 확인하게 하여 환각을 줄인다. |
| 하이브리드 구성 요소의 동적 가중치 부여 | LLM이 쿼리마다 키워드 매칭과 벡터 유사도 사이의 균형을 결정한다. | 사용자가 정확한 키워드를 포함하면 키워드 검색 가중치를 높이고, 그렇지 않으면 의미적 유사도에 더 의존할 수 있다. |
검색을 도구로 만드는 방법
# Pseudo‑code for an LLM‑driven retrieval tool
def hybrid_search_tool(query: str,
weight_keyword: float = 0.5,
weight_vector: float = 0.5,
top_k: int = 5) -> List[Document]:
"""
• `query` – the (possibly rewritten) search string.
• `weight_keyword` / `weight_vector` – dynamic blend of BM25 and embedding scores.
• `top_k` – number of chunks to return.
Returns a list of the most relevant document chunks.
"""
# 1️⃣ Keyword search (e.g., BM25)
kw_results = bm25_search(query, k=top_k)
# 2️⃣ Vector search (e.g., FAISS / HNSW)
vec_results = embedding_search(query, k=top_k)
# 3️⃣ Combine scores using the supplied weights
combined = blend_results(kw_results, vec_results,
w_kw=weight_keyword, w_vec=weight_vector)
return combined[:top_k]LLM은 hybrid_search_tool을 반복 호출하면서 query, weight_keyword, weight_vector, top_k를 매번 조정할 수 있습니다.
지금 이 방법이 통하는 이유
최신 LLM(예: GPT‑4‑Turbo, Claude‑3, Gemini‑1.5)은 다음과 같은 수준에 도달했습니다:
- 키워드 중심 질의와 개념 중심 질의를 구분할 수 있다.
- 프롬프트를 재작성하여 가장 유용한 임베딩을 끌어낼 수 있다.
- 검색된 컨텍스트의 충분성을 판단하고 추가 정보가 필요한지 결정할 수 있다.
몇 달 전만 해도 LLM에게 이런 수준의 자율성을 부여하는 것은 위험했을 것입니다. 오늘날 모델은 충분히 신뢰할 수 있어, 이와 같은 동적·도구 기반 접근 방식이 가능할 뿐만 아니라 권장됩니다.
핵심 요약
- 하이브리드 검색을 구현한다 (키워드 + 벡터).
- 검색을 호출 가능한 도구로 노출한다.
- LLM에게 결정권을 부여한다
- 검색 질의를 어떻게 표현할지,
- 몇 개의 청크를, 어떤 청크를 가져올지,
- 키워드와 의미적 유사도 중 어느 쪽에 가중치를 둘지.
하이브리드 검색과 에이전트형 LLM을 결합하면 RAG 시스템을 크게 강화할 수 있으며, 정적인 벡터‑전용 파이프라인보다 훨씬 나은 결과를 얻을 수 있습니다.
결론
이 글에서는 RAG 시스템에 하이브리드 검색을 구현하는 방법과 RAG 파이프라인을 보다 정교하게 만들어 훨씬 더 좋은 결과를 얻는 방법에 대해 논의했습니다. 이 두 기술을 결합하면 정보 검색 스택의 성능을 크게 향상시킬 수 있으며, Claude Code와 같은 코딩 에이전트를 사용하면 매우 쉽게 구현할 수 있습니다. 저는 Agentex Systems가 정보 검색의 미래를 대표한다고 믿으며, 여러분의 에이전트에 하이브리드 검색 기능을 장착해 무거운 작업을 대신 처리하도록 권장합니다.
📚 리소스
무료 eBook 및 웨비나
소셜에서 나를 찾아보세요