上一篇我们讲了:Function Call 的真正难点,不是“把工具挂上去”,而是:
- 模型什么时候调用?
- 调用哪个?
- 缺信息要不要追问?
- 工具之间的顺序是什么?
- 工具调用失败怎么 fallback?
- 多轮对话如何推进?
这些全部依赖一件关键事情:训练数据必须非常非常非常“工程化”。
如果你去看大厂生产级 Function Call 项目,数据永远不是一句一句“人工写对话”, 相反,它们都有一个共性:
必须构建一套可控、可扩展、可复现的“数据沙盒”。
这一篇文章,我会从三个角度把这件事讲透:
- 为什么 Function Call 数据要用“沙盒”的方式构建
- 完整的数据体系应该有哪些标签与变量
- 一个工业级 Function Call 数据集是如何从 0 到 1 构建的
最后,我会给出两段标准数据构造代码(消息格式 + 工具链模拟),你可以直接放进自己的项目里。
一、面试官第一个考点:为什么不能直接手写 SFT 数据?
很多同学构建 FC 数据的方式是:
user: 吴师兄,帮我找一个酒店assistant: (工具调用)tool: (工具返回)assistant: (结果)但这套方法做不了真正的工程项目,因为它有致命缺陷:
1)覆盖率太低
你写 10 条、100 条、甚至 500 条,都不可能覆盖:
- 缺目的地 vs 完整信息
- 缺日期 vs 缺预算
- 问路 vs 规划
- 酒店推荐 vs 酒店评价
- 工具成功 vs 工具为空
- 多轮追问 vs 单轮完成
- 旅行相关 vs 非相关拒答
你永远写不全业务真实场景。
2)对话格式很容易错
比如:
- “tool_calls” 字段格式不标准
- arguments 没有 JSON encode
- 多轮对话漏掉 role 切换
- 工具响应和 tool_call_id 对不上
- assistant 的行为和系统流程不匹配
SFT 一旦格式错一点点,训练就无意义。
3)模型永远学不到“流程”
功能型 Agent 的本质是流程,而不是内容。
流程是什么?
- 触发条件
- 需要补什么信息
- 工具调用顺序
- 工具依赖关系
- 什么时候结束
- 什么时候 fallback
手写数据容易漏掉逻辑,不可控。
因此必须使用一种方法:
构建一个“沙盒式数据生成系统”,把所有分支、变量、流程在数据层面定义清楚,然后一次性生成全量覆盖的数据集。
二、数据沙盒体系:为什么它能解决 Function Call 的所有难题?
我们以“旅行助手 Agent”为例。
它有 4 个核心工作流:
- 旅行规划(RAG + 天气)
- 问路导航(地图)
- 酒店查询(推荐 + 评价)
- 闲聊/拒答
沙盒体系要做到的事情只有一件:
把这四个路由中所有“变”的变量列出来,然后系统化地组合、覆盖,并生成完整的多轮对话 + 工具调用链。
1)首先定义标签体系(这是 Function Call 的灵魂)
下面是我们真实项目的数据标签体系:
| 标签类型 | 数量(训练集) |
|---|---|
| 旅行规划(不需要反问) | 320 |
| 旅行规划(需要反问) | 40 |
| 问路(不需要反问) | 80 |
| 问路(需要反问) | 16 |
| 酒店查询(不需要反问) | 160 |
| 酒店查询(需要反问) | 32 |
| 旅行相关(闲聊) | 80 |
| 拒答(非旅行) | 80 |
你会发现:
每条数据都有明确标签,这就是可控性。
每类数据都有足够量,这就是覆盖性。
2)其次定义业务变量(沙盒中最关键的一步)
四大类变量:
① 用户画像(system prompt 部分)
每条数据都包含:
- 用户名字(40 个池子)
- 城市 ID(100 个真实城市)
- 出发日期(一个日期范围内随机)
- 起点坐标(真实坐标)
这些数据会注入 system:
{ "role": "system", "content": "## 用户信息\n- 用户名: 吴师兄\n- 当前城市ID: 1012510801\n- 出发日期: 2025-12-02\n- 起点坐标: 100.479921,59.1237401"}② query 模板(语义扰动)
以“酒店查询”为例,有 30 种表达方式:
帮我找一家上海外滩附近 2000 左右的酒店外滩景观好的酒店推荐我周五去上海,住两晚,预算 2000,能推荐吗在魔都哪里住方便一点?…让模型学会理解用户的多种自然语言表达。
③ 工具结果(真实/模拟)
每个工具都会给定不同的返回:
- 酒店为空
- 返回 1 家
- 返回 3 家
- 返回 10 家
- 返回无效评论
- 返回异常
不同工具结果会训练模型做不同决策。
④ 对话分支(追问 vs 不追问)
例如旅行规划:
- 缺目的地 → 必须反问
- 缺日期 → 必须反问
- 信息完整 → 直接工具链
沙盒会自动生成完整多轮对话。
三、数据是如何从沙盒中“流”出来的?
我们真实项目的数据是两阶段生成的:
第一阶段:生成种子数据(generate_dataset.py)
伪代码如下:
class DatasetGenerator: def __init__(self): self.names = [...] self.cities = {...} self.hotel_queries = [...] self.travel_queries = [...] self.route_queries = [...] def generate_travel_plan_no_ask(self): return { "用户问题": random.choice(self.travel_queries), "用户名字": random.choice(self.names), "用户所处城市": city_id, "出发日期": date, "起点坐标": coord, "类型": "旅行规划-不需要反问", "是否追问": "否" }每个标签都有独立函数,生成不同场景:
旅行规划(不追问)400 条 旅行规划(追问)50 条 问路(不追问)100 条 …最终构成 1010 条种子数据。
第二阶段:转换为真实对话
这是 Function Call 项目的核心步骤。
训练数据格式必须符合 OpenAI 标准:
[ { "role": "system", "content": "..." }, { "role": "user", "content": "我要在武汉住酒店,预算200-300元" }, { "role": "assistant", "tool_calls": [ { "id": "call_9e45f8c7", "type": "function", "function": { "name": "recommend_hotels", "arguments": "{\"requirements\": \"武汉,预算200-300元\"}" } } ] }, { "role": "tool", "content": "...工具返回...", "tool_call_id": "call_9e45f8c7" }, { "role": "assistant", "content": "已根据您的预算,为您找到以下酒店…" }]生成过程包含:
- 根据标签 → 选择工作流
- 判断是否需要追问
- 自动生成工具调用链
- 自动生成工具返回内容
- 自动生成最终自然语言回复
所有流程都由代码严格执行,不靠人工写对话。
四、模型最终学到了什么?
经过这一套数据工程,模型会学习到:
1)如何判断意图(Router 选择)
用户一句话:
“我想住两晚 2000 元内的酒店”模型能自动:
- 判断是“酒店查询”
- 判断缺少入住/离店日期
- 选择走“需要反问”分支
2)如何追问用户信息(多轮)
assistant: 请问您的入住和离店日期是什么时候?user: 下周五入住,住两晚。模型在追问与理解上下文之间作出正确选择。
3)如何按顺序调用工具
比如酒店查询:
recommend_hotels→get_hotel_reviews(对每一家)→final answer或旅行规划:
search_travel_guide→get_weather_info→整合生成行程4)如何处理工具为空的情况
沙盒中包含“工具返回空”场景,让模型学会:
抱歉,吴师兄,暂时没有找到符合您需求的酒店。5)如何拒答非旅行问题
“如何学摄影?”→ 抱歉,吴师兄,我是旅行助手,只能回答旅行相关问题。五、面试官最爱问:你的数据是怎么保证覆盖率的?
下面的这段回答直接可用于面试,训练营学员亲测可用:
我首先将业务拆成 5 大工作流,每个工作流继续拆成“需要反问/不需要反问”两个分支,形成 10 类标签体系。
然后我定义所有业务变量(城市、时间、预算、景点、酒店、工具结果等),在沙盒中通过模板、多轮追问、工具返回扰动等方式组合生成全场景数据。
整个过程可控、可复现,并且保证每一个场景都有足够覆盖。
六、面试官更进一步:为什么你们的数据比普通数据更有效?
你可以这样说:
**因为我们不是“写数据”,而是在“定义业务规则”。**所有数据都是规则的组合结果,因此:
- 质量高
- 一致性强
- 可拓展性强
- 能反映真实业务流程
- 能显著提升模型的 Function Call 成功率
这句话很加分。
最后说一句
真正能拉开差距的,从来不是知识点,而是体系与思考方式。
在过去的几个月中,我们已经有超过80 个同学(战绩真实可查)反馈拿到了心仪的 offer ,包含腾讯、阿里、字节、华为、快手、智谱、月之暗面、minimax、小红书等各家大厂以及传统开发 / 0 基础转行的同学在短时间内拿到了各类大中小厂的 offer。
如何学习大模型 AI ?
由于新岗位的生产效率,要优于被取代岗位的生产效率,所以实际上整个社会的生产效率是提升的。
但是具体到个人,只能说是:
“最先掌握AI的人,将会比较晚掌握AI的人有竞争优势”。
这句话,放在计算机、互联网、移动互联网的开局时期,都是一样的道理。
我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。
我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。
第一阶段(10天):初阶应用
该阶段让大家对大模型 AI有一个最前沿的认识,对大模型 AI 的理解超过 95% 的人,可以在相关讨论时发表高级、不跟风、又接地气的见解,别人只会和 AI 聊天,而你能调教 AI,并能用代码将大模型和业务衔接。
- 大模型 AI 能干什么?
- 大模型是怎样获得「智能」的?
- 用好 AI 的核心心法
- 大模型应用业务架构
- 大模型应用技术架构
- 代码示例:向 GPT-3.5 灌入新知识
- 提示工程的意义和核心思想
- Prompt 典型构成
- 指令调优方法论
- 思维链和思维树
- Prompt 攻击和防范
- …
第二阶段(30天):高阶应用
该阶段我们正式进入大模型 AI 进阶实战学习,学会构造私有知识库,扩展 AI 的能力。快速开发一个完整的基于 agent 对话机器人。掌握功能最强的大模型开发框架,抓住最新的技术进展,适合 Python 和 JavaScript 程序员。
- 为什么要做 RAG
- 搭建一个简单的 ChatPDF
- 检索的基础概念
- 什么是向量表示(Embeddings)
- 向量数据库与向量检索
- 基于向量检索的 RAG
- 搭建 RAG 系统的扩展知识
- 混合检索与 RAG-Fusion 简介
- 向量模型本地部署
- …
第三阶段(30天):模型训练
恭喜你,如果学到这里,你基本可以找到一份大模型 AI相关的工作,自己也能训练 GPT 了!通过微调,训练自己的垂直大模型,能独立训练开源多模态大模型,掌握更多技术方案。
到此为止,大概2个月的时间。你已经成为了一名“AI小子”。那么你还想往下探索吗?
- 为什么要做 RAG
- 什么是模型
- 什么是模型训练
- 求解器 & 损失函数简介
- 小实验2:手写一个简单的神经网络并训练它
- 什么是训练/预训练/微调/轻量化微调
- Transformer结构简介
- 轻量化微调
- 实验数据集的构建
- …
第四阶段(20天):商业闭环
对全球大模型从性能、吞吐量、成本等方面有一定的认知,可以在云端和本地等多种环境下部署大模型,找到适合自己的项目/创业方向,做一名被 AI 武装的产品经理。
- 硬件选型
- 带你了解全球大模型
- 使用国产大模型服务
- 搭建 OpenAI 代理
- 热身:基于阿里云 PAI 部署 Stable Diffusion
- 在本地计算机运行大模型
- 大模型的私有化部署
- 基于 vLLM 部署大模型
- 案例:如何优雅地在阿里云私有部署开源大模型
- 部署一套开源 LLM 项目
- 内容安全
- 互联网信息服务算法备案
- …
学习是一个过程,只要学习就会有挑战。天道酬勤,你越努力,就会成为越优秀的自己。
如果你能在15天内完成所有的任务,那你堪称天才。然而,如果你能完成 60-70% 的内容,你就已经开始具备成为一名大模型 AI 的正确特征了。