尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
Function Calling彻底讲透:AI Agent时代,大模型“动手”调用外部世界到底是怎么做到的?
1. 为什么大模型必须学会“动手”从缸中之脑到真实调用大模型本身只会“说话”这是它最本质的能力边界。你问它“上海今天天气怎么样”它可以用训练数据里的统计规律给你编一个听起来很合理的答案但它没有真的去查过。你让它“帮我把这条数据写入数据库”它可以生成一段看起来正确的 SQL但它没有真的连过你的库。这种“知道很多但什么都做不了”的状态就是 Function Calling 要解决的核心问题。Function Calling 是一种让大模型在生成回答时能够自主决定调用哪些预设函数、并以结构化 JSON 格式输出调用参数的能力。注意两个关键词决定是模型自己判断的不是你在代码里写死的 if-else结构化意味着输出的不是一段自然语言而是严格的 JSON 对象你的程序可以直接解析执行。适合谁看这篇如果你正在自建 AI Agent、想让模型调用外部 API、或者单纯想搞懂 Cursor、Claude Code 这类工具底层到底怎么工作的这篇会从链路到代码完整走一遍。我试过用同一套逻辑接入不同厂商的模型只要协议兼容代码几乎不用改。没有 Function Calling 之前开发者用的是“土办法”在 Prompt 里写死暗号比如“如果你需要查天气请输出 [QUERY_WEATHER:上海]”然后用正则去匹配。这种方案能跑但模型可能不按格式输出、多轮调用上下文容易乱、每个工具都要写一套暗号完全没有结构化可言。Function Calling 把这件事变成了工业级标准模型输出结构化的 tool_calls你的程序解析后执行真实函数再把结果回填给模型生成最终回答。整个链路可以拆成三步声明开发者告诉模型有哪些工具可用、参数长什么样、决策模型根据用户输入判断要不要调、调哪个、参数是什么、执行应用代码真正执行函数结果回传模型。模型本身从不执行任何外部调用它只是“参谋”真正“动手”的是你的应用代码。记住这一点后面所有概念都围绕它展开。2. TaoToken 前置准备拿到 API Key 与 Base URL在写 Function Calling 代码之前你需要一个能调用模型的入口。TaoToken 提供了兼容 OpenAI 协议的 API 服务这意味着你后面写的 Function Calling 代码只需要改base_url和api_key两个地方就能跑起来。先访问官网 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 注册账号。注册流程不复杂邮箱验证后就能进入控制台。登录后找到 API Keys 页面创建一个新的 Key。这个 Key 只会显示一次复制下来保存好后面代码里要用。Base URL 是https://taotoken.net/api注意这个地址不加任何 UTM 参数直接用在代码里。如果你用的是 OpenAI 官方 SDK把base_url设成这个地址api_key设成你刚创建的 Key就可以直接调用。模型 ID 方面TaoToken 支持多种主流模型。你可以在控制台的模型列表里看到可用的 Model ID比如gpt-4、claude-3-5-sonnet等。Function Calling 对模型有要求不是所有模型都支持工具调用你需要选一个明确支持 Function Calling 的模型。一般来说GPT-4 系列、Claude 3.5 系列、以及国产的 DeepSeek、通义千问等主流模型都支持。如果你还没想好选哪个模型可以先从gpt-4或claude-3-5-sonnet开始这两个对 Function Calling 的支持最成熟。创建好 Key 之后建议先在模型对话页面 https://taotoken.net/model-chat?utm_sourcetaotoken_aicg_blog_endutm_contentmodel_chatutm_campaignrewrite 里简单测一下确认 Key 能正常调用模型再进入代码环节。这一步看起来简单但实际踩坑最多。常见问题包括Key 复制时带了空格、Base URL 写成了官网地址而不是 API 地址、模型 ID 拼写错误。这些都会导致后面代码报 401 或 404。建议先把这三个值写在一个.env文件里后面代码直接读环境变量避免硬编码。3. 可复制配置工具 Schema 与客户端初始化这一节给你可以直接复制的配置片段。先看客户端初始化我用的是 Python OpenAI SDK如果你用 Node.js 或其他语言逻辑完全一样只是语法不同。import json import os from openai import OpenAI client OpenAI( api_keyos.getenv(TAOTOKEN_API_KEY, sk-你的Key), base_urlhttps://taotoken.net/api )接下来是工具 Schema 的定义。Function Calling 的核心之一就是这份 JSON Schema它告诉模型“有哪些工具可用、每个工具的参数长什么样”。下面定义两个工具一个查天气一个做计算。tools [ { type: function, function: { name: get_weather, description: 查询指定城市的实时天气包括温度、天气状况、湿度。当用户问某地天气、温度、是否下雨时使用。, parameters: { type: object, properties: { city: { type: string, description: 城市名称例如北京、上海、广州 } }, required: [city] } } }, { type: function, function: { name: calculate, description: 执行数学表达式计算例如(35)*2。当用户需要做算术运算时使用。, parameters: { type: object, properties: { expression: { type: string, description: 合法的数学表达式字符串只包含数字和 - * / ( ) 运算符 } }, required: [expression] } } } ]这份 Schema 里有几个关键点。name是函数名模型返回时会带上这个名字你的代码根据它来分发执行。description非常重要它决定了模型在什么场景下会选择这个工具写得越清楚模型判断越准。parameters是标准的 JSON Schemarequired里的参数模型必须提供。如果你用 Claude Code 或 Cline 这类工具它们的配置文件里也有类似的工具定义。比如 Cline 的 MCP 配置本质上就是把外部工具注册给模型格式和上面的tools数组是同一个逻辑。Codex 的auth.json里配置的 Base URL 和 Key也是同样的三件套Base URL、Key、Model ID。把上面的客户端初始化和工具 Schema 放在一个文件里你就完成了 Function Calling 的前置配置。接下来写真正的调用循环。4. 验证请求一次真实外部调用的完整请求与响应现在写一个完整的对话函数走一遍“模型决策 → 应用执行 → 结果回填 → 最终回答”的全流程。先定义两个工具的伪实现真实场景里你会换成真正的 API 调用。def get_weather(city: str) - dict: fake_data { 北京: {temp: 28, weather: 晴, humidity: 45}, 上海: {temp: 32, weather: 多云, humidity: 70}, 广州: {temp: 35, weather: 雷阵雨, humidity: 80} } return fake_data.get(city, {temp: 25, weather: 未知, humidity: 50}) def calculate(expression: str) - dict: allowed set(0123456789-*/.() ) if not all(c in allowed for c in expression): return {error: 非法字符} try: return {result: eval(expression)} except Exception as e: return {error: str(e)}然后是核心的对话函数。注意第一轮请求带上tools和tool_choiceauto让模型自己决定要不要调工具。def chat(user_query: str) - str: messages [{role: user, content: user_query}] response client.chat.completions.create( modelgpt-4, messagesmessages, toolstools, tool_choiceauto ) msg response.choices[0].message if msg.tool_calls: print(f模型决定调用 {len(msg.tool_calls)} 个工具) messages.append(msg) for tool_call in msg.tool_calls: func_name tool_call.function.name func_args json.loads(tool_call.function.arguments) print(f 调用 {func_name}({func_args})) if func_name get_weather: result get_weather(**func_args) elif func_name calculate: result calculate(**func_args) else: result {error: 未知函数} print(f 返回: {result}) messages.append({ role: tool, tool_call_id: tool_call.id, content: json.dumps(result, ensure_asciiFalse) }) final_response client.chat.completions.create( modelgpt-4, messagesmessages ) return final_response.choices[0].message.content return msg.content跑一下测试print(chat(上海今天热不热)) print(chat(帮我算一下 (125 75) * 3 等于多少)) print(chat(北京今天多少度另外计算一下 2的10次方。)) print(chat(什么是光合作用))你会看到前三个问题触发了工具调用第四个问题模型直接回答没有调工具。第三个问题会触发并行调用模型在一次响应里同时返回两个tool_calls。这里有一个关键验证动作看日志确认工具是否真的被触发。在print(f 调用 {func_name}({func_args}))这一行如果控制台输出了函数名和参数说明模型确实返回了tool_calls你的代码也确实解析并执行了。如果这一行没输出但最终回答里却有天气数据那说明模型在“编造”结果工具根本没被调用。这是排查 Function Calling 是否真正生效的最直接方法。响应结构里msg.tool_calls是一个数组每个元素包含id、type、function.name、function.arguments。arguments是一个 JSON 字符串需要json.loads解析。回填时tool_call_id必须和请求时的id对应否则模型无法把结果和调用关联起来。5. 本篇常见错排查401、local proxy failed、reading choices、OAuth这一节对照真实报错给你排查思路。这些错误我在接入过程中基本都遇到过。401 Unauthorized最常见的原因是 API Key 不对。检查三件事Key 是否复制完整有没有多余空格、Base URL 是否写成了https://taotoken.net/api而不是官网地址、Key 是否已经过期或被删除。如果你用的是环境变量确认os.getenv真的读到了值可以在代码里打印一下 Key 的前几位确认。local proxy failed这个报错通常出现在网络层意思是请求没有到达目标服务器。检查你的 Base URL 是否拼写正确有没有多写或少写/v1之类的路径。TaoToken 的 API 地址是https://taotoken.net/api不要自己加/v1。另外确认你的运行环境能正常访问外网如果是公司内网可能需要配置网络策略。reading choices 报错典型报错是AttributeError: NoneType object has no attribute choices或者KeyError: choices。这说明 API 返回的响应结构和你预期的不一样。最常见的原因是模型 ID 写错了或者你选的模型不支持 Function Calling。先确认模型 ID 在控制台里存在再确认它支持工具调用。另一个原因是请求参数格式不对比如tools数组里少了type字段。OAuth 相关报错如果你用的是 Claude Code 或类似工具可能会遇到 OAuth 认证失败。这类工具通常需要你在配置文件里填 Base URL、Key、Model ID 三件套。以 Claude Code 为例检查settings.json里的apiBase是否指向https://taotoken.net/apiapiKey是否填了正确的 Key。如果是 Cline 的 MCP 配置检查mcpServers里的command和args是否正确以及环境变量有没有传进去。模型不调用工具模型返回了纯文本没有tool_calls。检查tool_choice参数如果是none模型就不会调。检查工具描述是否足够清晰模型可能没理解这个工具是干什么的。检查用户问题是否真的需要工具比如“什么是光合作用”本来就不需要调天气工具。参数解析失败json.loads(tool_call.function.arguments)报错。模型偶尔会输出不严格的 JSON比如多了一个逗号或者少了引号。生产环境必须用 try-catch 包住解析失败时返回错误信息给模型让它重新生成。死循环模型反复调用同一个工具不给出最终回答。必须设置最大循环次数一般 5-10 次就够了。超过次数强制结束返回“调用超时请重新提问”。6. 语义一致 CTA从验证到长期编码的路径走到这里你已经完成了一次完整的 Function Calling 链路从工具 Schema 定义到模型决策到应用执行再到结果回填和最终回答。如果你跟着代码跑通了控制台里应该能看到工具调用的日志和最终的自然语言回答。接下来如果你想继续深入有几个方向可以走。想验证更多模型的 Function Calling 表现可以去模型对话页面 https://taotoken.net/model-chat?utm_sourcetaotoken_aicg_blog_endutm_contentmodel_chatutm_campaignrewrite 直接测试不同模型对同一组工具的选择差异。想把这套逻辑接入自己的项目去 API Keys 页面 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi_keysutm_campaignrewrite 管理你的 Key接入文档 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 里有更详细的参数说明和错误码对照。如果你打算长期做 AI Agent 开发或者需要频繁调用模型做编码任务Coding Plan https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding_planutm_campaignrewrite 提供了更稳定的调用方案。Claude Code 的接入配置 https://taotoken.net/claude-code-anthropic?utm_sourcetaotoken_aicg_blog_endutm_contentclaude_codeutm_campaignrewrite 里也有完整的 Base URL、Key、Model ID 三件套示例可以直接复制到你的settings.json里。最后说一个实用技巧Function Calling 的工具描述值得反复打磨。我试过把同一个工具的description改了三版模型的选择准确率明显不一样。描述里写清楚“什么时候用”比“这个工具是什么”更重要。另外工具返回结果记得做摘要不要把整个 API 响应塞回给模型上下文窗口很贵。
RELATED

相关推荐

编译原理课设:C0语言到MIPS汇编完整源码与优化解析

编译原理课设:C0语言到MIPS汇编完整源码与优化解析

简介:这是北航计算机学院2017级编译原理课程设计项目,面向计算机专业学生和编译技术爱好者,完整实现C0语言到MIPS汇编的编译器。资源共33个文件,约81KB,以19个C源文件和8个头文件为核心,分模块覆盖词法分析…

📅 2026/10/12 13:33:54
Java服务启动卡死排查全攻略:从现象到根因

Java服务启动卡死排查全攻略:从现象到根因

先交代一下背景。最近连续接了两个线上反馈,都是同一个症状:新版本构建出来的jar包,扔到测试环境秒起,一上生产就“挂”在启动阶段,日志刷到一半直接停住,进程还活着,可端口就是不开&#xff0c…

📅 2026/10/12 13:33:54
【生物】基于matlab模拟自适应辅助控制用于上肢康复研究

【生物】基于matlab模拟自适应辅助控制用于上肢康复研究

✅作者简介:热爱科研的Matlab仿真开发者,擅长数学建模、模型改进、算法创新、程序设计科研仿真。🍎 往期回顾关注个人主页:完整代码获取 定制创新 论文复现私信🍊个人信条:做科研,博学之、审问之…

📅 2026/10/12 13:33:54
MORE NEWS

更多资讯

📰

CATIA V5R18 CAA二次开发完整环境搭建与调试指南

简介:本资源是面向CATIA二次开发工程师与高级应用人员的CAA(Customer Adaptation Area)定制化开发套件,专为CATIA V5R18版本构建,助力用户突破标准功能限制,实现界面定制、流程自动化及企业级系统集成。压缩…

📰

应用系统负载分析与磁盘容量预测:一套完整的Python源码实践解析

简介:资源内含一份基于数据挖掘的应用系统负载分析与磁盘容量预测Python源码包,面向系统运维、数据分析与机器学习初学者,解决如何在历史负载数据基础上建立容量预测模型的问题。压缩包共6个文件,包含4个xls格式的数据文件&#x…

📰

PyQt5与YOLOv5桌面检测工具:环境搭建、线程优化与避坑指南

简介:这份资源是一套面向PyQt5与YOLOv5初学者的多目标检测GUI实战项目,适合刚接触界面开发或YOLO算法、希望有现成工程练手的人群。项目以PyTorch为深度学习框架,将YOLOv5检测能力与PyQt5界面结合,重点演示界面设计与后端逻辑分离…

📰

OpenLayers创建点要素全流程:从坐标系到样式与交互实战

做WebGIS开发,接触OpenLayers的第一件事基本都是往地图上画东西。画个点、连条线、圈个面,说到底都是在做同一件事——创建要素(Feature)。我刚入行的时候,前辈丢给我一句“去看官方示例”,结果一打开示例代…

📰

LCTFP代码实战:基于CNN与LSTM的高速公路交通流量预测

简介:基于CNN和LSTM组合的高速公路交通流量预测模型LCTFP完整Python实现,面向交通流量时空建模研究者与开发者,可用于短时交通流预测及类似时序任务。模型以1D CNN提取短时交通流空间特征,LSTM捕捉时间特征,有效融合时…

📰

OpenClaw 2.7.9 对接飞书机器人完整分步实操教程(含安装包)

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

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬