核心要点
先定清晰的目标 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 文本」更高,也更容易校验。
延伸学习
与本题相关的知识库文章、术语、工具与行业资讯。