修复格式错误输出的循环
如果 JSON 无法解析,就将错误发回模型并要求它修复输出。
修复格式错误输出的循环 是 CoddyKit 上的免费 AI Agents 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 AI Agents 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 AI Agents 课程共包含 4 节课。
本课时的部分内容尚未翻译,以英文显示。
严格模式有时也会失败
较旧的模型、边界情况或非严格的提供商偶尔会返回格式错误的 JSON。健壮的代理会要求模型修复其输出,从而完成恢复。
Basic Repair Loop
from pydantic import ValidationError
import json
def call_with_repair(messages, schema, max_attempts=3):
for attempt in range(max_attempts):
response = client.chat.completions.create(
model='gpt-4o-mini',
messages=messages,
response_format={'type': 'json_object'}
)
raw = response.choices[0].message.content
try:
return schema.model_validate_json(raw)
except (json.JSONDecodeError, ValidationError) as e:
messages.append({'role': 'assistant', 'content': raw})
messages.append({
'role': 'user',
'content': f'That output failed to validate: {e}.\nReturn ONLY valid JSON that matches the schema. No prose, no markdown fences.'
})
raise RuntimeError('Could not get valid output after repair attempts.')为什么有效
模型会看到错误消息,通常会在下一轮中进行纠正。请添加明确的指令:
- "不要输出说明文字"
- "不要使用 Markdown 围栏"
- "匹配此确切结构:..."
去除 Markdown 围栏
模型经常会将 JSON 包裹在 ```json ... ``` 中。解析前请先去除围栏:
import re
def extract_json(text):
m = re.search(r'```(?:json)?\s*(.*?)```', text, re.S)
if m:
return m.group(1).strip()
return text.strip()
sample = '```json\n{"name": "Alice"}\n```'
print(extract_json(sample))
首尾括号切片
如果存在多余的说明文字,请从第一个 { 切片到最后一个匹配的 }:
def find_json_slice(text):
start = text.find('{')
if start == -1:
return None
depth = 0
for i, c in enumerate(text[start:], start):
if c == '{': depth += 1
if c == '}':
depth -= 1
if depth == 0:
return text[start:i+1]
return None
sample = 'Here is your answer: {"name": "Alice", "age": 30} - hope that helps!'
print(find_json_slice(sample))
可代您完成此操作的工具
- Instructor——封装 Pydantic、修复循环和重试
- Outlines——通过引导式解码保证结构化输出
- jsonformer——逐令牌强制生成 JSON(HF 模型)
有效的修复提示
请包含具体的错误消息和简短的格式提醒:
repair_prompt = f'''
Your previous output had this error: {error}
Fix the output. Requirements:
- Valid JSON only
- Match this schema: {json.dumps(schema)}
- No prose, no markdown fences
'''修复循环的成本
每次修复都需要额外调用一次 LLM。请限制重试次数(2~3 次就足够了——超过这个次数后,模型恢复成功的可能性很低),并将修复率记录为质量指标。
将修复作为质量信号
如果修复率超过 5%,说明存在问题:提示不清晰、架构过于复杂,或者模型太小。请进行调查。
替代方案:约束解码
开源模型支持语法约束解码——模型完全无法生成无效输出。Outlines、jsonformer 和 llama.cpp 语法都可以实现这一点。
替代方案:使用函数而非架构
使用严格模式强制工具调用,比 JSON 模式加修复更简洁。只要提供商支持,就应使用这种方式。
记录错误输出
记录每个经过修复的输出,以便分析其中的模式:
log.warning('Repaired output', extra={'raw': raw, 'error': str(e), 'attempt': attempt})何时放弃
如果经过 N 次修复尝试后输出仍然无效,请向用户返回错误——不要臆造备用结果。诚实地失败胜过悄无声息地破坏数据。
修复循环模式
修复循环中最简单的第一步是什么?
回顾
检测解析错误,将其作为工具消息或用户消息追加,然后要求模型进行修复。限制重试次数。优先使用严格模式的工具调用,以彻底消除修复需求。
用 AI 导师学习 AI Agents — 免费
在浏览器中编写并运行真实代码,获得全天候 AI 导师的即时帮助,并在网页或应用中继续学习。
- 课程
- 60
- 课程
- 239
常见问题解答
「修复格式错误输出的循环」课时是免费的吗?
是的 — 「修复格式错误输出的循环」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 AI Agents 课程的其余内容,请升级到 CoddyKit PRO。 AI Agents 课程共包含 4 节课。
「修复格式错误输出的循环」这节课中我会学到什么?
如果 JSON 无法解析,就将错误发回模型并要求它修复输出。 你通过在浏览器中直接运行的动手代码来练习 AI Agents,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 AI Agents 需要有经验吗?
无需任何先前经验。CoddyKit 上的 AI Agents 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。
「修复格式错误输出的循环」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 AI Agents 课中编写并运行代码吗?
能。每节 AI Agents 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。