最近总听说RAG,RAG到底是什么呢?本文将向你介绍代理型 RAG 的概念、实施方法,以及其优势与局限性。
什么是检索增强生成(RAG)
检索增强生成(RAG)是一种用于构建大型语言模型(LLM)驱动型应用的技术。它借助外部知识源,为大型语言模型提供相关背景信息,从而减少幻觉现象。就好比给 LLM 配备了一个小型的“资料库”,当用户提出问题时,系统会在资料库中查找相关内容并提供给 LLM,以帮助其生成更准确的回答。
基本的 RAG 流程包括检索组件(通常由嵌入模型和向量数据库组成)和生成组件(大型语言模型)。在推理阶段,用户问题用于在已索引的文档上执行相似性搜索,检索出与问题最相似的文档,并为大型语言模型提供额外的背景信息。
典型的 RAG 应用存在两个显著局限:
- 简单的 RAG 流程仅考虑一个外部知识源。然而,有些解决方案可能需要两个外部知识源,有些解决方案可能需要外部工具和 API,例如网络搜索。
- 它是一次性解决方案,即仅检索一次背景信息。对检索到的背景信息的质量没有进行推理或验证。
人工智能系统中的Agents是什么?
随着大型语言模型(LLM)的流行,人工智能代理和多代理系统的新范式应运而生。人工智能代理是具有角色和任务的大型语言模型,可以访问内存和外部工具。大型语言模型的推理能力有助于代理规划所需步骤并采取行动以完成当前任务。
举个例子,一个智能旅行规划代理可以帮助你规划旅行路线。它会先思考“用户需要一个旅行路线”这个任务,然后决定使用网络搜索工具查找目的地的景点和酒店,接着分析搜索结果并拟定旅行计划,最后将计划呈现给你。在这个过程中,它不断地思考、行动、观察,直到完成任务。
因此,人工智能代理的核心组件是:
- 大型语言模型(具有角色和任务)
- 内存(短期和长期)
- 规划(例如,反思、自我批评、查询路由等)
- 工具(例如,计算器、网络搜索等)
一个流行框架是 ReAct 框架。ReAct 代理可以通过将路由、查询规划和工具使用整合到一个实体中,来处理顺序多部分查询,同时通过维护状态(在内存中)。
ReAct = 推理 + 行动(借助大型语言模型)
该过程涉及以下步骤:
思考:在接收到用户查询后,代理对下一步要采取的行动进行推理。
行动:代理决定一个行动并执行它(例如,使用工具)。
观察:代理观察该行动的反馈。
这个过程不断迭代,直到代理完成任务并回复用户。
什么是代理型 RAG?
代理型 RAG 是一种基于人工智能代理来实现检索增强生成(RAG)的方法。具体来说,它将人工智能代理引入 RAG 流程中,协调其组件并执行简单信息检索与生成之外的更多操作,以此克服非代理型流程的局限。
代理型 RAG 如何工作?
尽管可以在 RAG 流程的不同阶段引入代理,但代理型 RAG 通常指的是在检索组件中使用代理。具体来说,通过使用具有访问不同检索工具权限的检索代理,检索组件具备了代理的特性,这些工具有:
- 向量搜索引擎(也称为查询引擎),可在向量索引上执行向量搜索(如同在典型的 RAG 流程中)
- 网络搜索
- 计算器
- 任何可编程访问软件的 API,例如电子邮件或聊天程序
- 以及其他更多工具。
然后,RAG 代理可在以下示例检索场景中进行推理和行动:
- 决定是否检索信息
- 决定使用哪种工具来检索相关信息
- 拟定查询本身
- 评估检索到的上下文并决定是否需要重新检索。
代理型 RAG 架构
与顺序的简单 RAG 架构不同,代理型 RAG 架构的核心是代理。代理型 RAG 架构可以具有不同程度的复杂性。最简单的形式是单代理 RAG 架构,即简单路由。但你也可以在多代理 RAG 架构中添加多个代理。本节将讨论两种基本的 RAG 架构。
单代理 RAG(路由)
在最简单的形式中,代理型 RAG 是一个路由。这意味着至少有两个外部知识源,代理决定从哪一个检索额外的上下文。然而,外部知识源不必局限于(向量)数据库。你也可以通过工具检索进一步的信息。例如,你可以进行网络搜索,或者使用 API 从 Slack 频道或你的电子邮件账户中检索额外的信息。
多代理 RAG 系统
正如你所能推测的,单代理系统也存在局限性,因为它仅限于一个集推理、检索和答案生成于一身的代理。因此,将多个代理串联成一个多代理 RAG 应用是很有益的。
例如,你可以设置一个主管代理,让它协调多个专门化检索代理之间的信息检索工作。比如,一个代理可以从专有的内部数据源检索信息,另一个代理可以专门从你的个人账户(如电子邮件或聊天记录)中检索信息,还有一个代理则可以专注于从网络搜索中获取公开信息。
超越检索代理
以上示例展示了不同类型检索代理的用法。然而,你也可以将代理用于检索之外的其他目的。代理在 RAG 系统中的可能性是多方面的。
代理型 RAG 与(普通)RAG 的对比
虽然 RAG 的基本概念(发送查询、检索信息和生成响应)保持不变,但工具的使用使其更加灵活和强大。
可以这样理解:普通的(基础)RAG 就像在智能手机出现之前的图书馆里回答特定问题。而代理型 RAG 则如同手中拿着一部带有网页浏览器、计算器、电子邮件等应用的智能手机。
实现代理型 RAG
如前所述,代理由多个组件构成。要构建代理型 RAG 流程,有两种选择:具有功能调用的语言模型或代理框架。两种实现方式最终都能达到相同的结果,区别仅在于你所期望的控制程度和灵活性。
具有功能调用的语言模型
语言模型是代理型 RAG 系统的主要组件。另一个组件是工具,它使语言模型能够访问外部服务。具有功能调用的语言模型提供了一种构建代理系统的方法,通过允许模型与预定义工具交互。语言模型提供商已将此功能添加到他们的客户端。
2023 年 6 月,OpenAI 为 gpt-3.5-turbo 和 gpt-4 推出了功能调用。这使得这些模型能够可靠地将 GPT 的功能与外部工具和 API 结合起来。开发者迅速开始构建应用程序,将 gpt-4 集成到代码执行器、数据库、计算器等工具中。
Cohere 进一步推出了他们的连接器 API,为 Command-R 系列模型添加工具。此外,Anthropic 和 Google 也为 Claude 和 Gemini 推出了功能调用。通过为这些模型提供外部服务支持,它们能够访问和引用网络资源、执行代码等。
功能调用不仅限于专有模型。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=[{
'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"]
你可以按照这个配方来重现上述内容。
代理框架
诸如 DSPy、LangChain、CrewAI、LlamaIndex 和 Letta 等代理框架已经出现,以方便使用语言模型构建应用。这些框架通过组合预制模板简化了构建代理型 RAG 系统的过程。
DSpy 支持 ReAct 代理和头像优化。头像优化描述了为每个工具的描述使用自动化提示工程。
LangChain 提供了许多使用工具的服务。LangChain 的 LCEL 和 LangGraph 框架进一步提供了内置工具。
LlamaIndex 进一步引入了 QueryEngineTool,即检索工具的模板集合。
CrewAI 是开发多代理系统的领先框架之一。在工具使用中利用的关键概念之一是在代理之间共享工具。
Swarm 是 OpenAI 构建的用于多代理编排的框架。Swarm 同样关注工具在代理之间的共享方式。 Letta 通过函数反映和细化内部世界模型。这可能涉及使用搜索结果来更新聊天机器人对用户的记忆,而不仅仅是回答问题。
为什么企业采用代理型 RAG
企业正在从基础 RAG 转向构建代理型 RAG 应用。Replit 推出了一个帮助开发者构建和调试软件的代理。此外,微软宣布推出与用户并肩工作的副驾,以提供完成任务的建议。这些只是生产中代理的几个例子,可能性是无穷无尽的。
代理型 RAG 的好处
从基础 RAG 转向代理型 RAG,使这些系统能够产生更准确的响应、自主执行任务以及更好地与人类协作。
代理型 RAG 的好处主要在于检索附加信息的质量得到改善。通过增加可以使用工具的代理,检索代理可以将查询路由到专门的知识源。此外,代理的推理能力可以在检索到的上下文用于进一步处理之前对其进行验证。因此,代理型 RAG 流程可以产生更稳健、更准确的响应。
代理型 RAG 的局限性
然而,任何事物都有两面性。使用 AI 代理执行子任务意味着引入一个大型语言模型(LLM)来执行任务。这带来了在任何应用中使用大型语言模型的局限性,例如增加延迟和不可靠性。根据大型语言模型的推理能力,代理可能无法充分完成任务(甚至根本无法完成)。重要的是要纳入适当的故障模式,以帮助 AI 代理在无法完成任务时摆脱困境。
如何学习大模型 AI ?
由于新岗位的生产效率,要优于被取代岗位的生产效率,所以实际上整个社会的生产效率是提升的。
但是具体到个人,只能说是:
“最先掌握AI的人,将会比较晚掌握AI的人有竞争优势”。
这句话,放在计算机、互联网、移动互联网的开局时期,都是一样的道理。
我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。
我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。
第一阶段(10天):初阶应用
该阶段让大家对大模型 AI有一个最前沿的认识,对大模型 AI 的理解超过 95% 的人,可以在相关讨论时发表高级、不跟风、又接地气的见解,别人只会和 AI 聊天,而你能调教 AI,并能用代码将大模型和业务衔接。
- 大模型 AI 能干什么?
- 大模型是怎样获得「智能」的?
- 用好 AI 的核心心法
- 大模型应用业务架构
- 大模型应用技术架构
- 代码示例:向 GPT-3.5 灌入新知识
- 提示工程的意义和核心思想
- Prompt 典型构成
- 指令调优方法论
- 思维链和思维树
- Prompt 攻击和防范
- …
第二阶段(30天):高阶应用
该阶段我们正式进入大模型 AI 进阶实战学习,学会构造私有知识库,扩展 AI 的能力。快速开发一个完整的基于 agent 对话机器人。掌握功能最强的大模型开发框架,抓住最新的技术进展,适合 Python 和 JavaScript 程序员。
- 为什么要做 RAG
- 搭建一个简单的 ChatPDF
- 检索的基础概念
- 什么是向量表示(Embeddings)
- 向量数据库与向量检索
- 基于向量检索的 RAG
- 搭建 RAG 系统的扩展知识
- 混合检索与 RAG-Fusion 简介
- 向量模型本地部署
- …
第三阶段(30天):模型训练
恭喜你,如果学到这里,你基本可以找到一份大模型 AI相关的工作,自己也能训练 GPT 了!通过微调,训练自己的垂直大模型,能独立训练开源多模态大模型,掌握更多技术方案。
到此为止,大概2个月的时间。你已经成为了一名“AI小子”。那么你还想往下探索吗?
- 为什么要做 RAG
- 什么是模型
- 什么是模型训练
- 求解器 & 损失函数简介
- 小实验2:手写一个简单的神经网络并训练它
- 什么是训练/预训练/微调/轻量化微调
- Transformer结构简介
- 轻量化微调
- 实验数据集的构建
- …
第四阶段(20天):商业闭环
对全球大模型从性能、吞吐量、成本等方面有一定的认知,可以在云端和本地等多种环境下部署大模型,找到适合自己的项目/创业方向,做一名被 AI 武装的产品经理。
- 硬件选型
- 带你了解全球大模型
- 使用国产大模型服务
- 搭建 OpenAI 代理
- 热身:基于阿里云 PAI 部署 Stable Diffusion
- 在本地计算机运行大模型
- 大模型的私有化部署
- 基于 vLLM 部署大模型
- 案例:如何优雅地在阿里云私有部署开源大模型
- 部署一套开源 LLM 项目
- 内容安全
- 互联网信息服务算法备案
- …
学习是一个过程,只要学习就会有挑战。天道酬勤,你越努力,就会成为越优秀的自己。
如果你能在15天内完成所有的任务,那你堪称天才。然而,如果你能完成 60-70% 的内容,你就已经开始具备成为一名大模型 AI 的正确特征了。