【小目标】
这一节点回答:怎么把概率模型的输出变成"可预期、可被程序使用"的? 也就是生成侧的第三个旋钮——指令遵循 + 结构化输出 + 工具调用。
这里最关键的一句判断:光让模型"能说"不够,还要让它"说的能被程序接住"。 纯自然语言的回答人能看,但程序用不了——要让模型和系统对接,必须有格式约束。这一层是"LLM 从玩具变成工具"的关键开关。
对做产品的人来说,这一层直接决定了你的 AI 功能能不能真正接入业务流程。如果每次回答都是自由文本,下游还得再做一次解析,既不稳又慢;如果模型直接输出结构化 JSON,下游就能直接用,整个链路就稳了。
【方法论】
一句话结论:让输出可预期有三层手段,由浅入深:系统提示 → 结构化输出 → 工具调用。 越往深,可控性越强,但实现复杂度也越高。
③ Function Calling / 工具调用 —— 输出"调哪个工具、传什么参数",外部真实执行
↑ (更可控,对接外部世界)
② 结构化输出(JSON schema)—— 强制格式,引擎级保证字段完整
↑ (更稳,程序可直接消费)
① 系统提示(System Prompt)—— 写清角色/规则/格式,约束全局行为
↑ (最基础,软约束)
可预期的输出
① 系统提示(System Prompt)—— 最基础的全局约束
- 在对话开头设置角色、目标、边界、格式要求,约束模型全局行为
- 好指令的三要素:
- 具体:不说"你是个好客服",说"你是电商导购客服,只回答商品相关问题,不聊其他"
- 单一:一个指令只干一件事,别把五个任务塞在一个 prompt 里
- 有示例:few-shot(少样本)比空讲规则更有效——给 1–2 个"输入→输出"的例子,模型学得更快
- 局限:软约束,模型不一定 100% 遵守。强约束要用下面的结构化输出。
② 结构化输出(Structured Output / JSON Mode)—— 格式硬约束
- 要求模型返回符合预定义 schema 的 JSON,甚至引擎级保证必填字段一定有、格式一定对
- 和"请用 JSON 回复"的提示词不同——那是软约束(可能还是会返回自然语言),结构化输出是引擎级硬约束
- 价值:让下游(路由/工具/落库)稳收数据,不用再去解析自由文本
- 常用场景:
- 意图识别结果输出为 JSON(
{"intent": "...", "confidence": 0.92}) - 信息抽取(从合同里抽出字段,直接入库)
- 函数调用的参数生成
- 意图识别结果输出为 JSON(
- 注意:结构化输出能力随模型版本波动,要回归评测——换模型版本后一定要测一下遵循率有没有掉
③ Function Calling / 工具调用—— LLM 对接外部世界的开关
- 让模型输出"调哪个工具、传什么参数"的结构化意图,由外部系统真实执行
- 这是 Agent(智能体)的基础——模型不只是回答问题,还能调用工具完成实际动作
- 例子:用户说"帮我查一下订单" → 模型输出
调用 get_order 工具,参数 order_id=123→ 外部系统执行 → 把结果返回给模型 → 模型组织成自然语言回答用户
- 例子:用户说"帮我查一下订单" → 模型输出
- 和结构化输出的关系:结构化输出只约束"格式",Function Calling 还决定"调哪个工具并传参",二者常配合
- 落地工程见阶段③第五章 Agent 系统工程
实践要点清单:
- 指令要具体、单一、无歧义,别写大段模糊的要求
- few-shot 示例比空讲规则更有用——给例子,模型学得更快更准
- 能结构化就结构化——只要下游是程序,就优先用 JSON schema,别让下游再做一次解析
- 结构化输出 + 低温 = 最稳的组合(结构化任务尽量把温度调到 0.1–0.3)
- 换模型版本后一定要回归测试指令遵循率和结构化输出合规率——这类能力会漂
【知识点】
- 让输出可预期有三层:系统提示(软约束)→ 结构化输出(格式硬约束)→ 工具调用(对接外部世界)。越往深越可控。
- 好指令三要素:具体、单一、有示例(few-shot)。别写大段模糊的要求。
- 结构化输出 ≠ "请用 JSON 回复":前者是引擎级硬约束(保证格式正确),后者是软约束(可能还是会瞎写)。
- Function Calling 是 LLM 对接外部世界的开关:模型不再只说话,还能调用工具干实事。这是 Agent 的基础。
- 结构化输出 + 低温 = 最稳组合:结构化任务(抽取、路由、参数生成)尽量低温 + 格式约束。
- 指令遵循率会漂:换模型版本后一定要回归测试,不能想当然认为"新版本更好"。
【名词卡】
| 名词 | 一句话解释 |
|---|---|
| System Prompt / 系统提示 | 对话开头设置角色/规则/边界/格式的指令,约束模型全局行为 |
| Instruction Following / 指令遵循 | 模型服从用户/系统指令完成指定任务的能力,是"按规矩办事"的基础 |
| Structured Output / JSON Mode / 结构化输出 | 强制模型按预定义 schema 输出固定格式(JSON),使结果可被程序直接消费 |
| JSON Schema | 描述 JSON 结构的规范(有哪些字段、类型、是否必填),用于约束结构化输出 |
| Function Calling / Tool Use / 函数调用 / 工具调用 | 让模型输出"调哪个工具、传什么参数"的结构化意图,由外部系统真实执行;是 LLM 对接外部世界的开关 |
| Few-shot / 少样本 | 给出少量示例让模型学会某任务/格式,通常比空讲规则更有效 |
| Zero-shot / 零样本 | 不给示例、直接让模型完成任务——考验模型的通用能力 |
| Prompt Engineering / 提示词工程 | 通过设计 prompt 让模型更好地完成任务的技巧,产品化见 F4.4 |
易混对比:
- 系统提示 vs 结构化输出:前者是软约束(写规则),后者是硬约束(引擎级保证格式)
- 结构化输出 vs Function Calling:结构化只约束"输出格式",Function Calling 还决定"调哪个工具并传参"
- Few-shot vs Zero-shot:给示例 vs 不给示例,有示例通常效果更好但更费 token
【练一练】
目标:亲手感受"系统提示 + 结构化输出"的威力——从自由文本抽取结构化信息,对比有/无格式约束的差异。
实验:拿下面这段"用户留言"作为输入,分别做 A/B 两组测试:
用户留言:"您好,我想退一下上周买的那个红色的无线耳机,订单号是 20240315001,原因是音质不太好,有点杂音。还有,我上次一起买的充电线能不能换个黑色的?谢谢!"
A 组(自由文本):
提示词:"请分析上面这段用户留言,告诉我用户想干什么。"
- 观察:模型的回答格式是什么?如果要把结果给程序用,方便吗?
B 组(结构化输出):
提示词:"请分析上面这段用户留言,严格按以下 JSON 格式输出:
{ "intent": "用户的主要意图,可选值:退款/换货/咨询/其他", "order_id": "订单号,如果没有则为 null", "product": "涉及的商品名称", "reason": "用户提到的原因,如果没有则为 null", "secondary_request": "是否有次要诉求,有则简述,没有则为 null" }只输出 JSON,不要其他文字。"
- 观察:模型输出的 JSON 格式正确吗?字段都填对了吗?程序能直接用吗?
对比分析:
- A 组和 B 组哪个对程序更友好?
- 如果把 A 组的回答给程序用,你还需要做什么额外工作?(解析自然语言?写正则?)
- B 组如果有字段填错了(比如 intent 选错了),你会怎么改进提示词让它更准?(加示例?把选项写得更清楚?)
进阶挑战:试着在 B 组的基础上加一个 few-shot 示例(在 prompt 里先给一个"输入→正确JSON"的例子),看加了示例后准确率有没有提升。