news 2026/9/21 22:34:01

经典Agent架构实战之工具使用 (Tool Use)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
经典Agent架构实战之工具使用 (Tool Use)


欢迎关注公众号:AI开发的后端厨师,知乎:巴塞罗那的风
及时获取更新内容,每周更新一个经典Agent架构

介绍

工具使用架构是连接大型语言模型(LLM)推理能力与真实、动态世界的 桥梁。它赋予智能体查询 API、搜索数据库和访问实时信息的能力,从而克服了 LLM 知识的静态局限性。

定义

工具使用 架构为 LLM 驱动的智能体配备了调用外部函数或 API(即 “工具”)的能力。智能体能够自主判断用户查询是否需要外部信息,并决定调用哪个工具来获取所需数据。

工作流程

接收查询 (Receive Query): 智能体接收用户的请求。
决策 (Decision): 智能体分析查询和可用工具,判断是否需要工具。
行动 (Action): 如果需要,智能体格式化对工具的调用(例如,带正确参数的特定函数)。
观察 (Observation): 系统执行工具调用,并将结果(“观察结果”)返回给智能体。
合成 (Synthesis): 智能体将工具的输出整合到其推理过程中,生成一个最终的、有事实依据 的答案。

和react的区别

大家都是要调工具,都是要总结合成,二者的区别在哪?tool use架构是只调用一次工具,不需要把调用的结果再交给模型进行下一步动作的思考,换句话说就是tool use适合一锤子买卖或者是普通的work flow;react适合更复杂问题的解决

代码

本文章是对这篇公众号文章的复刻
完整代码已上传github:地址

核心代码解释

prompt

funcDraftCodeTemplate()prompt.DefaultChatTemplate{systemTpl:=` 角色:你是一个精于解决用户问题的问题解答师。 任务:根据用户的需求,回答问题,必要时使用提供给你的工具进行问题回答。 要求:如果你已知了工具的查询结果,则无需继续调用工具,而应该结果整合进最终的回答中,确保回答的准确性和完整性。 `chatTpl:=prompt.FromMessages(schema.FString,schema.SystemMessage(systemTpl),schema.UserMessage("{user_query}"),)return*chatTpl}

告诉模型职责,限制仅调用一次工具,不过这里更应在使用场景上进行限制

编排部分

typestatestruct{Messages[]*schema.Message}funcGetToolUseRunnable()(compose.Runnable[map[string]any,*schema.Message],error){sg:=compose.NewGraph[map[string]any,*schema.Message](compose.WithGenLocalState(func(ctx context.Context)*state{return&state{Messages:make([]*schema.Message,0)}}))ctx:=context.Background()model,err:=GetModel()iferr!=nil{returnnil,err}tools:=GetBaiDuMapTool(ctx,[]string{MapServer})toolNode,err:=compose.NewToolNode(ctx,&compose.ToolsNodeConfig{Tools:tools,})iferr!=nil{returnnil,err}toolsInfo,err:=genToolInfos(ctx,tools)iferr!=nil{returnnil,err}model,err=model.WithTools(toolsInfo)iferr!=nil{returnnil,err}modelPreHandle:=func(ctx context.Context,input[]*schema.Message,state*state)([]*schema.Message,error){state.Messages=append(state.Messages,input...)returnstate.Messages,nil}toolsNodePreHandle:=func(ctx context.Context,input*schema.Message,state*state)(*schema.Message,error){ifinput==nil{returnstate.Messages[len(state.Messages)-1],nil// used for rerun interrupt resume}state.Messages=append(state.Messages,input)returninput,nil}makeAnswerTemplate:=DraftCodeTemplate()sg.AddChatTemplateNode("MakeAnswerTemplate",&makeAnswerTemplate,compose.WithNodeName("MakeAnswerTemplate"))sg.AddChatModelNode("MakeAnswerModel",model,compose.WithNodeName("MakeAnswerModel"),compose.WithStatePreHandler(modelPreHandle))sg.AddToolsNode("ToolsNode",toolNode,compose.WithNodeName("ToolsNode"),compose.WithStatePreHandler(toolsNodePreHandle))sg.AddChatModelNode("Synthesis",model,compose.WithNodeName("Synthesis"),compose.WithStatePreHandler(modelPreHandle))sg.AddEdge(compose.START,"MakeAnswerTemplate")sg.AddEdge("MakeAnswerTemplate","MakeAnswerModel")sg.AddEdge("MakeAnswerModel","ToolsNode")sg.AddEdge("ToolsNode","Synthesis")sg.AddEdge("Synthesis",compose.END)reflectionRunnable,err:=sg.Compile(context.Background())returnreflectionRunnable,err}

最终实现了如下的graph

MakeAnswerTemplate ->MakeAnswerModel ->ToolsNode ->Synthesis

handler的作用

可以看到在调用模型及工具之前写了两个handler,作用都是追加对话历史,如果没有这两个handler会出现什么问题呢?
工具调用完整,进行总结的时候 模型仅仅拿到tool call的结果,但是他不知道自己是谁,不知道自己该干什么
所以这里通过两个prehandler对state进行修改,实现对话记录在全节点上的透传

小坑

  1. 没有prehandler会导致最后输出的结果很奇怪

  2. 调用WithTools方法进行工具和模型的绑定时,这个方法会返回新的model,注意看官方的函数说明
    // WithTools returns a new ToolCallingChatModel instance with the specified tools bound. // This method does not modify the current instance, making it safer for concurrent use.

    运行结果

    工具调用结果

    最终结果

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/20 21:55:19

多目标蜣螂优化算法NSDBO:微电网多目标优化调度的利器

多目标蜣螂优化算法NSDBO求解微电网多目标优化调度 Matlab语言 1.单目标优化调度模型已不能满足专家的偏好,多目标优化可满足不同帕累托前沿的选择。 输出包括帕累托曲线图、方案调度图等等,如图1所示,方便您撰写,可完全满足您的需…

作者头像 李华
网站建设 2026/9/21 16:38:19

本研究基于分形纤维丛统一场论,构建了黑洞时空的几何模型,揭示了奇点消解、霍金辐射修正及信息守恒的新机制。该模型的优势在于将宏观时空的广义相对论效应与微观量子的分形特性实现了有机融合。

分形纤维丛理论框架下的黑洞结构与演化研究报告摘要 本报告基于分形纤维丛统一场论的核心思想,将黑洞的时空结构、视界动力学及量子引力效应纳入分形纤维丛的几何框架进行分析。通过构建黑洞时空的分形纤维丛模型,推导视界处纤维丛的分形维度演化方程&am…

作者头像 李华
网站建设 2026/9/20 23:31:36

好写作AI语言侦探:你的论文严谨性“隐形把关人”

当审稿人圈出“此处表达模糊”“逻辑跳跃”时,你可能需要的不仅是一个语法检查工具,而是一位懂学术的“语言侦探”。学术论文的严谨性如同精密仪器——一个小数点、一个模糊指代、一处逻辑断层,都可能让整篇研究的价值大打折扣。数据显示&…

作者头像 李华
网站建设 2026/9/21 18:29:04

解放双手!钉钉智能打卡神器完全上手手册

解放双手!钉钉智能打卡神器完全上手手册 【免费下载链接】AutoDingding 钉钉自动打卡 项目地址: https://gitcode.com/gh_mirrors/au/AutoDingding 还在为每天重复的打卡操作而烦恼吗?钉钉智能打卡项目为您提供了一站式的自动化解决方案。这个基于…

作者头像 李华
网站建设 2026/9/19 22:20:10

DMXAPI全球模型API调用完全指南:从入门到精通

欢迎来到小灰灰的博客空间!Weclome you! 博客主页:IT小灰灰 爱发电:小灰灰的爱发电 热爱领域:前端(HTML)、后端(PHP)、人工智能、云服务 目录 一、DMXAPI平台概述&#…

作者头像 李华