AnswerBuilder
AnswerBuilder
Generator를 포함한 파이프라인에서 그 응답(replies)을 파싱할 때 쓰는 컴포넌트예요.
파이프라인에서 가장 흔한 위치: (RAG 같은) 파이프라인에서 Generator 컴포넌트 뒤에 두고, 그 응답으로 GeneratedAnswer 객체를 만들 때 사용
필수 run 변수: query(쿼리 문자열), replies(Generator의 응답인 문자열 목록 또는 ChatMessage 객체 목록)
출력 변수: answers — GeneratedAnswer 객체 목록
API reference: Builders
GitHub link: https://github.com/deepset-ai/haystack/blob/main/haystack/components/builders/answer_builder.py
Package name: haystack-ai
출처: 문서
본문
Overview
AnswerBuilder는 쿼리와 Generator가 반환한 응답을 입력으로 받아 GeneratedAnswer 객체로 파싱해요. 선택적으로 Generator의 문서와 메타데이터도 입력으로 받아 GeneratedAnswer 객체를 풍부하게 만들 수 있습니다.
AnswerBuilder는 Chat Generator와 비-Chat Generator 모두에서 동작해요.
선택 pattern 파라미터는 응답에서 답변 텍스트를 어떻게 추출할지 정의합니다. 캡처 그룹이 최대 하나인 정규식이어야 해요. 캡처 그룹이 있으면 캡처 그룹이 매칭한 텍스트가 답변이 되고, 캡처 그룹이 없으면 전체 매치가 답변이 됩니다. pattern을 설정하지 않으면 전체 응답이 답변 텍스트로 사용돼요.
선택 reference_pattern 파라미터는 응답에서 참조된 문서를 파싱하는 정규식으로 설정할 수 있어요. 그러면 참조된 문서만 GeneratedAnswer 객체에 나열됩니다. Haystack은 문서가 입력 문서 목록의 인덱스로 참조되며 인덱스가 1부터 시작한다고 가정해요. 예를 들어 reference_pattern을 \\[(\\d+)\] 로 설정하면 "This is an answer[1]" 문자열에서 "1"을 찾습니다. reference_pattern을 설정하지 않으면 모든 입력 문서가 GeneratedAnswer 객체에 나열돼요.
Usage
On its own
아래는 Generator에서 받은 문자열일 수 있는 응답을 사용자 정의 정규식으로 파싱하는 AnswerBuilder 예시예요. 답변이 아닌 다른 텍스트는 빌더가 만든 GeneratedAnswer 객체에 포함되지 않습니다.
from haystack.components.builders import AnswerBuilder
builder = AnswerBuilder(pattern="Answer: (.*)")
builder.run(
query="What's the answer?",
replies=["This is an argument. Answer: This is the answer."],
)
In a pipeline
아래는 Generator가 반환한 응답에서 AnswerBuilder로 GeneratedAnswer 객체를 만드는 RAG 파이프라인 예시예요. 응답 텍스트 외에도 이 객체들은 쿼리, 참조된 문서, 그리고 Generator가 반환한 메타데이터를 담고 있어요.
from haystack import Pipeline
from haystack.document_stores.in_memory import InMemoryDocumentStore
from haystack.components.retrievers.in_memory import InMemoryBM25Retriever
from haystack.components.generators.chat import OpenAIChatGenerator
from haystack.components.builders.chat_prompt_builder import ChatPromptBuilder
from haystack.components.builders.answer_builder import AnswerBuilder
from haystack.utils import Secret
from haystack.dataclasses import ChatMessage
from haystack.dataclasses import Document
prompt_template = [
ChatMessage.from_system("You are a helpful assistant."),
ChatMessage.from_user(
"Given these documents, answer the question.\nDocuments:\n"
"{% for doc in documents %}{{ doc.content }}{% endfor %}\n"
"Question: {{query}}\nAnswer:",
),
]
docs = [
Document(content="The capital of France is Paris"),
Document(content="The capital of England is London"),
]
document_store = InMemoryDocumentStore()
document_store.write_documents(docs)
p = Pipeline()
p.add_component(
instance=InMemoryBM25Retriever(document_store=document_store),
name="retriever",
)
p.add_component(
instance=ChatPromptBuilder(
template=prompt_template,
required_variables={"query", "documents"},
),
name="prompt_builder",
)
p.add_component(
instance=OpenAIChatGenerator(api_key=Secret.from_env_var("OPENAI_API_KEY")),
name="llm",
)
p.add_component(instance=AnswerBuilder(), name="answer_builder")
p.connect("retriever", "prompt_builder.documents")
p.connect("prompt_builder", "llm.messages")
p.connect("llm.replies", "answer_builder.replies")
p.connect("retriever", "answer_builder.documents")
query = "What is the capital of France?"
result = p.run(
{
"retriever": {"query": query},
"prompt_builder": {"query": query},
"answer_builder": {"query": query},
},
)
print(result)
더 알아보기 (Learn more)
- Builders — 빌더 컴포넌트
- Generators — Generator 컴포넌트
- GeneratedAnswer — 데이터 클래스