零基础认识大语言模型(LLM)工作原理(10.Tool Calling:让 AI 第一次拥有行动能力)
零基础认识大语言模型LLM工作原理(10.Tool Calling让 AI 第一次拥有行动能力)在前面的章节中我们了解到大语言模型LLM本质上是一个“文本生成器”——它根据输入的提示预测下一个最合理的词语。但无论它生成多么精彩的回答它始终停留在“说”的层面无法真正去“做”任何事情。例如你问它“今天天气怎么样”它可能回答“根据我的训练数据我无法获取实时信息”。或者你让它“帮我发一封邮件”它只能给你一封邮件的草稿却无法真正发送。这就是LLM的“无力感”——它没有行动能力。但Tool Calling工具调用的出现彻底改变了这一局面。它让LLM第一次拥有了“行动能力”使其能够调用外部工具、API或函数完成实际任务。本文将深入剖析Tool Calling的原理并通过可运行的代码示例让你零基础理解这一强大的机制。## 什么是Tool CallingTool Calling顾名思义就是让LLM能够“调用工具”。其核心思想是在LLM的输入中提供一组预先定义好的工具如函数、API接口LLM在生成回答时可以自主决定是否需要调用某个工具并生成相应的参数。然后由外部系统执行这个工具并将结果返回给LLM让LLM基于结果继续生成回答。这种机制让LLM从“纯文本生成器”升级为“智能代理”Agent它能够感知环境、决策行动、获取反馈并最终完成任务。## Tool Calling的工作原理Tool Calling的工作流程通常分为以下几步1.定义工具开发者定义一组函数或API并给LLM提供它们的描述包括函数名、参数类型、功能说明。这些描述以JSON Schema或其他结构化格式呈现。2.用户提问用户向LLM提出一个需要调用工具才能完成的问题。3.LLM决策LLM分析问题如果认为需要调用工具它会生成一个特殊的响应包含要调用的工具名称和参数。4.执行工具外部系统如Python代码解析LLM的响应调用对应的函数并获取结果。5.返回结果将工具的执行结果作为新的上下文重新输入给LLM。6.生成最终回答LLM基于工具结果生成最终的自然语言回答。这种模式类似于人类使用工具我们先用语言思考LLM然后动手操作工具再根据结果调整。## 代码示例1使用OpenAI API实现简单的Tool Calling下面是一个使用OpenAI GPT-4 API实现Tool Calling的完整示例。假设我们想让AI能够调用一个“获取当前时间”的函数。pythonimport jsonfrom openai import OpenAI# 初始化OpenAI客户端需要设置API keyclient OpenAI(api_keyyour-api-key-here)# 1. 定义一个工具函数def get_current_time(timezone: str UTC) - str: 获取指定时区的当前时间 from datetime import datetime import pytz try: tz pytz.timezone(timezone) current_time datetime.now(tz).strftime(%Y-%m-%d %H:%M:%S) return f当前时间{timezone}: {current_time} except Exception as e: return f错误无法获取时区{timezone}的时间。{str(e)}# 2. 定义工具的元数据描述给LLM看tools [ { type: function, function: { name: get_current_time, description: 获取指定时区的当前时间, parameters: { type: object, properties: { timezone: { type: string, description: 时区名称如 Asia/Shanghai, America/New_York等, default: UTC } }, required: [] } } }]# 3. 用户提问messages [ {role: user, content: 现在日本东京是几点}]# 4. 调用LLM传入工具定义response client.chat.completions.create( modelgpt-4, messagesmessages, toolstools, tool_choiceauto # 让LLM自动决定是否调用工具)# 5. 解析LLM的响应assistant_message response.choices[0].message# 检查LLM是否决定调用工具if assistant_message.tool_calls: for tool_call in assistant_message.tool_calls: function_name tool_call.function.name function_args json.loads(tool_call.function.arguments) print(fLLM决定调用工具: {function_name}) print(f参数: {function_args}) # 6. 执行工具函数 if function_name get_current_time: result get_current_time(**function_args) print(f工具返回结果: {result}) # 7. 将工具结果返回给LLM messages.append(assistant_message) # 追加LLM的决策 messages.append({ role: tool, tool_call_id: tool_call.id, content: result }) # 8. 让LLM基于工具结果生成最终回答 final_response client.chat.completions.create( modelgpt-4, messagesmessages ) print(f最终回答: {final_response.choices[0].message.content})else: print(fLLM没有调用工具直接回答: {assistant_message.content})运行结果示例LLM决定调用工具: get_current_time参数: {timezone: Asia/Tokyo}工具返回结果: 当前时间Asia/Tokyo: 2025-03-15 14:30:45最终回答: 日本东京的当前时间是2025年3月15日14点30分45秒东京时间。在这个示例中LLM识别到用户的问题需要获取实时时间于是它“决定”调用get_current_time工具并自动填写了参数timezone: Asia/Tokyo。我们代码中执行了这个工具将结果返回给LLMLLM最终给出了一个完整的自然语言回答。## 代码示例2自定义工具调用实现天气查询下面我们实现一个更复杂的例子让AI能够调用天气API查询实时天气。为了简化我们使用一个模拟的天气查询函数。pythonimport jsonimport requests# 模拟的天气查询函数实际开发中可替换为真实APIdef get_weather(city: str) - str: 模拟查询指定城市的天气实际应调用天气API # 模拟数据 weather_data { 北京: {temperature: 22, condition: 晴, humidity: 45}, 上海: {temperature: 25, condition: 多云, humidity: 60}, 东京: {temperature: 18, condition: 小雨, humidity: 80}, 纽约: {temperature: 12, condition: 阴天, humidity: 70} } if city in weather_data: data weather_data[city] return f{city}天气{data[condition]}温度{data[temperature]}°C湿度{data[humidity]}% else: # 如果城市不在模拟数据中返回错误信息 return f抱歉暂时没有{city}的天气数据。# 定义工具元数据tools [ { type: function, function: { name: get_weather, description: 查询指定城市的当前天气情况, parameters: { type: object, properties: { city: { type: string, description: 城市名称如北京、上海等 } }, required: [city] } } }]# 用户提问messages [ {role: user, content: 我想去上海旅游帮我看看上海的天气怎么样另外北京现在热吗}]# 调用LLMresponse client.chat.completions.create( modelgpt-4, messagesmessages, toolstools, tool_choiceauto)assistant_message response.choices[0].message# 处理工具调用if assistant_message.tool_calls: # 注意这里LLM可能会同时调用多个工具并行调用 for tool_call in assistant_message.tool_calls: function_name tool_call.function.name function_args json.loads(tool_call.function.arguments) print(f调用工具: {function_name}) print(f参数: {function_args}) if function_name get_weather: result get_weather(**function_args) print(f返回结果: {result}) # 将结果追加到消息列表 messages.append(assistant_message) messages.append({ role: tool, tool_call_id: tool_call.id, content: result }) # 让LLM综合所有结果生成回答 final_response client.chat.completions.create( modelgpt-4, messagesmessages ) print(fAI最终回答: {final_response.choices[0].message.content})else: print(fAI直接回答: {assistant_message.content})运行结果示例可能输出调用工具: get_weather参数: {city: 上海}返回结果: 上海天气多云温度25°C湿度60%调用工具: get_weather参数: {city: 北京}返回结果: 北京天气晴温度22°C湿度45%AI最终回答: 上海现在的天气是多云温度25°C湿度60%非常适合旅游北京现在是晴天温度22°C不算热很舒适。两个城市都非常适合出行。注意在这个例子中LLM识别到用户询问了两个城市因此它“聪明地”连续调用了两次get_weather工具分别查询上海和北京的天气然后综合结果给出了回答。## Tool Calling的进阶应用Tool Calling不仅限于简单的函数调用它还可以用于1.数据库查询让AI生成SQL语句并执行返回结果。2.文件操作读取、写入、修改文件。3.发送消息通过API发送邮件、短信或即时消息。4.控制设备通过物联网API控制智能家居设备。5.代码执行让AI编写并执行Python代码需谨慎处理安全性。这些能力让AI从一个“聊天机器人”进化成一个真正的“智能助手”能够主动完成复杂的多步骤任务。## 总结Tool Calling是LLM能力的一次质的飞跃。通过将外部工具以结构化的方式暴露给LLM我们赋予了它“行动能力”——它不再只是被动地生成文本而是可以主动决策、调用工具、获取反馈最终完成任务。这一机制的核心在于“工具描述”和“执行分离”LLM负责决策调用哪个工具、用什么参数外部系统负责执行运行函数、返回结果。这种设计既利用了LLM强大的语言理解和推理能力又避免了它在计算、实时数据获取等方面的天然缺陷。对于开发者而言Tool Calling提供了一个强大的框架可以构建出各种实用的AI应用如智能客服、自动化工作流、个人助手等。掌握这一技术你就迈出了从“对话式AI”到“行动式AI”的关键一步。

相关新闻

AI智能体技能实战:从入门到企业级应用

AI智能体技能实战:从入门到企业级应用

1. 从零开始认识AI智能体技能 去年我接手了一个内容运营项目,每天需要处理上百篇行业报告。最初团队用传统方式人工阅读摘要,三个人全职工作还经常加班到深夜。直到我偶然接触到了AI智能体(Agent)技术,情况发生了翻天覆…

2026/9/23 15:54:42 阅读更多 →
阿里云 Elasticsearch 9.4 Agent Builder 实战

阿里云 Elasticsearch 9.4 Agent Builder 实战

导读:本文以一次灰度发布故障为完整演示,拆解阿里云 Elasticsearch 9.4 Agent Builder 如何用 Skill 固化经验、用 Tool 锁定口径、用 Workflow 守住人工确认,做到能力可复用、权限不放开、审批不跳过。 开篇:一条告警&#xff0c…

2026/9/22 0:32:33 阅读更多 →
ColorPickerPreference源码解读:探索Android颜色选择器的设计模式与最佳实践

ColorPickerPreference源码解读:探索Android颜色选择器的设计模式与最佳实践

ColorPickerPreference源码解读:探索Android颜色选择器的设计模式与最佳实践 【免费下载链接】android-ColorPickerPreference ColorPickerPreference for android to create color picker in preferences. Project created as Library 项目地址: https://gitcode…

2026/9/19 7:40:05 阅读更多 →

最新新闻

筛选协助企业获客的AI数字营销伙伴的要点分析

筛选协助企业获客的AI数字营销伙伴的要点分析

筛选协助企业搭建可持续线上获客体系的AI数字营销合作伙伴在数字化转型的深水区,寻找协助企业搭建可持续线上获客体系的AI数字营销合作伙伴已成为许多管理者的核心议题。这一过程的关键,在于确认潜在伙伴是否具备“生成式搜索优化(GEO&#x…

2026/9/24 20:04:28 阅读更多 →
5分钟用Lighthouse和Deepseek打造QQ智能体,无需代码

5分钟用Lighthouse和Deepseek打造QQ智能体,无需代码

1. 为什么我要把AI塞进QQ里先说结论:我用一台最便宜的云服务器,花了不到5分钟,把Deepseek接进了QQ,现在我的QQ好友列表里躺着一个24小时在线的智能体。它帮我回消息、查资料、写文案、翻译、算账,甚至半夜三点我睡不着…

2026/9/24 20:04:27 阅读更多 →
深入理解Inductor逐range编译:PiecewiseBackend自定义后端对接指南

深入理解Inductor逐range编译:PiecewiseBackend自定义后端对接指南

先把结论放在前面:如果你用过torch.compile,大概率听过 Inductor 这个名字,也大概率知道它默认走的是 Triton 后端。但真正自己写过自定义后端、或者想把 Inductor 的循环代码生成和别的编译后端对接的人,应该都体会过那种“官方文…

2026/9/24 20:04:27 阅读更多 →
GBase 8s报错排查实战:从SQL错误码到ISAM错误码的定位方法

GBase 8s报错排查实战:从SQL错误码到ISAM错误码的定位方法

这段时间在几个项目现场处理GBase 8s的报错问题,攒了不少一手素材。翻看之前的故障记录时我发现一个很有意思的现象:很多同事遇到GBase 8s报错,第一反应都是复制报错原文去搜索,但GBase 8s的报错体系是从Informix那一脉传下来的&a…

2026/9/24 20:04:27 阅读更多 →
MySQL索引全解:从B+树到覆盖索引,一文搞懂慢查询优化

MySQL索引全解:从B+树到覆盖索引,一文搞懂慢查询优化

做后端和数据库的同学,几乎没人能绕开MySQL索引这四个字。我最早被索引“教育”,是刚工作第一年:一张订单表,数据量才几十万行,一条简单查询没索引的时候跑了1.2秒,加了一个普通索引之后变成20毫秒&#xf…

2026/9/24 20:04:27 阅读更多 →
Linux下SNMP二进制快照实战:snmp.rar解压即用指南

Linux下SNMP二进制快照实战:snmp.rar解压即用指南

简介:本资源是一套面向Linux系统管理员与C/C网络开发者的精简版SNMP实践代码包,聚焦SNMP协议核心功能实现与轻量级部署需求,适用于服务器监控、嵌入式设备管理及SNMP客户端开发等场景。压缩包共6个C语言源文件(39KB)&a…

2026/9/24 20:03:27 阅读更多 →

日新闻

基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程

基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程

简介:这是一套面向计算机、人工智能、自动化等专业学生与教师的毕业设计级项目资源,围绕YOLOv8实现渔船作业监控系统,可用于毕设、课程设计、大作业或项目立项演示。压缩包共97个文件,约24.21MB,以70个Python源码文件为…

2026/9/24 0:00:19 阅读更多 →
单细胞注释实战:基于Scanpy的标记基因与参考映射流程解析

单细胞注释实战:基于Scanpy的标记基因与参考映射流程解析

简介:一份基于单细胞RNA测序数据的细胞类型注释算法研究Python毕业设计源码,针对计算机相关专业正在做毕设或需要项目实战的学习者,可用于课程设计与期末大作业。项目代码完整、经导师指导评审通过,可直接运行,覆盖数据…

2026/9/24 0:00:19 阅读更多 →
C#源生成器实战:用增量生成器替代反射,告别AOT崩溃

C#源生成器实战:用增量生成器替代反射,告别AOT崩溃

第一次在项目里被反射卡住,是在一个老旧的WinForms模块里:几十个类依赖PropertyChanged通知,运行时反射读属性、发通知,每次启动慢半拍不说,一上.NET Native/AOT裁剪模式几乎全面崩盘。后来我把这段逻辑全部改成C#源生…

2026/9/24 0:00:19 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/24 14:34:13 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/24 9:10:42 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/24 14:33:56 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/24 12:50:34 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/24 14:33:48 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/24 12:49:17 阅读更多 →