当前位置: 首页 > article >正文

02-Agent 智能体开发实战指南(二):工具调用系统

Agent 智能体开发实战指南二工具调用系统深度解析系列导读这是《Agent 智能体开发实战指南》系列的第二篇将深入讲解 Agent 的工具调用系统包括tool 装饰器原理、工具设计原则、多工具协作等核心内容。一、工具Agent 的手脚1.1 为什么需要工具如果把 LLM 比作大脑那么工具就是手脚——没有工具再聪明的大脑也无法影响现实世界。工具的本质将外部能力封装成 LLM 可以理解和调用的接口。┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ LLM 大脑 │ ──→ │ 工具接口 │ ──→ │ 外部系统 │ │ (决策者) │ │ (翻译层) │ │ (执行者) │ └─────────────┘ └─────────────┘ └─────────────┘1.2 工具的三大要素要素作用示例名称LLM 识别工具的标识get_weather描述LLM 理解工具用途“查询指定城市的天气”参数LLM 传递必要信息city: str二、tool 装饰器详解2.1 基础用法fromlangchain_core.toolsimporttooltool(description获取股价传入股票名称返回字符串信息)defget_price(name:str)-str:returnf股票{name}的价格是 40 元装饰器做了什么提取函数名get_price作为工具名解析参数签名name: str确定输入要求解析返回类型- str确定输出格式绑定description供 LLM 理解用途将普通函数转换为 LangChain 的Tool对象2.2 完整 Tool 对象结构# tool 装饰后实际生成的对象结构Tool(nameget_price,description获取股价传入股票名称返回字符串信息,args_schema{name:{type:string,description:股票名称}},funcfunction get_price at 0x...)2.3 多参数工具示例tool(description查询两个城市之间的天气对比)defcompare_weather(city1:str,city2:str)-str:获取两个城市的天气并进行对比# LLM 会自动传入两个参数weather1get_weather(city1)weather2get_weather(city2)returnf{city1}:{weather1}|{city2}:{weather2}三、工具描述编写指南3.1 描述的重要性description 是 LLM 选择工具的唯一依据。糟糕的描述会导致LLM 不知道何时调用该工具LLM 传入错误的参数LLM 完全忽略该工具3.2 优秀描述的三要素# 描述太简略tool(description获取数据)# 描述不够清晰tool(description获取股票价格)# 优秀的描述tool(description获取股票实时价格传入股票名称如华胜天成、贵州茅台返回包含股价、涨跌幅的字符串信息)优秀描述包含功能说明这个工具做什么参数说明需要传入什么格式是什么返回说明会返回什么格式是什么示例值给出典型参数示例3.3 描述模板tool(description[功能]传入 [参数名 格式 示例]返回 [返回内容 格式])实战示例# 天气查询tool(description查询指定城市的天气情况传入城市名称如深圳、北京返回包含气温、湿度、风向的详细天气信息)# 用户信息查询tool(description获取当前用户的 ID无需参数返回纯字符串格式的用户 ID)# 数据检索tool(description从知识库中检索相关内容传入搜索关键词返回最匹配的 3-5 条参考资料)四、多工具协作场景4.1 场景股票查询 介绍fromlangchain.agentsimportcreate_agentfromlangchain_community.chat_models.tongyiimportChatTongyifromlangchain_core.toolsimporttooltool(description获取股票价格传入股票名称返回当前股价字符串)defget_price(name:str)-str:returnf股票{name}的价格是 40 元tool(description获取股票公司信息传入股票名称返回公司业务介绍字符串)defget_info(name:str)-str:returnf股票{name}是一家 A 股上市公司专注于计算机领域。agentcreate_agent(modelChatTongyi(modelqwen3-max),tools[get_price,get_info],system_prompt你是一个智能助手可以回答股票相关问题请告知我思考过程让我知道你为什么调用某个工具)forchunkinagent.stream({messages:[{role:user,content:华胜天成股价多少并介绍一下}]},stream_modevalues):latest_messagechunk[messages][-1]iflatest_message.content:print(latest_message.content)try:iflatest_message.tool_calls:print(f工具调用{[tc[name]fortcinlatest_message.tool_calls]})exceptAttributeError:pass4.2 执行流程分析用户华胜天成股价多少并介绍一下 ↓ Agent 思考用户问了两个问题——股价 公司介绍 ↓ 行动 1调用 get_price(华胜天成) ↓ 观察 1获得股价信息 ↓ 行动 2调用 get_info(华胜天成) ↓ 观察 2获得公司介绍 ↓ 生成答案整合两条信息回复用户4.3 工具调用顺序LLM 会自动决定工具调用顺序通常遵循依赖关系先获取必要数据再进行处理逻辑顺序按人类思考的自然顺序效率优先能并行则并行LangChain 支持并行调用五、工具设计最佳实践5.1 单一职责原则❌ 错误示例一个工具做太多事tool(description处理用户所有请求)defhandle_everything(query:str)-str:# 又查天气又查股价又写报告...pass✅ 正确示例每个工具专注一件事tool(description查询天气)defget_weather(city:str)-str:passtool(description查询股价)defget_price(stock:str)-str:passtool(description生成报告)defgenerate_report(user_id:str)-str:pass5.2 错误处理工具内部应该处理异常返回友好提示tool(description查询天气传入城市名称)defget_weather(city:str)-str:try:# 调用天气 APIresponseweather_api.get(city)returnformat_weather(response)exceptCityNotFoundError:returnf未找到城市{city}的天气信息请检查城市名称是否正确exceptAPIErrorase:returnf天气服务暂时不可用请稍后重试错误码{e.code}为什么避免 Agent 因工具异常而崩溃让 LLM 知道发生了什么可以调整策略提供更好的用户体验5.3 返回值格式原则返回 LLM 容易理解的格式# ❌ 返回复杂对象defget_weather(city:str)-dict:return{temp:26,humidity:50,wind:南风 1 级}# ✅ 返回格式化字符串defget_weather(city:str)-str:returnf城市{city}天气为晴天气温 26 摄氏度空气湿度 50%南风 1 级原因LLM 处理自然语言最擅长结构化数据反而需要额外解析。5.4 参数设计原则参数越少越好类型越简单越好# 参数太多tool(description查询天气)defget_weather(city:str,date:str,unit:str,include_hourly:bool)-str:pass# 简化参数tool(description查询指定城市的天气)defget_weather(city:str)-str:# 内部使用默认值今天、摄氏度、不含小时预报pass六、实战完整的工具集设计6.1 智扫通客服 Agent 工具集fromlangchain_core.toolsimporttoolfromrag.rag_serviceimportRagSummarizeService ragRagSummarizeService()# 1. 知识库检索工具tool(description从向量存储中检索参考资料传入搜索关键词返回最相关的知识内容)defrag_summarize(query:str)-str:returnrag.rag_summarize(query)# 2. 天气查询工具tool(description获取指定城市的天气传入城市名称返回包含气温、湿度、风向的字符串信息)defget_weather(city:str)-str:returnf城市{city}天气为晴天气温 26 摄氏度空气湿度 50%南风 1 级AQI21# 3. 用户位置工具tool(description获取用户所在城市的名称无需参数返回纯字符串格式的城市名)defget_user_location()-str:return深圳# 实际应从用户 profile 获取# 4. 用户 ID 工具tool(description获取当前用户的 ID无需参数返回纯字符串格式的用户 ID)defget_user_id()-str:return1001# 实际应从 session 获取# 5. 时间工具tool(description获取当前月份无需参数返回YYYY-MM格式的字符串)defget_current_month()-str:return2025-03# 6. 外部数据工具tool(description从外部系统获取指定用户在指定月份的使用记录传入 user_id 和 month返回使用数据字符串)deffetch_external_data(user_id:str,month:str)-str:# 从数据库或 API 获取returnexternal_data.get(user_id,{}).get(month,)# 7. 上下文标记工具tool(description无入参无返回值调用后标记当前为报告生成场景触发提示词切换)deffill_context_for_report():returnfill_context_for_report 已调用6.2 工具分类管理agent/tools/ ├── agent_tools.py # 核心业务工具 ├── common_tools.py # 通用工具时间、位置等 └── system_tools.py # 系统工具日志、监控等七、调试技巧7.1 打印工具调用日志forchunkinagent.stream(input_dict,stream_modevalues):latest_messagechunk[messages][-1]iflatest_message.content:print(f Agent:{latest_message.content})try:iflatest_message.tool_calls:tool_names[tc[name]fortcinlatest_message.tool_calls]print(f 工具调用{tool_names})exceptAttributeError:pass7.2 常见问题排查问题可能原因解决方案Agent 不调用工具description 不清晰重写工具描述调用错误工具工具名相似区分工具命名参数传错参数类型不明确在 description 中说明工具返回被忽略返回格式混乱统一返回格式八、本章小结核心要点tool 装饰器将 Python 函数转换为 LLM 可调用的 Tool 对象description 至关重要决定 LLM 是否正确选择工具单一职责每个工具只做一件事做好一件事错误处理工具内部处理异常返回友好提示返回值格式优先返回自然语言字符串下章预告下一篇我们将深入ReAct 框架学习ReAct 的思考 - 行动 - 观察循环多步推理策略如何引导 Agent 按正确顺序调用工具ReAct 实战案例解析Agent 智能体开发实战指南一从 LLM 到 Agent 的认知升级Agent 智能体开发实战指南二工具调用系统深度解析本文Agent 智能体开发实战指南三ReAct 框架深度解析Agent 智能体开发实战指南四流式输出与状态管理Agent 智能体开发实战指南五中间件系统与动态提示词Agent 智能体开发实战指南六RAG 与向量存储实战Agent 智能体开发实战指南七项目架构设计与工程化实践Agent 智能体开发实战指南八UI 集成与生产部署本文是《Agent 智能体开发实战指南》系列的第二篇下一篇将深入讲解 ReAct 框架。

相关文章:

02-Agent 智能体开发实战指南(二):工具调用系统

Agent 智能体开发实战指南(二):工具调用系统深度解析 系列导读:这是《Agent 智能体开发实战指南》系列的第二篇,将深入讲解 Agent 的工具调用系统,包括tool 装饰器原理、工具设计原则、多工具协作等核心内容…...

AI大模型课程|非计算机专业转行人工智能,好就业吗?非常详细收藏我这一篇就够了

很多就业者在看到人工智能领域发展的很好,意识觉醒的人想进入这个行业里面得到一些新兴行业的红利,想转行却担心自己的经历或者是专业被卡,犹豫不决,今天就来和大家聊一聊这个话题,看看能不能解除你的疑惑。 01写在前面…...

2026春招AI人才暴涨12倍!高薪缺人,企业招聘“去初级化”,脉脉洞察求职新趋势!

近日,职场社区平台脉脉发布《社交求职——2026年1-2月中高端人才求职招聘洞察》(以下简称《洞察》)。《洞察》显示,2026年1-2月,招聘市场整体回暖。新经济行业岗位量增长12.77%。AI人才争夺成招聘主战场,岗…...

OpenClaw深度解析:AI Agent运作机制全拆解,揭秘智能边界与安全风险!

本课以 OpenClaw 为具体案例,系统拆解 AI Agent 的完整运作机制。核心逻辑链为:LLM文字接龙本质 → System Prompt驱动的身份认知构建 → Tool Call工具链执行(Read/Write/exec/TTS/ASR递归调用)→ Sub-agent层级外包与Context En…...

Coursera 6 大 AI 爆款课深度评测!告别理论堆砌,初级开发者也能秒懂选课攻略,简历瞬间加分!

市面上 AI 课程一大堆,但要么太理论,要么太基础。本文对 Coursera 上 6 门优质 AI 课程进行了评测,结合国内初级开发者视角,帮你看懂各课程适合什么人、侧重点是什么,以及如何按自己的起点与目标做出选课决策。导语 想…...

ebmap Tour 智慧节目时间表功能预览

ebmap Tour 最近新增了节目时间表功能,为景区 / 园区打造实时化、场景化的演艺活动管理与展示体系,让游客清晰掌握节目动态、合理规划游览路线,同时帮助运营方高效编排、精准触达游客,提升景区服务体验与活动曝光。安装扩展&#…...

约瑟夫环(代码+公式推导)

题目描述𝑛个人的编号是 1 ~ 𝑛,如果他们依编号按顺时针排成一个圆圈,从编号是 1 的人开始顺时针报数。(报数是从 1 报起)当报到 𝑘的时候,这个人就退出游戏圈。下一个人重新从 1 开…...

图解C语言侵入式双向循环链表与 container_of 宏底层原理

一、侵入式链表 在了解侵入式链表之前,先回顾之前的非侵入式链表,形式如下: struct Node {int data; // 数据struct Node* next; };在非侵入式链表的这种设计中,拿到一个 Node,顺便也就拿到了它的 data。 …...

java从头开始-苍穹外卖-day11-数据统计与展示

营业额统计用户统计订单统计销量排名top10这个其实要多表联查,菜品是在订单详情表,但是这个表没有订单完成状态,因此需要多表连查...

别让Service层“越界”:为何Java中Service层不该直接返回Result对象?

别让Service层“越界”:为何Java中Service层不该直接返回Result对象? 引入:一次代码审查引发的思考 昨天在进行代码审查的时候,我发现同事在 Service 层直接返回了 Result 对象。当时我就指出了这个问题,可同事一脸疑惑…...

基于Spring Boot的校园二手物品置换系统设计与实践

第一章:系统设计目标与需求拆解 在高校倡导绿色低碳理念与学生闲置物品处理需求增长的背景下,基于Spring Boot的校园二手物品置换系统,核心目标是构建“以物换物”的非货币交易平台,解决传统校园二手交易中“价格博弈繁琐、闲置物…...

基于SpringBoot+Vue的旅游信息咨询网站

第一章:网站设计背景与核心定位 在旅游消费升级的趋势下,用户对旅游信息的需求从“基础查询”转向“精准化、个性化、一站式”服务,传统旅游信息平台存在信息碎片化、更新滞后、互动性弱等问题——用户需在多个平台切换查询景点、住宿、交通信…...

大学C语言搜题app推荐,助你从小白变编程大牛

不少自学C语言的同学都碰到过这般困境,看书之际觉着自己懂了,然而一敲代码便两眼一抹黑,碰到报错也不清楚如何解决。实际上,要想切实掌握这门底层语言,仅仅啃书本远远不足够,借助手机上的工具随时开展练习、…...

C语言特点及应用领域介绍,面向过程语言的相关知识

拥有50年历史的老牌编程语言C语言,直至如今在嵌入式开发领域依旧稳稳占据着霸主位置,每年毕业的程序员数量成千上万,然而真正能够把C语言运用到关键之处的却并不多。它具备简单直接的面向过程特性,在资源受到限制的单片机上面&…...

MCP、RAG与AI智能体对比图文笔记:收藏这份入门指南,轻松掌握大模型核心技术方向!

核心概念:各司其职的技术方向当前AI领域最火的三个概念(MCP、RAG、AI智能体),本质上解决的是不同层面的问题,并非互斥竞争关系。以下是它们的定位差异:技术方向核心能力解决的核心问题MCP定义LLM如何使用外…...

技术深度:模型预测控制(MPC)储能控制策略与多目标哈里斯鹰(MOHHO)算法储能容量配置研究

模型预测控制(MPC)储能控制策略 多目标哈里斯鹰(MOHHO)算法储能容量配置 matlab 研究内容:控制策略为双层控制模型,上层储能补偿风电预测误差,下层储能利用MPC平抑风电功率波动。 配置模型嵌入了上述控制策略&#xf…...

Docker 核心知识点

一、Docker 是什么Docker 把应用 依赖 环境一起打包,放到一个轻量、隔离、可移植的容器里,在哪都能跑。二、3 个核心概念1. 镜像(Image)- 只读模板 - 相当于「安装包」「系统盘」- 例:nginx、centos、tomcat2. 容器…...

什么是 SMD 封装?是不是都不带引脚?

SMD Surface Mounted Device中文:表面贴装器件,就是直接贴在 PCB 板表面焊接的元器件,不是从孔里穿过去焊的那种。1. 是不是都不带引脚?不是绝对 “没有引脚”,而是没有长直插引脚。SMD 有两种典型结构:无…...

C++——数组类模板

1.模板参数可以是数值型参数&#xff08;非类型参数&#xff09;模板参数是在编译阶段被处理的单元&#xff0c;所以在编译阶段必须准确无误的唯一确定变量、浮点数、类对象不能作为模板参数示例&#xff1a;使用模板参数计算12...N#include <iostream> #include<stri…...

来晚了,最全openClaw 本地部署安装方式!(Mac 和 windows)

大家好&#xff0c;我是阿陆&#xff01; 最近哥们不是在面试嘛。面试都面到老板面了&#xff0c;结果老板问了一句&#xff0c;你有玩过openClaw嘛&#xff0c;我说没有。好家伙&#xff0c;这一句话一出来当场变脸。 后续不出所料&#xff0c;老板面没有通过。 我心里想着吃一…...

Dying Gasp IC 详解:定义、功能、选型参数与应用场景

引言在通信设备&#xff08;如 GPON ONU、xDSL Modem、工业网关&#xff09;的实际应用中&#xff0c;突然掉电可能导致设备状态丢失、网管无法定位故障等问题。Dying Gasp&#xff08;临终之息&#xff09;技术正是为解决这一痛点而生&#xff0c;而Dying Gasp IC作为该技术的…...

变异检测算法解析:GATK、Samtools、DeepVariant的原理与性能对比

点击 “AladdinEdu&#xff0c;你的AI学习实践工作坊”&#xff0c;注册即送-H卡级别算力&#xff0c;沉浸式云原生集成开发环境&#xff0c;80G大显存多卡并行&#xff0c;按量弹性计费&#xff0c;教育用户更享超低价。 摘要&#xff1a;变异检测是全基因组/全外显子组测序数…...

从对话到协作:深度解析 WebMCP —— 开启浏览器端的 AI 智能体新时代

在 2024 年底&#xff0c;Anthropic 推出了 MCP (Model Context Protocol)&#xff0c;试图为 AI 模型与外部数据源之间构建一条“通用数据总线”。然而&#xff0c;对于广大的前端开发者和 Web 生态来说&#xff0c;传统的 MCP 更多是在后端或桌面端发力。 2025 年初&#xf…...

java基础面试知识点

java基础 1. Java面试核心概念 Java三大特点 &#xff1a;平台无关性、面向对象、内存管理。 平台无关性&#xff1a;通过JVM&#xff08;Java虚拟机&#xff09;实现。源代码编译成字节码&#xff08;.class文件&#xff09;&#xff0c;可在任何安装了相应JVM的操作系统上运行…...

安装虚拟机详细教程!!!

...

【ASP.NET CORE】 11. SignalR

本系列专栏基于杨中科老师的《ASP.NET Core技术内幕与项目 实战》&#xff0c;本人记录梳理的学习笔记&#xff0c;有部分的增补和省略。更全面系统的讲解&#xff0c;请看杨老师的视频课&#xff1a;【.NET教程&#xff0c;.Net Core视频教程&#xff0c;杨中科主讲】。 一、…...

openclaw本地部署实践复盘 openclaw本地部署案例分享 openclaw本地部署亲测记录 openclaw本地部署实践分享 openclaw本地部署经验复盘 openc

在 openclaw本地部署 的实际项目推进中&#xff0c;环境依赖复杂、权限控制难统一以及插件生态缺乏标准化管理&#xff0c;往往成为工程团队普遍面临的技术挑战。围绕这一问题&#xff0c;行业中通常会通过更系统化的架构设计与部署流程来降低不确定性&#xff0c;北京万维速达…...

mac M芯片安装pytorch

用 conda 创建一个 arm64 的 Python 环境 在这个 conda 环境里用 pip 安装 PyTorch 用 MPS 验证是否启用了 Apple GPU 这是因为 PyTorch 官方当前在 macOS 上推荐的包管理方式是 pip&#xff0c;并注明最新稳定版要求 Python 3.10&#xff1b;macOS 安装页也直接给出了 pip3 in…...

灭菌柜集中监控管理平台解决方案

某工厂要求对研发实验室的多个灭菌柜进行集中监控与在线管理&#xff0c;需要监控的数据量包括干燥开始时间/结束时间、灭菌开始时间/结束时间、升温开始时间/结束时间等&#xff0c;便于统计实验结果与设备性能。对此&#xff0c;通过本地部署数据中台&#xff0c;能够实现多个…...

重置root密码!

mountmount -o remount,rw /sysroot&#xff08;这里需要注意空格哦&#xff01;&#xff01;&#xff01;&#xff09;chroot /sysrootpasswd输入新密码&#xff0c;输入的时候没有提示的哦再次输入设置的新密码touch /.autorelableexitexit注意哦&#xff0c;小编改的是root用…...