最近我在维护一份叫“AI错误全集”的文档。说是文档,更像一个不断变厚的账本:团队里只要有人在大模型调用、提示词编写、AI编程、智能体调试、AI视频生成这些环节里踩了坑,就把问题现场、根因和解决办法记进去。最初只有十几条,现在已经积累到几百条。这个“新增”有两层意思:一是条目不断新增,二是团队解决AI问题的能力不断新增。
这份AI错误全集解决的核心问题很直接:AI应用出错的重复成本太高。同一个坑,不能让大家轮流踩一遍。无论你是做AI测试开发的工程师、写提示词的产品经理、做AI应用开发的程序员,还是刚接触AI大模型的内容创作者,这套方法都能帮你少走弯路。接下来我把沉淀下来的分类逻辑、记录模板、典型案例和排查技巧完整分享一遍。
1. 内容整体设计与思路拆解
1.1 为什么AI项目比传统项目更需要“失败记忆”
传统软件的错误信息相对可复现:代码异常有堆栈、日志、数据库约束,照着栈信息一层层翻,总能定位到根因。AI项目完全不一样:同一个prompt,模型可能这次输出正常,下次输出就多一段废话;同一个bug,在A用户的会话里出现,在B用户的会话里又不出现。这种随机性导致了一个很常见的排查陷阱——大家习惯用传统方式定位,结果发现错误既不是代码逻辑错,也不是数据错,而是模型行为带来的“概率性失败”。
没有错误记忆时,每一次概率性失败都像第一次发生:重新翻文档、重新问同事、重新试参数。我的体会是,给AI项目建“失败记忆”不是锦上添花,而是刚需。AI错误全集,本质上就是把团队过去遇到的所有失败模式沉淀成可查询、可复用、可回归的知识资产。有了它,遇到新问题时先搜历史,很多问题能在几分钟内找到答案,而不是Again从头开始。
| 传统软件报错 | AI应用错误 |
|---|---|
| 可以稳定复现 | 概率性出现,时好时坏 |
| 堆栈能定位到代码行 | 现象与根因往往隔着好几层 |
| 修复代码通常能解决 | 可能要改prompt、参数、数据、上下文 |
| 回归测试结果明确 | 同一用例反复测,结果可能不同 |
这张对比表是我在整理错误全集时最常想到的。传统项目可以等报错后再查,AI项目最好把“失败模式”提前收集起来,因为同样的现象背后很可能是完全不同的原因。
1.2 核心需求:让错误全集覆盖哪些场景
我做分类时没有按报错文本来分,而是按“问题发生在模型工作流的哪个环节”来分,这样新条目一进来,就能立刻判断该改哪一层。目前的分类体系是六大类:
- 提示词设计错误:指令不清晰、边界条件缺失、示例冲突、角色混乱。
- 模型调用与参数错误:接口超时、限流、max_tokens截断、temperature设置不当。
- 上下文与检索错误:超出上下文窗口、信息被截断、RAG召回失败、检索到无关内容。
- 智能体与工具链错误:工具选择错误、循环调用、工具输出解析失败。
- 研发与测试工程错误:用例不稳定、回归失效、AI编程生成代码不可用。
- 内容安全与输出质量错误:误拒、漏放、幻觉、格式污染、多模态生成内容不一致。
按环节分类最大的好处是,处理建议不会散。比如“回答到一半中断”可能属于参数错误,也可能属于上下文超限,记录时不要只归一个类,可以打多个标签,但根因必须写清楚。我最常遇到的情况是:一条错误记录里有“现象”和“解决办法”,却没有“根因”,这等于没解决问题,只是绕开了一次。
1.3 记录原则:每条错误必须能指导行动
我不太认可这样的错误条目:“AI回答有误,重试就好了。”这等于没记。合格的条目最少包含触发场景、完整prompt或代码、错误输出、期望结果、根因、处理动作、验证状态。就像一份菜谱不但要写成功做法,还要把失败做法写出来:温度太高会糊、翻面太早会碎,别人看了就知道怎么避开。
所以从第一版开始,我就给团队立了一个硬规矩:新增AI错误条目时,必须能回答一个问题——“看到这条记录的人,能不能照着做一遍,不再犯同样的错?”如果不能,说明记录还缺上下文。这个简单的标准,让错误全集迅速从“吐槽本”变成了“操作手册”。
2. 核心细节解析与实操要点
2.1 提示词设计中的高频错误
提示词层面的错误是最多的,因为它看起来门槛最低,实际坑最深。
第一类是指令模糊。比如“帮我写一篇报告”,模型不知道报告给谁看、多长、什么格式、什么风格。这不是模型笨,而是信息不足。就像你不会让一个实习生在一无所知的情况下写出完美方案,模型也需要“受众、目标、边界、格式”这些要素。
第二类是缺少格式约束。想让模型输出表格、JSON、列表,但prompt里没有给格式示例,模型就可能先讲一段道理再给结果。我的做法是:在prompt末尾单独写一段“输出格式”说明,必要时给一个示例,比反复说“要JSON”管用得多。
第三类是负向约束写得太虚。只写“不要啰嗦”不够,要写“控制在300字以内,不要出现‘极致、完美、绝佳’这类空泛词”。负面约束越具体,越容易被模型执行。
第四类是上下文污染。有些任务型场景不需要把所有历史对话都发给模型,无关内容会干扰判断。我看到过不少团队把整段客服聊天记录全塞进去,结果模型被用户早期的抱怨带偏,答非所问。正确的做法是先把历史总结成“用户诉求+已解决事项”,再给模型。
第五类是少样本示例自相矛盾。给模型两个示例,若示例质量差,模型会模仿坏例子。少样本不是越多越好,而是示例与目标任务越一致越好。我补充一个小清单:是否说明受众和场景?是否给出格式和长度?是否包含具体负面限制?示例是否与目标一致?关键术语是否定义了?这五条查完,大部分提示词错误都能暴露出来。
2.2 模型调用与API参数错误
参数配置是AI应用开发里最容易翻车的地方,但很多团队只把它当作“配置项”,没有当作错误来源。
先说temperature。它控制随机性:0.2左右适合分类、抽取、JSON生成;0.7到1.0适合创意写作。如果发现结果呆板、重复,不一定prompt写得差,可能是temperature太低;如果发现答非所问、胡言乱语,可能是temperature太高。top_p和temperature不建议同时反复调整,改一个就能见效,两个交叉调只会让问题更难定位。
max_tokens是最常被忽略的参数。很多人拍脑袋填一个200,结果模型一句话没说完就被截断,后处理拿到的还是一个不完整的JSON。正确做法是先估算答案长度,再留出30%到50%余量。如果平台支持结构化输出或JSON Schema,直接启用;如果纯靠解析,必须为非法格式写异常分支,不能假设模型输出一定合法。我在错误全集里专门有一类“截断类错误”,就是因为max_tokens设小导致的。
网络调用层面的常见错误是超时和限流。重试不要用固定间隔,要用指数退避:第一次等1秒,第二次2秒,第三次4秒,同时设置最大重试次数。这样既能避开短暂抖动,又不会在服务不可用时把系统拖垮。这个细节看着简单,实际线上事故多半从这里来。
2.3 上下文与RAG检索错误
大模型上下文窗口不是无限大,而且“塞得进去”不等于“用得好”。上下文过长既增加成本,也可能让模型“迷失在中间位置”——开头和结尾的信息更容易被关注,中间段落容易被忽略。工程上,处理方式是历史信息摘要化,参考资料只保留关键片段。
RAG(检索增强生成)的错误也属于这一层。常见的有:文本切分得太大,一个chunk里包含多个主题,检索出来的片段信息混杂;切分得太小,语义不完整,模型看不懂;相似度阈值设置不当,太高召回为空,太低召回一堆无关内容;缺少元数据过滤,知识库里有多种产品、多种规则,检索结果跨域串门。
解决RAG问题不能只调一个参数,而要多管齐下:按章节结构切分,保留标题层级;对用户query做改写,让检索更准;对候选结果做重排;最后在prompt中限定回答范围。本质上,RAG的价值不是“给模型更多文档”,而是“给模型恰好需要的证据”。这条认知,是我在犯过几次检索错误后总结出来的。
2.4 AI编程与工具链错误
AI编程工具越来越常用,但错误也不少。“帮我修一下这个bug”的提示词,AI可能只看当前代码片段就动手改,忽略了外部依赖和整体结构,结果旧问题没修好,还引入新问题。可靠的做法是:把相关文件的关键定义、依赖、测试一起放进上下文,然后让AI先说明要改哪几行、会影响什么,再动手;最后用测试作为验收门槛,不要让“看起来能跑”成为完成标准。
智能体类应用的问题更隐蔽。模型决定调用哪个工具,如果工具描述写得不够清楚,就会选错工具;工具返回一个很长的JSON,模型解析失败;模型没有“足够信息就停止”的判断,一直调用工具直到步数耗尽。我的错误全集里有一条关于“工具循环”的经典记录,根因是prompt里缺少终止条件。解决办法有三个:每个工具的description写清楚“什么情况用、什么情况不用”;限制最大工具调用步数;要求模型每一步之后输出“当前结论+下一步计划”。加了这三条,工具链稳定性明显提升。
2.5 内容安全、输出质量与多模态生成错误
内容安全这部分容易两极分化:要么审核规则设置得过严,正常业务内容也被拦截;要么过宽,把不该输出的内容输出。AI错误全集里关于审核规则的条目,要记录的是“误判案例”和“规则改动前后对照”,而不是简单把锅扔给安全策略。幻觉是另一个高频问题,尤其知识问答场景,模型会“一本正经地编造”。解决思路是:要求模型基于给定资料回答,资料里没有的内容直接说“不知道”,同时给出引用来源。
输出质量还包括格式污染。模型在一个JSON字符串里写了换行、在代码块里出现了解释文字,这类错误很常见,也很容易在错误记录里被一带而过。其实只需要在prompt里加一句“只输出JSON,不要输出任何解释文字”,再加结构校验,就能解决大半。
多模态生成类的AI也有自己的错误条目,比如生成图片时物体数量错乱、人物在连续镜头中长相不一致、视频模型对空间关系的理解偏差。这些错误偶发,而且和模型版本、采样步数、随机种子强相关,所以记录时必须把参数一并保存,否则几乎无法复现。把这类内容收进AI错误全集,能让团队意识到:很多生成错误不是“运气差”,而是参数或流程可以优化。
3. 实操:把AI错误全集落地到工作流
3.1 错误记录模板长什么样
我在项目里用的是下面这个模板,字段不多,但每个都有用。团队新人看到一条完整记录,不需要再追着问“当时是怎么复现的”。
| 字段 | 说明 | 示例 |
|---|---|---|
| 错误编号 | 唯一ID,方便引用 | ERR-AGENT-024 |
| 错误现象 | 用户或日志看到的实际表现 | 智能体陷入工具循环,连续调用8次 |
| 触发场景 | 可复现的路径 | 用户要求查询天气后说“继续”,没有给出新指令 |
| 模型与参数 | 模型版本、关键参数 | 模型版本XXX,temperature=0.7,max_tokens=2048 |
| 输入输出摘要 | 脱敏后的关键记录 | 输入... 输出... |
| 期望结果 | 明确预期是什么 | 查完一次就结束,生成总结 |
| 实际结果 | 失败表现 | 重复调用工具,直到超时 |
| 根因分析 | 一句话说清本质 | 缺少“有足够信息就停止”的终止指令 |
| 解决方案 | 可执行的动作 | prompt增加“当你已有答案时直接总结,不要继续调用工具” |
| 验证状态 | 待验证/已验证 | 已验证 |
使用这个模板时,务必脱敏。输入输出里涉及个人隐私、业务敏感信息的内容一律替换成占位符。我见过有人直接把真实聊天记录粘贴进共享文档,结果内部系统被爬虫扫描出大量个人信息,这就是给自己埋雷。
3.2 快速记录与归类流程
记录动作必须足够轻,不然没人坚持。我的流程是:发现异常后先冻结现场,保存对话ID、完整输入输出、时间、模型版本;然后去错误全集搜索前三个关键词,如果已有类似条目,追加一条复现记录并更新“发生率”字段;如果没有,再新建一条。
新建的时候,先写现象和根因,不要急着写解决方案。很多人一看到错误就想着“我改了某句话试试”,还没定位就开药,最后验证不了,这条记录就废了。写完根因后,再补解决方案和验证状态。每周花三十分钟做一次回顾,把“已验证”的条目进入精华区,把无法复现的放到“待观察”区,保持全集不会越积越乱。
3.3 从错误全集生成上线前检查清单
错误全集的最高级用法,是提炼成上线前的自动化检查清单。以下是我从高频错误里提取出来的内容:
| 检查点 | 对应常见错误类型 |
|---|---|
| 输出格式是否有校验 | 模型参数不当、JSON解析失败 |
| max_tokens是否留足余量 | 回答截断 |
| 调用是否有重试与降级策略 | 超时、限流 |
| 智能体是否有终止条件 | 工具循环调用 |
| RAG检索阈值与过滤条件 | 召回错误、无关内容 |
| 安全规则是否覆盖典型场景 | 误拒、漏放 |
| 是否有测试用例做回归 | 效果退化、越修越错 |
这份清单要跟具体模型版本绑定。模型一升级,旧清单不一定还成立,需要重跑一遍再更新。
3.4 工具选型与信息同步
工具别过度设计。团队只有三个人,用在线多维表格就够了;已经习惯用Git做知识库的,可以用仓库加Markdown,再配一个全文搜索脚本;希望自动检索的,也可以用开源的wiki系统。关键是“记录成本要低”,否则不会有人愿意写。
多人协作时,我建议每个条目都要写“记录人”和“验证人”。不是追责,是为了后续有人看到这条记录时知道该找谁确认细节。很多错误在记录时没解释清楚,如果不留联系人,几个月后就成了无法追溯的死条目。
4. 典型错误案例拆解
4.1 案例一:指令宽泛导致“正确的废话”
有次产品同学让AI写App介绍,AI写出来的是:“这是一款优秀的应用,功能丰富、体验流畅。”没错,但没有任何信息量。根因是prompt缺少受众、场景、字数、卖点、调性。
修正后的prompt大概是这样的:
你是一位资深产品运营。请为我们的记账App写一段App Store简介。 受众:25-35岁、对理财有需求但嫌麻烦的上班族。 卖点:自动分类账单、每周消费摘要、无广告。 字数:150字以内。 风格:简洁、可信,不用“强大”“极致”等空泛词。 结构:第一句说明解决什么问题,第二句给出核心功能,第三句给出用户行动建议。修改后输出立刻变得可用。这个案例给我的提醒是:很多“AI错误”不是模型随机的,而是输入信息不完整。遇到这类问题,不要急着换模型,先补全prompt里的场景要素。
4.2 案例二:max_tokens截断导致JSON解析失败
有次让模型输出一个JSON对象:
{"name": "记事本", "price": 19.9, "reason": "适合随手记录"}结果max_tokens只设了80,模型在生成reason时被截断,返回了{"name":"记事本","price":19.9,"re,后处理解析直接抛异常。表面看是JSON解析问题,根因是max_tokens余量不足。
修复方式有两个:把max_tokens改成300,并在prompt末尾加上“只输出JSON,不要输出任何解释文字”;如果平台支持JSON Schema,直接启用结构化输出。这个案例后来被我放进错误全集,因为团队里至少有三个人在同一个截断问题上各自踩了一遍。
4.3 案例三:RAG检索到相似但不相关的内容
知识库里同时有“售后退货政策”和“七天无理由政策”,用户问某商品能不能退,系统检索到了“七天无理由”,回答“能退”,但这款商品实际上不支持。根因是文档切分时丢掉了“适用范围”这个关键维度,导致语义相近的片段混在一起。
解决方法是:把每件商品的适用条件单独切成一个chunk,并在元数据里记录商品ID;检索时先按商品ID过滤,再做相似度匹配;最后在prompt里加一句“如果资料中没有明确适用范围,回答需要人工确认”。这类检索错误很典型,不记录到错误全集里,下次换个商品还会再犯。
4.4 案例四:AI编程助手越修越错
有个同事让AI修复一个前端文件的lint错误,AI只看了报错片段,删了一行变量。问题是这个变量在原函数里还被引用,立刻出现了新的编译错误。再让AI修,它又改另一处,来回折腾了五轮。
根因是AI只拿到了局部文件,不知道变量被引用的情况,而且没有测试作为验收约束。正确用法是把相关文件、入口函数、测试用例一起放进上下文,要求AI先解释“要改哪几行、影响什么”,再动手;修改后跑全量测试,测试不过就停止。如果是接口开发,最稳妥的方法是先写一个单元测试,让AI围绕测试失败信息去修复,而不是泛泛地说“帮我看看哪里有问题”。
5. 常见问题与排查技巧实录
5.1 排查顺序和最小复现
AI错误排查不能沿用传统直觉,我总结了一个固定顺序:
- 先判断是“调用失败”还是“输出质量差”,这两类排查方向完全不同。
- 看原始返回,不要只看后处理结果。很多所谓“AI错误”其实是解析层或框架层把上半段输出吞掉了。
- 构建最小复现:去掉复杂业务上下文,只保留几行prompt或代码,看能不能复现。如果最小用例不再出问题,那问题多半在上下文数据或流程编排。
- 记录模型版本和参数,不要只写“今天AI抽风”。模型版本、temperature、随机种子不同,结果都不一样。
这套顺序帮我把排查时间缩短了至少一半。很多人一上来就“换prompt、改参数”,忽略了先确认现象和最小化问题,结果越改越乱。
5.2 高频问题速查表
| 现象 | 常见原因 | 快速解法 |
|---|---|---|
| 回答突然中断 | max_tokens不足、接口超时、安全审核截断 | 增加max_tokens、配置重试、查审核日志 |
| 输出格式不符合预期 | 未给格式示例、随机性过高 | 给出示例、开启结构化输出、降低temperature |
| 同样输入每次结果不同 | temperature较高、非确定性 | 降低temperature,支持时固定seed |
| 工具调用死循环 | Agent缺少终止条件 | 限制最大步数、要求输出最终总结 |
| 检索不到资料 | 阈值太高、切块太碎、query表达不清 | 调整阈值、重新切块、做query改写 |
| AI越修代码越错 | 上下文不完整、没有测试验收 | 附加相关文件和测试,以测试通过为准 |
这张表是我从错误全集的数百条记录里提炼出来的。它不是标准答案,但可以作为排查起点。把新问题先对到表里,如果对不上,再开新条目。
5.3 几条独家避坑经验
第一,重试三次还没结果,就先停下来。同一个prompt改来改去没有效果,问题往往不在prompt,而在上下文数据或工具链路。
第二,错误全集里的旧结论会过期。模型升级、接口变化都会让旧条目失效。我建议每季度抽一个下午,把错误全集当回归测试集跑一遍,看看哪些问题已经消失、哪些新问题出现。
第三,记录幻觉案例时必须保留正确来源。只记录“模型答错了”,不记录“正确答案来自哪个文档”,后面根本没法改进。我在错误全集里会专门加一个字段叫“证据来源”。
第四,新增错误条目不等于解决错误。一定要在条目标记验证状态,防止把猜测当结论。如果验证失败,就把根因那一条打回重写。
6. 一点个人经验:错误全集是团队的排错记忆
维护这份AI错误全集以来,我最深的感受是:它逼着我们把“AI又乱说话”这种抱怨,翻译成可执行的问题描述。这个动作本身,比文档里的某一条结论更重要。很多时候,团队并不是缺少技术能力,而是缺少对失败的系统性观察。
最后分享一个小技巧:每新增一条错误,强制自己写“一句话根因”和“三个标签”。如果写不出来,说明还没定位到本质,这门功课不能省。另外,每次大模型版本更新后,抽半天把旧条目重新跑一遍,你会发现有些问题不是被“修好”的,而是被“略过”的。真正值得持续投入的,永远是那些模型升级后依然存在的错误。