LangChain教程 - Agent - 支持 9 种 ReAct 交互
引言
LangChain
总结了 9 种经典的复杂模型交互模式,每种都针对特定任务设计,兼具独特优势与适用场景,内容涵盖: ReAct、Function Call、知识库、搜索等,使用这些模式可以大大简化这些场景开发难度。这些模式可以使用Agent
形式来使用,并以AgentType
来做区分,详见下面实例。在开发时,选择合适的 AgentType 是成功的关键,本文将逐一剖析这些代理类型,结合特性分析、应用场景和代码示例,助你在实际项目中快速找到最优解。
1. ZERO_SHOT_REACT_DESCRIPTION
特点
- 基于 ReAct 模型:推理(Reasoning)与行动(Action)结合。
- 无需训练样本即可完成任务(零样本)。
优势
简单直接,适合快速推理与操作。
局限性
对复杂任务的处理能力有限。
应用场景
基础计算、逻辑推理或单步查询。
代码示例
from langchain.agents import initialize_agent, AgentType
from langchain.chat_models import ChatOpenAI
from langchain.tools import Tool# 定义工具:计算平方
def square_number(n: str):return int(n) ** 2square_tool = Tool(name="Square Calculator", func=square_number, description="计算一个数的平方")# 初始化代理
agent = initialize_agent(tools=[square_tool],llm=ChatOpenAI(model="gpt-4"),agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION,verbose=True
)# 执行任务
response = agent.run("计算 5 的平方")
print(response) # 输出: 25
2. REACT_DOCSTORE
特点
- 在 ReAct 基础上集成文档存储(DocStore)。
- 先检索文档,再推理回答。
优势
增强了对知识库的支持,适合信息密集型任务。
局限性
需要预先准备文档库,初始化成本较高。
应用场景
知识库问答、RAG 系统。
代码示例
from langchain.vectorstores import FAISS
from langchain.embeddings import OpenAIEmbeddings
from langchain.document_loaders import TextLoader
from langchain.tools import Tool# 加载文档并创建向量存储
loader = TextLoader("knowledge.txt")
docs = loader.load()
vectorstore = FAISS.from_documents(docs, OpenAIEmbeddings())# 定义检索工具
def retrieve_docs(query: str):return vectorstore.similarity_search(query, k=3)docstore_tool = Tool(name="Document Retriever", func=retrieve_docs, description="检索文档内容")# 初始化代理
agent = initialize_agent(tools=[docstore_tool],llm=ChatOpenAI(model="gpt-4"),agent=AgentType.REACT_DOCSTORE,verbose=True
)response = agent.run("查找人工智能相关资料")
print(response)
3. SELF_ASK_WITH_SEARCH
特点
- 将复杂问题拆解为子问题,通过搜索工具逐一解决。
- 动态获取外部信息。
优势
适合需要实时数据的任务。
局限性
依赖搜索工具质量,响应时间可能较长。
应用场景
时事查询、专业资料搜集。
代码示例
from langchain.tools import Tool
from langchain.utilities import GoogleSearchAPIWrapper# 配置 Google 搜索工具(需 API Key)
search = GoogleSearchAPIWrapper()
search_tool = Tool(name="Google Search", func=search.run, description="通过 Google 搜索信息")# 初始化代理
agent = initialize_agent(tools=[search_tool],llm=ChatOpenAI(model="gpt-4"),agent=AgentType.SELF_ASK_WITH_SEARCH,verbose=True
)response = agent.run("爱因斯坦哪年获得诺贝尔奖?")
print(response) # 输出: 1921
4. CONVERSATIONAL_REACT_DESCRIPTION
特点
- 支持多轮对话,具备上下文记忆。
- 融合 ReAct 的推理与操作能力。
优势
动态适应用户需求,交互性强。
局限性
对内存管理要求较高。
应用场景
聊天机器人、智能客服。
代码示例
from langchain.memory import ConversationBufferMemory# 配置上下文记忆
memory = ConversationBufferMemory(memory_key="chat_history")# 初始化代理
agent = initialize_agent(tools=[],llm=ChatOpenAI(model="gpt-4"),agent=AgentType.CONVERSATIONAL_REACT_DESCRIPTION,memory=memory,verbose=True
)print(agent.run("中国的 GDP 是多少?"))
print(agent.run("比去年增长了多少?")) # 利用上下文回答
5. CHAT_ZERO_SHOT_REACT_DESCRIPTION
特点
- 为聊天场景优化的零样本 ReAct。
- 注重自然语言表达。
优势
对话流畅,适合轻量交互。
局限性
不支持复杂工具调用。
应用场景
简单聊天助手。
代码示例
agent = initialize_agent(tools=[],llm=ChatOpenAI(model="gpt-4"),agent=AgentType.CHAT_ZERO_SHOT_REACT_DESCRIPTION,verbose=True
)response = agent.run("介绍 Python 语言的特点。")
print(response)
6. CHAT_CONVERSATIONAL_REACT_DESCRIPTION
特点
- 结合聊天优化与上下文记忆。
- 支持更复杂的多轮对话。
优势
适用于长时间、连贯的交互。
局限性
配置稍复杂,计算资源需求较高。
应用场景
高级客服、交互式问答。
代码示例
agent = initialize_agent(tools=[],llm=ChatOpenAI(model="gpt-4"),agent=AgentType.CHAT_CONVERSATIONAL_REACT_DESCRIPTION,verbose=True
)response = agent.run("什么是机器学习?")
print(response)
7. STRUCTURED_CHAT_ZERO_SHOT_REACT_DESCRIPTION
特点
- 支持多工具调用,返回结构化数据。
- 任务处理更具条理性。
优势
适合复杂任务的综合处理。
局限性
对工具定义要求较高。
应用场景
天气查询、综合信息整合。
代码示例
from langchain.tools import Tool# 定义天气工具
def get_weather(city: str):return f"{city} 当前温度为 25°C"weather_tool = Tool(name="Weather Tool", func=get_weather, description="获取城市天气")# 初始化代理
agent = initialize_agent(tools=[weather_tool],llm=ChatOpenAI(model="gpt-4"),agent=AgentType.STRUCTURED_CHAT_ZERO_SHOT_REACT_DESCRIPTION,verbose=True
)response = agent.run("查询北京的天气")
print(response)
8. OPENAI_FUNCTIONS
特点
- 利用 OpenAI 的 function calling 机制。
- 直接调用外部 API,返回结构化结果。
优势
调用精准,响应高效。
局限性
依赖 OpenAI 模型支持。
应用场景
API 驱动任务,如航班查询。
代码示例
from langchain.tools import StructuredTool
from pydantic import BaseModel# 定义查询结构
class FlightQuery(BaseModel):origin: strdestination: strdef search_flights(query: FlightQuery):return f"从 {query.origin} 到 {query.destination} 的航班价格约为 1500 元"flight_tool = StructuredTool.from_function(func=search_flights, name="Flight Search", description="查询航班价格")# 初始化代理
agent = initialize_agent(tools=[flight_tool],llm=ChatOpenAI(model="gpt-4"),agent=AgentType.OPENAI_FUNCTIONS,verbose=True
)response = agent.run("查询从北京到上海的航班价格。")
print(response)
9. OPENAI_MULTI_FUNCTIONS
特点
- 支持多个 OpenAI 函数调用。
- 可整合多源数据。
优势
处理多任务能力强。
局限性
配置复杂,依赖多工具协作。
应用场景
综合查询,如航班与汇率结合。
代码示例
from langchain.tools import Tool# 定义汇率工具
def get_exchange_rate():return "当前 1 USD = 7.2 CNY"exchange_tool = Tool(name="Exchange Rate Checker", func=get_exchange_rate, description="获取美元兑人民币汇率")# 初始化代理
agent = initialize_agent(tools=[flight_tool, exchange_tool],llm=ChatOpenAI(model="gpt-4"),agent=AgentType.OPENAI_MULTI_FUNCTIONS,verbose=True
)response = agent.run("查询从北京到上海的航班价格,并获取最新美元汇率。")
print(response)
总结与选择指南
代理类型 | 核心特点 | 优势 | 局限性 | 适用场景 |
---|---|---|---|---|
ZERO_SHOT_REACT_DESCRIPTION | 零样本推理与操作 | 简单高效 | 不适合复杂任务 | 基础计算、逻辑推理 |
REACT_DOCSTORE | 文档检索 + 推理 | 知识库支持强 | 需预置文档 | 知识库问答、RAG |
SELF_ASK_WITH_SEARCH | 问题拆解 + 搜索 | 实时信息获取 | 依赖搜索质量 | 时事、专业查询 |
CONVERSATIONAL_REACT_DESCRIPTION | 多轮对话 + 上下文 | 交互性强 | 内存需求高 | 聊天机器人、智能客服 |
CHAT_ZERO_SHOT_REACT_DESCRIPTION | 聊天优化零样本 | 对话流畅 | 无复杂工具支持 | 简单聊天助手 |
CHAT_CONVERSATIONAL_REACT_DESCRIPTION | 聊天 + 上下文记忆 | 连贯性好 | 配置复杂 | 高级客服、多轮问答 |
STRUCTURED_CHAT_ZERO_SHOT_REACT_DESCRIPTION | 多工具 + 结构化输出 | 处理复杂任务 | 工具定义要求高 | 天气、综合查询 |
OPENAI_FUNCTIONS | 单函数调用 | 调用精准 | 依赖 OpenAI | API 驱动任务 |
OPENAI_MULTI_FUNCTIONS | 多函数调用 | 数据整合能力强 | 配置复杂 | 综合多任务查询 |
选择建议
- 轻量任务:优先
ZERO_SHOT_REACT_DESCRIPTION
或CHAT_ZERO_SHOT_REACT_DESCRIPTION
。 - 知识密集型:选择
REACT_DOCSTORE
或SELF_ASK_WITH_SEARCH
。 - 多轮交互:推荐
CONVERSATIONAL_REACT_DESCRIPTION
或CHAT_CONVERSATIONAL_REACT_DESCRIPTION
。 - 复杂工具调用:使用
STRUCTURED_CHAT_ZERO_SHOT_REACT_DESCRIPTION
或OPENAI_MULTI_FUNCTIONS
。
希望这篇优化后的指南能为你的 LangChain 项目提供清晰指引!如需更具体案例或代码调试建议,请随时告诉我。
相关文章:
LangChain教程 - Agent - 支持 9 种 ReAct 交互
引言 LangChain 总结了 9 种经典的复杂模型交互模式,每种都针对特定任务设计,兼具独特优势与适用场景,内容涵盖: ReAct、Function Call、知识库、搜索等,使用这些模式可以大大简化这些场景开发难度。这些模式可以使用…...

蓝桥杯备赛日记【day1】(c++赛道)
一、裁纸刀问题(2022、规律、思维、省赛) 解法思路: 参考题目给出的例子发现。不管要裁剪多少次。最外围的四次是固定的。然后通过观察发现,我们的行的裁剪次数为(m-1) 次,而每行都需要裁剪列数…...

【大模型基础_毛玉仁】1.4 语言模型的采样方法
【大模型基础_毛玉仁】1.4 语言模型的采样方法 1.4 语言模型的采样方法1.4.1 概率最大化方法1)贪心搜索(GreedySearch)2)波束搜索(BeamSearch) 1.4.2 随机采样方法1)Top-K 采样2)Top…...

[内网安全] Windows 本地认证 — NTLM 哈希和 LM 哈希
关注这个专栏的其他相关笔记:[内网安全] 内网渗透 - 学习手册-CSDN博客 0x01:SAM 文件 & Windows 本地认证流程 0x0101:SAM 文件简介 Windows 本地账户的登录密码是存储在系统本地的 SAM 文件中的,在登录 Windows 的时候&am…...

基于SNR估计的自适应码率LDPC编译码算法matlab性能仿真,对比固定码率LDPC的系统传输性能
目录 1.算法仿真效果 2.算法涉及理论知识概要 2.1 基于序列的SNR估计 2.2 基于SNR估计值进行码率切换 2.3 根据数据量进行码率切换 3.MATLAB核心程序 4.完整算法代码文件获得 1.算法仿真效果 matlab2022a仿真结果如下(完整代码运行后无水印)&…...
opencv 模板匹配方法汇总
在OpenCV中,模板匹配是一种在较大图像中查找特定模板图像位置的技术。OpenCV提供了多种模板匹配方法,通过cv2.matchTemplate函数实现,该函数支持的匹配方式主要有以下6种,下面详细介绍每种方法的原理、特点和适用场景。 1. cv2.T…...

Embedding技术:DeepWalkNode2vec
引言 在推荐系统中,Graph Embedding技术已经成为一种强大的工具,用于捕捉用户和物品之间的复杂关系。本文将介绍Graph Embedding的基本概念、原理及其在推荐系统中的应用。 什么是Graph Embedding? Graph Embedding是一种将图中的节点映射…...
微信小程序注册组件
在微信小程序中注册组件分为自定义组件的创建和全局/局部注册,下面为你详细介绍具体步骤和示例。 自定义组件的创建 自定义组件由四个文件组成,分别是 .js(脚本文件)、.json(配置文件)、.wxml(…...

【docker】安装mysql,修改端口号并重启,root改密
我的docker笔记 【centOS】安装docker环境,替换国内镜像 1. 配置镜像源 使用阿里云镜像加速器,编辑/etc/docker/daemon.json sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-EOF {"registry-mirrors": ["https:/…...
自定义wordpress三级导航菜单代码
首先,在你的主题functions.php文件中,添加以下代码以注册一个新的菜单位置: function mytheme_register_menus() {register_nav_menus(array(primary-menu > __(Primary Menu, mytheme))); } add_action(init, mytheme_register_menus); …...

洛谷 P1480 A/B Problem(高精度详解)c++
题目链接:P1480 A/B Problem - 洛谷 1.题目分析 1:说明这里是高精度除以低精度的形式,为什么不是高精度除以高精度的形式,是因为它很少见,它的模拟方式是用高精度减法来做的,并不能用小学列竖式的方法模拟…...
JAVA入门——网络编程简介
自己学习时的笔记,可能有点水( 以后可能还会补充(大概率不会) 一、基本概念 网络编程三要素: IP 设备在网络中的唯一标识 端口号 应用软件在设备中的唯一标识两个字节表示的整数,0~1023用于知名的网络…...

Ubuntu 合上屏幕 不待机 设置
有时候需要Ubuntu的机器合上屏幕的时候也能正常工作,而不是处于待机状态。 需要进行配置文件的设置,并重启即可。 1. 修改配置文件 /etc/systemd/logind.conf sudo vi /etc/systemd/logind.conf 然后输入i,进入插入状态,修改如…...

捣鼓180天,我写了一个相册小程序
🙋为什么要做土著相册这样一个产品? ➡️在高压工作之余,我喜欢浏览B站上的熊猫幼崽视频来放松心情。有天在家族群里看到了大嫂分享的侄女卖萌照片,同样感到非常解压。于是开始翻阅过去的聊天记录,却发现部分图片和视…...

短分享-Flink图构建
一、背景 通过简单的书写map、union、keyby等代码,Flink便能构建起一个庞大的分布式计算任务,Flink如何实现的这个酷炫功能呢?我们本次分享Flink做的第一步,将代码解析构建成图 源码基于Flink 2.10,书籍参考《Flink核…...

【监督学习】支持向量机步骤及matlab实现
支持向量机 (四)支持向量机1.算法步骤2. MATLAB 实现参考资料 (四)支持向量机 支持向量机(Support Vector Machine, SVM)是一种用于分类、回归分析以及异常检测的监督学习模型。SVM特别擅长处理高维空间的…...
机器学习-随机森林解析
目录 一、.随机森林的思想 二、随机森林构建步骤 1.自助采样 2.特征随机选择 3构建决策树 4.集成预测 三. 随机森林的关键优势 **(1) 减少过拟合** **(2) 高效并行化** **(3) 特征重要性评估** **(4) 耐抗噪声** 四. 随机森林的优缺点 优点 缺点 五.…...

Javaweb后端spring事务管理 事务四大特性ACID
2步操作,只能同时成功,同时失败,要放在一个事务中,最后提交事务或者回滚事务 事务控制 事务管理进阶 事务的注解 这是所有异常都会回滚 事务注解 事务的传播行为 四大特性...
在Spring Boot + MyBatis中优雅处理多表数据清洗:基于XML的配置化方案
问题背景 在实际业务中,我们常会遇到数据冗余问题。例如,一个公司表(sys_company)中存在多条相同公司名的记录,但只有一条有效(del_flag0),其余需要删除。删除前需将关联表…...
【无标题】四色拓扑模型与宇宙历史重构的猜想框架
### 四色拓扑模型与宇宙历史重构的猜想框架 --- #### **一、理论基础:四色拓扑与时空全息原理的融合** 1. **宇宙背景信息的拓扑编码** - **大尺度结构网络**:将星系团映射为四色顶点,纤维状暗物质结构作为边,构建宇宙尺度…...

IDEA运行Tomcat出现乱码问题解决汇总
最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…...

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)
题目:3442. 奇偶频次间的最大差值 I 思路 :哈希,时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况,哈希表这里用数组即可实现。 C版本: class Solution { public:int maxDifference(string s) {int a[26]…...

江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命
在华东塑料包装行业面临限塑令深度调整的背景下,江苏艾立泰以一场跨国资源接力的创新实践,重新定义了绿色供应链的边界。 跨国回收网络:废料变黄金的全球棋局 艾立泰在欧洲、东南亚建立再生塑料回收点,将海外废弃包装箱通过标准…...

NFT模式:数字资产确权与链游经济系统构建
NFT模式:数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新:构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议:基于LayerZero协议实现以太坊、Solana等公链资产互通,通过零知…...

SpringCloudGateway 自定义局部过滤器
场景: 将所有请求转化为同一路径请求(方便穿网配置)在请求头内标识原来路径,然后在将请求分发给不同服务 AllToOneGatewayFilterFactory import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; impor…...

C++ Visual Studio 2017厂商给的源码没有.sln文件 易兆微芯片下载工具加开机动画下载。
1.先用Visual Studio 2017打开Yichip YC31xx loader.vcxproj,再用Visual Studio 2022打开。再保侟就有.sln文件了。 易兆微芯片下载工具加开机动画下载 ExtraDownloadFile1Info.\logo.bin|0|0|10D2000|0 MFC应用兼容CMD 在BOOL CYichipYC31xxloaderDlg::OnIni…...

项目部署到Linux上时遇到的错误(Redis,MySQL,无法正确连接,地址占用问题)
Redis无法正确连接 在运行jar包时出现了这样的错误 查询得知问题核心在于Redis连接失败,具体原因是客户端发送了密码认证请求,但Redis服务器未设置密码 1.为Redis设置密码(匹配客户端配置) 步骤: 1).修…...
【Java学习笔记】BigInteger 和 BigDecimal 类
BigInteger 和 BigDecimal 类 二者共有的常见方法 方法功能add加subtract减multiply乘divide除 注意点:传参类型必须是类对象 一、BigInteger 1. 作用:适合保存比较大的整型数 2. 使用说明 创建BigInteger对象 传入字符串 3. 代码示例 import j…...

Yolov8 目标检测蒸馏学习记录
yolov8系列模型蒸馏基本流程,代码下载:这里本人提交了一个demo:djdll/Yolov8_Distillation: Yolov8轻量化_蒸馏代码实现 在轻量化模型设计中,**知识蒸馏(Knowledge Distillation)**被广泛应用,作为提升模型…...

Linux 中如何提取压缩文件 ?
Linux 是一种流行的开源操作系统,它提供了许多工具来管理、压缩和解压缩文件。压缩文件有助于节省存储空间,使数据传输更快。本指南将向您展示如何在 Linux 中提取不同类型的压缩文件。 1. Unpacking ZIP Files ZIP 文件是非常常见的,要在 …...