AnswerBuilder
在包含 Generator 的 pipeline 中使用此组件来解析其回复。
| pipeline 中的最常见位置 | 在 pipeline(例如 RAG pipeline)中使用,在 Generator 组件之后,用于从其回复创建 GeneratedAnswer 对象。 |
| 强制运行变量 | “query”: 查询字符串 “replies”: 字符串列表,或 ChatMessage 对象列表,它们是 Generator 的回复 |
| 输出变量 | “answers”: 一个列表,其中包含GeneratedAnswer 对象 |
| API 参考 | Builders (构建器) |
| GitHub 链接 | https://github.com/deepset-ai/haystack/blob/main/haystack/components/builders/answer_builder.py |
概述
AnswerBuilder 接收查询和 Generator 返回的回复作为输入,并将它们解析为GeneratedAnswer 对象。它还可以选择性地接受 Generator 返回的文档和元数据作为输入,以丰富GeneratedAnswer 对象。
该AnswerBuilder 可与聊天和非聊天 Generator 一起使用。
可选的pattern 参数定义了如何从回复中提取答案文本。它必须是一个最多包含一个捕获组的正则表达式。如果存在捕获组,则将捕获组匹配的文本用作答案。如果不存在捕获组,则将整个匹配项用作答案。如果没有设置pattern,则整个回复都将用作答案文本。
可选的可以设置 reference_pattern 参数为一个正则表达式,用于解析回复中的引用文档,以便只有这些引用文档会列在GeneratedAnswer 对象中。Haystack 假定文档通过其在输入文档列表中的索引来引用,并且索引从 1 开始。例如,如果您将reference_pattern 设置为 \\[(\\d+)\\],它会在字符串 "This is an answer[1]" 中找到 "1"。如果reference_pattern 未设置,则所有输入文档都会列在GeneratedAnswer 对象。
用法
单独使用
下面是一个示例,我们使用AnswerBuilder 来解析一个可能是 Generator 返回的回复的字符串,并使用自定义正则表达式。除了答案之外的任何文本都不会包含在由生成器构建的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."])
在 pipeline 中
下面是一个 RAG pipeline 的示例,我们在其中使用AnswerBuilder 来从 Generator 返回的回复中创建GeneratedAnswer 对象。除了回复文本外,这些对象还包含 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
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:"
)
]
p = Pipeline()
p.add_component(instance=InMemoryBM25Retriever(document_store=InMemoryDocumentStore()), 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)
更新于 大约 2 个月前
