在 deepset Studio 中构建 Agentic RAG 管道
使用 deepset Studio 构建一个 Agentic Haystack 管道,其中包含用于动态网络搜索的备用机制
2025年1月14日在本文中,我们将探讨如何在 deepset Studio(一个面向开发者的 AI 应用程序原型工具)上构建一个 Agentic 检索增强生成 (RAG) 管道。我们将首先构建一个基本的 RAG 管道,然后扩展该管道,加入一个备用机制,当数据库中找不到用户查询的答案时,该机制可以执行网络搜索。
本文也解决了 Advent of Haystack 2024 第 5 天的挑战:精灵的快速开发秘诀 💨
让我们深入研究,创建一个不仅能搜索,还能主动决策的管道。
创建 deepset Studio 账户
deepset Studio 是 Haystack 的开发环境。它允许您可视化地构建和测试 Haystack 管道。它是免费且对所有人开放的。在公告博客文章中了解更多关于 Studio 及其功能的信息。
要在 deepset Studio 上开始构建管道,您需要有一个账户。如果您还没有账户,请在此处注册以获取访问权限。
进入后,您可以完成入门教程,或稍后在左侧边栏中返回。左侧边栏还有一些相关选项卡,例如“文件”、“管道模板”和“管道”。
添加文件
为简单起见,我们将使用 Studio 自带的“AI”示例文件。当然,您也可以在 Studio 中使用自己的文件。如果您想上传自己的文件,有两种选择:您可以使用 Studio 使用的内置数据库,这是一个OpenSearch实例,或者您可以远程连接到您的Weaviate、Pinecone、Qdrant、ElasticSearch实例。
构建初始 RAG 管道
查看在管道构建器中创建管道以获得更详细的解释。
要开始构建管道,我们需要切换到“管道模板”选项卡。在这里,您可以找到针对不同用例(RAG、聊天、摘要、文档相似性等)的多个预构建管道(包含组件、模型和最佳参数),以加速构建过程并避免从头开始。
找到“RAG Question Answering GPT-4o”并点击“使用模板”。在模态屏幕上,您可以更改默认名称或将其保留原样。点击“创建管道”将带您进入管道构建器,这是一个用于创建和编辑管道的拖放界面。
此模板管道附带一个全面的索引管道,该管道处理所有文件类型,将它们分割成块,并使用intfloat/e5-base-v2模型创建嵌入。查询管道具有混合检索和一个Ranker,并使用 OpenAI 的gpt-4o进行生成。
⚠️ 如果您使用的是自己的数据库实例,则需要相应地更新您的索引管道。有关更多信息,请参阅连接到外部文档存储。
我们将保持索引管道不变,但更新查询管道以包含网络搜索备用机制。
在 RAG 管道中纳入备用机制
我们希望我们的管道通过动态决定其行动方案来表现出 Agentic 行为。具体来说,它将首先在我们数据库上执行 RAG,如果无法解决查询,它将智能地切换到网络搜索备用。这种决策能力类似于 Agentic 设计,增强了管道的健壮性和灵活性。
我们已经有一个有效的 RAG 管道,我们将对其进行扩展,加入额外的组件以包含网络备用机制。
阅读教程:使用条件路由构建备用机制以进行网络搜索,以了解如何设计具有备用机制的 Haystack 管道。
更新默认提示
在扩展的 RAG 管道中,Generator 组件中使用的 LLM 将具有双重功能。除了根据数据库中的文档生成答案外,它还应该指示何时无法根据给定文档生成答案。模板管道已经包含了一个广泛的提示,所以您所要做的就是用指令来稍微调整一下提示,如果文档无法回答问题,则返回NO_ANSWER。这是我们将使用的新的提示:
You are a technical expert.
You answer questions truthfully based on provided documents.
Ignore typing errors in the question.
For each document check whether it is related to the question.
Only use documents that are related to the question to answer it.
Ignore documents that are not related to the question.
If the answer exists in several documents, summarize them.
Only answer based on the documents provided. Don't make things up.
Just output the structured, informative and precise answer and nothing else.
If the documents can't answer the question, say "NO_ANSWER".
Always use references in the form [NUMBER OF DOCUMENT] when using information from a document, e.g. [3] for Document[3].
Never name the documents, only enter a number in square brackets as a reference.
The reference must only refer to the number that comes in square brackets after the document.
Otherwise, do not use brackets in your answer and reference ONLY the number of the document without mentioning the word document.
These are the documents:
{% for document in documents %}
Document[{{ loop.index }}]:
Name of Source File: {{ document.meta.file_name }}
{{ document.content }}
{% endfor %}
Question: {{ question }}
Answer:
添加 ConditionalRouter
在 Haystack 中,路由是构建管道中的备用机制并启用 Agentic 行为的最便捷方式。Router 组件可以根据某些条件或输入规范(例如元数据或文件类型)将输入定向到不同的分支。
在本例中,我们将添加ConditionalRouter组件,以帮助管道根据 LLM 的响应决定是继续处理数据库查询结果还是调用网络搜索分支。此组件将连接到OpenAIGenerator并检查 LLM 响应。如果响应包含关键字NO_ANSWER,它将把查询定向到网络搜索分支。如果没有,则搜索将被终止。您需要在ConditionalRouter中定义条件以实现此目的:
- condition: '{{''NO_ANSWER'' in replies[0]}}'
output: '{{query}}'
output_name: go_to_web
output_type: str
- condition: '{{''NO_ANSWER'' not in replies[0]}}'
output: '{{replies}}'
output_name: replies
output_type: typing.List[str]
这些条件将为ConditionalRouter创建两个输出/边:“replies”和“go_to_web”。“replies”边将连接到AnswerBuilder,因为它完成了搜索,而“go_to_web”边将连接到网络搜索分支。
创建网络搜索分支
备用分支将是一个简单的 RAG 管道,但这次我们将使用SerperDevWebSearch而不是 Retriever,它是WebSearch组件之一。此组件将从ConditionalRouter获取查询,并从网络检索相关信息。网络搜索管道将继续使用一个新的PromptBuilder、Generator和AnswerBuilder。作为提示,这次我们可以使用一个更短的提示:
Answer the following query given the documents retrieved from the web.
Your answer should indicate that your answer was generated from websearch.
Documents:
{% for document in documents %}
{{document.content}}
{% endfor %}
Query: {{query}}
对于生成器,我们可以再次通过OpenAIGenerator使用gpt-4o模型。
处理收尾工作
在 deepset Studio 中,查询管道必须以“Output”节点结尾,该节点可以返回 Answer 列表、Document 列表或两者都返回。AnswerBuilder是一个方便的组件,它使用查询、LLM 答案和其他可选信息(例如文档或元数据)来构建 Answer 对象。由于我们在这里从两个不同的分支获取 Answer 对象,因此我们还需要一个AnswerJoiner来连接 Answer 列表并将它们传递给“Output”节点。
完成后,管道应如下所示:
⚠️ 在继续之前,不要忘记按“保存”以保留所有这些更改🙂
添加 API 密钥
在部署并开始测试管道之前,我们需要将OPENAI_API_KEY和SERPERDEV_API_KEY添加到 deepset Studio。您需要在右上角菜单中的“连接”中为 OpenAI 设置,为 Serper 在“Secrets”中设置。
部署和测试管道
完成以上所有步骤后,部署管道。此过程可能需要一些时间,因为部署后,deepset Studio 会设置一个文档存储实例,处理所有文件,创建嵌入并对其进行索引。当一切完成后,您将在管道上看到Indexed标签。
部署完成后,您可以在 Playground 中测试您的管道。您可以在侧边栏找到“Playground”选项卡。此 UI 使您能够对管道运行一些查询并检查响应。您可以尝试使用查询“What’s Compound AI?”。然后,询问圣诞老人的生日,以确认管道在需要时是否使用了备用分支。
💡 提示
- 尝试一些查询并使用按钮对每个答案进行评分。这将帮助您系统地收集反馈并了解管道的性能。
- 如果您与他人合作,您可以与他们分享您的管道。
- 当您完成开发和测试后,您可以轻松地将管道导出为 Python 或 YAML 格式,以部署在您自己的基础设施中,或升级到 deepset Cloud,这是 deepset Studio 的企业版。
结论
在本文中,我们演示了如何在 deepset Studio 中构建、部署和测试 Agentic Haystack 管道,该管道智能地从数据库搜索切换到网络搜索,而无需担心底层基础设施。
Haystack 的模块化设计,结合 deepset Studio 的用户友好环境,使得复杂的 AI 应用程序的开发对每个人都变得容易,从初学者到经验丰富的开发人员。开始使用 Haystack,并立即获取您的免费 deepset Studio 账户!
