LangChain(六)——Agents
LangChain模块架构图 [1]

一、智能体架构:Agent
1.1 什么是智能体(Agent)
将大语言模型作为一个推理引擎。给定一个任务,智能体自动生成完成任务所需的步骤,执行相应动作(例如选择并调用工具),直到任务完成。

Agent 继承了 Chain 的所有能力
- Chain 的能力构成了 Agent 的 “推理链” 能力基础
- Agent 的执行器(Executor)就是基于 LLM Chain 实现的
- Agent 自身具备和 Chain 类似的 “调用 / 执行” 接口的能力
Agent 在 Chain 的能力基础上
进化出了两个核心能力
- 一条思考链(Chain of Thought):Agent 可以规划和调度推理链,会思考分步骤的、每一步的行动
- 一个工具箱(Toolbox):Agent
自带工具体系,可以接入并调用外部工具(工具可以按既定接口规范定制)
- Agent 只关注每个工具的输入输出(格式及内容),工具内部可以自行进行本地和 Web 接口调用
1.2 智能体类型:ReAct
ReAct: Synergizing Reasoning and Acting in Language Models
ReAct机制:

ReAct
使用大语言模型同时生成推理链和行动,两者交替出现,相互支持:
- 推理链帮助 Agent 制定、跟踪和更新行动计划
- 行动让 Agent 与环境上下文交互,获取更多信息支持推理
流程概览:给出任务 ➡️ 推理下一步行动 ➡️ 行动并更新环境 ➡️ 观察并推理下一步行动 ➡️ 循环直至任务完成
1 | |
1 | |
LangSmith流程展现:

1.3 智能体类型:SelfAskWithSearch
Self-Ask with Search 利用一种叫做
Follow-up Question(追问)加Intermediate Answer(中间答案)的技巧,来辅助大模型寻找事实性问题的过渡性答
案,从而引出最终答案。
SelfAskWithSearch流程:

1 | |
1 | |
LangSmith流程展现:

工具集合:Agent包含解决问题所必须的搜索工具,可以用来查询和验证多个信息点
逐步逼近:Agent可以根据第一个问题的答案,提出进一步的问题,直到得到最终答案。这种逐步逼近的方式可以确保答案的准确性。
自我提问与搜索:Agent可以自己提问并搜索答案。
决策链:Agent通过一个决策链来执行任务,使其可以跟踪和处理复杂的多跳问题,这对于解决需要多步推理的问题尤为重要。
1.4 智能体类型:Plan and Execute
Plan-and-Solve Prompting: Improving Zero-Shot Chain-of-Thought Reasoning by Large Language Models
Zero-Shot:代表0样例
顾名思义,Agent 通过首先计划要做什么,然后执行子任务来实现目标
- 这个想法很大程度上是受到 BabyAGI 和后来的《Plan-and-Solve Prompting》论文的启发
- 计划几乎总是由 LLM 完成;执行通常由单独的(带有工具的)Agent 完成
该 Agent 有两个主要的关键步骤:
- 首先,Agent 使用 LLM 创建一个计划,以明确的步骤回答查询
- 一旦制定了计划,它就会使用传统的 Agent(比如 ReAct)来解决每个步骤
Plan and Execute流程:

其想法是,计划步骤通过将较大的任务分解为更简单的子任务,使 LLM 更加“步入正轨”。但是,与传统 Agent 相比,此方法需要更多单独的 LLM 查询,并且延迟更高。
首先安装依赖
1 | |
代码示例
1 | |
1 | |
Plan and Execute LangSmith流程展现:

1.5 OpenAI Tools Angent
OpenAI 模型(如
gpt-3.5-turbo-0613)已经过微调,可以检测何时应调用函数并响应应传递给函数的输入
- OpenAI Functions 的目标是比通用文本完成或聊天 API 更可靠地返回有效且有用的函数调用
- 在 API 调用中,您可以描述函数并让模型智能地选择输出包含调用这些函数的参数的 JSON 对象
1 | |
1 | |
OpenAI Tools Angent LangSmith流程展现:

更多Agent Type:https://python.langchain.com/docs/modules/agents/agent_types/
二、Agent 工具箱
工具是Agent,chain以及LLM可以用来与世界交互的功能。工具由以下组成:
- 工具名
- 工具的说明
- 工具输入的JSON Schema
- 工具函数
- 工具返回的结果是否应该直接返回给用户
名称、说明和 JSON schema 可用于 LLM Prompt,用于向模型传达该工具的用途以及何时使用它。
2.1 内置工具
2.1.1 内置工具的使用
1 | |
输出
1 | |
2.1.2 定制化内置工具
我们可以修改工具的名字, 说明以及JSON Schema,在定义JSON Schema参数时,输入必须保证与函数相同,因此无法进行修改,但是可以修改每个参数的说明。
1 | |
输出
1 | |
更多内置工具请参考:https://python.langchain.com/docs/integrations/tools/
2.2 自定义工具
自定义工具除了实际功能之外,工具还有其他几个组件:
name(str),是必需的,并且在一组工具中必须是唯一的提供给Agentdescription(str),是可选的,但建议使用,Agent会用它来决定工具的使用args_schema(Pydantic BaseModel),是可选的,但推荐使用,可以用于提供更多信息(例如,few-shot)或验证参数
2.2.1 @tool 装饰器
定义工具的最简单方法
1 | |
输出
1 | |
2.2.2 StructuredTool 数据类
1 | |
输出
1 | |
其他更多说明请参考: https://python.langchain.com/docs/modules/tools/custom_tools/
2.3 Agent 工具箱中的工具集
工具集(Toolkit)是旨在一起用于特定任务并具有方便的加载方法的工具的集合
全部工具集:https://python.langchain.com/docs/integrations/toolkits/
2.3.1 使用PythonREPLTool工具集
1 | |
1 | |
LangSmith流程展现:
