Function Calling 实战教程:从踩坑到封装,附完整可运行代码

Function Calling 实战教程:从踩坑到封装,附完整可运行代码上周接了个需求 要做一个能查天气 查快递 查数据库的智能客服 一开始想的是用正则匹配用户意图 写了一堆 if else 结果用户稍微换个说法就识别不了 后来同事提醒我 你怎么不用 Function Calling 说实话之前只在文档里扫过一眼 没正经写过 折腾了两天 踩了不少坑 现在总算把整套流程跑通了 记录一下 Function Calling

大家好,我是讯享网,很高兴认识大家。这里提供最前沿的Ai技术和互联网信息。



上周接了个需求,要做一个能查天气、查快递、查数据库的智能客服。一开始想的是用正则匹配用户意图,写了一堆 if-else,结果用户稍微换个说法就识别不了。后来同事提醒我:”你怎么不用 Function Calling?” 说实话之前只在文档里扫过一眼,没正经写过。折腾了两天,踩了不少坑,现在总算把整套流程跑通了,记录一下。

Function Calling 是让大模型"调用外部工具"最靠谱的方案,比自己写正则解析强太多了。核心流程就三步:

步骤 做什么 谁来做 1. 定义工具 用 JSON Schema 描述你有哪些函数、参数是什么 开发者 2. 模型决策 大模型根据用户输入决定要不要调函数、调哪个、传什么参 大模型 3. 执行回填 你拿到模型返回的函数名和参数,自己执行,把结果塞回对话 开发者

有一点要搞清楚:模型不会帮你执行函数,它只是告诉你「我觉得应该调这个函数,参数是这些」,执行和回填都是你自己的事。

纯靠 prompt 让大模型输出 JSON 再自己解析,有几个问题:

  • 格式不稳定:有时候给你 JSON,有时候给你 markdown 代码块包着的 JSON,有时候还夹带私货说两句废话
  • 参数类型乱来:你要 number 它给你 string,你要数组它给你逗号分隔的字符串
  • 幻觉调用:瞎编一个你根本没有的函数名

Function Calling 是模型厂商在 API 层面做的结构化支持,输出格式是确定的,参数会按你定义的 JSON Schema 校验。GPT-5.4 和 Claude Opus 4.6 在这方面已经非常稳,Gemini 3.0 也支持得不错。

先从最简单的场景开始:让模型调用一个查天气的函数。

 
  

运行结果:

GPT plus 代充 只需 145

到这里模型的活干完了。接下来你要自己执行函数,再把结果喂回去。

 
  

输出:

GPT plus 代充 只需 145

这就是完整的一轮 Function Calling 流程。模型根据函数执行结果,生成了自然语言的回答。

实际项目里不可能只有一个函数。我那个智能客服需要同时支持查天气、查快递、查订单,而且用户可能一句话触发多个函数调用。这就需要一个调度循环。

 
  

运行输出:

GPT plus 代充 只需 145

模型在一轮里同时调了两个函数,参数也都对。这个调度循环是我最终在项目里用的核心逻辑。

挑几个有代表性的说。

回填 tool 消息时, 必须和模型返回的 一一对应。我一开始偷懒写了个固定字符串,直接报 400 错误,错误信息还特别模糊,排了好久。

返回的是 JSON 字符串,不是 Python 字典。必须 一下。虽然很基础,但我第一次真就直接当字典用了,报错 ,愣了半天。

这个是最大的坑。我一开始 的 description 写的是"天气函数",结果用户说"今天会不会下雨"的时候模型不调它。改成"查询指定城市的当前天气信息,包括温度、天气状况、降水概率等"之后就正常了。

description 要写得像给一个不懂代码的人看的说明书,越具体越好。参数的 description 也一样,别省。

我用 ofox.ai 的聚合接口测了几个模型(ofox.ai 是一个 AI 模型聚合平台,一个 API Key 可以调用 GPT-5.4、Claude Opus 4.6、Gemini 3.0 等 50+ 模型,国内直连无需代理),实测结果:

模型 单函数准确率 多函数并行 参数类型遵守 综合评价 GPT-5.4 99% 支持,稳定 很好 首选 Claude Opus 4.6 98% 支持 很好 复杂逻辑场景强 Gemini 3.0 95% 支持 偶尔类型偏差 性价比不错 DeepSeek V3 90% 基本支持 一般 简单场景够用

GPT-5.4 在 Function Calling 方面体验最好,Claude Opus 4.6 在需要复杂推理来决定调哪个函数的场景下更胜一筹。

 
  

是最常用的,但如果发现模型该调函数时老不调,可以试试 。

加超时和重试。 函数执行可能失败,模型也可能返回不存在的函数名,调度循环里一定要有异常处理。

限制最大轮次。 我上面代码里写了 ,防止模型反复调函数陷入死循环。真遇到过这种情况,模型调完一个函数觉得信息不够,又调另一个,来来回回停不下来。

日志一定要打。 把每轮的 tool_calls 和执行结果都记下来,线上出问题没日志就是抓瞎。

参数校验别依赖模型。 虽然有 JSON Schema,但模型偶尔还是会传奇怪的值,函数内部该做的参数校验一个不能少。

Function Calling 的核心就是定义工具 → 模型决策 → 执行回填这个循环。搞明白这个,不管是做智能客服、数据查询助手还是 Agent,底层逻辑都是一样的。

比我预想的简单,主要时间花在了调 description 和处理各种边界情况上,代码层面反而不多。把上面那个 函数改改就能直接用在项目里。

对了,如果你在国内开发,各家模型 API 的网络和鉴权确实挺折腾的。我现在统一走聚合接口,换模型只改一个 model 参数,省了不少事。

小讯
上一篇 2026-03-15 19:55
下一篇 2026-03-15 12:01

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/237546.html