核心要点

  • 先定清晰的目标 schema:字段名、类型、是否必填、枚举取值范围,越明确越稳

  • 要求模型只输出 JSON(不带解释),配 2–3 个 few-shot 示例示范输入到输出

  • 加 schema 校验 + 失败重试:解析失败或字段不合法就把错误回灌让它重出

  • 难点是字段缺失/幻觉/格式不稳:用约束解码或 Function Calling 锁格式,并建评测集量化

标准回答

第一步:定义清晰的 schema

先把要抽什么定清楚:每个字段的名字、类型(字符串/数字/日期)、是否必填、枚举值范围。比如从简历抽 {name, phone, years_of_experience(int), skills(list)}。schema 越明确,模型越不容易自由发挥。

第二步:明确指令 + 只输出 JSON

prompt 里要求「严格按以下 schema 输出 JSON,不要任何额外解释」,并强调「原文没有的字段填 null,不要编造」,从源头压制幻觉

第三步:给 few-shot 示例

放 2–3 个「输入文本 → 期望 JSON」的示例,尤其覆盖字段缺失、多值、边界情况,让模型照着模仿格式。

第四步:校验 + 重试

代码侧用 schema 校验(如 JSON Schema / Pydantic)解析输出:解析失败或字段类型不对,就把报错信息回灌让模型修正,设重试上限。

第五步:锁格式与评测

要更稳可用约束解码或 Function Calling(把 schema 作为函数参数定义,让模型直接产出合法结构)。最后建一个标注好的评测集,量化字段级准确率,持续迭代而非凭感觉。

常见误区

⚠️ 常见踩坑

不给校验和重试,直接信任模型输出去入库——格式偶发出错、字段被幻觉编造会污染数据;也别让模型对原文没有的字段瞎填,要明确要求填 null。

追问

追问 1模型老是给原文里没有的信息(幻觉)怎么办?

在指令里强制「只抽原文出现的内容,没有就填 null,禁止推测」;few-shot 里专门放「字段缺失填 null」的示例;输出后做规则校验,必要时让模型对每个字段附上原文出处,便于核查和过滤编造值。

追问 2为什么用 Function Calling 抽取更稳?

把目标 schema 定义成函数的参数结构,模型被强制按这个结构产出参数,天然是合法 JSON,省去解析自由文本的麻烦,格式稳定性比让它「输出 JSON 文本」更高,也更容易校验。

延伸学习

与本题相关的知识库文章、术语、工具与行业资讯。