零基础学AI大模型之LangChain智能体之initialize_agent开发实战

大家好,我是工藤学编程 🦉 一个正在努力学习的小博主,期待你的关注
实战代码系列最新文章😉 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 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开发全流程

本次实战将实现一个"支持数学计算+网页搜索"的智能体,完成两个任务:

  1. 数学计算:计算5乘以6的结果
  2. 实时信息获取:查询腾讯最新股价

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(随机)
)

替换提示

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

解读

  1. 智能体先思考"该用哪个工具"(根据工具文档字符串判断)
  2. 调用 math_calculator 工具,传入参数 5 * 6
  3. 获取工具返回结果,整理后输出

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 工具
  • 搜索结果格式化后直接返回,无需手动处理结果整合

六、实战注意事项

  1. 工具文档字符串是"灵魂"

    智能体完全依赖文档字符串判断工具用途,描述不清晰会导致工具调用错误(如把数学计算任务传给搜索工具)。

  2. API密钥安全管理

    不要硬编码API密钥(如SearchApi、DashScope),建议使用环境变量、配置文件或密钥管理服务。

  3. eval函数的安全风险

    示例中用 eval 执行数学计算,生产环境下存在代码注入风险,建议替换为 ast.literal_evalsympy 等安全计算库。

  4. 大模型兼容性问题

    部分大模型不支持多参数工具(如 multiply(a:int, b:int)),可能会报错,建议先测试工具兼容性。

  5. handle_parsing_errors=True必加

    工具调用时可能出现参数解析错误,开启该参数后智能体将自动重试,大幅提升稳定性。

七、总结

initialize_agent 是LangChain中最简单、最适合入门的智能体初始化方法,它通过封装工具调度逻辑,让我们无需关注"如何选工具、如何处理错误",只需专注于业务工具的定义。

本文通过"数学计算+实时搜索"实战,掌握了:

  • 手动调用工具的痛点及解决方案
  • initialize_agent的语法、参数(尤其是AgentType)
  • 工具定义技巧(文档字符串编写)
  • 智能体创建、测试全流程

虽然 initialize_agent 是旧版方法,但它能帮助我们快速理解智能体的核心工作原理。下一篇文章,我们将学习更强大的新版智能体创建方法------create_react_agentcreate_tool_calling_agent

如果本文对你有帮助,欢迎点赞、关注、收藏!有任何问题,欢迎在评论区留言交流~

相关推荐
NAGNIP9 小时前
一文搞懂深度学习中的通用逼近定理!
人工智能·算法·面试
冬奇Lab10 小时前
一天一个开源项目(第36篇):EverMemOS - 跨 LLM 与平台的长时记忆 OS,让 Agent 会记忆更会推理
人工智能·开源·资讯
冬奇Lab10 小时前
OpenClaw 源码深度解析(一):Gateway——为什么需要一个"中枢"
人工智能·开源·源码阅读
AngelPP14 小时前
OpenClaw 架构深度解析:如何把 AI 助手搬到你的个人设备上
人工智能
宅小年14 小时前
Claude Code 换成了Kimi K2.5后,我再也回不去了
人工智能·ai编程·claude
九狼14 小时前
Flutter URL Scheme 跨平台跳转
人工智能·flutter·github
ZFSS14 小时前
Kimi Chat Completion API 申请及使用
前端·人工智能
天翼云开发者社区15 小时前
春节复工福利就位!天翼云息壤2500万Tokens免费送,全品类大模型一键畅玩!
人工智能·算力服务·息壤
知识浅谈16 小时前
教你如何用 Gemini 将课本图片一键转为精美 PPT
人工智能
Ray Liang16 小时前
被低估的量化版模型,小身材也能干大事
人工智能·ai·ai助手·mindx