Hybrid Search와 함께 Agentic RAG를 구축하는 방법

발행: (2026년 3월 13일 오후 09:00 GMT+9)
19 분 소요

Source: Towards Data Science

번역을 진행하려면 번역하고자 하는 전체 텍스트를 제공해 주시겠어요?
텍스트를 알려주시면 원본 형식과 마크다운을 그대로 유지하면서 한국어로 번역해 드리겠습니다.

Retrieval‑Augmented Generation (RAG) 및 하이브리드 검색

RAG, 혹은 Hybrid Search 라고도 불리는 이 기술은 코퍼스에서 관련 문서를 검색하고 해당 청크를 대형 언어 모델(LLM)에 전달하여 사용자 질문에 답변하도록 하는 강력한 방법입니다.

전통적인 RAG 작동 방식

  1. 벡터 유사도를 사용해 의미적으로 유사한 문서 청크를 찾습니다.
  2. 가장 관련성이 높은 청크를 LLM에 전달하고, LLM이 응답을 생성합니다.

이 접근법은 의미적 유사성이 미묘한 의미까지 포착할 수 있기 때문에 많은 경우에 잘 작동합니다.

벡터 유사도가 한계에 부딪히는 경우

  • 사용자가 특정 키워드, ID, 정확한 구문을 그대로 일치시켜야 할 때.
  • 순수 의미 검색만으로는 이러한 정확한 일치를 놓칠 수 있어 답변이 불완전하거나 부정확해질 수 있습니다.

키워드(하이브리드) 검색 도입

하이브리드 검색은 다음을 결합합니다:

  • 키워드 검색(정확 일치)
  • 벡터 유사도(의미 기반 매칭)

두 방법을 모두 활용함으로써 정확한 용어가 필요할 때도 가장 관련성 높은 청크를 효과적으로 검색할 수 있습니다.

배울 내용

  • 하이브리드 검색이 키워드가 많은 시나리오에서 RAG 성능을 향상시키는지.
  • 어떻게 키워드와 벡터 검색을 동적으로 선택하는 에이전트형 RAG 시스템을 구현할지.
  • 실용적인 단계와 코드 스니펫을 통해 하이브리드 파이프라인을 구축하는 방법.

시각적 개요

Learn how to build an agentic hybrid search RAG.
이 기사 주요 내용을 요약한 인포그래픽. 이미지 제공: Gemini.

하이브리드 검색을 사용하는 이유?

벡터 유사도는 입력 프롬프트에 오타나 동의어가 포함되어 있어도(예: lift 대신 elevator) 코퍼스에서 관련 청크를 검색하는 강력한 도구입니다. 하지만 몇 가지 눈에 띄는 한계가 있습니다:

  • 키워드 민감도: 벡터 모델은 개별 단어나 식별자에 특별한 가중치를 부여하지 않습니다. 그 결과, 키워드나 ID가 다른 의미적으로 관련된 용어에 의해 “묻혀” 순수 의미 검색만으로는 가장 관련성 높은 문서를 찾아내기 어렵습니다.
  • 정확한 매칭: 사용자의 쿼리에 제품 코드, 일련 번호, 고유 이름과 같은 특정 용어가 포함된 경우, 벡터 유사도만으로는 해당 문서를 우선순위에 올리기 어렵습니다.

키워드 검색의 강점

전통적인 키워드 기반 방법(예: BM25)은 다음에 뛰어납니다:

  • 정확한 용어 매칭: 특정 단어가 한 문서에만 등장한다면, 그 단어가 쿼리에 포함될 때 해당 문서는 높은 관련성 점수를 받습니다.
  • 식별자 검색: 고유 ID나 코드를 직접 매칭하여 올바른 문서가 나타나도록 보장합니다.

하이브리드 접근 방식의 장점

벡터 유사도와 키워드 검색을 결합하면 두 세계의 장점을 모두 활용할 수 있습니다:

  1. 광범위한 커버리지 – 의미적 유사도는 패러프레이징이나 철자 오류가 있더라도 관련 콘텐츠를 포착합니다.
  2. 정밀한 검색 – 키워드 점수는 정확한 용어와 식별자가 간과되지 않도록 합니다.
  3. 높은 관련성 – 하이브리드 점수는 두 신호를 균형 있게 조합해, 상황에 맞으면서도 사용자의 의도에 정확히 부합하는 결과를 제공합니다.

핵심 요약: 퍼지하고 의미 기반인 쿼리 정확한 키워드 또는 식별자 조회를 모두 처리하고 싶을 때 하이브리드 검색을 사용하면 다양한 사용자 입력에 대해 보다 정확하고 유용한 결과를 얻을 수 있습니다.

Source:

하이브리드 검색 구현 방법

하이브리드 검색은 시맨틱(벡터) 유사도키워드(BM25) 유사도를 결합하여 검색 품질을 향상시킵니다. 아래는 하이브리드 검색 시스템을 직접 구축할 수 있는 간결한 단계별 가이드입니다.

1. 벡터 검색 설정 (시맨틱 검색)

  1. 문서들을 언어 모델(예: OpenAI 임베딩, Sentence‑Transformers 등)을 사용해 밀집 벡터로 인코딩합니다.
  2. 벡터들을 벡터 데이터베이스(예: Pinecone, Weaviate, Milvus, 혹은 TurboPuffer)에 저장합니다.
  3. 쿼리: 사용자 질의를 벡터로 변환하고 코사인 유사도 또는 내적을 이용해 상위 k개의 가장 유사한 문서를 검색합니다.

벡터 인덱싱에 대한 자세한 내용은 이 가이드의 범위를 벗어납니다; 표준 벡터 검색 파이프라인이면 모두 작동합니다.

2. 키워드 검색 추가 (BM25)

  1. 동일한 코퍼스를 BM25 구현체(예: Elasticsearch, Apache Lucene, Whoosh, 혹은 rank_bm25 파이썬 라이브러리)로 인덱싱합니다.
  2. 쿼리: 원시 텍스트 질의를 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
KeywordScoreBM25 관련 점수(보통 정규화됨)0 – 1

α 선택 팁

  • 도메인‑특화 작업(예: 법률, 의료)에서는 정확한 용어 매칭이 중요하므로 키워드 가중치를 높이는 것이 유리합니다.
  • 개방형 또는 대화형 질의는 시맨틱 가중치를 높이는 것이 일반적입니다.
  • 동적 가중치: LLM 기반 에이전트가 질의 의도에 따라 α를 실시간으로 결정하도록 할 수 있습니다(예: “정확한 구문 찾기” → α 낮춤).

4. (선택) 기존 패키지 활용

모든 것을 처음부터 구축하고 싶지 않다면, 이미 하이브리드 검색 유틸리티를 제공하는 라이브러리들이 있습니다:

라이브러리벡터 스토어키워드 검색비고
TurboPuffer내장 벡터 저장소KeyboardSearch 패키지(BM25)두 모달리티를 결합하는 간단한 API
Haystack다중 백엔드(FAISS, Milvus 등)Elasticsearch, OpenSearchHybridRetriever를 기본 제공
Vespa네이티브 벡터 및 BM25 지원수십억 문서 규모 확장 가능

라이브러리를 사용하더라도 기본 메커니즘을 이해하는 것이 중요합니다—직접 파이프라인을 구현하면 가중치, 정규화, 랭킹 로직을 세밀하게 조정할 수 있습니다.

5. 평가 및 반복

  1. 테스트 세트를 만들어 질의와 해당 질의에 대한 정답 문서를 준비합니다.
  2. 하이브리드 파이프라인을 실행하고 Recall@k, NDCG, MRR 같은 지표를 계산합니다.
  3. α를 조정하거나(비선형 결합 시도) 원하는 정밀도와 재현율 사이의 균형을 얻을 때까지 반복합니다.

Summary

  • Semantic search는 문맥적 관련성을 제공하고, BM25는 정확한 용어 매칭을 보장합니다.
  • 두 방법을 각각 구현한 뒤, 가중치(α)를 조정하여 점수를 병합합니다.
  • 파이프라인을 직접 구성하거나 TurboPuffer, Haystack, Vespa와 같은 기존 도구를 활용할 수 있습니다.
  • 평가를 적절히 수행하는 것이 특정 사용 사례에 최적의 균형을 찾는 핵심입니다.

Hybrid search는 그리 복잡하지 않으며, 두 구성 요소를 갖추면 비교적 적은 추가 엔지니어링 노력으로도 검색 품질이 눈에 띄게 향상되는 것을 확인할 수 있습니다. 즐거운 검색 되세요!

에이전트형 하이브리드 검색

하이브리드 검색을 구현하면 Retrieval‑Augmented Generation (RAG) 시스템의 성능을 처음부터 크게 끌어올릴 수 있습니다. 하지만 하이브리드‑검색 RAG 파이프라인의 혜택을 최대화하고 싶다면 에이전트형으로 만드는 것이 좋습니다.

“에이전트형”이 의미하는 것

일반적인 RAG 흐름은 다음과 같습니다:

  1. 관련 문서 청크를 검색한다 (벡터 또는 키워드 검색).
  2. 해당 청크들을 LLM에 전달한다.
  3. 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에게 이런 수준의 자율성을 부여하는 것은 위험했을 것입니다. 오늘날 모델은 충분히 신뢰할 수 있어, 이와 같은 동적·도구 기반 접근 방식이 가능할 뿐만 아니라 권장됩니다.

핵심 요약

  1. 하이브리드 검색을 구현한다 (키워드 + 벡터).
  2. 검색을 호출 가능한 도구로 노출한다.
  3. LLM에게 결정권을 부여한다
    • 검색 질의를 어떻게 표현할지,
    • 몇 개의 청크를, 어떤 청크를 가져올지,
    • 키워드와 의미적 유사도 중 어느 쪽에 가중치를 둘지.

하이브리드 검색과 에이전트형 LLM을 결합하면 RAG 시스템을 크게 강화할 수 있으며, 정적인 벡터‑전용 파이프라인보다 훨씬 나은 결과를 얻을 수 있습니다.

결론

이 글에서는 RAG 시스템에 하이브리드 검색을 구현하는 방법과 RAG 파이프라인을 보다 정교하게 만들어 훨씬 더 좋은 결과를 얻는 방법에 대해 논의했습니다. 이 두 기술을 결합하면 정보 검색 스택의 성능을 크게 향상시킬 수 있으며, Claude Code와 같은 코딩 에이전트를 사용하면 매우 쉽게 구현할 수 있습니다. 저는 Agentex Systems가 정보 검색의 미래를 대표한다고 믿으며, 여러분의 에이전트에 하이브리드 검색 기능을 장착해 무거운 작업을 대신 처리하도록 권장합니다.

📚 리소스

0 조회
Back to Blog

관련 글

더 보기 »

PageIndex를 활용한 RAG 시스템 개선

전통적인 RAG의 숨겨진 문제 대부분의 RAG 파이프라인은 유사한 워크플로우를 따릅니다: 1. 문서를 청크로 분할합니다. 2. 각 청크를 embed로 변환합니다.