发布时间:2026/7/27 21:28:18
零基础认识大语言模型(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”的关键一步。

相关新闻

2026/7/27 21:23:18

Linux进程创建与内存管理核心机制解析

1. 操作系统核心机制全景解读 当我们在终端敲下 ./a.out 运行程序时,背后究竟发生了什么?这个看似简单的动作触发了操作系统最精妙的连锁反应。作为在Linux系统开发领域摸爬滚打多年的老手,今天我想用最直白的语言,带大家深入理…

2026/7/27 21:23:18

人工智能对社会和经济发展的影响存在显著地域差异

结论先行:人工智能对经济与社会的赋能不是普惠均等的,存在极强的地域差异、城乡差异和圈层差异,呈现 “强者愈强、弱者滞后” 的马太效应。一、为什么 AI 影响天然存在地域差距?人工智能产业落地高度依赖三大稀缺资源:…

2026/7/27 21:23:18

智赋万象:人工智能对当代社会与经济发展的深层影响

目录 一、重塑经济体系:催生智能经济新形态,激活增长新动能 二、赋能社会发展:优化公共服务,重构大众生活方式 三、直面变革阵痛:人工智能带来的社会经济新挑战 四、守正创新:构建人工智能良性发展新格…

2026/7/27 22:28:24

A-59工业级语音模块:十种工作模式的架构逻辑与宽温选型分析

多模式架构的设计背景语音处理模组在实际系统中面临的接口环境差异极大:有系统仅提供USB接口,有系统仅有模拟音频接口,有系统具备完整的I2S数字音频接口,还有些系统需要同时支持多种接口以适配不同的使用场景。在产品线设计时&…

2026/7/27 22:28:24

嘎嘎降AI:智能论文格式处理工具实战指南

1. 项目背景与工具定位 去年帮学弟改论文时发现,很多毕业生在最后的格式调整阶段耗费大量时间。从页眉页脚设置到参考文献排版,这些机械性工作往往要反复折腾好几天。而嘎嘎降AI这款国产智能文档处理工具,恰好能解决这类痛点。它不像传统办公…

2026/7/27 22:28:24

2026年算法工程师最新必问面试题五:刷题与代码实战(8题)

1. 反转链表(LeetCode 206) 反转链表是面试中最基础也最高频的题目,要求掌握递归和迭代两种写法。 迭代写法 def reverseList(head):prev = Nonecurr = headwhile curr:next_temp = curr.nextcurr.next = prevprev = currcurr = next_tempreturn prev 时间复杂度:O(n),…

2026/7/27 22:28:24

3.3 技能开发基础:Markdown语法

《扣子编程从一句话到产品上线:零门槛AI心流开发》全书案例分享~持续更新-CSDN博客 技能本质是文档化的业务规则,因此必须依托一套统一、标准、AI高适配的排版语法,即 Markdown 语法。Markdown 是整个零代码智能体开发的底层基石&#xff0c…

2026/7/27 22:23:24

TMS320C54x DSP UART寄存器详解与中断驱动通信实践

1. 项目概述:从寄存器视角看透TMS320C54x的UART与中断 在嵌入式系统,尤其是像TMS320C54x这类经典的定点DSP平台上,串口通信(UART)是连接外部世界最基础、最可靠的桥梁之一。无论是调试信息输出、与上位机通信&#xff…

2026/7/27 9:04:58

PDF合并与动态水印的工程化方案:2026国内免费工具实测对比

一、背景与测试方案 在实际项目交付中,PDF文件合并与版权保护水印的叠加是一个高频但容易被低估的技术需求。典型的处理链路涉及:多源PDF的文件流合并、页面级水印渲染(含透明度混合与图层叠加)、输出文件体积控制。看似简单的操作…

2026/7/27 0:01:12

xcku5p-ffvb676-2-i 设计 RoCEv2 时 constraints.xdc 配置依据核查记录

constraints.xdc 配置依据核查记录 被核查文件:fpga/vitis/xcku5p/build/constraints/constraints.xdc 目标板卡:RK-XCKU5P-F V1.2(搭载 xcku5p-ffvb676-2-i) 移植母本:fpga/pynq/rfsoc-pynq/build/constraints/constraints.xdc(NVIDIA Holoscan Sensor Bridge 参考工程)…

2026/7/27 0:01:12

TMS320C54x DSP内存映射与I/O模拟配置实战指南

1. 项目概述与核心价值在嵌入式系统开发,尤其是DSP这类资源受限、架构独特的处理器上,内存映射配置和I/O模拟是每个开发者都必须跨越的一道坎。这不仅仅是调试器里的几个菜单选项或命令行参数,它直接关系到你的程序能否在目标板上正确运行、能…

2026/7/27 3:13:33

3个高效策略:快速掌握Axure中文界面配置

3个高效策略:快速掌握Axure中文界面配置 【免费下载链接】axure-cn Chinese language file for Axure RP. Axure RP 简体中文语言包。支持 Axure 11、10、9。不定期更新。 项目地址: https://gitcode.com/gh_mirrors/ax/axure-cn 还在为Axure RP的英文界面感…