FilterRetriever

FilterRetriever

특정 필터와 일치하는 Document를 가져오기 위해 어떤 Document Store와도 함께 쓸 수 있는 Retriever 구성 요소예요.

출처: 문서

본문

FilterRetriever는 제공된 필터와 일치하는 Document를 검색해요. 특별한 종류의 Retriever라서, 단 하나의 스토어에 특화되지 않고 모든 Document Store와 함께 작업할 수 있어요. 다만 다른 Retriever처럼 초기화 시점에 어떤 Document Store가 필요하고, 그 인스턴스의 콘텐츠에 대해서만 필터링을 수행해요. 따라서 다른 Retriever처럼 파이프라인에서 사용할 수 있어요.

많은 Document가 포함된 Document Store에서 FilterRetriever를 쓸 때 주의해야 해요. 필터와 일치하는 모든 문서를 반환하거든요. 필터 없는 run 명령은 파이프라인의 다른 구성 요소(예: Generator)를 쉽게 압도할 수 있어요:

filter_retriever.run({})

또 하나 주의할 점은 FilterRetriever가 Document를 점수화하거나 어떤 식으로든 순위를 매기지 않는다는 거예요. 쿼리와의 유사성으로 문서를 순위 매기려면 Ranker 구성 요소를 고려하세요.

  • 대표적인 파이프라인 위치: 파이프라인의 시작
  • 필수 init 변수: document_store — Document Store 인스턴스
  • 필수 run 변수: filters — Document Store가 지원하는 것과 동일한 문법의 필터 딕셔너리
  • 출력 변수: documents — 필터와 일치하는 모든 문서
  • API reference: Retrievers
  • 패키지명: haystack-ai

Usage ​

On its own ​

from haystack import Document
from haystack.components.retrievers import FilterRetriever
from haystack.document_stores.in_memory import InMemoryDocumentStore

docs = [
    Document(content="Python is a popular programming language", meta={"lang": "en"}),
    Document(
        content="python ist eine beliebte Programmiersprache",
        meta={"lang": "de"},
    ),
]
doc_store = InMemoryDocumentStore()
doc_store.write_documents(docs)

retriever = FilterRetriever(doc_store)
result = retriever.run(filters={"field": "lang", "operator": "==", "value": "en"})

assert "documents" in result
assert len(result["documents"]) == 1
assert result["documents"][0].content == "Python is a popular programming language"

In a RAG pipeline ​

OPENAI_API_KEY를 환경 변수로 설정하고 다음 코드를 실행하세요:

from haystack.components.retrievers.filter_retriever import FilterRetriever
from haystack.document_stores.in_memory import InMemoryDocumentStore
from haystack import Document, Pipeline
from haystack.components.builders import ChatPromptBuilder
from haystack.components.generators.chat import OpenAIChatGenerator
from haystack.dataclasses import ChatMessage
from haystack.document_stores.types import DuplicatePolicy

# OpenAIChatGenerator reads the OPENAI_API_KEY environment variable by default.

document_store = InMemoryDocumentStore()
documents = [
    Document(content="Mark lives in Berlin.", meta={"year": 2018}),
    Document(content="Mark lives in Paris.", meta={"year": 2021}),
    Document(content="Mark is Danish.", meta={"year": 2021}),
    Document(content="Mark lives in New York.", meta={"year": 2023}),
]
document_store.write_documents(documents=documents)

# Create a RAG query pipeline
prompt_template = [
    ChatMessage.from_user(
        """
    Given these documents, answer the question.\nDocuments:
    {% for doc in documents %}
        {{ doc.content }}
    {% endfor %}
    \nQuestion: {{question}}
    \nAnswer:
    """,
    ),
]

rag_pipeline = Pipeline()
rag_pipeline.add_component(
    name="retriever",
    instance=FilterRetriever(document_store=document_store),
)
rag_pipeline.add_component(
    instance=ChatPromptBuilder(template=prompt_template, required_variables="*"),
    name="prompt_builder",
)
rag_pipeline.add_component(instance=OpenAIChatGenerator(), name="llm")
rag_pipeline.connect("retriever", "prompt_builder.documents")
rag_pipeline.connect("prompt_builder.prompt", "llm.messages")

result = rag_pipeline.run(
    {
        "retriever": {"filters": {"field": "year", "operator": "==", "value": 2021}},
        "prompt_builder": {"question": "Where does Mark live?"},
    },
)
print(result["llm"]["replies"][0].text)

이런 예시 출력을 볼 수 있을 거예요:

According to the provided documents, Mark lives in Paris.

더 알아보기 (Learn more)

  • Retrievers API reference를 확인하세요.