LangChain最详细教程之Agents
本文系统介绍了LangChain框架中Agent(智能体)的详细使用方法。主要内容包括:1. Agent的基本概念与核心组件(LLM、Memory、Tools等),以及与Chain的区别;2. 两种主要Agent模式(FunctionCall和ReAct)的特点及适用场景;3. AgentExecutor的两种创建方式(传统方式和通用方式);4. 工具集成方法,包括单工具、多工具和自定义工具的使用
目录
简介
本系列教程将以「系统梳理 + 实战落地」为核心,从基础到进阶全面拆解 LangChain—— 这个目前最流行的大语言模型(LLM)应用开发框架。之前对langchain进行了系统的概述,现在我们就来详细看看每一个板块。
LangChain最详细教程之Model I/O(一)调用模型
LangChain最详细教程之Model I/O(二)Prompt Template
LangChain最详细教程之Model I/O(三)Output Parsers
一、理解Agents
| AI 等级(类比自动驾驶) | 名称 | 特点 | 示例 |
|---|---|---|---|
| L1 | Tool | 人类完成所有工作,没有任何显性的 AI 辅助 | 目前绝大多数软件产品 |
| L2 | Chatbot | 人类完成绝大部分工作。人类向 AI 询问意见,了解信息,AI 提供信息和建议但不直接处理工作 | 初代 ChatGPT 等 Chatbot |
| L3 | Copilot | 人类和 AI 进行协作,工作量相当。AI 根据人类 prompt 完成工作初稿,人类进行目标设定、修改调整,最后确认 | GitHub Copilot、Midjourney、Jasper 等 |
| L4 | Agent | AI 完成绝大部分工作,人类负责设定目标、提供资源和监督结果。AI 完成任务拆分,工具选择,进度控制,实现目标后自主结束工作 | AutoGPT 等 |
| L5 | Species | 完全无需人类监督,AI 自主拆解目标、寻找资源、选择并使用工具、完成全部工作,人类只需给出目标 | 机器人? |
- 如何 拆解任务
- 需要 调用哪些工具
- 以 什么顺序调用
- 如何利用好 中间结果 推进任务
Agent(智能体) 是一个通过动态协调 大语言模型(LLM) 和 工具(Tools) 来完成复杂任务的智能系统。它让LLM充当"决策大脑",根据用户输入自主选择和执行工具(如搜索、计算、数据库查询等),最终生成精准的响应。

- ① Agent 接收任务后,通过大模型推理选择适合的工具处理任务。
- ② 一旦选定,LangChain将任务输入传递给该工具,工具处理输入生成输出。
- ③ 输出经过大模型推理,可用于其他工具的输入或作为最终结果返回给用户。
二、Agent 入门使用
1、 Agent、AgentExecutor的创建
| 环节 1:创建 Agent | 环节 2:创建 AgentExecutor | |
| 式 1:传统方式 | 使用 AgentType 指定 | initialize_agent() |
| 方式 2:通用方式 | create_xxx_agent()比如: create_react_agent ()、create_tool_calling_agent () | 调用 AgentExecutor () 构造方法 |
2、 Agent的类型
- 方式1:Funcation Call模式
- 方式2:ReAct 模式
2.1 FUNCATION_CALL模式
- 基于 结构化函数调用 (如 OpenAI Function Calling)
- 直接生成工具调用参数( JSON 格式 )
- 效率更高,适合工具明确的场景
#第1种:
AgentType.OPENAI_FUNCTIONS
#第2种:
AgentType.OPENAI_MULTI_FUNCTIONS
第1步:找到Search工具:{"tool": "Search", "args": {"query": "LangChain最新版本"}}
第2步:执行Search工具
======================================
第1步:找打scrape_website工具:{"tool": "Search", "args": {"target": "LangChain最新版本","url":"要
抓取的网站地址"}}
第2步:执行scrape_website工具
2.2 ReAct 模式
- 基于 文本推理 的链式思考(Reasoning + Acting),具备反思和自我纠错能力。
- 推理(Reasoning):分析当前状态,决定下一步行动
- 行动(Acting):调用工具并返回结果
- 通过 自然语言描述决策过程
- 适合需要明确推理步骤的场景。例如智能客服、问答系统、任务执行等。
#第1种:零样本推理(可以在没有预先训练的情况下尝试解决新的问题)
AgentType.ZERO_SHOT_REACT_DESCRIPTION
#第2种:无记忆对话
AgentType.STRUCTURED_CHAT_ZERO_SHOT_REACT_DESCRIPTION
#第3种:带记忆对话
AgentType.CONVERSATIONAL_REACT_DESCRIPTION
问题:我想要查询xxx
思考:我需要先搜索最新信息 → 行动:调用Search工具 → 观察:获得3个结果 →
思考:需要抓取第一个链接 → 行动:调用scrape_website工具...→ 观察:获得工具结果
最后:获取结果
| 特性 | Function Call 模式 | ReAct 模式 |
|---|---|---|
| 底层机制 | 结构化函数调用 | 自然语言推理 |
| 输出格式 | JSON / 结构化数据 | 自由文本 |
| 适合场景 | 需要高效工具调用 | 需要解释决策过程 |
| 典型延迟 | 较低(直接参数化调用) | 较高(需生成完整文本) |
| LLM 要求 | 需支持函数调用(如 gpt-4) | 通用模型即可 |
3、 AgentExecutor创建方式
- 特点:
- 内置一些标准化模板(如 ZERO_SHOT_REACT_DESCRIPTION )
- Agent的创建:使用AgentType
- 优点:快速上手(3行代码完成配置)
- 缺点:定制化能力较弱(如提示词固定)
- 特点: Agent的创建:使用create_xxx_agent
- 优点:
- 可自定义提示词(如从远程hub获取或本地自定义)
- 清晰分离Agent逻辑与执行逻辑
- 缺点:
- 需要更多代码
- 需理解底层组件关系
| 组件 | 传统方式 | 通用方式 |
|---|---|---|
| Agent 创建 | 通过 AgentType 枚举选择预设 | 通过 create_xxx_agent 显式构建 |
| AgentExecutor 创建 | 通过 initialize_agent () 创建 | 通过 AgentExecutor () 创建 |
| 提示词 | 内置不可见 | 可以自定义 |
| 工具集成 | AgentExecutor 中显式传入 | Agent/AgentExecutor 中需显式传入 |
三、Agent中工具的使用
1、 传统方式
案例1:单工具使用
from langchain_core.tools import StructuredTool
from langchain_openai import ChatOpenAI
from langchain.agents import initialize_agent, AgentType
from langchain.tools import Tool
import os
import dotenv
from langchain_openai import ChatOpenAI
from langchain_community.tools.tavily_search import TavilySearchResults
dotenv.load_dotenv()
# 读取配置文件的信息
# os.environ['TAVILY_API_KEY'] = os.getenv("TAVILY_API_KEY")
os.environ['TAVILY_API_KEY'] = "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"
# 获取Tavily搜索工具的实例
search = TavilySearchResults(max_results=3)
# 获取一个搜索的工具
# 方式1:
# search_tool = StructuredTool.from_function(
# func=search.run,
# name="Search",
# description="用于检索互联网上的信息",
# )
# 方式2:使用Tool
search_tool = Tool(
func=search.run,
name="Search",
description="用于检索互联网上的信息",
)
# 获取大语言模型
os.environ['OPENAI_API_KEY'] = os.getenv("OPENAI_API_KEY1")
os.environ['OPENAI_BASE_URL'] = os.getenv("OPENAI_BASE_URL")
llm = ChatOpenAI(
model="gpt-4o-mini",
temperature=0,
)
# 获取Agent的实例
agent = AgentType.ZERO_SHOT_REACT_DESCRIPTION
# 获取AgentExecutor的实例
agent_executor = initialize_agent(
tools = [search_tool],
llm = llm,
agent = agent,
verbose = True, # 显示详细的日志信息
)
# 通过AgentExecutor 调用invoke(),并得到响应
result = agent_executor.invoke("查询北京今天的天气情况")
# 处理响应数据
print(result)
上述示例也可以写为:
from langchain_core.tools import StructuredTool
from langchain_openai import ChatOpenAI
from langchain.agents import initialize_agent, AgentType
from langchain.tools import Tool
import os
import dotenv
from langchain_openai import ChatOpenAI
from langchain_community.tools.tavily_search import TavilySearchResults
dotenv.load_dotenv()
# 读取配置文件的信息
# os.environ['TAVILY_API_KEY'] = os.getenv("TAVILY_API_KEY")
os.environ['TAVILY_API_KEY'] = "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"
# 获取Tavily搜索工具的实例
search = TavilySearchResults(max_results=3)
# 获取大语言模型
os.environ['OPENAI_API_KEY'] = os.getenv("OPENAI_API_KEY1")
os.environ['OPENAI_BASE_URL'] = os.getenv("OPENAI_BASE_URL")
llm = ChatOpenAI(
model="gpt-4o-mini",
temperature=0,
)
# 获取Agent的实例
agent = AgentType.ZERO_SHOT_REACT_DESCRIPTION
# 获取AgentExecutor的实例
agent_executor = initialize_agent(
tools = [search],
llm = llm,
agent = agent,
verbose = True, # 显示详细的日志信息
)
# 通过AgentExecutor 调用invoke(),并得到响应
result = agent_executor.invoke("查询北京今天的天气情况")
# 处理响应数据
print(result)
方式2:FUNCATION_CALL模式
- AgentType是 OPENAI_FUNCTIONS
from langchain_core.tools import StructuredTool
from langchain_openai import ChatOpenAI
from langchain.agents import initialize_agent, AgentType
from langchain.tools import Tool
import os
import dotenv
from langchain_openai import ChatOpenAI
from langchain_community.tools.tavily_search import TavilySearchResults
dotenv.load_dotenv()
# 读取配置文件的信息
# os.environ['TAVILY_API_KEY'] = os.getenv("TAVILY_API_KEY")
os.environ['TAVILY_API_KEY'] = "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"
# 获取Tavily搜索工具的实例
search = TavilySearchResults(max_results=3)
# 获取一个搜索的工具
# 方式1:
# search_tool = StructuredTool.from_function(
# func=search.run,
# name="Search",
# description="用于检索互联网上的信息",
# )
# 方式2:使用Tool
search_tool = Tool(
func=search.run,
name="Search",
description="用于检索互联网上的信息",
)
# 获取大语言模型
os.environ['OPENAI_API_KEY'] = os.getenv("OPENAI_API_KEY1")
os.environ['OPENAI_BASE_URL'] = os.getenv("OPENAI_BASE_URL")
llm = ChatOpenAI(
model="gpt-4o-mini",
temperature=0,
)
# 获取Agent的实例 (使用function_call模型)
agent = AgentType.OPENAI_FUNCTIONS
# 获取AgentExecutor的实例
agent_executor = initialize_agent(
tools = [search_tool],
llm = llm,
agent = agent,
verbose = True, # 显示详细的日志信息
)
# 通过AgentExecutor 调用invoke(),并得到响应
result = agent_executor.invoke("查询北京今天的天气情况")
# 处理响应数据
print(result)
| 对比维度 | ZERO_SHOT_REACT_DESCRIPTION | OPENAI_FUNCTIONS |
|---|---|---|
| 底层机制 | 模型生成文本指令,系统解析后调用工具 | 模型直接返回 JSON 格式工具调用 |
| 执行效率 | 🐢 较低(需多轮文本交互) | ⚡ 更高(单步完成) |
| 输出可读性 | 直接显示人类可读的思考过程 | 需查看结构化日志 |
| 工具参数处理 | 依赖模型文本描述准确性 | 自动匹配工具参数结构 |
| 兼容模型 | 所有文本生成模型 | 仅 GPT-4/Claude 3 等新型模型 |
| 复杂任务表现 | 可能因文本解析失败出错 | 更可靠(结构化保证) |
案例2:多工具使用
1.导入相关依赖
from langchain_openai import ChatOpenAI
from langchain.agents import initialize_agent, AgentType
from langchain.tools import Tool
from langchain_community.tools.tavily_search import TavilySearchResults
from langchain_experimental.utilities.python import PythonREPL
# 2. 设置 TAVILY_API 密钥
os.environ["TAVILY_API_KEY"] = "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" # 需要替换为你的 Tavily API 密钥
# 3.定义搜索工具
search = TavilySearchResults(max_results=3)
search_tool = Tool(
name="Search",
func=search.run,
description="用于搜索互联网上的信息,特别是股票价格和新闻"
)
# 4.定义计算工具
python_repl = PythonREPL() # LangChain封装的工具类可以进行数学计算
calc_tool = Tool(
name="Calculator",
func=python_repl.run,
description="用于执行数学计算,例如计算百分比变化"
)
# 5. 定义LLM
llm = ChatOpenAI(
model="gpt-4o-mini",
temperature=0,
)
# 6. 创建AgentExecutor执行器对象
agent_executor = initialize_agent(
tools=[search_tool, calc_tool],
llm=llm,
agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION,
verbose=True
)
# 7. 测试股票价格查询
query = "比亚迪当前股价是多少?比去年上涨了百分之几?"
result=agent_executor.invoke(query)
print(f"查询结果: {result}")
# 1.导入相关依赖
from langchain_openai import ChatOpenAI
from langchain.agents import initialize_agent, AgentType
from langchain.tools import Tool
from langchain_community.tools.tavily_search import TavilySearchResults
from langchain_experimental.utilities.python import PythonREPL
# 2. 设置 TAVILY_API 密钥
os.environ["TAVILY_API_KEY"] = "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" # 需要替换为你的 Tavily API 密钥
# 3.定义搜索工具
search = TavilySearchResults(max_results=3)
search_tool = Tool(
name="Search",
func=search.run,
description="用于搜索互联网上的信息,特别是股票价格和新闻"
)
# 4.定义计算工具
python_repl = PythonREPL() # LangChain封装的工具类可以进行数学计算
calc_tool = Tool(
name="Calculator",
func=python_repl.run,
description="用于执行数学计算,例如计算百分比变化"
)
# 5. 定义LLM
llm = ChatOpenAI(
model="gpt-4o-mini",
temperature=0,
)
# 6. 创建AgentExecutor执行器对象
agent_executor = initialize_agent(
tools=[search_tool, calc_tool],
llm=llm,
agent=AgentType.OPENAI_FUNCTIONS, #唯一需要修改的位置
verbose=True
)
# 7. 测试股票价格查询
query = "比亚迪当前股价是多少?比去年上涨了百分之几?"
result=agent_executor.invoke(query)
print(f"查询结果: {result}")
案例3:自定义函数与工具
举例:计算3的平方,Agent自动调用工具完成
from langchain.agents import initialize_agent, AgentType, Tool
from langchain_openai import ChatOpenAI
import langchain
# 1. 定义工具 - 计算器(要求字符串输入)
def simple_calculator(expression: str) -> str:
"""
基础数学计算工具,支持加减乘除和幂运算
参数:
expression: 数学表达式字符串,如 "3+5" 或 "2**3"
返回:
计算结果字符串或错误信息
"""
print(f"\n[工具调用] 计算表达式: {expression}")
print("只因为在人群中多看了你一眼,确认下你调用了我^_^")
return str(eval(expression))
# 2. 创建工具对象
math_calculator_tool = Tool(
name="Math_Calculator", # 工具名称(Agent将根据名称选择工具)
func=simple_calculator, # 工具调用的函数
description="用于数学计算,输入必须是纯数学表达式(如'3+5'或'3**2'表示平方)。不支持字母或特殊符号" # 关键:明确输入格式要求
)
# 3. 初始化大模型
llm = ChatOpenAI(
model="gpt-4o-mini",
temperature=0,
)
# 4. 初始化AgentExecutor(使用零样本React模式、增加超时设置)
agent_executor = initialize_agent(
tools=[math_calculator_tool], # 可用的工具列表
llm=llm,
agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION, # 简单指令模式
verbose=True # 关键参数!在控制台显示详细的推理过程
)
# 5. 测试工具调用(添加异常捕获)
print("=== 测试:正常工具调用 ===")
response = agent_executor.invoke("计算3的平方") # 向Agent提问
print("最终答案:", response)
2 、通用方式
方式1:FUNCATION_CALL模式
from langchain_core.prompts import ChatPromptTemplate, PromptTemplate
# 获取Tavily搜索的实例
from langchain_openai import ChatOpenAI
from langchain.agents import initialize_agent, AgentType, create_tool_calling_agent, AgentExecutor
from langchain.tools import Tool
import os
import dotenv
from langchain_openai import ChatOpenAI
from langchain_community.tools.tavily_search import TavilySearchResults
dotenv.load_dotenv()
# 读取配置文件的信息
os.environ['TAVILY_API_KEY'] = "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"
# 获取Tavily搜索工具的实例
search = TavilySearchResults(max_results=3)
# 获取一个搜索的工具
# 使用Tool
search_tool = Tool(
func=search.run,
name="Search",
description="用于检索互联网上的信息",
)
# 获取大语言模型
os.environ['OPENAI_API_KEY'] = os.getenv("OPENAI_API_KEY1")
os.environ['OPENAI_BASE_URL'] = os.getenv("OPENAI_BASE_URL")
llm = ChatOpenAI(
model="gpt-4o-mini",
temperature=0,
)
# 提供提示词模板(以ChatPromptTemplate为例)
prompt_template = ChatPromptTemplate.from_messages([
("system","你是一个乐于助人的ai助手,根据用户的提问,必要时调用Search工具,使用互联网检索数据"),
("human","{input}"),
("system","{agent_scratchpad}"),
# ("placeholder","{agent_scratchpad}")
])
# 获取Agent的实例:create_tool_calling_agent()
agent = create_tool_calling_agent(
llm=llm,
prompt=prompt_template,
tools=[search_tool]
)
# 获取AgentExecutor的实例
agent_executor = AgentExecutor(
agent=agent,
tools=[search_tool],
verbose=True,
)
# 通过AgentExecutor的实例调用invoke(),得到响应
result = agent_executor.invoke({"input":"查询今天北京的天气情况"})
# 处理响应
print(result)
方式2:ReAct模式
举例1:使用PromptTemplate实现
from langchain.agents import create_react_agent
from langchain_core.prompts import ChatPromptTemplate
# 获取Tavily搜索的实例
from langchain_openai import ChatOpenAI
from langchain.agents import initialize_agent, AgentType, create_tool_calling_agent, AgentExecutor
from langchain.tools import Tool
import os
import dotenv
from langchain_openai import ChatOpenAI
from langchain_community.tools.tavily_search import TavilySearchResults
dotenv.load_dotenv()
# 读取配置文件的信息
os.environ['TAVILY_API_KEY'] = "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"
# 获取Tavily搜索工具的实例
search = TavilySearchResults(max_results=3)
# 获取一个搜索的工具
# 使用Tool
search_tool = Tool(
func=search.run,
name="Search",
description="用于检索互联网上的信息",
)
# 获取大语言模型
os.environ['OPENAI_API_KEY'] = os.getenv("OPENAI_API_KEY1")
os.environ['OPENAI_BASE_URL'] = os.getenv("OPENAI_BASE_URL")
llm = ChatOpenAI(
model="gpt-4o-mini",
temperature=0,
)
# 提供提示词模板(以PromptTemplate为例)
template = """
Answer the following questions as best you can. You have access to the following tools:
{tools}
Use the following format:
Question: the input question you must answer
Thought: you should always think about what to do
Action: the action to take, should be one of [{tool_names}]
Action Input: the input to the action
Observation: the result of the action
... (this Thought/Action/Action Input/Observation can repeat N times)
Thought: I now know the final answer
Final Answer: the final answer to the original input question
Begin!
Question: {input}
Thought:{agent_scratchpad}"""
prompt_template = PromptTemplate.from_template(
template=template,
)
# 获取Agent的实例:create_react_agent()
agent = create_react_agent(
llm=llm,
prompt=prompt_template,
tools=[search_tool]
)
# 获取AgentExecutor的实例
agent_executor = AgentExecutor(
agent=agent,
tools=[search_tool],
verbose=True,
)
# 通过AgentExecutor的实例调用invoke(),得到响应
result = agent_executor.invoke({"input":"查询今天北京的天气情况"})
# 处理响应
print(result)
上述的举例1也可以改写为:
from langchain import hub
from langchain.agents import create_react_agent
from langchain_core.prompts import ChatPromptTemplate
# 获取Tavily搜索的实例
from langchain_openai import ChatOpenAI
from langchain.agents import initialize_agent, AgentType, create_tool_calling_agent, AgentExecutor
from langchain.tools import Tool
import os
import dotenv
from langchain_openai import ChatOpenAI
from langchain_community.tools.tavily_search import TavilySearchResults
dotenv.load_dotenv()
# 读取配置文件的信息
os.environ['TAVILY_API_KEY'] = "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"
# 获取Tavily搜索工具的实例
search = TavilySearchResults(max_results=3)
# 获取一个搜索的工具
# 使用Tool
search_tool = Tool(
func=search.run,
name="Search",
description="用于检索互联网上的信息",
)
# 获取大语言模型
os.environ['OPENAI_API_KEY'] = os.getenv("OPENAI_API_KEY1")
os.environ['OPENAI_BASE_URL'] = os.getenv("OPENAI_BASE_URL")
llm = ChatOpenAI(
model="gpt-4o-mini",
temperature=0,
)
# 使用LangChain Hub中的官方ReAct提示模板
prompt_template = hub.pull("hwchase17/react")
# 获取Agent的实例:create_react_agent()
agent = create_react_agent(
llm=llm,
prompt=prompt_template,
tools=[search_tool]
)
# 获取AgentExecutor的实例
agent_executor = AgentExecutor(
agent=agent,
tools=[search_tool],
verbose=True,
)
# 通过AgentExecutor的实例调用invoke(),得到响应
result = agent_executor.invoke({"input":"查询今天北京的天气情况"})
# 处理响应
print(result)
from langchain.agents import create_react_agent
from langchain_core.prompts import ChatPromptTemplate
# 获取Tavily搜索的实例
from langchain_openai import ChatOpenAI
from langchain.agents import initialize_agent, AgentType, create_tool_calling_agent, AgentExecutor
from langchain.tools import Tool
import os
import dotenv
from langchain_openai import ChatOpenAI
from langchain_community.tools.tavily_search import TavilySearchResults
dotenv.load_dotenv()
# 读取配置文件的信息
os.environ['TAVILY_API_KEY'] = "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"
# 获取Tavily搜索工具的实例
search = TavilySearchResults(max_results=3)
# 获取一个搜索的工具
# 使用Tool
search_tool = Tool(
func=search.run,
name="Search",
description="用于检索互联网上的信息",
)
# 获取大语言模型
os.environ['OPENAI_API_KEY'] = os.getenv("OPENAI_API_KEY1")
os.environ['OPENAI_BASE_URL'] = os.getenv("OPENAI_BASE_URL")
llm = ChatOpenAI(
model="gpt-4o-mini",
temperature=0,
)
# 提供提示词模板(以ChatPromptTemplate为例)
system_template = """
Answer the following questions as best you can. You have access to the following tools:
{tools}
Use the following format:
Question: the input question you must answer
Thought: you should always think about what to do
Action: the action to take, should be one of [{tool_names}]
Action Input: the input to the action
Observation: the result of the action
... (this Thought/Action/Action Input/Observation can repeat N times)
Thought: I now know the final answer
Final Answer: the final answer to the original input question
Begin!"""
prompt_template = ChatPromptTemplate.from_messages([
("system",system_template),
("human","{input}"),
("system","{agent_scratchpad}"),
])
# 获取Agent的实例:create_react_agent()
agent = create_react_agent(
llm=llm,
prompt=prompt_template,
tools=[search_tool]
)
# 获取AgentExecutor的实例
agent_executor = AgentExecutor(
agent=agent,
tools=[search_tool],
verbose=True,
)
# 通过AgentExecutor的实例调用invoke(),得到响应
result = agent_executor.invoke({"input":"查询今天北京的天气情况"})
# 处理响应
print(result)
小结:
1、传统方式,相较于通用方式来讲,不用提供提示词模板。
2、对于通用方式来讲,
FUNCTION_CALL模式:在创建Agent时,推荐大家使用ChatPromptTemplate
ReAct模式:在创建Agent时,大家可以使用ChatPromptTemplate、PromptTemplate。但相较来讲,推荐大家使用PromptTemplate
四、Agent嵌入记忆组件
1、 传统方式
以ReAct模式为例进行实现:
from langchain.memory import ConversationBufferMemory
from langchain_openai import ChatOpenAI
from langchain.agents import initialize_agent, AgentType
from langchain.tools import Tool
import os
import dotenv
from langchain_openai import ChatOpenAI
from langchain_community.tools.tavily_search import TavilySearchResults
dotenv.load_dotenv()
# 读取配置文件的信息
# os.environ['TAVILY_API_KEY'] = os.getenv("TAVILY_API_KEY")
os.environ['TAVILY_API_KEY'] = "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"
# 获取Tavily搜索工具的实例
search = TavilySearchResults(max_results=3)
# 获取一个搜索的工具
search_tool = Tool(
func=search.run,
name="Search",
description="用于检索互联网上的信息",
)
# 获取大语言模型
os.environ['OPENAI_API_KEY'] = os.getenv("OPENAI_API_KEY1")
os.environ['OPENAI_BASE_URL'] = os.getenv("OPENAI_BASE_URL")
llm = ChatOpenAI(
model="gpt-4o-mini",
temperature=0,
)
# 获取一个记忆的实例:ConversationBufferMemory
memory = ConversationBufferMemory(
return_messages=True,
memory_key="chat_history" #此时必须设置memory_key,且值为chat_history。因为提示词模板中使用的是chat_history。二者必须一致!
)
# 获取Agent的实例
agent = AgentType.CONVERSATIONAL_REACT_DESCRIPTION
# 获取AgentExecutor的实例
agent_executor = initialize_agent(
tools = [search_tool],
llm = llm,
agent = agent,
verbose = True, # 显示详细的日志信息
memory = memory,
)
# 通过AgentExecutor 调用invoke(),并得到响应
result = agent_executor.invoke("查询北京今天的天气情况")
# 处理响应数据
print(result)
result = agent_executor.invoke("上海呢?")
# 处理响应数据
print(result)
2 、通用方式
from langchain.memory import ConversationBufferMemory
from langchain_core.prompts import ChatPromptTemplate, PromptTemplate
# 获取Tavily搜索的实例
from langchain_openai import ChatOpenAI
from langchain.agents import initialize_agent, AgentType, create_tool_calling_agent, AgentExecutor
from langchain.tools import Tool
import os
import dotenv
from langchain_openai import ChatOpenAI
from langchain_community.tools.tavily_search import TavilySearchResults
dotenv.load_dotenv()
# 读取配置文件的信息
os.environ['TAVILY_API_KEY'] = "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"
8
# 获取Tavily搜索工具的实例
search = TavilySearchResults(max_results=3)
# 获取一个搜索的工具
# 使用Tool
search_tool = Tool(
func=search.run,
name="Search",
description="用于检索互联网上的信息",
)
# 获取大语言模型
os.environ['OPENAI_API_KEY'] = os.getenv("OPENAI_API_KEY1")
os.environ['OPENAI_BASE_URL'] = os.getenv("OPENAI_BASE_URL")
llm = ChatOpenAI(
model="gpt-4o-mini",
temperature=0,
)
# 提供提示词模板(以ChatPromptTemplate为例)
prompt_template = ChatPromptTemplate.from_messages([
("system","你是一个乐于助人的ai助手,根据用户的提问,必要时调用Search工具,使用互联网检索数据"),
("system","{agent_scratchpad}"),
("system","{chat_history}"), #添加一个chat_history的变量,用于记录上下文的记忆
("human","{input}"),
# ("placeholder","{agent_scratchpad}")
])
# 提供记忆的实例:ConversationBufferMemory
memory = ConversationBufferMemory(
return_messages=True,
memory_key="chat_history", #此值需要与提示词模板中的记录记忆的变量同名
)
# 获取Agent的实例:create_tool_calling_agent()
agent = create_tool_calling_agent(
llm=llm,
prompt=prompt_template,
tools=[search_tool]
)
# 获取AgentExecutor的实例
agent_executor = AgentExecutor(
agent=agent,
tools=[search_tool],
verbose=True,
memory=memory,
)
# 通过AgentExecutor的实例调用invoke(),得到响应
result = agent_executor.invoke({"input":"查询今天北京的天气情况"})
# 处理响应
print(result)
result = agent_executor.invoke({"input":"上海的呢?"})
print(result)
from langchain import hub
from langchain.agents import create_react_agent
from langchain_core.prompts import ChatPromptTemplate
# 获取Tavily搜索的实例
from langchain_openai import ChatOpenAI
from langchain.agents import initialize_agent, AgentType, create_tool_calling_agent, AgentExecutor
from langchain.tools import Tool
import os
import dotenv
from langchain_openai import ChatOpenAI
from langchain_community.tools.tavily_search import TavilySearchResults
dotenv.load_dotenv()
# 读取配置文件的信息
os.environ['TAVILY_API_KEY'] = "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"
# 获取Tavily搜索工具的实例
search = TavilySearchResults(max_results=3)
# 获取一个搜索的工具
# 使用Tool
search_tool = Tool(
func=search.run,
name="Search",
description="用于检索互联网上的信息",
)
# 获取大语言模型
os.environ['OPENAI_API_KEY'] = os.getenv("OPENAI_API_KEY1")
os.environ['OPENAI_BASE_URL'] = os.getenv("OPENAI_BASE_URL")
llm = ChatOpenAI(
model="gpt-4o-mini",
temperature=0,
)
# 使用LangChain Hub中的官方ReAct提示模板
prompt_template = hub.pull("hwchase17/react-chat")
# 提供记忆的实例
memory = ConversationBufferMemory(
return_messages=True,
memory_key="chat_history",
)
# 获取Agent的实例:create_react_agent()
agent = create_react_agent(
llm=llm,
prompt=prompt_template,
tools=[search_tool]
)
# 获取AgentExecutor的实例
agent_executor = AgentExecutor(
agent=agent,
tools=[search_tool],
verbose=True,
memory=memory,
)
# 通过AgentExecutor的实例调用invoke(),得到响应
result = agent_executor.invoke({"input":"查询2025年9月9日北京的天气情况"})
# 处理响应
print(result)
result = agent_executor.invoke({"input":"上海的呢?"})
print(result)
from langchain import hub
from langchain.agents import create_react_agent
from langchain_core.prompts import ChatPromptTemplate
# 获取Tavily搜索的实例
from langchain_openai import ChatOpenAI
from langchain.agents import initialize_agent, AgentType, create_tool_calling_agent, AgentExecutor
from langchain.tools import Tool
import os
import dotenv
from langchain_openai import ChatOpenAI
from langchain_community.tools.tavily_search import TavilySearchResults
dotenv.load_dotenv()
# 读取配置文件的信息
os.environ['TAVILY_API_KEY'] = "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"
# 获取Tavily搜索工具的实例
search = TavilySearchResults(max_results=3)
# 获取一个搜索的工具
# 使用Tool
search_tool = Tool(
func=search.run,
name="Search",
description="用于检索互联网上的信息",
)
# 获取大语言模型
os.environ['OPENAI_API_KEY'] = os.getenv("OPENAI_API_KEY1")
os.environ['OPENAI_BASE_URL'] = os.getenv("OPENAI_BASE_URL")
llm = ChatOpenAI(
model="gpt-4o-mini",
temperature=0,
)
# 自定义提示词模板
template = """Assistant is a large language model trained by OpenAI.
Assistant is designed to be able to assist with a wide range of tasks, from answering simple questions to providing in-depth explanations and discussions on a wide range of topics. As a language model, Assistant is able to generate human-like text based on the input it receives, allowing it to engage in natural-sounding conversations and provide responses that are coherent and relevant to the topic at hand.
Assistant is constantly learning and improving, and its capabilities are constantly evolving. It is able to process and understand large amounts of text, and can use this knowledge to provide accurate and informative responses to a wide range of questions. Additionally, Assistant is able to generate its own text based on the input it receives, allowing it to engage in discussions and provide explanations and descriptions on a wide range of topics.
Overall, Assistant is a powerful tool that can help with a wide range of tasks and provide valuable insights and information on a wide range of topics. Whether you need help with a specific question or just want to have a conversation about a particular topic, Assistant is here to assist.
TOOLS:
------
Assistant has access to the following tools:
{tools}
To use a tool, please use the following format:
```
Thought: Do I need to use a tool? Yes
Action: the action to take, should be one of [{tool_names}]
Action Input: the input to the action
Observation: the result of the action
```
When you have a response to say to the Human, or if you do not need to use a tool, you MUST use the format:
```
Thought: Do I need to use a tool? No
Final Answer: [your response here]
```
Begin!
Previous conversation history:
{chat_history}
New input: {input}
{agent_scratchpad}
"""
prompt_template = PromptTemplate.from_template(
template=template,
)
# 提供记忆的实例
memory = ConversationBufferMemory(
return_messages=True,
memory_key="chat_history",
)
# 获取Agent的实例:create_react_agent()
agent = create_react_agent(
llm=llm,
prompt=prompt_template,
tools=[search_tool]
)
# 获取AgentExecutor的实例
agent_executor = AgentExecutor(
agent=agent,
tools=[search_tool],
verbose=True,
memory=memory,
handle_parsing_errors=True,
)
# 通过AgentExecutor的实例调用invoke(),得到响应
result = agent_executor.invoke({"input":"查询2025年9月9日北京的天气情况"})
# 处理响应
print(result)
result = agent_executor.invoke({"input":"上海的呢?"})
print(result)
更多推荐



所有评论(0)