| 大家好,我是工藤学编程 🦉 | 一个正在努力学习的小博主,期待你的关注 |
|---|---|
| 实战代码系列最新文章😉 | C++实现图书管理系统(Qt C++ GUI界面版) |
| SpringBoot实战系列🐷 | 【SpringBoot实战系列】SpringBoot3.X 整合 MinIO 存储原生方案 |
| 分库分表 | 分库分表之实战-sharding-JDBC分库分表执行流程原理剖析 |
| 消息队列 | 深入浅出 RabbitMQ-RabbitMQ消息确认机制(ACK) |
| AI大模型 | 零基础学AI大模型之LangChain智能体执行引擎AgentExecutor |
前情摘要
1、零基础学AI大模型之读懂AI大模型
2、零基础学AI大模型之从0到1调用大模型API
3、零基础学AI大模型之SpringAI
4、零基础学AI大模型之AI大模型常见概念
5、零基础学AI大模型之大模型私有化部署全指南
6、零基础学AI大模型之AI大模型可视化界面
7、零基础学AI大模型之LangChain
8、零基础学AI大模型之LangChain六大核心模块与大模型IO交互链路
9、零基础学AI大模型之Prompt提示词工程
10、零基础学AI大模型之LangChain-PromptTemplate
11、零基础学AI大模型之ChatModel聊天模型与ChatPromptTemplate实战
12、零基础学AI大模型之LangChain链
13、零基础学AI大模型之Stream流式输出实战
14、零基础学AI大模型之LangChain Output Parser
15、零基础学AI大模型之解析器PydanticOutputParser
16、零基础学AI大模型之大模型的"幻觉"
17、零基础学AI大模型之RAG技术
18、零基础学AI大模型之RAG系统链路解析与Document Loaders多案例实战
19、零基础学AI大模型之LangChain PyPDFLoader实战与PDF图片提取全解析
20、零基础学AI大模型之LangChain WebBaseLoader与Docx2txtLoader实战
21、零基础学AI大模型之RAG系统链路构建:文档切割转换全解析
22、零基础学AI大模型之LangChain 文本分割器实战:CharacterTextSplitter 与 RecursiveCharacterTextSplitter 全解析
23、零基础学AI大模型之Embedding与LLM大模型对比全解析
24、零基础学AI大模型之LangChain Embedding框架全解析
25、零基础学AI大模型之嵌入模型性能优化
26、零基础学AI大模型之向量数据库介绍与技术选型思考
27、零基础学AI大模型之Milvus向量数据库全解析
28、零基础学AI大模型之Milvus核心:分区-分片-段结构全解+最佳实践
29、零基础学AI大模型之Milvus部署架构选型+Linux实战:Docker一键部署+WebUI使用
30、零基础学AI大模型之Milvus实战:Attu可视化安装+Python整合全案例
31、零基础学AI大模型之Milvus索引实战
32、零基础学AI大模型之Milvus DML实战
33、零基础学AI大模型之Milvus向量Search查询综合案例实战
33、零基础学AI大模型之新版LangChain向量数据库VectorStore设计全解析
34、零基础学AI大模型之相似度Search与MMR最大边界相关搜索实战
35、零基础学AI大模型之LangChain整合Milvus:新增与删除数据实战
36、零基础学AI大模型之LangChain+Milvus实战:相似性搜索与MMR多样化检索全解析
37、零基础学AI大模型之LangChain Retriever
38、零基础学AI大模型之MultiQueryRetriever多查询检索全解析
39、零基础学AI大模型之LangChain核心:Runnable接口底层实现
40、零基础学AI大模型之RunnablePassthrough
41、零基础学AI大模型之RunnableParallel
42、零基础学AI大模型之RunnableLambda
43、零基础学AI大模型之RunnableBranch
44、零基础学AI大模型之Agent智能体
45、零基础学AI大模型之LangChain Tool工具
46、零基础学AI大模型之LLM绑定Tool工具实战
47、零基础学AI大模型之LangChain Tool异常处理
48、零基础学AI大模型之CoT思维链和ReAct推理行动
49、零基础学AI大模型之Zero-Shot和Few-Shot
50、零基础学AI大模型之LangChain智能体执行引擎AgentExecutor
本文章目录
- 零基础学AI大模型之LangChain智能体之initialize_agent开发实战
- 一、手动调用工具的"痛点":为什么需要initialize_agent?
- 二、LangChain智能体初始化方案对比
- 三、initialize_agent方法详解
-
- [3.1 核心作用](#3.1 核心作用)
- [3.2 语法与参数解析](#3.2 语法与参数解析)
-
- [3.2.1 基础语法](#3.2.1 基础语法)
- [3.2.2 关键参数详解](#3.2.2 关键参数详解)
- [3.3 核心参数:AgentType类型选择](#3.3 核心参数:AgentType类型选择)
- 四、实战:initialize_agent开发全流程
-
- [4.1 环境准备](#4.1 环境准备)
- [4.2 步骤1:定义工具(Tool)](#4.2 步骤1:定义工具(Tool))
- [4.3 步骤2:初始化大模型(LLM)](#4.3 步骤2:初始化大模型(LLM))
- [4.4 步骤3:用initialize_agent创建智能体](#4.4 步骤3:用initialize_agent创建智能体)
- [4.5 步骤4:解析智能体底层逻辑(可选)](#4.5 步骤4:解析智能体底层逻辑(可选))
- [4.6 步骤5:测试智能体](#4.6 步骤5:测试智能体)
- [4.7 完整代码汇总](#4.7 完整代码汇总)
- 五、运行结果与解读
-
- [5.1 数学计算任务输出(verbose=True模式)](#5.1 数学计算任务输出(verbose=True模式))
- [5.2 实时股价查询输出](#5.2 实时股价查询输出)
- 六、实战注意事项
- 七、总结
零基础学AI大模型之LangChain智能体之initialize_agent开发实战
一、手动调用工具的"痛点":为什么需要initialize_agent?
在之前的文章中,我们已经学会了如何定义LangChain Tool、将Tool与LLM绑定,但手动调用工具时会面临一系列棘手问题,这些问题让开发者陷入"重复造轮子"的困境:
| 手动调用工具的问题 | initialize_agent 解决方案 |
|---|---|
| 需要手动编写工具选择逻辑(判断"该用哪个工具") | 自动根据输入文本动态选择最合适的工具 |
| 缺乏错误重试机制(工具调用失败直接中断) | 内置异常捕获和重试策略,提升稳定性 |
| 输出格式不统一(不同工具返回格式混乱) | 标准化响应格式,统一结果输出样式 |
| 难以处理多工具协作场景(不知道调用顺序) | 自动编排工具调用顺序,支持复杂任务 |
| 手动处理任务分解、参数生成、结果整合 | 利用大模型推理能力自动完成全流程 |
简单说,initialize_agent 就像给智能体装了一个"智能调度大脑",让我们从繁琐的工具管理逻辑中解放出来,专注于业务工具的定义本身。
二、LangChain智能体初始化方案对比
LangChain提供了多种智能体创建方法,各自有不同的适用场景,我们先通过表格快速了解:
| 智能体创建方法 | 核心特点 | 适用场景 |
|---|---|---|
| initialize_agent | 通用初始化(兼容旧版),一行代码构建 | 快速原型开发、简单任务处理 |
| create_react_agent | 基于ReAct框架,支持多步推理 | 复杂逻辑推理、需要思考过程的任务 |
| create_tool_calling_agent | 专为工具调用优化,支持结构化输出 | 高精度工具调用、企业级应用 |
| create_json_agent | 专注处理JSON格式数据 | 接口数据解析、JSON相关任务 |
| create_openai_tools_agent | 适配OpenAI工具调用格式 | 使用OpenAI系列模型的场景 |
本文重点讲解 initialize_agent------虽然它是旧版方法,未来可能被弃用,但胜在简单直观,是零基础入门智能体工具调度的最佳选择。
三、initialize_agent方法详解
3.1 核心作用
initialize_agent 通过封装智能体的决策逻辑和工具调度流程,实现"传入工具列表+LLM,输出可直接运行的智能体执行器(AgentExecutor)",核心价值是:
- 自动化工具选择:无需手动判断"用哪个工具"
- 流程标准化:统一处理错误、重试、结果格式化
- 简化开发:一行代码完成智能体初始化
3.2 语法与参数解析
3.2.1 基础语法
python
from langchain.agents import initialize_agent
def initialize_agent(
tools: Sequence[BaseTool], # 可用工具列表
llm: BaseLanguageModel, # 大模型实例
agent: Optional[AgentType] = None, # Agent类型(关键参数)
verbose: bool = False, # 是否显示详细执行过程
handle_parsing_errors: bool = False, # 是否自动处理解析错误
) -> AgentExecutor: # 返回值:智能体执行器
3.2.2 关键参数详解
| 参数名 | 类型 | 作用 | 常用值 |
|---|---|---|---|
| tools | Sequence[BaseTool] | 传入智能体可调用的工具列表 | 自定义@tool装饰的函数组成的列表 |
| llm | BaseLanguageModel | 驱动智能体决策的大模型 | ChatOpenAI、Qwen、Llama等 |
| agent | AgentType | 指定智能体类型(决策逻辑) | 见3.3小节详解 |
| verbose | bool | 是否打印思考过程(调试用) | True/False |
| handle_parsing_errors | bool | 是否自动处理工具调用解析错误 | True(推荐,提升稳定性) |
3.3 核心参数:AgentType类型选择
agent 参数决定了智能体的决策模式,不同类型适配不同场景,常用类型如下:
| AgentType | 中文名称 | 核心特点 | 适用场景 |
|---|---|---|---|
| ZERO_SHOT_REACT_DESCRIPTION | 零样本ReAct智能体 | 基于ReAct框架,无需示例,根据工具描述决策 | 通用任务、快速原型 |
| STRUCTURED_CHAT_ZERO_SHOT_REACT_DESCRIPTION | 结构化聊天ReAct智能体 | 支持复杂参数类型,适合结构化输入 | 需要复杂参数的工具调用 |
| CONVERSATIONAL_REACT_DESCRIPTION | 对话式ReAct智能体 | 保留对话历史上下文 | 多轮对话场景 |
| SELF_ASK_WITH_SEARCH | 自问自答搜索智能体 | 自动生成中间问题并验证 | 知识问答、需要分步搜索的任务 |
入门推荐 :优先使用 ZERO_SHOT_REACT_DESCRIPTION,零样本即可工作,对新手最友好。
四、实战:initialize_agent开发全流程

本次实战将实现一个"支持数学计算+网页搜索"的智能体,完成两个任务:
- 数学计算:计算5乘以6的结果
- 实时信息获取:查询腾讯最新股价
4.1 环境准备
首先确保安装必要依赖:
bash
# 安装LangChain核心库
pip install langchain
# 安装OpenAI兼容库(适配通义千问等模型)
pip install langchain-openai
# 安装搜索工具依赖
pip install langchain-community
4.2 步骤1:定义工具(Tool)
使用 @tool 装饰器定义智能体可调用的工具,工具的文档字符串(docstring)至关重要------智能体将通过文档字符串判断"何时使用该工具"。
python
import os
from langchain_core.tools import tool
from langchain_community.utilities import SearchApiAPIWrapper
# ---------------------- 1. 配置搜索工具API密钥 ----------------------
# 注:SearchApi需要注册获取密钥,地址:https://www.searchapi.io/
os.environ["SEARCHAPI_API_KEY"] = "xxx"
search = SearchApiAPIWrapper() # 实例化搜索工具
# ---------------------- 2. 定义网页搜索工具 ----------------------
@tool("web_search", return_direct=True)
def web_search(query: str) -> str:
"""
当需要获取实时信息、最新事件或未知领域知识时使用,输入应为具体的搜索关键词
例如:"腾讯最新股价"、"2025年人工智能发展趋势"
"""
try:
# 获取搜索结果(默认前3条)
results = search.results(query)
# 格式化输出结果(来源+内容)
return "\n\n".join([
f"来源:{res['title']}\n内容:{res['snippet']}"
for res in results['organic_results']
])
except Exception as e:
return f"搜索失败:{str(e)}"
# ---------------------- 3. 定义数学计算工具 ----------------------
@tool("math_calculator", return_direct=True)
def math_calculator(expression: str) -> str:
"""
用于进行数学计算,输入必须是一个有效的数学表达式
例如:'2 + 3'、'5 * 4'、'10 / 2 - 1'
"""
try:
# 执行计算(注意:eval存在安全风险,生产环境建议用ast.literal_eval或第三方计算库)
result = eval(expression)
return f"计算结果:{expression} = {str(result)}"
except Exception as e:
return f"计算出错:{str(e)}"
# ---------------------- 4. 定义乘法工具(演示多参数工具) ----------------------
@tool("multiply")
def multiply(a: int, b: int) -> str:
"""
专门用于计算两个整数的乘法,仅接收两个整数参数a和b
例如:a=5, b=6 时,返回30
"""
result = a * b
return f"乘法计算结果:{a} × {b} = {result}"
# ---------------------- 5. 构建工具列表 ----------------------
tools = [math_calculator, web_search, multiply] # 智能体可调用的工具集合
关键说明:
return_direct=True:工具执行结果直接返回给用户,不经过大模型二次处理- 文档字符串必须清晰描述"工具用途+输入格式",否则智能体无法正确判断何时调用
4.3 步骤2:初始化大模型(LLM)
本次使用通义千问(qwen-plus)模型,通过阿里云DashScope兼容接口调用:
python
from langchain_openai import ChatOpenAI
# 初始化大模型(通义千问)
llm = ChatOpenAI(
model_name="qwen-plus", # 模型名称
base_url="https://dashscope.aliyuncs.com/compatible-mode/v1", # 阿里云兼容接口
api_key="sk-xx", # 替换为自己的api_key
temperature=0.7 # 随机性:0(确定)~1(随机)
)
替换提示:
api_key需要在阿里云DashScope控制台获取(https://dashscope.console.aliyun.com/)- 也可替换为OpenAI模型:
model_name="gpt-3.5-turbo",base_url="https://api.openai.com/v1"
4.4 步骤3:用initialize_agent创建智能体
一行代码完成智能体初始化,返回 AgentExecutor 执行器:
python
from langchain.agents import initialize_agent, AgentType
# 创建智能体
agent_chain = initialize_agent(
tools=tools, # 传入工具列表
llm=llm, # 传入大模型
agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION, # 零样本ReAct智能体
verbose=True, # 显示详细思考过程(调试用)
handle_parsing_errors=True # 自动处理解析错误
)
4.5 步骤4:解析智能体底层逻辑(可选)
通过打印 agent_chain 的属性,了解智能体的决策核心(LLM链、Prompt模板等):
python
# 打印智能体的LLM链(决策核心)
print("="*50 + " 智能体LLM链 " + "="*50)
print(agent_chain.agent.llm_chain)
# 打印Prompt模板(智能体的决策规则)
print("\n" + "="*50 + " Prompt模板 " + "="*50)
print(agent_chain.agent.llm_chain.prompt.template)
# 打印Prompt输入变量
print("\n" + "="*50 + " Prompt输入变量 " + "="*50)
print(agent_chain.agent.llm_chain.prompt.input_variables)
输出解读:
- Prompt模板中包含智能体的决策规则(如"先思考该用哪个工具,再调用工具")
- 输入变量通常包括
input(用户输入)、agent_scratchpad(思考过程)
4.6 步骤5:测试智能体
调用 agent_chain.invoke() 方法执行任务,智能体将自动判断"用哪个工具"并执行。
测试1:数学计算(自动调用math_calculator工具)
python
# 任务:计算5乘以6的结果
print("="*50 + " 测试1:数学计算 " + "="*50)
result1 = agent_chain.invoke({"input": "计算 5 乘以 6 的结果"})
print("最终结果:", result1["output"])
测试2:实时股价查询(自动调用web_search工具)
python
# 任务:获取腾讯最新股价
print("\n" + "="*50 + " 测试2:实时股价查询 " + "="*50)
result2 = agent_chain.invoke({"input": "查询腾讯控股(00700.HK)最新股价"})
print("最终结果:", result2["output"])
4.7 完整代码汇总
python
import os
from langchain.agents import initialize_agent, AgentType
from langchain_openai import ChatOpenAI
from langchain_core.tools import tool
from langchain_community.utilities import SearchApiAPIWrapper
# ---------------------- 1. 配置环境与工具初始化 ----------------------
os.environ["SEARCHAPI_API_KEY"] = "xxx"
search = SearchApiAPIWrapper()
# ---------------------- 2. 定义工具 ----------------------
@tool("web_search", return_direct=True)
def web_search(query: str) -> str:
"""
当需要获取实时信息、最新事件或未知领域知识时使用,输入应为具体的搜索关键词
例如:"腾讯最新股价"、"2025年人工智能发展趋势"
"""
try:
results = search.results(query)
return "\n\n".join([
f"来源:{res['title']}\n内容:{res['snippet']}"
for res in results['organic_results']
])
except Exception as e:
return f"搜索失败:{str(e)}"
@tool("math_calculator", return_direct=True)
def math_calculator(expression: str) -> str:
"""
用于进行数学计算,输入必须是一个有效的数学表达式
例如:'2 + 3'、'5 * 4'、'10 / 2 - 1'
"""
try:
result = eval(expression)
return f"计算结果:{expression} = {str(result)}"
except Exception as e:
return f"计算出错:{str(e)}"
@tool("multiply")
def multiply(a: int, b: int) -> str:
"""
专门用于计算两个整数的乘法,仅接收两个整数参数a和b
例如:a=5, b=6 时,返回30
"""
return f"乘法计算结果:{a} × {b} = {a * b}"
# ---------------------- 3. 初始化大模型与智能体 ----------------------
tools = [math_calculator, web_search, multiply]
llm = ChatOpenAI(
model_name="qwen-plus",
base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
api_key="sk-xxx",
temperature=0.7
)
agent_chain = initialize_agent(
tools=tools,
llm=llm,
agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION,
verbose=True,
handle_parsing_errors=True
)
# ---------------------- 4. 解析底层逻辑 ----------------------
print("="*50 + " 智能体底层逻辑 " + "="*50)
print("LLM链:", agent_chain.agent.llm_chain)
print("\nPrompt模板:", agent_chain.agent.llm_chain.prompt.template)
print("\n输入变量:", agent_chain.agent.llm_chain.prompt.input_variables)
# ---------------------- 5. 测试智能体 ----------------------
print("\n" + "="*50 + " 测试1:数学计算 " + "="*50)
result1 = agent_chain.invoke({"input": "计算 5 乘以 6 的结果"})
print("结果:", result1["output"])
print("\n" + "="*50 + " 测试2:实时股价查询 " + "="*50)
result2 = agent_chain.invoke({"input": "查询腾讯控股(00700.HK)最新股价"})
print("结果:", result2["output"])
五、运行结果与解读
5.1 数学计算任务输出(verbose=True模式)
> Entering new AgentExecutor chain...
I need to calculate 5 multiplied by 6. Which tool should I use? The math_calculator tool is for mathematical calculations, and the input should be a valid mathematical expression. So I can use math_calculator with the expression '5 * 6'.
Action: math_calculator
Action Input: 5 * 6
Observation: 计算结果:5 * 6 = 30
Thought: I have obtained the calculation result, so I can directly return it to the user.
Final Answer: 计算结果:5 * 6 = 30
计算结果:5 * 6 = 30
解读:
- 智能体先思考"该用哪个工具"(根据工具文档字符串判断)
- 调用
math_calculator工具,传入参数5 * 6 - 获取工具返回结果,整理后输出
5.2 实时股价查询输出
> Entering new AgentExecutor chain...
I need to get the latest stock price of Tencent Holdings (00700.HK), which is real-time information. I should use the web_search tool.
Action: web_search
Action Input: 腾讯控股(00700.HK)最新股价
Observation: 来源:腾讯控股(00700.HK)股价_行情_走势图-东方财富网
内容:腾讯控股(00700.HK)最新价:385.20港元,涨跌幅:+1.23%,成交量:123.5万手,成交额:47.6亿港元...
Final Answer: 来源:腾讯控股(00700.HK)股价_行情_走势图-东方财富网
内容:腾讯控股(00700.HK)最新价:385.20港元,涨跌幅:+1.23%,成交量:123.5万手,成交额:47.6亿港元...
解读:
- 智能体判断"实时股价"属于"实时信息",自动调用
web_search工具 - 搜索结果格式化后直接返回,无需手动处理结果整合
六、实战注意事项
-
工具文档字符串是"灵魂"
智能体完全依赖文档字符串判断工具用途,描述不清晰会导致工具调用错误(如把数学计算任务传给搜索工具)。
-
API密钥安全管理
不要硬编码API密钥(如SearchApi、DashScope),建议使用环境变量、配置文件或密钥管理服务。
-
eval函数的安全风险
示例中用
eval执行数学计算,生产环境下存在代码注入风险,建议替换为ast.literal_eval或sympy等安全计算库。 -
大模型兼容性问题
部分大模型不支持多参数工具(如
multiply(a:int, b:int)),可能会报错,建议先测试工具兼容性。 -
handle_parsing_errors=True必加
工具调用时可能出现参数解析错误,开启该参数后智能体将自动重试,大幅提升稳定性。
七、总结
initialize_agent 是LangChain中最简单、最适合入门的智能体初始化方法,它通过封装工具调度逻辑,让我们无需关注"如何选工具、如何处理错误",只需专注于业务工具的定义。
本文通过"数学计算+实时搜索"实战,掌握了:
- 手动调用工具的痛点及解决方案
- initialize_agent的语法、参数(尤其是AgentType)
- 工具定义技巧(文档字符串编写)
- 智能体创建、测试全流程
虽然 initialize_agent 是旧版方法,但它能帮助我们快速理解智能体的核心工作原理。下一篇文章,我们将学习更强大的新版智能体创建方法------create_react_agent 和 create_tool_calling_agent。
如果本文对你有帮助,欢迎点赞、关注、收藏!有任何问题,欢迎在评论区留言交流~