零基础学AI大模型之个人助理智能体之tool_calling_agent实战

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

之前我们学过用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格式),无解析错误,参数完整
  • 自动利用用户固定信息(姓名"老王"),无需重复询问,体验像真实助理

六、实战注意事项

  1. 模型必须支持工具调用:如果用不支持的模型(如旧版通义千问、GPT-3.5-turbo-0301),会报错,优先选qwen-plus、gpt-4-turbo、llama-3-70b等
  2. Prompt占位符不能少{tools}{tool_names}{agent_scratchpad}是核心,少一个都会导致工具调用失败
  3. 工具描述要精准:特别是参数说明(类型、用途),描述模糊会让智能体传错参数
  4. 多步骤任务要引导:在system消息中明确"按顺序调用工具",智能体才能正确完成复杂任务
  5. 生产环境注意安全:示例中工具是模拟的,真实场景对接API时,要做好参数校验、权限控制(如身份证号加密)

七、总结

create_tool_calling_agent作为LangChain 0.3的新特性,是开发高精度、多工具协作智能体(如个人助理、企业API助手)的首选方案。它通过"结构化参数输出"解决了旧方案的解析痛点,让工具调用像"函数调用"一样简单、可靠。

本次实战我们掌握了:

  • create_tool_calling_agent的核心特点和适用场景
  • 三大必填参数的配置技巧(尤其是Prompt模板)
  • 个人助理智能体的完整开发流程(工具定义→模型初始化→智能体创建→测试)

如果你有任何问题,欢迎在评论区留言交流,喜欢就点赞、关注、收藏吧!

相关推荐
WZgold1412 小时前
黄金再创新高!2026 年金价走势预测
大数据·人工智能·经验分享·区块链
雷焰财经2 小时前
生成式AI走进金融核心系统——效率革命还是风险放大器?
人工智能
TOPGUS2 小时前
谷歌第三季度财报发布:AI搜索并未蚕食传统搜索,反而正在创造增量
大数据·人工智能·搜索引擎·谷歌·seo·数字营销
百度智能云技术站2 小时前
基于 vLLM 的大模型推理服务秒级扩缩容的工程优化实践
人工智能
下海fallsea2 小时前
AI竞争的答案:只买人不买产品
大数据·人工智能
sunfove2 小时前
空间几何的基石:直角、柱、球坐标系的原理与转换详解
人工智能·python·机器学习
<-->2 小时前
pytorch vs ray
人工智能·pytorch·python
知乎的哥廷根数学学派2 小时前
基于多尺度特征提取和注意力自适应动态路由胶囊网络的工业轴承故障诊断算法(Pytorch)
开发语言·网络·人工智能·pytorch·python·算法·机器学习
Yuer20252 小时前
低熵回答倾向:语言模型中的一种系统稳定态
人工智能·机器学习·语言模型·ai安全·edca os