AzureAISearchHybridRetriever

AzureAISearchHybridRetriever

조밀(dense) 및 희소(sparse) 임베딩을 모두 기반으로 하며 Azure AI Search Document Store와 호환되는 Retriever예요.

이 Retriever는 임베딩 기반 검색과 BM25 텍스트 검색을 결합해 검색 인덱스에서 더 관련성 높은 문서를 찾습니다.

파이프라인에서 가장 흔한 위치:

  1. RAG 파이프라인에서 TextEmbedder 다음, PromptBuilder 앞
  2. 하이브리드 검색 파이프라인의 마지막 컴포넌트
  3. 추출형 QA 파이프라인에서 TextEmbedder 다음, TransformersExtractiveReader 앞

필수 init 변수: document_store — AzureAISearchDocumentStore 인스턴스 필수 run 변수: query(문자열), query_embedding(float 목록) 출력 변수: documents — 쿼리와 일치하는 문서 목록 API reference: Azure AI Search GitHub link: https://github.com/deepset-ai/haystack-core-integrations/tree/main/integrations/azure_ai_search Package name: azure-ai-search-haystack

출처: 문서

본문

Overview

AzureAISearchHybridRetriever는 벡터 검색과 BM25 텍스트 검색을 결합해 AzureAISearchDocumentStore에서 관련 문서를 가져와요. 텍스트(키워드) 쿼리와 쿼리 임베딩을 단일 요청으로 처리하며 모든 하위 쿼리를 병렬로 실행합니다. 결과는 Rank Fusion(RRF)으로 병합·재정렬되어 통합된 결과 집합을 만듭니다.

query와 query_embedding 외에도 AzureAISearchHybridRetriever는 top_k(가져올 최대 문서 수)와 검색을 다듬는 filters 같은 선택 파라미터를 받아요. 추가 커스터마이즈를 위해 초기화 때 추가 키워드 인자를 전달할 수도 있습니다.

검색 인덱스에 의미 구성(semantic configuration)이 포함되어 있다면, 의미 순위 매김을 활성화해 Retriever의 결과에 적용할 수 있어요. 자세한 내용은 Azure AI 문서를 참고하세요.

순수 키워드 기반 검색에는 AzureAISearchBM25Retriever를, 임베딩 기반 검색에는 AzureAISearchEmbeddingRetriever를 사용할 수 있어요.

Usage

Installation

이 통합을 쓰려면 배포된 Azure AI Search 서비스가 있는 활성 Azure 구독이 있어야 해요.

Haystack에서 Azure AI 검색을 쓰려면 패키지를 설치하세요:

pip install azure-ai-search-haystack

On its own

이 Retriever는 실행하려면 AzureAISearchDocumentStore와 인덱싱된 문서가 필요해요.

from haystack import Document
from haystack_integrations.components.retrievers.azure_ai_search import (
    AzureAISearchHybridRetriever,
)
from haystack_integrations.document_stores.azure_ai_search import (
    AzureAISearchDocumentStore,
)

document_store = AzureAISearchDocumentStore(index_name="haystack_docs")
documents = [
    Document(content="There are over 7,000 languages spoken around the world today."),
    Document(
        content="Elephants have been observed to behave in a way that indicates a high level of self-awareness, such as recognizing themselves in mirrors.",
    ),
    Document(
        content="In certain parts of the world, like the Maldives, Puerto Rico, and San Diego, you can witness the phenomenon of bioluminescent waves.",
    ),
]
document_store.write_documents(documents=documents)

retriever = AzureAISearchHybridRetriever(document_store=document_store)
# fake embeddings to keep the example simple
retriever.run(
    query="How many languages are spoken around the world today?",
    query_embedding=[0.1] * 384,
)

In a RAG pipeline

다음 예시는 파이프라인에서 AzureAISearchHybridRetriever를 사용하는 방법을 보여줘요. 인덱싱 파이프라인은 임베딩이 있는 문서를 AzureAISearchDocumentStore에 인덱싱·저장하고, 쿼리 파이프라인은 주어진 쿼리에 기반해 하이브리드 검색으로 관련 문서를 가져옵니다.

이 페이지의 예시는 sentence-transformers-haystack 패키지의 Sentence Transformers 임베더를 사용해요. 예시를 실행하려면 설치하세요:

pip install sentence-transformers-haystack
from haystack import Document, Pipeline
from haystack_integrations.components.embedders.sentence_transformers import (
    SentenceTransformersDocumentEmbedder,
    SentenceTransformersTextEmbedder,
)
from haystack.components.writers import DocumentWriter
from haystack_integrations.components.retrievers.azure_ai_search import (
    AzureAISearchHybridRetriever,
)
from haystack_integrations.document_stores.azure_ai_search import (
    AzureAISearchDocumentStore,
)

document_store = AzureAISearchDocumentStore(index_name="hybrid-retrieval-example")
model = "sentence-transformers/all-mpnet-base-v2"
documents = [
    Document(content="There are over 7,000 languages spoken around the world today."),
    Document(
        content="""Elephants have been observed to behave in a way that indicates a         
        high level of self-awareness, such as recognizing themselves in mirrors.""",
    ),
    Document(
        content="""In certain parts of the world, like the Maldives, Puerto Rico, and          
        San Diego, you can witness the phenomenon of bioluminescent waves.""",
    ),
]
document_embedder = SentenceTransformersDocumentEmbedder(model=model)

# Indexing Pipeline
indexing_pipeline = Pipeline()
indexing_pipeline.add_component(instance=document_embedder, name="doc_embedder")
indexing_pipeline.add_component(
    instance=DocumentWriter(document_store=document_store),
    name="doc_writer",
)
indexing_pipeline.connect("doc_embedder", "doc_writer")
indexing_pipeline.run({"doc_embedder": {"documents": documents}})

# Query Pipeline
query_pipeline = Pipeline()
query_pipeline.add_component(
    "text_embedder",
    SentenceTransformersTextEmbedder(model=model),
)
query_pipeline.add_component(
    "retriever",
    AzureAISearchHybridRetriever(document_store=document_store),
)
query_pipeline.connect("text_embedder.embedding", "retriever.query_embedding")

query = "How many languages are there?"
result = query_pipeline.run(
    {"text_embedder": {"text": query}, "retriever": {"query": query}},
)
print(result["retriever"]["documents"][0])
# ... (출력 계속, 원문 참조)

더 알아보기 (Learn more)