《Agentic Design Patterns》第 5 章导读:工具使用(Tool Use)
《Agentic Design Patterns》第 5 章导读工具使用Tool Use本文是对开源书籍《Agentic Design Patterns》第 5 章的解读与导读内容忠实呈现原文并附个人思考。原书在线阅读https://adp.xindoo.xyz/ 翻译项目代码仓库https://github.com/xindoo/agentic-design-patterns前面四章提示词链、路由、并行化、反思讲的都是在模型之间编排信息流。但一个残酷的现实是LLM 本质上和外部世界是断开的——它只吃训练数据知识是静态的不能查天气、不能算账、不能关灯、不能发邮件。第 5 章的**工具使用Tool Use**模式正是要给模型装上手和眼睛让它能真正调用外部 API、数据库、执行代码、控制其他系统。这也是把模型从文本生成器变成智能体的关键一步。一、什么是工具使用函数调用Function Calling工具使用通常通过**函数调用Function Calling**机制实现。它的完整流程书里拆得很细我整理成一张流程表阶段做什么1. 工具定义向 LLM 描述外部函数的能力用途、名称、参数及类型/描述2. LLM 决策模型结合用户请求 工具定义判断要不要调、调哪个3. 函数调用生成若决定调用模型输出结构化对象通常是 JSON注明工具名和参数4. 工具执行框架/编排层拦截这个结构化输出真正执行外部函数5. 观察/结果工具的执行结果返回给智能体6. LLM 处理模型把工具输出当上下文据此给用户最终答复或决定下一步再调用、反思、收尾一句话概括它的价值它是连接LLM 推理能力与外部海量功能之间的那座桥打破了模型只能靠记忆输出的天花板。书中还提了一个很有启发性的观点与其叫函数调用不如用更宽的**“工具调用”**视角——因为工具可以是传统函数、复杂 API 端点、数据库查询甚至是发给另一个专业智能体的指令。这样想主智能体就能扮演编排者把分析任务委托给分析师智能体、通过 API 查外部库构建出真正复杂的生态系统。二、应用场景一览场景典型工具智能体流程示例外部信息检索天气 API问伦敦天气LLM 调气象工具 → 取数 → 格式化回复与数据库/API 交互库存、订单、支付 API问X 有货吗LLM 调库存 API → 返回数量 → 告知用户计算与数据分析计算器、股票 API、电子表格问买 100 股 AAPL 的潜在利润LLM 先后调股票 计算器工具发送通信邮件发送 API“给 John 发封关于明天会议的邮件” → LLM 提取收件人/主题/正文并调用执行代码代码解释器用户贴代码问这段做什么LLM 用解释器运行并分析输出控制系统/设备智能家居 API“关掉客厅灯” → LLM 用命令目标设备调用家居工具图 1智能体使用工具的几个示例——检索、计算、通信、执行代码、控制设备。三、代码实战一用 LangChain 搭建工具调用智能体LangChain 的做法分两步先定义工具通常用tool装饰器封装一个 Python 函数再把工具和 LLM 绑定成会调工具的智能体。pipinstalllangchain langchain-openai langchain-google-genaiimportos,getpassimportasyncioimportnest_asynciofromlangchain_google_genaiimportChatGoogleGenerativeAIfromlangchain_core.promptsimportChatPromptTemplatefromlangchain_core.toolsimporttoolaslangchain_toolfromlangchain.agentsimportcreate_tool_calling_agent,AgentExecutor# 需要支持函数调用/工具调用的模型llmChatGoogleGenerativeAI(modelgemini-2.0-flash,temperature0)## --- 定义工具 ---langchain_tooldefsearch_information(query:str)-str:提供有关给定主题的事实信息。使用此工具查找诸如法国首都或伦敦的天气等短语的答案。simulated_results{weather in london:伦敦目前多云温度为 15°C。,capital of france:法国的首都是巴黎。,population of earth:地球的估计人口约为 80 亿人。,tallest mountain:珠穆朗玛峰是海拔最高的山峰。,default:f{query} 的模拟搜索结果未找到特定信息但该主题似乎很有趣。}returnsimulated_results.get(query.lower(),simulated_results[default])tools[search_information]## --- 创建工具调用智能体 ---agent_promptChatPromptTemplate.from_messages([(system,你是一个有用的助手。),(human,{input}),(placeholder,{agent_scratchpad}),# 智能体内部步骤的占位符])agentcreate_tool_calling_agent(llm,tools,agent_prompt)agent_executorAgentExecutor(agentagent,verboseTrue,toolstools)## --- 运行 ---asyncdefmain():tasks[agent_executor.ainvoke({input:法国的首都是什么}),agent_executor.ainvoke({input:伦敦的天气怎么样}),agent_executor.ainvoke({input:告诉我一些关于狗的事情。}),# 触发默认]resultsawaitasyncio.gather(*tasks)forrinresults:print(r[output])nest_asyncio.apply()asyncio.run(main())要点langchain_tool把普通 Python 函数变成可被模型感知的工具create_tool_calling_agent把LLM 工具 提示词绑成智能体AgentExecutor是运行时——负责在模型决定调用和真正执行工具之间搭桥。四、代码实战二用 CrewAI——会抛错的工具更专业CrewAI 的示例有一个很值得学的工程细节工具返回干净数据 主动抛错让智能体自己去处理异常。## pip install crewai langchain-openaiimportos,loggingfromcrewaiimportAgent,Task,Crewfromcrewai.toolsimporttool logging.basicConfig(levellogging.INFO,format%(asctime)s - %(levelname)s - %(message)s)## --- 1. 工具返回干净数据找不到就抛 ValueError ---tool(Stock Price Lookup Tool)defget_stock_price(ticker:str)-float:获取给定股票代码符号的最新模拟股票价格。以浮点数返回。如果未找到代码则引发 ValueError。simulated_prices{AAPL:178.15,GOOGL:1750.30,MSFT:425.50}pricesimulated_prices.get(ticker.upper())ifpriceisnotNone:returnpriceraiseValueError(f未找到代码 {ticker.upper()} 的模拟价格。)## --- 2. 定义智能体 ---financial_analyst_agentAgent(role高级财务分析师,goal使用提供的工具分析股票数据并报告关键价格。,backstory你是一位经验丰富的财务分析师擅长使用数据源查找股票信息。,verboseTrue,tools[get_stock_price],allow_delegationFalse,)## --- 3. 定义任务明确成功与失败的处理方式 ---analyze_aapl_taskTask(description(Apple代码AAPL的当前模拟股票价格是多少使用 Stock Price Lookup Tool 查找它。如果未找到代码你必须报告无法检索价格。),expected_output一个清晰的句子说明 AAPL 的模拟股票价格例如AAPL 的模拟股票价格是 $178.15。,agentfinancial_analyst_agent,)## --- 4. 组建团队并运行 ---financial_crewCrew(agents[financial_analyst_agent],tasks[analyze_aapl_task])resultfinancial_crew.kickoff()print(result)设计亮点让工具通过抛异常而不是返回折中字符串来报错是因为智能体天生会处理异常——它能据此决定下一步干什么比如报告失败而不是傻乎乎拿一条错误字符串继续往下走。五、代码实战三Google ADK 的预构建工具ADK 的杀手锏是大量开箱即用的预构建工具无需自己写函数fromgoogle.adk.agentsimportAgentfromgoogle.adk.runnersimportRunnerfromgoogle.adk.sessionsimportInMemorySessionServicefromgoogle.adk.toolsimportgoogle_searchfromgoogle.genaiimporttypesimportnest_asyncio,asyncio APP_NAME,USER_ID,SESSION_IDGoogle Search_agent,user1234,1234## 使用预构建的 Google 搜索工具定义智能体root_agentAgent(namebasic_search_agent,modelgemini-2.0-flash-exp,description使用 Google 搜索回答问题的智能体。,instruction我可以通过搜索互联网回答您的问题。随便问我什么,tools[google_search]# 直接拿来即用)asyncdefcall_agent(query):session_serviceInMemorySessionService()sessionawaitsession_service.create_session(app_nameAPP_NAME,user_idUSER_ID,session_idSESSION_ID)runnerRunner(agentroot_agent,app_nameAPP_NAME,session_servicesession_service)contenttypes.Content(roleuser,parts[types.Part(textquery)])eventsrunner.run(user_idUSER_ID,session_idSESSION_ID,new_messagecontent)foreventinevents:ifevent.is_final_response():print(智能体响应,event.content.parts[0].text)nest_asyncio.apply()asyncio.run(call_agent(最新的 AI 新闻是什么))除此之外ADK 还提供内建代码执行BuiltInCodeExecutor提供一个沙盒化 Python 解释器让模型自己写代码去计算——弥补了概率性语言生成做不了确定性精确计算的短板比如直接写 Python 去算(57)*3企业搜索VSearchAgent帮你查询企业私有数据存储Vertex AI Search还能拿到来源归因grounding回答有出处Vertex 扩展结构化 API 包装器企业级安全与隐私控制关键是——Vertex AI 会自动执行扩展而普通工具调用需要你自己手动执行这是两者最核心的区别。六、速览问题背景LLM 是强大的文本生成器但基本与外部世界断开——知识静态、止于训练数据缺乏执行操作或检索实时信息的能力无法完成需要调用 API/数据库/服务交互的任务。解决方案以模型能理解的方式描述可用的外部工具函数/API。智能体 LLM 根据请求决定是否需要工具生成结构化数据对象JSON指定函数名与参数编排层执行调用、取回结果、反馈给 LLM从而让模型把最新外部信息并入最终响应。实践建议当智能体需要突破内部知识、与外部世界交互时使用。典型任务实时数据天气、股价、私有/专有信息查公司库、精确计算、执行代码、触发其他系统操作发邮件、控设备。可视化总结图 2工具使用设计模式——模型决定 → 框架执行 → 结果回流的闭环。关键要点工具使用函数调用让智能体能访问动态信息、连接外部系统核心是定义描述清晰、参数明确LLM 可理解的工具模型决定何时用、用哪个并生成结构化工具调用框架负责执行与回传结果LangChain 用tool简化定义create_tool_calling_agentAgentExecutor搭建智能体Google ADK 提供 Google 搜索、代码执行、Vertex AI 搜索等现成工具。结语与个人思考工具使用是这本书里第一个真正让模型接地气的模式——前四章都是在模型之间搬信息这一章开始让模型去触碰真实世界。往后几乎所有高级模式RAG、Agent 间通信、编码 Agent……都建立在这个地基之上没有工具模型只是会聊天的辞典有了工具模型才成为能办事的智能体。几条工程心得书里也都点到了工具描述决定了调用质量模型靠工具定义来决定调不调、调哪个。描述含糊模型就不敢用或乱用。所以给工具的人话描述和参数说明往往比工具本身更重要。异常要抛给模型像 CrewAI 那样让工具抛异常比返回错误字符串更能引导模型做正确的事——模型天生会思考下一步怎么办。确定性工作交给工具LLM 做乘法都容易算错。但凡涉及精确计算、CRUD、确定性逻辑就交给工具/代码执行器模型只负责调度和表达。注意执行权边界像Vertex 扩展自动执行 vs 工具调用需手动执行是安全设计上的关键分水岭。让模型自动触发有副作用的操作发邮件、转账尤其要谨慎这直接关系到后面会讲的Guardrails安全护栏。下一步建议阅读第 6 章规划Planning——如果说工具是手那规划就是让智能体想清楚先后顺序再动手的大脑识别多步任务并拆分执行计划实现真正的自主。本文基于开源书籍《Agentic Design Patterns》https://github.com/xindoo/agentic-design-patterns 在线阅读 https://adp.xindoo.xyz/ 整理供学习交流版权归原作者所有。

相关新闻

隐私守护者:iOS远程访问安卓核心数据,为企业高管提供双重保障

隐私守护者:iOS远程访问安卓核心数据,为企业高管提供双重保障

在这个万物互联却又处处设防的职场江湖里,企业高管们往往过着一种“分裂”的生活。左手是承载着公司核心机密、财务报表和战略决策的高安全级别工作手机,右手则是记录着家庭琐事、社交八卦和周末计划的个人手机。这种物理上的隔离,本意是为了…

2026/10/8 8:20:50 阅读更多 →
开会、教学、远程演示必备:OPPO手机投屏+音乐同步全教程

开会、教学、远程演示必备:OPPO手机投屏+音乐同步全教程

作为一名互联网行业的打工人,我每天的工作就是在各种会议、客户演示和内部分享中来回切换。我们公司的产品功能复杂,光是靠口头解释远远不够,最好的方式就是直接投屏——把手机里的操作流程、产品界面甚至宣传视频,原原本本地展示…

2026/10/8 8:20:50 阅读更多 →
AI编程助手技能扩展实战:Claude Code与Codex的skills配置指南

AI编程助手技能扩展实战:Claude Code与Codex的skills配置指南

1. 从"skills"这个模糊词说起:它到底指什么第一次看到"skills"这个标题,很多人会懵——这词太泛了。但结合热搜词里高频出现的 Claude Code、Codex、agents、plugin 这几个词,方向其实很明确:这里说的 skills…

2026/10/8 8:20:50 阅读更多 →

最新新闻

php正则表达式学习笔记

php正则表达式学习笔记

前言 先说一件容易混淆的事:PHP 里的「正则表达式」其实分两套历史,一套是已经消失的 POSIX 扩展,一套是现在唯一在用的 PCRE。POSIX 那套函数(ereg()、eregi()、ereg_replace()、eregi_replace()、split()、spliti()、sql_regcas…

2026/10/9 9:54:17 阅读更多 →
php框架Phpbean说明

php框架Phpbean说明

前言 先说清楚一件事:Phpbean 是一个非常早期(PHP 5 时代)的轻量级 MVC 框架,早已停止维护,它的官方站点和官方文档如今都很难找到。网上关于它的说明文章内容高度雷同,基本是同一份文本被反复转抄&#xf…

2026/10/9 9:54:17 阅读更多 →
Honeywell EPKS SafeView配置实战:只读视图安全加固指南

Honeywell EPKS SafeView配置实战:只读视图安全加固指南

简介:本资源是一份面向工业自动化领域DCS操作员与系统工程师的Honeywell EPKS SafeView专项技术指南,聚焦解决传统Windows多窗口环境在工业监控场景中画面混乱、关键信息易被覆盖、操作不可控等核心痛点。文档基于Honeywell官方标准文档(如GS…

2026/10/9 9:54:17 阅读更多 →
从信息到Element:WSaiOS-SI结构智能体系的信息结构化理论研究

从信息到Element:WSaiOS-SI结构智能体系的信息结构化理论研究

从信息到Element:WSaiOS-SI结构智能体系的信息结构化理论研究摘要:信息如何进入结构智能体系,是WSaiOS-SI理论建设中必须回答的基础问题。本文提出,信息不等于Element,字符不等于Element,Token不等于Elemen…

2026/10/9 9:54:17 阅读更多 →
拆解MES基础考核试题:从ISA-95到BOM与生产模式的制造执行系统核心知识

拆解MES基础考核试题:从ISA-95到BOM与生产模式的制造执行系统核心知识

简介:MES基础业务考核试题(含答案)是一份面向制造企业信息化新员工、MES运维实施人员及生产管理实习生的考核型资料,内容围绕制造执行系统在车间层的应用展开,系统覆盖ISA-95标准、四个重点功能、物料批管控与单体管控…

2026/10/9 9:54:17 阅读更多 →
ARM架构本质:不是指令集背诵,而是硬件契约与系统权衡

ARM架构本质:不是指令集背诵,而是硬件契约与系统权衡

1. 为什么“搞懂ARM架构”这件事,90%的人从一开始方向就错了很多人点开一篇叫《一文深入搞懂ARM处理器架构》的文章,心里想的是:“我只要记住Cortex-A78比A55快、Neoverse是服务器用的、Thumb指令集更省电”——然后合上页面,觉得…

2026/10/9 9:53:15 阅读更多 →

日新闻

Java时间API实战:LocalDate、Date与ZonedDateTime的转换与避坑指南

Java时间API实战:LocalDate、Date与ZonedDateTime的转换与避坑指南

Java时间API这个话题,隔三差五就会在群里被翻出来讨论一次。上周还有个同事线上处理一个订单超时问题,排查到最后发现是ZonedDateTime序列化后时区丢了,用户在下单当天晚上看到的时间整整差了8个小时。这类问题几乎每个做Java开发的人都遇到过…

2026/10/9 0:00:49 阅读更多 →
EasyTier实践:从NAT穿透到子网代理的异地组网部署与排错

EasyTier实践:从NAT穿透到子网代理的异地组网部署与排错

前几个月我手头有好几台机器需要互相访问:办公室台式机、家里 NAS、还有一台云主机。如果只是偶尔传个文件倒还好,问题是工作场景经常要在几处环境之间来回切换,每次都先登录跳板机再层层代理,实在折腾。我先后试过端口映射、自建…

2026/10/9 0:00:49 阅读更多 →
AI Agent工程实战:从七要素到七个决策点的系统设计指南

AI Agent工程实战:从七要素到七个决策点的系统设计指南

AI Agent 这个词在过去一年里被反复提及,但真正动手搭过一套能跑起来的 Agent 系统的人都知道,从"知道它是什么"到"让它稳定干活"之间隔着一整套工程决策。我前后参与过几个 Agent 项目的落地,从最初用现成框架拼装&…

2026/10/9 0:01:50 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 15:26:32 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 15:26:40 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 10:10:36 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 21:13:17 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 15:26:17 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 6:17:20 阅读更多 →