AI Agents · 课时

修复格式错误输出的循环

如果 JSON 无法解析,就将错误发回模型并要求它修复输出。

第 3 / 4 课15 个步骤

修复格式错误输出的循环 是 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 反馈 — 无需本地设置。

此课程中的所有课时

  1. JSON 模式与工具调用输出
  2. Pydantic 模式验证
  3. 修复格式错误输出的循环
  4. Instructor / Outlines:保证结构
← 返回 AI Agents