读懂LLM工具调用:模型只会思考,Runtime才负责干活
文章目录一、先讲个故事AI 到底会不会干活二、LLM 被困在哪里先拆一个最大的误解三、工具不是魔法而是一份说明书四、第一次调用模型只是在做选择题五、Runtime 才是真正干活的人六、工具结果还要再交回模型七、Tool Use 和普通 API 调用有什么区别八、工具描述越清楚调用越稳定九、我真正记住的是这条分工线P.S. 目前国内还是很缺AI人才的希望更多人能真正加入到AI行业共同促进行业进步增强我国的AI竞争力。想要系统学习AI知识的朋友可以看看我精心打磨的教程 http://blog.csdn.net/jiangjunshow教程通俗易懂高中生都能看懂还有各种段子风趣幽默从深度学习基础原理到各领域实战应用都有讲解我22年的AI积累全在里面了。注意教程仅限真正想入门AI的朋友否则看看零散的博文就够了。一、先讲个故事AI 到底会不会干活很多产品经理第一次看 AI 产品演示眼睛瞪得像铜铃。“哇它能搜网页它能读 Excel它能查天气它能帮我改代码大模型成精了啊”打住。作为一个在 AI 圈混了 22 年的老油条我得说句实话大模型自己连你家 WiFi 密码都不知道。它不会打开浏览器不会访问数据库不会调用你的内部接口更不会自己执行代码。它连今天星期几都要靠猜——猜错了还不带脸红的。那问题来了AI 是怎么从只会聊天变成能办事的答案就三个字Tool Use也就是工具调用。二、LLM 被困在哪里先拆一个最大的误解大模型的核心能力是什么预测下一个 token。就这么简单。它擅长理解、推理、生成文本但有几个**“先天残疾”**不知道实时信息股价、天气、新闻不能读取本地文件不能查询数据库不能调用业务接口不能自己执行代码举个例子用户问青岛啤酒的收盘价是多少如果只靠模型自己的参数它会怎么回答它会根据训练语料**“瞎蒙”**一个数字。可能蒙对了可能蒙错了。但你敢把蒙出来的数字拿去炒股吗不敢吧所以模型需要工具。工具调用的核心思路就一句话模型负责判断这个问题需要查数据程序负责真正去查数据。这就是很多 Agent 产品能工作的基础。三、工具不是魔法而是一份说明书模型并不天然知道你的项目里有哪些函数。你得先写一份**“说明书”**给它看。这份说明书要告诉模型工具叫什么工具能做什么什么时候该用它需要哪些参数参数是什么类型哪些参数是必填的在代码里这通常写成一段tools配置。比如一个获取股票收盘价的工具consttools[{type:function,function:{name:get_closing_price,description:获取指定股票的收盘价,parameters:{type:object,properties:{name:{type:string,description:股票名称}},required:[name]}}}];这段代码真正有意思的地方不是写了个 JSON。而是它把一个传统软件世界里的函数翻译成了模型能理解的语言。模型不懂你的后端实现不懂数据库怎么查也不懂股票接口怎么封装。但它能读懂获取指定股票的收盘价这句话也能理解参数name是股票名称。这一步可以理解成一次**“认知植入”**把外部工具的能力写进模型当前这次对话的上下文里。四、第一次调用模型只是在做选择题有了工具说明以后用户再问青岛啤酒的收盘价是多少程序会把用户消息和工具配置一起发给模型asyncfunctionsendMessage(messages){constresawaitclient.chat.completions.create({model:deepseek-v4-pro,messages,tools,tool_choice:auto});returnres;}注意这里的tool_choice: auto。它的意思不是模型自动执行工具而是模型可以自己判断要不要调用工具。如果模型判断这个问题需要查股票收盘价它返回的可能不是普通文本而是类似这样的结构tool_calls:[{type:function,function:{name:get_closing_price,arguments:{name:青岛啤酒}}}]这一步模型做了三件事识别用户意图用户想查股票收盘价选择工具应该用get_closing_price生成参数股票名称是青岛啤酒但它还没有真的查到价格。因为模型不会执行函数。它只是生成了一份**“我想调用这个工具”**的结构化请求。就像你让 ChatGPT 帮你订外卖它说好的我要打开美团但它手里根本没有手机。五、Runtime 才是真正干活的人真正执行函数的是runtime。也就是 Node、Python、Java 或其他后端代码。在这个例子里程序拿到模型返回的tool_calls以后会解析参数然后调用本地函数functionget_closing_price(name){if(name青岛啤酒){return67.92;}elseif(name贵州茅台){return1488.21;}else{return未找到该股票;}}执行过程大概是consttoolCallresponse.choices[0].message.tool_calls[0];constargsJSON.parse(toolCall.function.arguments);constpriceget_closing_price(args.name);这一步才是真正的**“操作外部世界”**。如果换成真实项目这个函数里面可以是查数据库调第三方 API读取本地文件执行搜索调用内部业务服务模型只负责说我要用哪个工具以及参数是什么。runtime 负责真的去做。这就好比模型是军师runtime 是将军。军师说今晚夜袭敌营将军说收到我带兵去。你让军师自己去砍人他连刀都举不起来。六、工具结果还要再交回模型工具执行完以后结果不会直接粗暴地丢给用户。更完整的做法是把工具结果作为新的上下文再塞回对话里messages.push({role:tool,content:price,tool_call_id:toolCall.id});这里的tool_call_id很关键。它用来告诉模型这个工具结果对应刚才哪一次工具调用。如果一次请求里调用了多个工具比如同时查天气、查日程、查库存没有这个 id模型就很容易分不清哪个结果属于哪个问题。把工具结果放回messages以后再调用一次模型constfinalResawaitsendMessage(messages);这时模型终于拥有了真实数据。它不再需要猜青岛啤酒的收盘价是多少而是可以基于工具返回的67.92组织一段自然语言回答。所以一次完整的 Tool Use其实不是一次模型调用而是一条链用户提问→ 模型判断要调用工具→ runtime 执行工具→ 工具结果写回上下文→ 模型生成最终回答七、Tool Use 和普通 API 调用有什么区别看到这里你可能会问这不就是 API 调用吗有一点像但不完全一样。普通 API 调用通常是程序员提前写死流程用户点按钮 → 调某个接口 → 展示结果Tool Use 的特别之处在于中间多了一层模型决策用户自然语言提问 → 模型判断意图 → 模型选择工具 → 程序执行工具 → 模型组织回答也就是说工具调用不是让模型拥有了函数能力而是让模型参与了函数调用前的判断过程。它可以根据自然语言决定要不要调用工具调哪个工具参数怎么填工具结果该怎么解释给用户这就是 LLM 和传统程序结合以后真正有价值的地方。传统程序负责稳定执行大模型负责理解意图和组织语言。八、工具描述越清楚调用越稳定Tool Use 很强但它不是随便写一个函数名就能稳定工作的。如果工具描述很模糊模型就容易选错工具。如果参数设计很混乱模型就容易传错参数。比如一个参数叫query但不说明它到底是城市名、股票名称、搜索关键词模型只能猜。工具设计也需要工程能力函数名要清楚比如get_weather比handle更好description 要具体告诉模型什么时候该用参数类型要准确不要什么都写 stringrequired 要明确别让模型漏参数返回结果要干净方便模型继续理解高风险操作要加确认不要直接让模型执行工具越像一份清晰的接口合同模型调用起来就越稳定。这就好比你去餐厅点菜菜单上写着宫保鸡丁用鸡肉、花生、辣椒炒辣度可选你肯定点得准。如果菜单上只写一份吃的你点完可能上来一盘仰望星空派。九、我真正记住的是这条分工线Tool Use 最重要的不是AI 会调用函数这句话。真正重要的是这条分工线模型负责理解和决策。runtime 负责执行和校验。工具负责连接外部世界。结果再回到模型由模型继续生成用户能读懂的回答。所以以后看到 AI 会查天气、读文件、搜网页、调接口不用把它想得太神秘。它不是突然有了自我意识也不是模型真的突破了物理限制。它背后是一套很清晰的工程流程把工具描述给模型让模型选择工具再让程序执行工具最后把结果交回模型。LLM 负责**“想明白要做什么”**。Tool 负责**“真的把事情做掉”**。这就好比你让 Siri 帮你设闹钟Siri 不会真的伸手去按你手机上的按钮——它只是把你的语音转成指令交给 iOS 系统去执行。AI 工具调用本质上也是一回事。模型是那个听懂你说话的人runtime 是那个真正动手的人。分工明确各司其职这才是工程之美。原创不易如果觉得有用点个赞再走呗 P.S. 目前国内还是很缺AI人才的希望更多人能真正加入到AI行业共同促进行业进步增强我国的AI竞争力。想要系统学习AI知识的朋友可以看看我精心打磨的教程 http://blog.csdn.net/jiangjunshow教程通俗易懂高中生都能看懂还有各种段子风趣幽默从深度学习基础原理到各领域实战应用都有讲解我22年的AI积累全在里面了。注意教程仅限真正想入门AI的朋友否则看看零散的博文就够了。