零基础认识大语言模型(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/10/20 0:25:49 阅读更多 →
阿里云 Elasticsearch 9.4 Agent Builder 实战

阿里云 Elasticsearch 9.4 Agent Builder 实战

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

2026/10/20 12:02:24 阅读更多 →
ColorPickerPreference源码解读:探索Android颜色选择器的设计模式与最佳实践

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

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

2026/10/19 23:57:50 阅读更多 →

最新新闻

WebSocket断线重连实战:心跳机制、指数退避与消息补偿方案

WebSocket断线重连实战:心跳机制、指数退避与消息补偿方案

做个长连接项目,断线重连这关早晚要过。我见过不少团队,连接正常时觉得一切都很简单,直到某天用户反馈“消息发不出去”“聊天记录中间断了一截”,才意识到WebSocket的稳定性问题才是整个项目的分水岭。这篇文章不打算从握手细节讲…

2026/10/20 15:30:20 阅读更多 →
DeepSeek V4.1 Flash推理优化原理与工程实践

DeepSeek V4.1 Flash推理优化原理与工程实践

1. 项目概述:这不是一次普通升级,而是一次推理范式的悄然迁移“DeepSeek V4.1 Flash 凭什么登顶 OpenRouter?”——这句话最近在多个技术社区高频出现,不是因为营销稿刷屏,而是真实跑分数据、实测延迟曲线和开发者自发…

2026/10/20 15:30:20 阅读更多 →
空间转录组+scRNA+bulk RNA-seq:垂体瘤免疫微环境多组学解析

空间转录组+scRNA+bulk RNA-seq:垂体瘤免疫微环境多组学解析

我最近跟某课题组一起梳理了一个垂体瘤多组学项目,核心就是标题里这句:空间转录组 scRNA bulk RNA-Seq,组合起来看免疫细胞怎么影响肿瘤生长。做完这轮分析,我最大的感受是,垂体瘤这病太容易被"良性"两个字…

2026/10/20 15:30:20 阅读更多 →
神经网络入门:从线性模型到反向传播与激活函数的原理详解

神经网络入门:从线性模型到反向传播与激活函数的原理详解

很多想系统入门深度学习的朋友,最先撞上的就是“神经网络”这四个字。我见过太多人兴致勃勃翻开资料,结果被神经元、权重、偏置、激活函数、反向传播这一串术语劝退——每个词单看都懂,连在一起就懵。我当年真正开窍,不是靠背公式…

2026/10/20 15:30:20 阅读更多 →
办公智能体实战:从AI助手到自动执行的工作流革命

办公智能体实战:从AI助手到自动执行的工作流革命

最近圈子里都在聊一款新出的办公智能体工具,代号叫Cowork。前两周我在一个内部项目里做了小范围试用,说实话,它跟我以前用过的AI助手完全是两个物种。以前的AI工具是你问一句、它答一句,能帮你写文案、做摘要,但基本停…

2026/10/20 15:30:20 阅读更多 →
diagram-design:如何把复杂系统用图讲清楚

diagram-design:如何把复杂系统用图讲清楚

1. 从一张草图到一套系统:diagram-design 到底在解决什么问题 第一次听到 diagram-design 这个词,很多人会以为它只是一个画图工具的别名,或者某个设计软件的插件。但真正在工程团队里待过几年的人会明白,它指向的是一套完整的、关…

2026/10/20 15:29:19 阅读更多 →

日新闻

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

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

2026/10/20 1:01:30 阅读更多 →
ESP32舵机控制指南:原理、多路驱动与避坑实战

ESP32舵机控制指南:原理、多路驱动与避坑实战

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

2026/10/20 1:01:30 阅读更多 →
位移法实现一阶低通滤波:单片机ADC采样降噪实战

位移法实现一阶低通滤波:单片机ADC采样降噪实战

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

2026/10/20 1:01:30 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/20 10:02:13 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/19 17:32:41 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

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

月新闻

我发现了一个新思路:用 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/20 10:02:08 阅读更多 →
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/20 9:50: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/20 9:50:45 阅读更多 →