虽然检索增强生成 (RAG) 主导了 2023 年,但代理工作流程将在 2024 年推动巨大进步。AI 代理的使用为构建更强大、更稳健、更通用的大型语言模型 (LLM) 驱动的应用程序开辟了新的可能性。一种可能性是使用代理 RAG 管道中的 AI 代理来增强 RAG 管道。本文将介绍Agentic RAG 的概念、其实现以及其优点和局限性。Agentic RAG 描述了基于 AI 代理的 RAG 实现。在进一步讨论之前,让我们快速回顾一下 RAG 和 AI 代理的基本概念。检索增强生成 (RAG)是一种构建 LLM 驱动应用程序的技术。它利用外部知识源为 LLM 提供相关背景并减少幻觉。一个简单的 RAG 管道由一个检索组件(通常由一个嵌入模型和一个向量数据库组成)和一个生成组件(LLM)组成。在推理时,用户查询用于对索引文档运行相似性搜索,以检索与查询最相似的文档并为 LLM 提供额外的上下文。- 简单的 RAG 管道仅考虑一个外部知识源。但是,有些解决方案可能需要两个外部知识源,而有些解决方案可能需要外部工具和 API,例如网络搜索。
- 它们是一次性解决方案,这意味着上下文只被检索一次。对检索到的上下文的质量没有任何推理或验证。
随着 LLM 的流行,出现了新的 AI 代理和多代理系统范式。AI 代理是具有角色和任务的 LLM,可以访问内存和外部工具。LLM 的推理能力可帮助代理规划所需步骤并采取行动完成手头的任务。一个流行的框架是ReAct 框架。ReAct 代理可以通过将路由、查询规划和工具使用组合成一个实体来处理顺序的多部分查询,同时保持状态(在内存中)。ReAct = Reason + Act(LLMs)
1、思考:收到用户查询后,代理会推断下一步要采取的行动 2、行动:代理决定一个动作并执行它(例如,使用工具)Agentic RAG 描述了一种基于 AI 代理的 RAG 实现。具体来说,它将 AI 代理整合到 RAG 管道中,以协调其组件并执行除简单信息检索和生成之外的其他操作,以克服非代理管道的局限性。Agentic RAG 描述了基于 AI 代理的 RAG 实现。尽管代理可以纳入 RAG 管道的不同阶段,但代理 RAG 最常指的是在检索组件中使用代理。具体来说,检索组件通过使用可访问不同检索工具的检索代理而变得具有代理性,例如:- 矢量搜索引擎(也称为查询引擎),通过矢量索引执行矢量搜索(如在典型的 RAG 管道中)
- 任何以编程方式访问软件的 API,例如电子邮件或聊天程序
然后,RAG 代理可以根据以下示例检索场景进行推理并采取行动:与顺序式简单 RAG 架构相比,代理式 RAG 架构的核心是代理。代理式 RAG 架构可以具有各种复杂程度。在最简单的形式中,单代理 RAG 架构是一个简单的路由器。但是,您也可以将多个代理添加到多代理 RAG 架构中。本节讨论了两种基本的 RAG 架构。最简单的形式是,agentic RAG 是一个路由器。这意味着您至少有两个外部知识源,代理决定从哪个源检索其他上下文。但是,外部知识源不必局限于(矢量)数据库。您也可以从工具中检索更多信息。例如,您可以进行网络搜索,或者您可以使用 API 从 Slack 频道或您的电子邮件帐户检索其他信息。正如您所猜测的,单代理系统也有其局限性,因为它仅限于一个代理,集推理、检索和答案生成于一体。因此,将多个代理链接到多代理 RAG 应用程序中是有益的。例如,您可以让一个主代理协调多个专门检索代理之间的信息检索。例如,一个代理可以从专有的内部数据源检索信息。另一个代理可以专门从您的个人帐户(例如电子邮件或聊天)检索信息。另一个代理还可以专门从网络搜索中检索公开信息。上述示例展示了不同检索代理的用法。但是,您也可以将代理用于检索以外的目的。RAG 系统中代理的可能性是多种多样的。Agentic RAG vs (Vanilla) RAG虽然 RAG 的基本概念(发送查询、检索信息和生成响应)保持不变,但工具的使用对其进行了概括,使其更加灵活和强大。可以这样想:普通(原始)RAG 就像在图书馆(智能手机出现之前)回答特定问题。另一方面,Agentic RAG 就像手中拿着一部智能手机,上面有网络浏览器、计算器、电子邮件等。如前所述,代理由多个组件组成。要构建代理 RAG 管道,有两种选择:具有函数调用的语言模型或代理框架。两种实现都会得到相同的结果,这只取决于您想要的控制和灵活性。语言模型是代理 RAG 系统的主要组件。另一个组件是工具,它使语言模型能够访问外部服务。具有函数调用的语言模型提供了一种构建代理系统的方法,允许模型与预定义的工具进行交互。语言模型提供商已将此功能添加到他们的客户中。2023 年 6 月,OpenAI 发布了函数调用和gpt-3.5-turbo。gpt-4它使这些模型能够将 GPT 的功能与外部工具和 API 可靠地连接起来。开发人员迅速开始构建可插入gpt-4代码执行器、数据库、计算器等的应用程序。Cohere进一步推出了其连接器 API,为 Command-R 模型套件添加工具。此外,Anthropic和Google还推出了针对 Claude 和 Gemini 的函数调用。通过为这些模型提供外部服务,它可以访问和引用 Web 资源、执行代码等。函数调用不仅适用于专有模型。Ollama 引入了对流行开源模型(如Llama3.2、nemotron-mini等)的工具支持。要构建工具,首先需要定义函数。在此代码片段中,我们正在编写一个函数,该函数使用 Weaviate 的混合搜索从数据库中检索对象:def get_search_results(query: str) -> str:
"""Sends a query to Weaviate's Hybrid Search. Parses the response into a {k}:{v} string."""
response = blogs.query.hybrid(query, limit=5)
stringified_response = ""
for idx, o in enumerate(response.objects):
stringified_response += f"Search Result: {idx+1}:\n"
for prop in o.properties:
stringified_response += f"{prop}:{o.properties[prop]}"
stringified_response += "\n"
return stringified_response
然后,我们将通过 将该函数传递给语言模型tools_schema。然后,该模式将在语言模型的提示中使用:tools_schema=[{'type': 'function','function': {'name': 'get_search_results','description': 'Get search results for a provided query.','parameters': {'type': 'object','properties': {'query': {'type': 'string','description': 'The search query.',},},'required': ['query'],},},}]
由于您直接连接到语言模型 API,因此您需要编写一个在语言模型和工具之间路由的循环:
def ollama_generation_with_tools(user_message: str,
tools_schema: List, tool_mapping: Dict,
model_name: str = "llama3.1") -> str:
messages=[{
"role": "user",
"content": user_message
}]
response = ollama.chat(
model=model_name,
messages=messages,
tools=tools_schema
)
if not response["message"].get("tool_calls"):
return response["message"]["content"]
else:
for tool in response["message"]["tool_calls"]:
function_to_call = tool_mapping[tool["function"]["name"]]
print(f"Calling function {function_to_call}...")
function_response = function_to_call(tool["function"]["arguments"]["query"])
messages.append({
"role": "tool",
"content": function_response,
})
final_response = ollama.chat(model=model_name, messages=messages)
return final_response["message"]["content"]
ollama_generation_with_tools("How is HNSW different from DiskANN?",tools_schema=tools_schema, tool_mapping=tool_mapping)
- DSPy、LangChain、CrewAI、LlamaIndex 和 Letta 等代理框架已经出现,以促进使用语言模型构建应用程序。这些框架通过将预构建的模板组合在一起,简化了agentic RAG 系统的构建。
- DSPy 支持ReAct代理和Avatar优化。Avatar 优化描述了每个工具描述中自动提示工程的使用。
- LangChain提供许多使用工具的服务。LangChain 的LCEL和LangGraph框架进一步提供了内置工具。
- LlamaIndex进一步引入了 QueryEngineTool,一组检索工具的模板集合。
- CrewAI是开发多智能体系统的领先框架之一。工具使用的关键概念之一是在智能体之间共享工具。
- Swarm是 OpenAI 为多智能体编排而构建的框架。Swarm 同样专注于智能体之间如何共享工具。
- Letta将反映和改进内部世界模型作为函数进行交互。除了回答问题之外,这还可能使用搜索结果来更新代理对聊天机器人用户的记忆。
企业为什么要采用Agentic RAG
企业正在从vanilla RAG转向构建agentic RAG应用程序。Replit发布了一个代理,帮助开发人员构建和调试软件。此外,微软还提出了copilots与用户一起工作,为用户完成任务提供建议。这些只是生产中的代理的几个例子,可能性是无穷无尽的。从vanilla RAG到agentic RAG的转变使这些系统能够产生更准确的响应,自主执行任务,并更好地与人类合作。agentic RAG的好处主要在于改进了检索到的附加信息的质量。通过添加具有工具使用权限的代理,检索代理可以将查询路由到专门的知识来源。此外,代理的推理能力允许在检索上下文用于进一步处理之前对其进行一层验证。因此,agentic RAG管道可以导致更健壮和准确。然而,凡事都有两面性。在子任务中使用AI agent意味着结合LLM来完成任务。这伴随着在任何应用程序中使用llm的限制,例如增加延迟和不可靠性。根据LLM的推理能力,代理可能无法充分完成任务(甚至根本无法完成任务)。当AI agent无法完成任务时,加入适当的失败模式来帮助他们摆脱困境是很重要的。