一个实现可靠结构化输出的廉价技巧:将验证错误反馈给重试
摘要
一种实用技术,通过将验证错误反馈到重试提示中,改进语言模型的结构化输出生成,使模型能够自我修正而非盲目重试。该方法以模型易理解的方式描述错误,并提供先前输出供其编辑。
如果你从 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%)。
Pigeonholing:不良提示导致模型崩溃并犯错
本文介绍了“Pigeonholing”这一现象,即不良提示导致大语言模型崩溃并重复错误,造成38-40%的性能下降。跨越10个任务和10个模型的实验表明,随着对话轮次增加,问题恶化,并提出了结合合成错误的RLVR作为缓解措施。
搜索、失败、恢复:一种面向纠错感知推理的训练框架
介绍了Pyligent,一种利用任务验证器标记失败并在推理中教导大语言模型回溯的训练框架,提高了隐藏图、数独和积木世界的求解率。
迈向可靠且鲁棒的LLM规划:符号反馈驱动的迭代自我改进框架
本文提出了一种符号反馈驱动的迭代自我改进框架,以提高大语言模型在长周期规划任务中的鲁棒性和可靠性。该方法利用自然语言提示、符号验证器和计划识别器来增强可行性与正确性。