2 分钟

AI 生成系统中的验证、错误与边缘情况

了解 AI 生成工作流如何暴露验证规则、错误处理需求和棘手的边缘情况——以及测试、监控和修复它们的实用方法。

AI 生成系统中的验证、错误与边缘情况

本文所指的“AI 生成系统”是什么

AI 生成系统 是指任何模型产生的输出会直接决定系统下一步行为的产品——展示给用户的内容、要存储的内容、要发送到其他工具的内容,或要执行的操作。

这比“聊天机器人”更宽泛。实践中 AI 生成可能表现为:

  • 生成的文本或数据(摘要、分类、提取字段)
  • 生成的代码(代码片段、配置、SQL、模板)
  • 生成的工作流(逐步计划、检查表、路由决策)
  • 代理行为(模型选择工具、调用 API 并串联动作)
  • 提示式系统(经过精心设计的提示,表现得像“软代码”)

如果你使用过像 Koder.ai 这样的 vibe-coding 平台——在那里的对话可以生成并演进完整的 Web、后端或移动应用——“AI 输出成为控制流”的概念就尤为具体。模型的输出不只是建议;它可以改变路由、模式、API 调用、部署和用户可见的行为。

为什么验证和错误是产品特性

当 AI 输出成为控制流的一部分时,验证规则和错误处理就成了面向用户的可靠性特性,而不仅仅是工程细节。缺失字段、格式错误的 JSON,或自信但错误的指令并不会简单地“失败”——它们可能导致令人困惑的用户体验、不正确的记录或高风险的操作。

因此目标不是“从不失败”。当输出是概率性的时,失败是正常的。目标是可控失败:尽早检测问题、清晰沟通并安全恢复。

本文将涵盖的内容

下面的内容把话题分解为实用领域:

  • 规则:检查输入和输出(结构与含义)
  • 错误处理:选择(快速失败还是优雅降级)
  • 边缘情况:真实使用中出现的问题以及如何减少意外
  • 测试:针对非确定性行为的策略
  • 监控与可观测性:让你看见失败、趋势和回归

如果你把验证和错误路径视为一等公民,AI 生成系统会更容易被信任——也更容易随着时间改进。

为什么验证规则会自然而然地出现

AI 系统擅长生成看起来合理的答案,但“看起来合理”并不等于“可用”。当你依赖 AI 输出来驱动真实工作流——发送邮件、创建工单、更新记录——你原先隐藏的假设就会变成显式的验证规则。

可变性会把假设暴露出来

在传统软件中,输出通常是确定性的:如果输入是 X,你期望 Y。AI 生成系统中,同样的提示可能产生不同措辞、不同细节层次或不同解释。这种可变性本身不是缺陷——但它意味着你不能依赖诸如“很可能会包含日期”或“通常返回 JSON”之类的非正式期望。

验证规则是对“为了安全和可用,这个输出必须满足什么?”的实用回答。

“看起来有效”与“对我们业务有效”

AI 回应可能看上去有效,但仍然不满足你的真实需求。

例如,模型可能产生:

  • 格式良好的地址,但使用了错误的国家/地区
  • 友好的退款信息,但违反了你的政策
  • 发明了一个团队并不追踪的度量的摘要

实际上你会得到两层检查:

  1. 结构有效性(是否可解析、完整、符合预期格式?)
  2. 业务有效性(是否被允许、是否足够准确、是否符合你的规则?)

歧义通常出现在可预测的位置

AI 输出常常模糊一些人类直觉上会解决的细节,尤其在:

  • 格式: “03/04/2025”(是 3 月 4 日还是 4 月 3 日?)
  • 单位: “20”(分钟、小时、美元?)
  • 姓名: “Alex Chen”(CRM 中哪个 Alex Chen?)
  • 时区: “明天早上”(是谁的时区?)

用合同思考:输入、输出、副作用

一种有帮助的设计验证方法是为每次 AI 交互定义“合同”:

  • 输入: 必需字段、允许范围、所需上下文
  • 输出: 必需键、允许值、置信度阈值
  • 副作用: 允许执行的动作(例如“仅草稿”、“禁止发送”、“必须请求确认”)

一旦有了合同,验证规则就不会显得像额外的官僚主义——它们是让 AI 行为足够可靠以投入使用的方式。

输入验证:守好前门

输入验证是 AI 生成系统可靠性的第一道防线。如果混乱或意外的输入漏进来,模型仍然可能生成看似“自信”的内容,这正是为什么前门很重要。

在 AI 系统中,什么算作“输入”?

输入不仅仅是提示框。典型来源包括:

  • 用户文本(聊天消息、提示、评论)
  • 文件(PDF、图像、电子表格、音频)
  • 结构化表单(下拉、多步引导)
  • API 负载(来自其他服务的 JSON、Webhook)
  • 检索到的数据(搜索结果、数据库行、工具输出)

这些中的每一种都可能不完整、格式错误、过大,或根本不是你所期望的。

防止可避免失败的实用检查

良好的验证侧重于清晰、可测试的规则:

  • 必需字段: 提示是否存在、文件是否附上、语言是否选择?
  • 范围与限制: 最大文件大小、最大项目数、最小/最大数值
  • 允许值: 枚举字段("summary" | "email" | "analysis")、允许的文件类型
  • 长度限制: 提示长度、标题长度、数组大小
  • 编码与格式: 有效的 UTF-8、有效 JSON、无损坏的 base64、安全的 URL 格式

这些检查能减少模型困惑,并保护下游系统(解析器、数据库、队列)免于崩溃。

在验证前先规范化(当可预测时)

规范化能把“几乎正确”变成一致数据:

  • 修剪空白;合并重复空格
  • 在含义不变时规范大小写(例如国家代码)
  • 小心解析区域格式(千位分隔符和小数点的差异、不同日期顺序)
  • 在解析后把日期转换为标准表示(例如 ISO-8601)

仅在规则无二义时进行规范化。如果不能肯定用户意图,就不要猜测。

拒绝 vs 自动修正:选择更安全的选项

  • 拒绝输入 当修正可能改变含义、产生安全风险或掩盖用户错误时(例如模糊日期、意外货币、可疑 HTML/JS)。
  • 自动修正 当意图明显且更改可逆时(例如修剪、修复常见标点错误、把 ".PDF" 转为 "pdf")。

一个实用规则:对格式做自动修正,对语义做拒绝。当你拒绝时,返回清晰的信息告诉用户应如何更改以及为什么。

输出验证:检查结构与含义

输出验证是在模型发言之后的检查点。它回答两个问题:

(1) 输出的形状正确吗? (2) 内容对我们来说是可接受且有用的吗?

在真实产品中,通常两者都需要。

1)使用输出 schema 做结构验证

首先定义输出 schema:你期望的 JSON 结构,哪些键必须存在,以及它们可以持有的类型和允许值。这会把“自由文本”变成应用可以安全消费的东西。

实用的 schema 通常会指定:

  • 必需键(例如 answer, confidence, citations
  • 类型(字符串、数字、数组)
  • 枚举(例如 status 必须是 "ok" | "needs_clarification" | "refuse" 之一)
  • 约束(最小/最大长度、数值范围、非空数组)

结构检查能捕捉常见失败:模型返回了散文而不是 JSON、忘记了某个键、或输出了数字而你需要字符串。

2)语义验证:结构不足以保证正确

即便完全符合 JSON 结构也可能是错的。语义验证检验内容是否对你的产品和策略有意义。

通过 schema 但在语义上失败的例子:

  • 幻觉 ID: 返回 customer_id: "CUST-91822",但该 ID 在数据库中并不存在
  • 引用薄弱或缺失: 有引用字段但并未支持主张——或引用了并未提供的来源
  • 不可能的合计: 明细合计为 120,但 total 是 98;或折扣超过小计

语义检查通常表现为业务规则:"ID 必须能解析"、"总额必须对账"、"日期必须在未来"、"主张必须由提供的文件支持"、以及"禁止不允许的内容"。

3)在真实系统中有效的策略

  • 强制 schema: 在使用前验证 JSON;若不合格则拒绝或重试
  • 受限解码 / 结构化输出: 限制模型可发出的内容,降低产生无效形状的可能性
  • 后检验器: 运行确定性的验证器(有时也会用第二个模型)来核验一致性、引用与策略合规性

目标不是惩罚模型——而是防止下游系统把“自信的胡说”当命令去执行。

错误处理基础:快速失败还是优雅降级

生成严格的输出合约
让 Koder.ai 生成输出模式和校验,使您的应用可以信任模型的响应。

AI 生成系统有时会产生无效、不完整或根本不可用于下一步的输出。良好的错误处理在于判断哪些问题应该立即中止工作流,哪些问题可以在不让用户吃惊的情况下恢复。

硬失败 vs 软失败

硬失败 指继续下去很可能导致错误结果或不安全行为的情况。例子:缺少必需字段、JSON 无法解析、输出违反必须遵守的策略。在这些情况下应快速失败:停止、展示清晰错误并避免猜测。

软失败 是可恢复的问题,存在安全的回退方案。例子:模型返回了正确的含义但格式有问题、依赖暂时不可用、或请求超时。在这些情况下应优雅降级:重试(但有限制)、用更严格的约束重新提示,或切换到更简单的回退路径。

面向用户的消息:说明发生了什么以及下一步怎么做

面向用户的错误应简短且可操作:

  • 发生了什么: “我们无法为该文档生成有效摘要。”
  • 下一步: “请重试,或上传较小的文件。”
  • 可选上下文(非技术化): “响应不完整。”

避免暴露堆栈跟踪、内部提示或内部 ID。这些细节有用——但只是对内部有用。

将面向用户的错误与内部诊断分离

把错误作为两条并行输出处理:

  • 面向用户: 安全的消息、下一步建议、有时的重试按钮
  • 内部诊断: 结构化日志(错误码、原始模型输出的安全副本、验证结果、时序、依赖状态、关联/请求 ID)

这样既能让产品保持平和、易懂,又给团队足够的信息去修复问题。

给错误分类以便快速分诊

一个简单的分类法能帮助团队快速行动:

  • 验证: 输出与 schema 不符、缺失字段、不安全内容
  • 依赖: 数据库/API 失败、权限问题
  • 超时: 模型或上游调用超过时间预算
  • 逻辑: 拼接代码、映射或业务规则中的错误

当你能正确标注事故,就能把它路由给对的人,并改进正确的验证规则。

恢复与回退(不让情况更糟)

验证会捕捉问题;恢复决定用户看到的是有帮助的体验还是令人困惑的体验。目标不是“总是成功”——而是“可预测地失败,并安全降级”。

重试:对瞬时失败有用,对错误答案有害

当失败可能是暂时性时,重试逻辑最有效:

  • 速率限制(429)网络抖动、或模型超时
  • 短暂的上游中断

使用有界重试指数退避和抖动。短时间内重试五次通常会把一个小问题扩大。重试在输出结构无效或语义错误时会有害:如果验证器提示“缺少必需字段”或“策略违规”,用相同提示的再一次尝试可能只会生成另一个不同但无效的答案——并浪费 token 与延迟。此类情况应优先考虑提示修复(用更严格的约束重新问)或回退方案。

优雅降级的回退方案

好的回退方案应能向用户解释并在内部可度量:

  • 更小/更便宜的模型 用于“够用即可”回答
  • 缓存的答案 用于重复且稳定的问题
  • 基于规则的基线(模板、启发式)用于可预测的格式化
  • 人工复核 当错误代价高时

明确记录使用了哪条路径,以便日后比较质量与成本。

部分成功:返回尽力而为的结果并附上警告

有时你可以返回一个可用的子集(例如提取了实体但没有完整摘要)。标记为部分,包含警告,并避免默默用猜测填补空白。这样既保留了信任,又仍然给调用方可执行的内容。

速率限制、超时与断路器

为每次调用设置超时和整体请求截止时间。被速率限制时,若存在 Retry-After 则应遵从。添加断路器以便重复失败时能快速切换到回退,而不是继续给模型/API 施压。这能防止级联变慢并使恢复行为一致。

真实使用中边缘情况的来源

边缘情况是团队在演示中没看到的情形:罕见输入、奇怪格式、对抗性提示,或对话远超预期长度。因为人们把系统当作灵活的助手来使用,随后会把它推向超出“快乐路径”的范围,边缘情况会很快出现。

1)罕见且杂乱的用户输入

真实用户不会按测试数据写东西。他们可能粘贴 OCR 后的文本、半成品笔记,或从 PDF 复制的带有奇怪换行的内容。他们也会尝试“有创意”的提示:让模型忽略规则、泄露隐藏指令,或以故意混乱的格式输出。长上下文也是常见边缘情形:用户可能上传一份 30 页的文档并要求结构化摘要,然后接连十个澄清问题。即便模型在早期表现良好,随着上下文增长行为也可能漂移。

2)打破假设的边界值

许多失败来自极端值而非正常使用:

  • 空值:空字段、缺失附件或关键位置的 “N/A”
  • 最大长度:非常长的姓名、巨大列表、多段地址或整个聊天历史被粘贴为一次输入
  • 罕见 Unicode:表情符号、零宽空格、智能引号、从右到左文本或看起来一样但比较不同的组合字符
  • 混合语言:半英文半西班牙文的工单;标题为日文但属性为法文的产品目录

这些往往被基本检查遗漏,因为文本对人类看起来没问题,但会导致解析、计数或下游规则失败。

3)集成边缘情况(外部世界在你之下改变)

即便提示和验证做得很扎实,集成也会引入新边缘:

  • 下游 API 更改了字段名、添加了必需参数或开始返回新的错误码
  • 权限不匹配:AI 生成请求访问用户无权查看的数据,或尝试执行服务帐号无法做的操作
  • 数据契约漂移:某工具期望 ISO 日期却收到“下周五”,或期望货币代码却得到货币符号

4)“未知的未知”以及日志为何重要

一些边缘情况无法事先预测。发现它们的唯一可靠方式是观察真实失败。良好的日志与追踪应捕获:输入形状(在保证安全的前提下)、模型输出(在保证安全的前提下)、哪个验证规则失败了、以及运行了什么回退路径。当你能按模式分组失败时,你就能把惊喜变成明确的新规则——而不是在猜测。

安全与防护:当验证就是保护措施

让验证失败可见
通过日志和指标查看哪些规则失败、以及用户卡在哪些环节。

验证不仅仅是为了输出整洁;它还是阻止 AI 系统做危险事情的手段。许多 AI 加持的应用安全事件本质上就是“坏的输入”或“坏的输出”问题,但代价更高:可能导致数据泄露、未授权操作或工具滥用。

提示注入是一个带安全后果的验证问题

提示注入发生在非受信内容(用户消息、网页、电子邮件、文档)包含诸如“忽略你的规则”或“把隐藏的系统提示发给我”之类指令时。这看起来像一个验证问题,因为系统必须决定哪些指令是有效的、哪些是敌意的。

实用立场:把面向模型的文本视为不受信的。你的应用应验证意图(请求的动作是什么)和权限(请求者是否被授权),而不仅仅是格式。

起到护栏作用的防御性检查

良好的安全通常看起来就是普通的验证规则:

  • 工具白名单: 明确限制模型在给定上下文中可调用的工具/动作
  • URL 与文件限制: 仅允许批准域名、阻止本地网络目标、强制文件类型/大小限制、避免任意文件读取
  • 数据脱敏: 在发送给模型或返回输出前检测并移除密钥(API key、token)、个人数据和内部标识符

如果你允许模型浏览或抓取文档,验证它可以去哪里以及能带回什么。

工具与令牌的最小权限原则

应用最小权限原则:给每个工具最少权限,并对令牌进行严格范围限定(短期、限制端点、限制数据)。与其宽泛地授予“以防万一”的权限,不如在请求失败时要求更窄的操作。

敏感操作需要摩擦与可追溯性

对于高影响操作(付款、账户变更、发送邮件、删除数据),加入:

  • 显式确认(“你将转账 $500 给 X——确认?”)
  • 双人控制(人工审批或第二因素)
  • 审计轨迹(谁请求、执行了什么、输入、工具调用、时间戳)

这些措施把验证从 UX 细节变成真正的安全边界。

针对 AI 生成行为的测试策略

测试 AI 生成行为时,把模型当作一个不可完全预测的合作者:你无法断言每一句话,但可以断言边界、结构和有用性。

分层测试套件(让失败指向正确修复)

使用多层测试,每层回答不同的问题:

  • 单元测试: 验证你自己的代码(解析器、验证器、路由、提示构建)。这些应确定且快速。
  • 契约测试: 验证与模型的形状约定,例如“必须返回包含键 X/Y/Z 的有效 JSON”或“当置信度低时必须包含引用字段”。
  • 端到端场景: 运行真实用户流程(包括重试与回退),观察系统在压力下是否仍然有用。

一个好规则:若某个 bug 触及端到端测试,就为其添加更小的测试(单元/契约),以便下次更早捕获。

构建“金牌用例”提示集

创建一小套精心挑选的提示,代表真实使用。为每个记录:

  • 提示(以及任何系统/开发者指令)
  • 必需约束(格式、安全规则、业务规则)
  • 期望行为(不是精确措辞):例如“返回包含 3 条建议的对象”、“拒绝请求敏感信息”、“在输入缺失时提出澄清问题”

在 CI 中运行金牌集并跟踪随时间的变化。发生事故时,为该案例添加新的金牌测试。

模糊测试:把奇怪输入当作常态

AI 系统常在杂乱边缘出错。添加自动化模糊测试来生成:

  • 随机字符串与混合编码
  • 格式错误的 JSON、截断的负载、多余逗号
  • 极端值(超长文本、空字段、巨大数字、异常日期)

测试非确定性输出

不要对精确文本做快照,而要使用容差与评分表:

  • 根据检查表为输出打分(必需字段、禁止内容、长度边界)
  • 语义检查(例如分类标签在允许集合内)
  • 摘要的相似度阈值,以及“必须提到关键事实”的断言

这能使测试稳定,同时仍捕捉真实回归。

针对验证与错误的监控与可观测性

把规则变成真实应用
通过聊天构建,并在工作流中内置验证、错误处理和安全恢复。

验证规则和错误处理只有在你能看到真实使用情况时才会变得更好。监控把“我们认为还好”变成明确证据:哪些失败、发生频率、以及可靠性是在改进还是在悄悄滑坡。

应记录什么(同时避免隐私问题)

从解释请求为何成功或失败的日志开始——然后默认对敏感数据进行脱敏或避免记录。

  • 输入与输出(隐私感知): 存储哈希、截断摘录或结构化字段而不是原始文本;如果必须保留原始内容用于调试,应短期保留并加访问控制
  • 验证失败: 规则名、字段/路径(例如 address.postcode)和失败原因(schema 不匹配、不安全内容、缺少必要意图)
  • 工具调用与副作用: 调用了哪个工具、参数(已清理)、响应码与耗时
  • 异常与超时: 内部错误的堆栈信息(仅限内部)、以及映射到已知类别的用户安全错误码

真正能预测可靠性的指标

日志帮助你调试单个事故;指标帮助你发现模式。

跟踪:

  • 验证失败率(总体与按规则细分)
  • schema 通过率(输出匹配期望结构的比率)
  • 重试率恢复成功率(回退工作多少次)
  • 延迟(端到端与每个工具调用)
  • 主要错误类别(例如“缺失字段”、“工具超时”、“策略违规”)

关于漂移的告警

AI 输出在提示修改、模型更新或新用户行为后可能会微妙变化。告警应关注变化而不是绝对阈值:

  • 某个验证规则失败的突然上升
  • 新的错误类别出现
  • 输出形状变化(例如 JSON 字段变成了自由文本)

供非技术团队使用的仪表盘

好的仪表盘能回答:“对用户来说它是否在工作?”包括简单的可靠性记分卡、schema 通过率趋势线、按类别拆分的失败情况,以及最常见失败类型的示例(已移除敏感内容)。为工程师链接更深入的技术视图,但顶层视图应对产品与支持团队可读。

持续改进:把失败变成更好的规则

验证与错误处理不是“设定一次就完事”的事。在 AI 生成系统中,真正的工作通常在上线后开始:每一个异常输出都是关于你规则应该如何调整的线索。

建立紧密的反馈环路

把失败当作数据,而不是轶事。最有效的循环通常结合:

  • 用户报告(简易的“报告问题”+可选的截图/输出 ID)
  • 人工审查队列 用于模糊或高风险案例(误导性、不安全或“看起来不对”)
  • 自动打标(正则/ schema 失败、毒性标记、语言检测不匹配、高不确定性信号)

确保每个报告都能追溯到确切的输入、模型/提示版本和验证器结果,以便之后重现。

修复通常如何进行

大多数改进属于几个可重复的动作:

  • 收紧 schema: 如果你期望 JSON,就指定必需字段、枚举与类型;拒绝“几乎是 JSON”的输出
  • 添加针对性验证器: 强制单位、日期格式、允许范围和必须包含的约束
  • 调整提示: 明确优先级(“不确定时请回答不了”)、添加示例、减少模糊指令
  • 添加回退: 用更严格的提示重试、切换到更安全的模板响应或路由到人工审查——不要默默发明细节

修复一个案例时,同时问:“哪些相邻的情况仍会漏网?”把规则扩展覆盖一个小的簇,而不是仅修一个单独事故。

版本控制与安全上线

像管理代码一样对提示、验证器与模型做版本控制。用金丝雀A/B 发布来推出变更,跟踪关键指标(拒绝率、用户满意度、成本/延迟),并保留快速回滚路径。

这也是产品工具能发挥作用的地方:例如,像 Koder.ai 这类平台支持在应用迭代期间的快照与回滚,这很好地映射到提示/验证器版本管理。当更新导致 schema 失败增加或破坏集成时,快速回滚能把生产事故变成快速恢复。

实用检查清单

  • 我们能否从日志中重现任何报告的问题?
  • 失败是否路由到了正确的桶(重试、回退、人工审查、硬停止)?
  • 我们是否同时更新了 schema/验证器和提示?
  • 我们是否为该失败添加了测试用例以防其复发?
  • 我们是否将更改放在金丝雀后并监控影响?

常见问题

本文中“AI 生成系统”指的是什么?

AI 生成系统是指任何模型输出直接影响下一步发生什么的产品——显示给用户的内容、要存储的内容、要发送到另一个工具的内容,或要执行的动作。

它比聊天更广:可以包含生成的数据、生成的代码、工作流步骤或代理/工具决策。

为什么将验证和错误处理视为产品特性?

因为一旦 AI 输出成为控制流的一部分,可靠性就变成了用户体验问题。一个格式错误的 JSON 响应、缺失字段或错误指令可能:

  • 产生令人困惑的界面状态
  • 写入不正确的记录
  • 触发不安全的副作用

提前设计验证和错误路径可以让失败变得可控,而不是混乱。

结构有效性和业务有效性有什么区别?

结构有效性表示输出可解析且形状符合预期(例如有效的 JSON、必需键存在、类型正确)。

业务有效性表示内容是否满足你的实际规则(例如 ID 必须存在、总额必须对账、退款文案必须符合政策)。通常两层检查都需要存在。

将 AI 交互设计为“合同”是什么意思?

实用的“合同”会在三个层面定义必须成立的条件:

  • 输入: 必需字段、允许范围、所需上下文
  • 输出: 必需键、允许值、阈值(例如置信度)
  • 副作用: 允许执行的动作(例如“仅草稿”、“发送前必须确认”)

一旦有了合同,验证器只是对其进行自动化执行。

AI 工作流中应验证哪些输入?

把输入范围扩大一点来考虑:用户文本、文件、表单字段、API 负载和检索/工具数据。

高杠杆的校验包括必需字段、文件大小/类型限制、枚举值、长度边界、有效编码/JSON 和安全 URL 格式。这些能减少模型困惑并保护下游解析器与数据库。

什么时候应该对输入自动更正,什么时候应该拒绝?

当意图明确且更改可逆时进行规范化(例如修剪空白、对国家/地区代码统一大小写)。

当“修复”可能改变含义或掩盖错误时应拒绝(例如模糊日期如“03/04/2025”、意外货币、可疑的 HTML/JS)。一个好规则:对格式进行自动修正,对语义进行拒绝。

如何以真正安全的方式验证模型输出?

从明确的输出 schema 开始:

  • 必需键(例如 answer, status
  • 类型(字符串/数字/数组)
  • 枚举和约束(长度/范围)

然后添加语义检查(ID 能解析、总额能对齐、日期合理、引用能支持断言)。如果验证失败,避免将输出用于下游处理——要么重试(并收紧约束),要么使用回退方案。

如何在快速失败和优雅降级之间做选择?

当继续会带来风险时应快速失败:无法解析输出、缺少必需字段、违反必须遵守的策略等。

当存在安全的恢复路径时应优雅降级:瞬时超时、速率限制或格式问题可以重试(有界重试并带退避与抖动),或使用更严格的提示/回退路径。

在两种情况下都要区分:

  • 面向用户的消息: 简短、可操作、非技术化
  • 内部诊断: 错误码、经过安全处理的原始输出、验证结果、耗时、关联 ID
什么时候重试和回退有帮助,什么时候反而有害?

重试在失败可能是暂时性的场景下有用(429、网络抖动、模型超时等),应采用有界重试、指数退避与抖动。

当失败是“错误答案”(schema 不匹配、缺失必需字段、策略违规)时,重试常常浪费资源且无效。此类情况更适合提示修复(更严格的指令)、确定性模板、更小模型、缓存结果或人工审查。

边缘情况通常来自哪里?

常见边缘情况来源于:

  • 杂乱的真实用户输入(复制的 PDF、奇怪的换行、长上下文)
  • 边界值(空值、最大长度文本、异常 Unicode、混合语言)
  • 集成漂移(API 字段改变、权限不匹配、日期/货币契约不一致)

通过隐私感知的日志记录发现“未知的未知”,记录哪个验证规则失败以及运行了什么恢复路径。

Related posts