尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

《Agentic Design Patterns》第 5 章导读:工具使用(Tool Use)

《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/ 整理供学习交流版权归原作者所有。
返回列表