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를 확인하세요.