零基础学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

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

相关推荐
king王一帅12 小时前
Incremark Solid 版本上线:Vue/React/Svelte/Solid 四大框架,统一体验
前端·javascript·人工智能
泰迪智能科技14 小时前
分享|职业技术培训|数字技术应用工程师快问快答
人工智能
Dxy123931021616 小时前
如何给AI提问:让机器高效理解你的需求
人工智能
少林码僧16 小时前
2.31 机器学习神器项目实战:如何在真实项目中应用XGBoost等算法
人工智能·python·算法·机器学习·ai·数据挖掘
钱彬 (Qian Bin)16 小时前
项目实践15—全球证件智能识别系统(切换为Qwen3-VL-8B-Instruct图文多模态大模型)
人工智能·算法·机器学习·多模态·全球证件识别
没学上了17 小时前
CNNMNIST
人工智能·深度学习
宝贝儿好17 小时前
【强化学习】第六章:无模型控制:在轨MC控制、在轨时序差分学习(Sarsa)、离轨学习(Q-learning)
人工智能·python·深度学习·学习·机器学习·机器人
智驱力人工智能17 小时前
守护流动的规则 基于视觉分析的穿越导流线区检测技术工程实践 交通路口导流区穿越实时预警技术 智慧交通部署指南
人工智能·opencv·安全·目标检测·计算机视觉·cnn·边缘计算
AI产品备案17 小时前
生成式人工智能大模型备案制度与发展要求
人工智能·深度学习·大模型备案·算法备案·大模型登记