文档API 参考📓 教程🧑‍🍳 食谱🤝 集成💜 Discord🎨 Studio
文档

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)

相关链接

在我们的 API 参考中查看参数详情