一个实现可靠结构化输出的廉价技巧:将验证错误反馈给重试
摘要
一种实用技术,通过将验证错误反馈到重试提示中,改进语言模型的结构化输出生成,使模型能够自我修正而非盲目重试。该方法以模型易理解的方式描述错误,并提供先前输出供其编辑。
如果你从 LLM 生成结构化输出并针对 schema 进行验证,你清楚失败模式:通常正常,偶尔出现字段缺失或无法解析的响应。常规修复手段是重试,但简单重试使用的是相同提示和相同温度,相当于只是重新掷骰。对我而言,更有效的方法是让重试具有自我修正能力:当验证失败时,将验证错误和模型先前输出的内容放回下一个提示中,要求它修复具体问题。这样是编辑而非重新生成。
python
except ValidationError as e:
attempts += 1
error_message = f"""
上次响应因以下错误验证失败:
<error>{format_error_for_llm(e)}</error>
修复错误并返回修正后的数据:
<data>{serialize(response).decode()}</data>
"""
response = None
# 下一轮循环会将 error_message 追加到提示中
两个细节很重要:向模型描述错误,而不是写日志(例如「字段 X 必须为整数,你传入了字符串」),并且把模型自己的先前输出作为待修正内容交给它。权衡:失败时会多一次调用且提示更长(设定尝试上限);只有当错误输出足够可解析以回传时才有效;如果你还在不同提供商之间切换,不要把切换算作一次尝试。
这来自我构建的一个 RAG 平台。其他人是如何处理这个问题的?通过受限解码/语法,还是类似这样的反馈循环?
相似文章
使用LLM实现结构化输出的可靠性——三个月生产环境经验总结
本文分享了在生产环境中可靠地从LLM生成结构化JSON输出的经验,涵盖JSON模式、模式验证和重试循环等方法,实现了99.5%的有效性。
当LLM奖励设计失败:稀疏结构化强化学习的诊断驱动细化
本文将LLM生成的奖励塑形视为稀疏结构化强化学习中的调试问题,识别出奖励泛滥和语义误解等失败模式。作者提出诊断驱动的迭代细化,与一次性生成相比,取得了显著的成功率提升(例如,DoorKey-8×8从2.3%提升至97.6%)。
为何自我纠正循环会降低大语言模型流水线的一致性(从85%降至62%)
在用于结构化数据提取的大语言模型流水线中添加自我纠正循环,导致一致性从85%下降到62%,原因在于复合噪声和再生漂移。文章探讨了潜在的解决方案,如细粒度差异机制或确定性门控。
@jakevin7: 分享一个神级review提示词方法论。 LLM 自我纠正的综述 《When Can LLMs Actually Correct Their Own Mistakes?》结论是:如果没有测试结果、工具输出等可靠的外部反馈,模型仅靠自己反思,…
分享了一个基于LLM自我纠正研究的提示词方法论,强调无外部反馈时模型自查效果有限,推荐对抗式审查等逐步增强的提示策略。
Pigeonholing:不良提示导致模型崩溃并犯错
本文介绍了“Pigeonholing”这一现象,即不良提示导致大语言模型崩溃并重复错误,造成38-40%的性能下降。跨越10个任务和10个模型的实验表明,随着对话轮次增加,问题恶化,并提出了结合合成错误的RLVR作为缓解措施。