当前位置: 首页 > news >正文

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单函数调用调用精准依赖 OpenAIAPI 驱动任务
OPENAI_MULTI_FUNCTIONS多函数调用数据整合能力强配置复杂综合多任务查询

选择建议

  • 轻量任务:优先 ZERO_SHOT_REACT_DESCRIPTIONCHAT_ZERO_SHOT_REACT_DESCRIPTION
  • 知识密集型:选择 REACT_DOCSTORESELF_ASK_WITH_SEARCH
  • 多轮交互:推荐 CONVERSATIONAL_REACT_DESCRIPTIONCHAT_CONVERSATIONAL_REACT_DESCRIPTION
  • 复杂工具调用:使用 STRUCTURED_CHAT_ZERO_SHOT_REACT_DESCRIPTIONOPENAI_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&#xff08…...

【docker】安装mysql,修改端口号并重启,root改密

我的docker笔记 【centOS】安装docker环境&#xff0c;替换国内镜像 1. 配置镜像源 使用阿里云镜像加速器&#xff0c;编辑/etc/docker/daemon.json sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-EOF {"registry-mirrors": ["https:/…...

自定义wordpress三级导航菜单代码

首先&#xff0c;在你的主题functions.php文件中&#xff0c;添加以下代码以注册一个新的菜单位置&#xff1a; function mytheme_register_menus() {register_nav_menus(array(primary-menu > __(Primary Menu, mytheme))); } add_action(init, mytheme_register_menus); …...

洛谷 P1480 A/B Problem(高精度详解)c++

题目链接&#xff1a;P1480 A/B Problem - 洛谷 1.题目分析 1&#xff1a;说明这里是高精度除以低精度的形式&#xff0c;为什么不是高精度除以高精度的形式&#xff0c;是因为它很少见&#xff0c;它的模拟方式是用高精度减法来做的&#xff0c;并不能用小学列竖式的方法模拟…...

JAVA入门——网络编程简介

自己学习时的笔记&#xff0c;可能有点水&#xff08; 以后可能还会补充&#xff08;大概率不会&#xff09; 一、基本概念 网络编程三要素&#xff1a; IP 设备在网络中的唯一标识 端口号 应用软件在设备中的唯一标识两个字节表示的整数&#xff0c;0~1023用于知名的网络…...

Ubuntu 合上屏幕 不待机 设置

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

捣鼓180天,我写了一个相册小程序

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

短分享-Flink图构建

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

【监督学习】支持向量机步骤及matlab实现

支持向量机 &#xff08;四&#xff09;支持向量机1.算法步骤2. MATLAB 实现参考资料 &#xff08;四&#xff09;支持向量机 支持向量机&#xff08;Support Vector Machine, SVM&#xff09;是一种用于分类、回归分析以及异常检测的监督学习模型。SVM特别擅长处理高维空间的…...

机器学习-随机森林解析

目录 一、.随机森林的思想 二、随机森林构建步骤 1.自助采样 2.特征随机选择 3构建决策树 4.集成预测 三. 随机森林的关键优势 ​**(1) 减少过拟合** ​**(2) 高效并行化** ​**(3) 特征重要性评估** ​**(4) 耐抗噪声** 四. 随机森林的优缺点 ​优点 ​缺点 五.…...

Javaweb后端spring事务管理 事务四大特性ACID

2步操作&#xff0c;只能同时成功&#xff0c;同时失败&#xff0c;要放在一个事务中&#xff0c;最后提交事务或者回滚事务 事务控制 事务管理进阶 事务的注解 这是所有异常都会回滚 事务注解 事务的传播行为 四大特性...

在Spring Boot + MyBatis中优雅处理多表数据清洗:基于XML的配置化方案

问题背景 在实际业务中&#xff0c;我们常会遇到数据冗余问题。例如&#xff0c;一个公司表&#xff08;sys_company&#xff09;中存在多条相同公司名的记录&#xff0c;但只有一条有效&#xff08;del_flag0&#xff09;&#xff0c;其余需要删除。删除前需将关联表&#xf…...

【无标题】四色拓扑模型与宇宙历史重构的猜想框架

### 四色拓扑模型与宇宙历史重构的猜想框架 --- #### **一、理论基础&#xff1a;四色拓扑与时空全息原理的融合** 1. **宇宙背景信息的拓扑编码** - **大尺度结构网络**&#xff1a;将星系团映射为四色顶点&#xff0c;纤维状暗物质结构作为边&#xff0c;构建宇宙尺度…...

基于算法竞赛的c++编程(28)结构体的进阶应用

结构体的嵌套与复杂数据组织 在C中&#xff0c;结构体可以嵌套使用&#xff0c;形成更复杂的数据结构。例如&#xff0c;可以通过嵌套结构体描述多层级数据关系&#xff1a; struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...

Day131 | 灵神 | 回溯算法 | 子集型 子集

Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a; 笔者写过很多次这道题了&#xff0c;不想写题解了&#xff0c;大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...

高频面试之3Zookeeper

高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个&#xff1f;3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制&#xff08;过半机制&#xff0…...

【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的“no matching...“系列算法协商失败问题

【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的"no matching..."系列算法协商失败问题 摘要&#xff1a; 近期&#xff0c;在使用较新版本的OpenSSH客户端连接老旧SSH服务器时&#xff0c;会遇到 "no matching key exchange method found"​, "n…...

【Android】Android 开发 ADB 常用指令

查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...

[ACTF2020 新生赛]Include 1(php://filter伪协议)

题目 做法 启动靶机&#xff0c;点进去 点进去 查看URL&#xff0c;有 ?fileflag.php说明存在文件包含&#xff0c;原理是php://filter 协议 当它与包含函数结合时&#xff0c;php://filter流会被当作php文件执行。 用php://filter加编码&#xff0c;能让PHP把文件内容…...

django blank 与 null的区别

1.blank blank控制表单验证时是否允许字段为空 2.null null控制数据库层面是否为空 但是&#xff0c;要注意以下几点&#xff1a; Django的表单验证与null无关&#xff1a;null参数控制的是数据库层面字段是否可以为NULL&#xff0c;而blank参数控制的是Django表单验证时字…...

Android写一个捕获全局异常的工具类

项目开发和实际运行过程中难免会遇到异常发生&#xff0c;系统提供了一个可以捕获全局异常的工具Uncaughtexceptionhandler&#xff0c;它是Thread的子类&#xff08;就是package java.lang;里线程的Thread&#xff09;。本文将利用它将设备信息、报错信息以及错误的发生时间都…...

门静脉高压——表现

一、门静脉高压表现 00:01 1. 门静脉构成 00:13 组成结构&#xff1a;由肠系膜上静脉和脾静脉汇合构成&#xff0c;是肝脏血液供应的主要来源。淤血后果&#xff1a;门静脉淤血会同时导致脾静脉和肠系膜上静脉淤血&#xff0c;引发后续系列症状。 2. 脾大和脾功能亢进 00:46 …...

npm install 相关命令

npm install 相关命令 基本安装命令 # 安装 package.json 中列出的所有依赖 npm install npm i # 简写形式# 安装特定包 npm install <package-name># 安装特定版本 npm install <package-name><version>依赖类型选项 # 安装为生产依赖&#xff08;默认&…...