本实践的产出 ⭐ 最小产出:为国际机票需求抽取任务设计一套结构化输出 Schema 完整产出:Schema + 自由文本对照实验 + 流式事件记录 + Fallback 策略表
预计投入:5~7 小时。这套 Schema 在阶段 5(工具契约)和阶段 10(评测集)会被直接复用,值得做扎实。
任务定义:输入一段用户自然语言(对话或单句),输出一个可直接驱动查询的结构化订票意图。
在写字段之前,先明确边界——这一步比字段设计重要:
写清楚这三条,能挡掉后面 80% 的字段膨胀。
建议的骨架(按需增删,重点是每个字段都要能说出为什么需要):
| 要求 | 为什么 |
|---|---|
| 相对日期必须双字段(raw + resolved + resolve_basis) | "下周三"依赖"今天是哪天"。只存解析结果,事后无法复核对错;只存原文,下游没法用 |
| unknown 必须是合法值 | 逼模型必填等于逼它编。阶段 1 实验 1 里"日期"是分歧最集中的字段,就是这个原因 |
| raw_quotes 可溯源 | 抽错时能一眼看出是"没看见"还是"看见了理解错",这是两类完全不同的问题 |
存放:ai-output/temporary/data/ 放测试集与结果,Schema 定稿后可放本目录或产品文档。
问题:同一个抽取任务,让模型"自由回答"再解析 vs 直接结构化输出,差距有多大?
做法:同一批 20 条输入,跑两种方式各 3 次:
| 方式 | 提示词 | 解析 |
|---|---|---|
| A · 自由文本 | "请提取出发地、目的地、日期、人数" | 正则/LLM 二次解析 |
| B · 结构化输出 | 同样指令 + Schema 约束 | 直接反序列化 + 校验 |
记录:
| 指标 | A | B |
|---|---|---|
| 解析成功率 | ||
| 字段级准确率 | ||
| 三次运行完全一致率 | ||
| 平均 token 消耗 | ||
| 平均延迟 | ||
| 出错时能否定位到字段 |
要看到的现象:
验收:能用一句话说清"结构化输出解决了什么、没解决什么"。
做法:
产出:一份带注释的事件序列文档(可直接用讲义第三节的图作为模板对照)。
要回答的三个问题:
把讲义第五节的模板,改写成针对国际机票 Agent 的具体版本:
| 触发信号 | 阈值 | 动作 | 用户可见 | 埋点 |
|---|---|---|---|---|
| 主模型超时 | ||||
| 限流 | ||||
| Schema 校验失败 | ||||
| 工具连续失败 | ||||
| 全部不可用 |
额外要求:
| 维度 | 阶段 2 的问法 |
|---|---|
| 解释 | 给研发讲清"为什么我要求 unknown 是合法值" |
| 画图 | 画出一次带工具调用的流式事件时序图 |
| 比较 | Structured Output 与 Function Calling 各举一个本业务用例,并说明为什么不能互换 |
| 实践 | Schema 跑通 20 条测试集 |
| 评测 | 定义"抽取任务成功"的判据:整体一致?字段级?还是只看必需字段? |
| 产品化 | Fallback 表能拿去和研发评审 |
| 迁移 | 换成支付场景(收银台意图抽取),这套 Schema 设计方法是否还成立? |