当前位置: 首页 > 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;构建宇宙尺度…...

Ubuntu系统下交叉编译openssl

一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机&#xff1a;Ubuntu 20.04.6 LTSHost&#xff1a;ARM32位交叉编译器&#xff1a;arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...

以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:

一、属性动画概述NETX 作用&#xff1a;实现组件通用属性的渐变过渡效果&#xff0c;提升用户体验。支持属性&#xff1a;width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项&#xff1a; 布局类属性&#xff08;如宽高&#xff09;变化时&#…...

3.3.1_1 检错编码(奇偶校验码)

从这节课开始&#xff0c;我们会探讨数据链路层的差错控制功能&#xff0c;差错控制功能的主要目标是要发现并且解决一个帧内部的位错误&#xff0c;我们需要使用特殊的编码技术去发现帧内部的位错误&#xff0c;当我们发现位错误之后&#xff0c;通常来说有两种解决方案。第一…...

从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路

进入2025年以来&#xff0c;尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断&#xff0c;但全球市场热度依然高涨&#xff0c;入局者持续增加。 以国内市场为例&#xff0c;天眼查专业版数据显示&#xff0c;截至5月底&#xff0c;我国现存在业、存续状态的机器人相关企…...

linux 错误码总结

1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...

屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!

5月28日&#xff0c;中天合创屋面分布式光伏发电项目顺利并网发电&#xff0c;该项目位于内蒙古自治区鄂尔多斯市乌审旗&#xff0c;项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站&#xff0c;总装机容量为9.96MWp。 项目投运后&#xff0c;每年可节约标煤3670…...

C++中string流知识详解和示例

一、概览与类体系 C 提供三种基于内存字符串的流&#xff0c;定义在 <sstream> 中&#xff1a; std::istringstream&#xff1a;输入流&#xff0c;从已有字符串中读取并解析。std::ostringstream&#xff1a;输出流&#xff0c;向内部缓冲区写入内容&#xff0c;最终取…...

【Java_EE】Spring MVC

目录 Spring Web MVC ​编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 ​编辑参数重命名 RequestParam ​编辑​编辑传递集合 RequestParam 传递JSON数据 ​编辑RequestBody ​…...

UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)

UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中&#xff0c;UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化&#xf…...

精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南

精益数据分析&#xff08;97/126&#xff09;&#xff1a;邮件营销与用户参与度的关键指标优化指南 在数字化营销时代&#xff0c;邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天&#xff0c;我们将深入解析邮件打开率、网站可用性、页面参与时…...