01
60 秒回答模板
我会把 API schema repair 分成确定性校验和 self-refine 两层。第一层不是 LLM,而是 JSON Schema、Pydantic、Zod 或类型系统适配器:拿到 API 返回后先检查 required 字段、类型、枚举、数组结构、版本号和 unknown fields。冗余字段通常可以按白名单丢弃或放到 raw 扩展区;类型可安全转换的,比如字符串数字转 number,可以在 adapter 中处理;必填字段缺失时不能让模型直接猜,要先看是否能通过重调 API、读取备用字段、查详情接口或使用默认业务值恢复。第二层 self-refine 是把校验错误、原始 payload、目标 schema 和允许操作给模型,让它输出修复计划或转换后的候选结构,然后再次跑同一个校验器。循环必须有最大次数、差异审计和置信度门槛,失败就降级或返回可解释错误。这样 self-refine 负责处理结构变化和半结构化异常,契约校验负责守住事实和类型边界。
考点 LLM 不是第一道校验器
难度 真实面经题
回答目标 回答要体现 self-refine 是 schema 校验后的受控修复闭环,能提升韧性但不能突破事实来源、类型契约和审计边界。
02
深入解析
01 先校验再修正
API 返回异常首先应由确定性校验器发现,而不是直接交给模型自由解释。schema 校验能明确指出缺哪个字段、哪个字段类型不对、数组还是对象不匹配、枚举值是否非法。只有错误被结构化后,self-refine 才有清楚的修复目标和边界。
02 错误分类
字段缺失、字段冗余、类型错误、层级变化、版本不兼容和语义冲突的处理方式不同。冗余字段可以忽略,类型错误可以有限转换,层级变化可以映射,缺失事实则通常需要重新获取。把这些都混成一次模型重写,会增加幻觉和数据污染风险。
03 缺失字段处理
必填字段缺失时,Agent 不能为了通过 schema 而编造值。优先级应是查同一 payload 的别名字段、调用详情接口、从缓存或数据库读取可信记录、使用明确业务默认值,最后才降级为不完整结果并标记原因。模型可以建议路径,但事实来源必须可验证。
04 冗余字段处理
冗余字段不一定是错误,可能是 API 升级带来的新信息。对于严格输出给下游的结构,可以按白名单投影,未知字段进入 raw 或 extensions 供审计;对于安全敏感字段,要默认不透传。这样既避免下游被多余字段打爆,也保留排查版本漂移的线索。
05 结构不匹配修复
如果 API 把对象变成数组、把嵌套字段平铺,或返回半结构化文本,self-refine 可以根据目标 schema 生成转换候选。但候选必须经过同一 schema 校验,并最好保留字段级 provenance,说明每个目标字段来自原始 payload 的哪个路径或哪个工具调用。
06 修复循环控制
self-refine 循环要有最大重试次数、错误类型白名单和幂等输入。每次修复后比较 diff,确认没有引入无来源字段。连续失败时应停止并返回结构化错误,而不是无限让模型重写。否则会把真实上游契约问题隐藏成不稳定的模型行为。
07 版本和兼容
API schema repair 还需要版本意识。请求和响应里应带 schema_version 或 provider_version,adapter 按版本选择映射规则。对于新增字段、废弃字段和语义变化,要通过契约测试和金样本发现,而不能依赖线上 self-refine 长期兜底。
08 验证指标
验证要看 schema 校验失败率、自动修复成功率、重调 API 成功率、幻觉字段率、未知字段增长、下游解析失败率和人工审计通过率。还要构造缺字段、冗余字段、类型错、结构漂移的样本集,确认修复逻辑不会把坏数据静默变好看。
03
易错点
- 把 self-refine 理解成让模型再回答一次,没有明确 schema 校验和错误分类。
- API 缺少必填字段时让模型凭上下文猜值,制造无法追溯的幻觉数据。
- 对冗余字段一律透传,导致下游解析、权限边界或隐私处理被上游变化影响。
- 修复后不再跑校验器,直接把模型重写结果交给下游业务逻辑。
- 没有最大重试次数,遇到结构异常时让 Agent 在修复循环里反复消耗 token。
- 把运行时修复当成长期方案,不做 API 版本管理、契约测试和上游告警。
- 没有记录字段来源,最终结果看似符合 schema,但无法说明每个值来自哪里。
- 对金额、身份、权限等高风险字段使用自由文本修复,缺少确定性保护。
04
面试官追问
如果 API 少了一个 required 字段,能不能让模型补?
一般不能直接补,除非这是有明确定义的业务默认值。正确做法是先找别名字段、调用详情接口、查缓存或数据库可信记录。如果仍然没有,就返回不完整状态并标记缺失原因,而不是让模型根据上下文猜一个看似合理的值。
冗余字段应该直接报错还是忽略?
取决于下游契约和安全要求。面向严格下游输出时应按白名单投影,未知字段不进入正式结构;但可以把原始 payload 保存到 raw 区用于审计和分析。对于敏感字段,默认不透传,避免上游新增字段带来权限或隐私风险。
self-refine 修复结构不符合预期时,prompt 应包含什么?
应包含原始 payload、目标 schema、校验器返回的具体错误、允许的操作列表和禁止编造事实的约束。输出最好是结构化修复结果加字段来源说明,而不是一段自然语言解释。随后仍要重新执行确定性校验。
怎么防止修复逻辑掩盖上游 API 变更?
把每次修复的错误类型、原始版本、diff 和修复策略都打点。若某类错误突然升高,应触发契约变更告警。运行时修复只能保证短期可用,长期要更新 adapter、schema 和契约测试,不能让模型一直在线兜底。
哪些场景不适合用 LLM 做 schema repair?
金额、权限、身份、库存、合规审计等强事实和高风险字段不适合交给 LLM 推断。它们最多能做格式转换建议,最终必须来自可信系统或人工确认。否则一个错误补值就可能变成真实业务副作用。