当前位置: 首页 > 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) ** 2

square_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: str
    destination: str

def 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 项目提供清晰指引!如需更具体案例或代码调试建议,请随时告诉我。

相关文章:

  • 数字逻辑与FPGA实现基础
  • k-Shape:高效准确的聚类方法
  • VPC2-多域攻击-tomcat渗透-通达oa-域控提权-密码喷射-委派攻击-数据库提权
  • 人工智能 模型中D*算法的逻辑
  • 云存储的安全性之代理IP如何确保文件不被未授权访问
  • 杨校老师课堂之零基础入门C++备战信息学奥赛-基础篇
  • C++入门——命名空间
  • django中视图作用和视图功能 以及用法
  • mysql新手常见问题解决方法总结
  • 【OMCI实践】wireshark解析脚本omci.lua文件(独家分享)
  • Unity Shader 学习15:可交互式雪地流程
  • vulnhub靶场之【digitalworld.local系列】的torment靶机
  • HarmonyOS:如何将图片转为PixelMap并进行图片缓存策略
  • linux0.11内核源码修仙传第四章——操作系统的框架代码
  • 删除已加入 .gitignore却仍被git追踪的文件
  • 突破极限:高性能ROCK 220A-M 工业级无人机电调深度测评 —— 无人机动力系统的核心守护者
  • 审批流AntV框架蚂蚁数据可视化X6饼图(附注释)
  • Java 8 Stream API 详解
  • MySQL的安装和配置
  • 【Vue3 Element UI - Plus + Tyscript 实现Tags标签输入及回显】
  • 网站维护工程师月薪多少/黑帽seo培训大神
  • 宝鸡网站网站建设/如何搜索关键词热度
  • 一站式服务是什么意思/想学网络营销怎么学
  • 甘肃省住房和城乡建设厅网站/西安seo外包优化
  • 做网站广告联盟/上海还能推seo吗
  • 专业网站建设顾问/梅花seo 快速排名软件