| 大家好,我是工藤学编程 🦉 | 一个正在努力学习的小博主,期待你的关注 |
|---|---|
| 实战代码系列最新文章😉 | C++实现图书管理系统(Qt C++ GUI界面版) |
| SpringBoot实战系列🐷 | 【SpringBoot实战系列】SpringBoot3.X 整合 MinIO 存储原生方案 |
| 分库分表 | 分库分表之实战-sharding-JDBC分库分表执行流程原理剖析 |
| 消息队列 | 深入浅出 RabbitMQ-RabbitMQ消息确认机制(ACK) |
| AI大模型 | 零基础学AI大模型之LangChain智能体之initialize_agent开发实战 |
前情摘要
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图片提取全解析
50、零基础学AI大模型之LangChain智能体执行引擎AgentExecutor
51、零基础学AI大模型之LangChain智能体之initialize_agent开发实战
本文章目录
- 零基础学AI大模型之个人助理智能体之tool_calling_agent实战
- 一、为什么需要tool_calling_agent?旧方案的痛点
- 二、create_tool_calling_agent方法介绍
-
- [2.1 核心定位](#2.1 核心定位)
- [2.2 三大核心特点](#2.2 三大核心特点)
- [2.3 与initialize_agent对比](#2.3 与initialize_agent对比)
- 三、create_tool_calling_agent参数详解
-
- [3.1 基础语法](#3.1 基础语法)
- [3.2 关键参数必知](#3.2 关键参数必知)
- 四、实战:打造个人AI助理智能体
-
- [4.1 环境准备](#4.1 环境准备)
- [4.2 步骤1:定义工具(Tool)](#4.2 步骤1:定义工具(Tool))
- [4.3 步骤2:初始化支持工具调用的大模型](#4.3 步骤2:初始化支持工具调用的大模型)
- [4.4 步骤3:自定义Prompt模板](#4.4 步骤3:自定义Prompt模板)
- [4.5 步骤4:创建tool_calling_agent和执行器](#4.5 步骤4:创建tool_calling_agent和执行器)
- [4.6 步骤5:测试个人助理](#4.6 步骤5:测试个人助理)
- 五、运行结果与解读
-
- [5.1 完整运行日志(关键部分)](#5.1 完整运行日志(关键部分))
- [5.2 结果解读](#5.2 结果解读)
- 六、实战注意事项
- 七、总结
零基础学AI大模型之个人助理智能体之tool_calling_agent实战
一、为什么需要tool_calling_agent?旧方案的痛点
之前我们学过用initialize_agent创建智能体,它虽然简单,但在实际开发中会遇到不少麻烦:
- 工具调用参数是自然语言描述,需要额外解析,容易出错
- 不支持复杂数据类型参数,面对API集成等场景力不从心
- 多步骤工具调用时,顺序和参数控制精度低,容错率差
而LangChain 0.3版本新增的create_tool_calling_agent,完美解决了这些问题------它要求大模型直接返回结构化的工具调用参数(如JSON格式),减少中间解析环节,让工具调用更精准、更稳定,尤其适合做个人助理这类需要多工具协作的智能体。
二、create_tool_calling_agent方法介绍
2.1 核心定位
create_tool_calling_agent是专为"高精度工具调用"设计的智能体创建方法,核心是让大模型像"调用函数"一样使用工具,直接输出结构化参数,无需额外解析。
2.2 三大核心特点
- 结构化工具调用:显式指定工具名和参数,支持int、str、对象等复杂数据类型,参数格式无歧义
- 多步骤任务处理:能根据任务需求,按顺序调用多个工具,比如"查航班→订机票"的完整流程
- 精准控制:通过自定义Prompt模板,可精细指导智能体的思考和工具调用行为
2.3 与initialize_agent对比
| 特性 | initialize_agent | create_tool_calling_agent |
|---|---|---|
| 参数输出格式 | 自然语言描述 | 结构化格式(如JSON) |
| 解析错误率 | 较高 | 极低(无需额外解析) |
| 复杂参数支持 | 差 | 好(支持任意数据类型) |
| 多步骤任务适配 | 一般 | 优秀 |
| 适用场景 | 快速原型、简单任务 | API集成、高精度、个人助理 |
三、create_tool_calling_agent参数详解
3.1 基础语法
python
from langchain.agents import create_tool_calling_agent
agent = create_tool_calling_agent(
llm: BaseLanguageModel, # 支持工具调用的大模型实例
tools: Sequence[BaseTool], # 工具列表
prompt: ChatPromptTemplate # 提示模板(含工具调用规则)
)
3.2 关键参数必知
三个参数都是必填项,缺一不可,重点看这几点:
| 参数名 | 类型 | 作用说明 |
|---|---|---|
| llm | BaseLanguageModel | 必须是支持工具调用的模型(如ChatOpenAI、通义千问增强版、Llama 3等) |
| tools | Sequence[BaseTool] | 用@tool装饰器定义的工具列表,每个工具需清晰描述参数类型和用途 |
| prompt | ChatPromptTemplate | 必须包含{tools}(工具列表)、{tool_names}(工具名列表)、{agent_scratchpad}(思考过程)占位符 |
四、实战:打造个人AI助理智能体

本次实战将开发一个能"查股票、查日期、搜航班、订机票"的个人助理,完整流程从工具定义到智能体运行一步到位。
4.1 环境准备
确保安装最新版LangChain(需0.3+版本):
bash
pip install -U langchain langchain-openai langchain-community
4.2 步骤1:定义工具(Tool)
用@tool装饰器定义4个实用工具,注意清晰描述工具用途和参数------这是智能体能正确调用的关键:
python
from langchain.tools import tool
from datetime import datetime
# 工具1:获取当前日期
@tool
def get_current_date() -> str:
"""获取当前系统日期,格式为YYYY-MM-DD,适用于需要日期参数的任务(如查航班)"""
formatted_date = datetime.now().strftime("%Y-%m-%d")
return f"The current date is {formatted_date}"
# 工具2:搜索航班
@tool
def search_flights(from_city: str, to_city: str, date: str) -> str:
"""
根据出发城市、到达城市和日期搜索可用航班
参数说明:
- from_city: 出发城市(如广州、北京)
- to_city: 到达城市(如北京、上海)
- date: 出行日期(格式YYYY-MM-DD)
"""
# 实际场景可替换为真实航班查询API(如携程、飞猪API)
return f"成功查询到航班:{from_city} → {to_city},日期:{date},航班号:CA1314,价格:¥1200,起飞时间:08:30"
# 工具3:预订航班
@tool
def book_flight(flight_id: str, user: str) -> str:
"""
预订指定航班
参数说明:
- flight_id: 航班号(如CA1314)
- user: 用户名(如老王)
"""
# 实际场景可替换为真实航班预订API
return f"用户 {user} 已成功预订航班 {flight_id},订单号:ORD2025001,请注意查收短信通知"
# 工具4:获取股票价格(函数式工具)
def get_stock_price(symbol: str) -> str:
"""
获取指定股票的当前价格
参数说明:
- symbol: 股票代码或简称(如AAPL代表苹果股票,腾讯代表腾讯控股)
"""
# 实际场景可替换为真实股票数据API(如雪球、富途API)
return f"The current price of {symbol} is $198.50"
# 将函数式工具包装为LangChain Tool对象
from langchain.agents import Tool
stock_tool = Tool(
name="get_stock_price",
func=get_stock_price,
description="获取指定股票的当前价格,参数为股票代码或简称(如AAPL、腾讯)"
)
# 整理工具列表
tools = [get_current_date, search_flights, book_flight, stock_tool]
4.3 步骤2:初始化支持工具调用的大模型
必须使用支持工具调用的大模型,这里用通义千问(qwen-plus),也可替换为ChatOpenAI、Llama 3等:
python
from langchain_openai import ChatOpenAI
# 初始化大模型(通义千问)
llm = ChatOpenAI(
model_name="qwen-plus", # 支持工具调用的模型版本
base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
api_key="sk-xxx", # 替换为自己的API密钥
temperature=0.3 # 降低随机性,提高工具调用准确性
)
4.4 步骤3:自定义Prompt模板
Prompt必须包含{tools}、{tool_names}、{agent_scratchpad}占位符,同时可以加入用户信息(如姓名、需求),让助理更懂用户:
python
from langchain_core.prompts import ChatPromptTemplate
# 定义Prompt模板
prompt = ChatPromptTemplate.from_messages([
# 系统消息:定义助理身份和行为规则
("system", """你是一个贴心的个人AI助理,名叫小工。
工作规则:
1. 优先判断是否需要调用工具,不需要则直接回答
2. 需要调用工具时,必须使用结构化参数,确保参数完整、格式正确
3. 多步骤任务(如查航班+订机票)需按顺序调用工具,逐步完成
4. 调用工具前可先获取必要信息(如当前日期)"""),
# 用户固定信息:提前告知用户姓名等,避免重复询问
("human", "我叫老王,经常出差,身份证号是4414231993210223213332"),
# 用户输入:接收动态查询
("human", "{input}"),
# 智能体思考过程占位符:存储工具调用记录和结果
("placeholder", "{agent_scratchpad}")
])
4.5 步骤4:创建tool_calling_agent和执行器
用create_tool_calling_agent创建智能体,再用AgentExecutor包装(负责运行智能体):
python
from langchain.agents import AgentExecutor
# 创建tool_calling_agent
agent = create_tool_calling_agent(
llm=llm,
tools=tools,
prompt=prompt
)
# 创建智能体执行器(verbose=True显示思考和调用过程)
agent_executor = AgentExecutor(
agent=agent,
tools=tools,
verbose=True, # 调试用,显示详细流程
return_intermediate_steps=True # 返回中间调用步骤结果
)
4.6 步骤5:测试个人助理
让助理完成"查苹果股票+查明天广州飞北京航班+订机票"的组合任务,看它如何自动调用工具:
python
# 发起用户查询
result = agent_executor.invoke({
"input": "苹果股票现在多少钱?根据我的行程,帮我查询下明天的航班,从广州去北京,并预订机票"
})
# 打印最终结果
print("\n" + "="*80)
print("个人助理最终回复:")
print(result["output"])
五、运行结果与解读
5.1 完整运行日志(关键部分)
> Entering new AgentExecutor chain...
[{"name":"get_stock_price","parameters":{"symbol":"苹果"}}]
> Tool returned: The current price of 苹果 is $198.50
[{"name":"get_current_date","parameters":{}}]
> Tool returned: The current date is 2025-08-20
[{"name":"search_flights","parameters":{"from_city":"广州","to_city":"北京","date":"2025-08-21"}}]
> Tool returned: 成功查询到航班:广州 → 北京,日期:2025-08-21,航班号:CA1314,价格:¥1200,起飞时间:08:30
[{"name":"book_flight","parameters":{"flight_id":"CA1314","user":"老王"}}]
> Tool returned: 用户 老王 已成功预订航班 CA1314,订单号:ORD2025001,请注意查收短信通知
> Finished chain.
================================================================================
个人助理最终回复:
苹果股票当前价格为$198.50。
已为你查询2025-08-21广州飞往北京的航班:航班号CA1314,起飞时间08:30,价格¥1200。
已成功为你(老王)预订该航班,订单号ORD2025001,请留意短信通知。
5.2 结果解读
- 智能体按"查股票→查当前日期→算明天日期→搜航班→订机票"的顺序调用工具,逻辑清晰
- 每次工具调用都返回结构化参数(JSON格式),无解析错误,参数完整
- 自动利用用户固定信息(姓名"老王"),无需重复询问,体验像真实助理
六、实战注意事项
- 模型必须支持工具调用:如果用不支持的模型(如旧版通义千问、GPT-3.5-turbo-0301),会报错,优先选qwen-plus、gpt-4-turbo、llama-3-70b等
- Prompt占位符不能少 :
{tools}、{tool_names}、{agent_scratchpad}是核心,少一个都会导致工具调用失败 - 工具描述要精准:特别是参数说明(类型、用途),描述模糊会让智能体传错参数
- 多步骤任务要引导:在system消息中明确"按顺序调用工具",智能体才能正确完成复杂任务
- 生产环境注意安全:示例中工具是模拟的,真实场景对接API时,要做好参数校验、权限控制(如身份证号加密)
七、总结
create_tool_calling_agent作为LangChain 0.3的新特性,是开发高精度、多工具协作智能体(如个人助理、企业API助手)的首选方案。它通过"结构化参数输出"解决了旧方案的解析痛点,让工具调用像"函数调用"一样简单、可靠。
本次实战我们掌握了:
- create_tool_calling_agent的核心特点和适用场景
- 三大必填参数的配置技巧(尤其是Prompt模板)
- 个人助理智能体的完整开发流程(工具定义→模型初始化→智能体创建→测试)
如果你有任何问题,欢迎在评论区留言交流,喜欢就点赞、关注、收藏吧!