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. **宇宙背景信息的拓扑编码** - **大尺度结构网络**:将星系团映射为四色顶点,纤维状暗物质结构作为边,构建宇宙尺度…...

[特殊字符] Django 常用命令
🚀 Django 常用命令大全:从开发到部署 Django 提供了许多实用的命令,可以用于 数据库管理、调试、测试、用户管理、运行服务器、部署 等。 本教程将详细介绍 Django 开发中最常用的命令,并提供 示例,帮助你更高…...

mysql中如何保证没有幻读发生
在 MySQL 中,幻读(Phantom Read)是指在一个事务中,两次相同的查询返回了不同的结果集,通常是由于其他事务插入或删除了符合查询条件的数据。为了保证没有幻读,MySQL 主要通过 事务隔离级别 和 锁机制 来实现…...

Golang实践录:go发布版本信息收集
go发布版本信息收集。 背景 本文从官方、网络资料收罗有关go的发布历史概况。主要目的是能快速了解golang不同版本的变更。鉴于官方资料为英文,为方便阅读,使用工具翻译成中文,重要特性参考其它资料补充/修改。由于发布版本内容较多…...

字节跳动AI原生编程工具Trae和百度“三大开发神器”AgentBuilder、AppBuilder、ModelBuilder的区别是?
字节跳动AI编程工具Trae与百度"三大开发神器"(AgentBuilder、AppBuilder、ModelBuilder)在定位、功能架构和技术路线上存在显著差异,具体区别如下: 一、核心定位差异 Trae:AI原生集成开发环境(AI…...

【UCB CS 61B SP24】Lecture 21: Data Structures 5: Priority Queues and Heaps 学习笔记
本文介绍了优先队列与堆,分析了最小堆的插入与删除过程,并用 Java 实现了一个通用类型的最小堆。 1. 优先队列 1.1 介绍 优先队列是一种抽象数据类型,其元素按照优先级顺序被处理。不同于普通队列的先进先出(FIFO)&…...

mapbox高阶,结合threejs(threebox)添加三维球体
👨⚕️ 主页: gis分享者 👨⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨⚕️ 收录于专栏:mapbox 从入门到精通 文章目录 一、🍀前言1.1 ☘️mapboxgl.Map 地图对象1.2 ☘️mapboxgl.Map style属性1.3 ☘️threebox Sphere静态对象二、🍀使用t…...

QEMU源码全解析 —— 块设备虚拟化(1)
本文内容参考: 《趣谈Linux操作系统》 —— 刘超,极客时间 《QEMU/KVM源码解析与应用》 —— 李强,机械工业出版社 详解全虚拟半虚拟及硬件辅助虚拟化技术-百度开发者中心 特此致谢! 序言 本专栏之前的系列文章,讲了很多QEMU/KVM相关知识,其中一部分内容是设备的虚拟…...

IDEA中Git版本回退终极指南:Reset与Revert双方案详解
目录 前言一、版本回退前置知识二、Reset方案:整体改写历史1、IDEA图形化操作(推荐)1.1、查看提交历史1.2、选择目标版本1.3、选择回退模式1.3.1、Soft(推荐)1.3.2、Mixed1.3.3、Hard(慎用)1.3.…...

Flutter 学习之旅 之 flutter 使用 flutter_screenutil 简单进行屏幕适配
Flutter 学习之旅 之 flutter 使用 flutter_screenutil 简单进行屏幕适配 目录 Flutter 学习之旅 之 flutter 使用 flutter_screenutil 简单进行屏幕适配 一、简单介绍 二、简单介绍 flutter_screenutil 三、安装 carousel_slider 四、简单案例实现 五、关键代码 六、补…...

实验一:在Windows 10/11下配置和管理TCP/IP
目录 1.【实训目标】 2.【实训环境】 3.【实训内容】 4.【实训步骤】 1.【实训目标】 1.了解网络基本配置中包含的协议、服务、客户端。 2.了解Windows支持的网络协议及参数设置方法。 3.掌握TCP/IP协议的配置。 2.【实训环境】 硬件环境:每人一台计算机&a…...