Agent X-Ray
RuntimeNotesAbout
Notes/产品经理/Agent 基础知识/S02-实践

阶段 2 实践 — 国际机票需求抽取 Schema

4 分钟 · 更新于 2026-09-01

阶段 2 实践 — 国际机票需求抽取 Schema

本实践的产出最小产出:为国际机票需求抽取任务设计一套结构化输出 Schema 完整产出:Schema + 自由文本对照实验 + 流式事件记录 + Fallback 策略表

预计投入:5~7 小时。这套 Schema 在阶段 5(工具契约)和阶段 10(评测集)会被直接复用,值得做扎实。


实践 1 · 需求抽取 Schema(⭐ 必做)

任务定义:输入一段用户自然语言(对话或单句),输出一个可直接驱动查询的结构化订票意图。

第一步:先写"不做什么"

在写字段之前,先明确边界——这一步比字段设计重要:

  • 抽取器不做业务校验(城市是否通航、日期是否可售)——那是下游的事
  • 抽取器不做推断补全(用户没说舱位就不要默认经济舱),而是标记为未提供
  • 抽取器不做多意图拆分("先查东京再看首尔"应当整体标记为多意图,交给上层处理)

写清楚这三条,能挡掉后面 80% 的字段膨胀。

第二步:字段设计

建议的骨架(按需增删,重点是每个字段都要能说出为什么需要):

text
intent          枚举: search | change | refund | baggage | other | multi_intent
trip_type       枚举: one_way | round_trip | multi_city | unknown
segments[]      每段: origin / destination / depart_date / depart_time_pref
  origin        城市或机场(三字码 + 原文),unknown 允许
  destination   同上
  depart_date   ISO 日期;相对表达("下周三")需给出 raw 与解析结果两个字段
  time_pref     枚举: morning | afternoon | evening | redeye | any | unknown
passengers      adult / child / infant 各一个整数,未提供为 null 而非 0
cabin_pref      枚举: economy | premium_economy | business | first | unknown
constraints[]   自由但受控的约束列表: direct_only / specific_airline / budget_max / ...
confidence      0-1,模型对本次抽取整体把握
missing_fields[] 明确列出"用户没说、但下单必需"的字段
raw_quotes{}    每个关键字段对应的原文片段(可溯源)

第三步:三条硬要求

要求为什么
相对日期必须双字段raw + resolved + resolve_basis"下周三"依赖"今天是哪天"。只存解析结果,事后无法复核对错;只存原文,下游没法用
unknown 必须是合法值逼模型必填等于逼它编。阶段 1 实验 1 里"日期"是分歧最集中的字段,就是这个原因
raw_quotes 可溯源抽错时能一眼看出是"没看见"还是"看见了理解错",这是两类完全不同的问题

验收标准

  • 用 20 段真实风格的中文输入测试,其中至少包含:省略主语的、含相对日期的、多意图的、信息不全的、含口语数量词("我们仨")的
  • 每个字段都能回答"下游谁用它"
  • missing_fields 的准确率单独统计——它决定了 Agent 会不会该追问时不追问

存放ai-output/temporary/data/ 放测试集与结果,Schema 定稿后可放本目录或产品文档。


实践 2 · 自由文本 vs 结构化输出对照

问题:同一个抽取任务,让模型"自由回答"再解析 vs 直接结构化输出,差距有多大?

做法:同一批 20 条输入,跑两种方式各 3 次:

方式提示词解析
A · 自由文本"请提取出发地、目的地、日期、人数"正则/LLM 二次解析
B · 结构化输出同样指令 + Schema 约束直接反序列化 + 校验

记录

指标AB
解析成功率
字段级准确率
三次运行完全一致率
平均 token 消耗
平均延迟
出错时能否定位到字段

要看到的现象

  • B 的解析成功率接近 100%,但字段级准确率不一定更高——结构化解决的是"格式",不是"理解"
  • B 的可诊断性明显更好

验收:能用一句话说清"结构化输出解决了什么、没解决什么"。


实践 3 · 记录一次完整的流式事件序列

做法

  1. 挑一个会触发工具调用的请求(如果暂时没有工具,可用一个假的 search_flights 定义)
  2. 打开流式,把每一个事件原样落盘(不要只记文本增量)
  3. 标注出:思考开始/结束、文本开始、工具调用意图出现、参数拼完、停止原因、usage

产出:一份带注释的事件序列文档(可直接用讲义第三节的图作为模板对照)。

要回答的三个问题

  • 从哪个事件开始,能确定"模型决定调工具了"?
  • 工具参数从开始出现到拼完,中间经过多少个 delta?这段时间 UI 该显示什么?
  • stop_reason 一共出现过哪几种?每一种对应什么产品表现?

实践 4 · Fallback 策略表

把讲义第五节的模板,改写成针对国际机票 Agent 的具体版本

触发信号阈值动作用户可见埋点
主模型超时
限流
Schema 校验失败
工具连续失败
全部不可用

额外要求

  • 每一行都要写埋点字段——没有埋点的降级策略在线上等于不存在
  • 标注哪些降级是"静默"的,哪些必须告诉用户(原则:结果质量下降必须告知,仅延迟增加可以静默
  • 如果走网关,标注"路由到哪个实际模型"是否可观测;不可观测就是一个必须解决的风险项

自测

维度阶段 2 的问法
解释给研发讲清"为什么我要求 unknown 是合法值"
画图画出一次带工具调用的流式事件时序图
比较Structured Output 与 Function Calling 各举一个本业务用例,并说明为什么不能互换
实践Schema 跑通 20 条测试集
评测定义"抽取任务成功"的判据:整体一致?字段级?还是只看必需字段?
产品化Fallback 表能拿去和研发评审
迁移换成支付场景(收银台意图抽取),这套 Schema 设计方法是否还成立?

  • 阶段 2 讲义
  • 阶段 5 实践:工具粒度重审
  • 阶段 10 实践:最小评测集
  • 学习路线

本章目录
实践 1 · 需求抽取 Schema(⭐ 必做)实践 2 · 自由文本 vs 结构化输出对照实践 3 · 记录一次完整的流式事件序列实践 4 · Fallback 策略表自测Related Documents
苏ICP备2025204887号-2