AI 长任务三道坎:上下文压缩、幻觉检测、错误累积
这三个词经常一起出现在 AI Agent 工程文档里,本质上它们是同一条事故链上的三环 :
AI 干的活越长,越容易「记不住 → 开始编 → 错上加错」。
这份文档只用大白话讲清楚:每道坎是什么、为什么会发生、工程上怎么破。
先说结论(一句话)
AI 干长活有三道坎:记性有限(所以要分层压缩)、嘴上没把门的(所以要幻觉检测)、一步错步步错(所以要阻断错误累积)。三者不是三件事,是一条事故链的三个环节。
〇、三者的关系:一条事故链
css
flowchart TD
A[任务越干越长] --> B[坎 1:上下文装不下<br/>必须压缩]
B -->|压缩丢了关键细节| C[坎 2:AI 开始脑补<br/>产生幻觉]
C -->|幻觉没被拦住| D[坎 3:错误进入下一步的输入<br/>越滚越大]
D -->|带病前进| E[全盘皆输]
B -.->|分层压缩:重要的事记牢| OK[关键信息不丢]
C -.->|检测:对不上依据就拦下| OK2[逼它重答或认怂]
D -.->|检查点:发现就回滚| OK3[止损重来]
一句话串起来:压缩丢信息 → 诱发幻觉 → 幻觉没拦住 → 喂给下一步 → 错误复利式放大。破法也在这条链上各插一道闸门。
一、分层上下文压缩 ------ AI 的记性问题
1. 问题是什么
AI 的「工作记忆」(上下文窗口)是有限的,就像你的手机相册存储:
- 聊得越久,装的东西越多,又慢又贵;
- 更坑的是:塞得太满,AI 会「顾头不顾尾」------开头和结尾记得清楚,中间的内容会被忽略(业界叫 lost in the middle);
- 所以「多塞」≠「多记住」。
2. 最笨的办法为什么不行
最直觉的办法是砍掉最旧的对话 (截断)。但问题在于:重要的决定往往发生在早期------
比如项目一开始就约定了「预算上限 5000」。砍掉这段后,AI 后面每次都按 8000 干活,你还不知道为什么。
3. 分层压缩:近的记原文,远的记摘要,再远的记结论
像整理手机相册一样按「新旧的远近」分层处理:
| 层 | 打个比方 | 保留什么 | 丢什么 |
|---|---|---|---|
| 近期对话(热) | 上周的照片存原图 | 最近几轮对话一字不差 | 无损 |
| 中期摘要(温) | 一年前的照片压缩过 | 每段对话的要点和结论 | 细节、语气 |
| 长期事实(冷) | 多年前的只留缩略图 | 关键结论、决定、人名实体 | 全部过程 |
再加一个外挂:云盘(检索式记忆) ------不占相册空间的东西(完整文档、历史资料)不放上下文里,要用的时候再去搜出来(就是 RAG)。
4. 核心权衡
压缩的本质是有损的 :省了空间,就必然丢信息。所以压缩策略的全部功夫在于------丢细节可以,丢关键事实不行。常见做法是压缩时强制保留:用户的原始需求、已确认的决定、不能违反的约束。
二、幻觉检测 ------ AI 的诚信问题
1. 先搞懂:AI 为什么会一本正经地胡说八道
AI 生成的原理不是「查资料再回答」,而是**「接话茬」**------根据上文预测下一个最顺口的词。
所以它产出的是「最像真话的话」,而不是「真话」。流畅 ≠ 正确,而且它自己不知道自己在编------它没有「我不知道」的天然本能。
另外幻觉分两种,人话说:
- 把没有的说成有:编造不存在的 API、不存在的数据(事实性幻觉);
- 把有的说歪了:材料在眼前,但曲解了意思、答非所问(忠实性幻觉)。
2. 检测思路:既然不能根治,那就「发现 + 拦截」
| 方法 | 人话解释 | 代价 |
|---|---|---|
| 出处核查(Grounding) | 每句关键论断都问「依据是哪段原文?」,对不上就标红。像论文引用核对 | 必须得有源材料 |
| 多次采样一致性 | 同一个问题背对背问它几遍,答案飘忽不定就是心虚。像警察对证人多次问话比对细节 | 推理成本翻几倍 |
| 专门请裁判 | 另开一个 AI 专职挑刺,生成者和检查者分开,运动员和裁判不一人兼 | 多一次模型调用 |
| 先答再自查(Chain-of-Verify) | 让它先写答案,再针对答案逐条自问「这条站得住吗」 | 生成量约两倍 |
| 置信度门槛 | 没把握就逼它说「我不确定」,而不是硬编 | 需要模型支持校准 |
3. 核心原则
宁可让它说「我不知道」,也不能让它顺嘴编。 幻觉检测的目标不是消灭幻觉(目前做不到),而是把「编的」和「有据的」分开,把编的那部分拦在交付之前。
三、错误累积 ------ AI 的执行问题
1. 问题是什么
AI Agent 干的是多步活:第 2 步拿第 1 步的输出当输入,第 3 步拿第 2 步的......每一步的小错,都会成为下一步的错误地基------像传话游戏,也像复利,不过是负的。
关键在于错误是相乘而不是相加的:
| 单步正确率 | 连续 10 步后整体正确率 | 连续 20 步后 |
|---|---|---|
| 99% | 90% | 82% |
| 95% | 60% | 36% |
| 90% | 35% | 12% |
单看每一步「90 分」好像挺不错,但 10 步连乘下来只剩三成胜率------这就是为什么 AI 单步演示惊艳、长任务拉胯。
2. 破法:在链路上插「质检闸门」
| 手段 | 人话解释 |
|---|---|
| 能一步别两步 | 链条越短,连乘损耗越小。先想清楚再动手,别走一步看一步 |
| 每步留可验证的中间产物 | 写完代码就跑测试、算完数就对合计------产出能被机器验证的步骤,错误立刻暴露,而不是攒到最后 |
| 检查点 + 回滚 | 每过一个验证点存档;发现错了退回上一个正确存档重来,而不是带病硬走。类似 git 的分支提交思维 |
| 关键节点人卡点 | 涉及花钱、删数据、不可逆操作时,停下来让人确认 |
3. 核心原则
错误不可能不发生,但要让它「早死」:在单步内被验证掐死,绝不放行到下一步。
最贵错误不是「出错了」,而是「错了十步之后才发现」。
四、组合拳:三道闸门怎么配合
单靠任何一招都不够,实际工程是三道闸门接力:
rust
flowchart LR
CTX[分层压缩<br/>保住关键事实] -->|减少"遗忘型"幻觉| HAL[幻觉检测<br/>拦住编造内容]
HAL -->|干净的输出才放行| CHK[检查点验证<br/>错了就回滚]
CHK -->|用干净的状态继续| NEXT[下一步]
NEXT -.->|长任务持续循环| CTX
- 压缩做得好 → AI 不忘关键约束,从源头减少「因为忘了所以瞎编」;
- 检测做得好 → 编造的内容进不了下一步的输入;
- 检查点做得好 → 就算漏网之鱼,也在最近一步被拦下回滚,损失封顶。
五、三句话带走
- 记性 :AI 记不住整个对话,只能「近的记原文、远的记摘要、更远的记结论、参考资料放外挂」,压缩时可以丢细节,不能丢决定;
- 诚信 :AI 是接话茬机器不是查资料机器,说得多顺不代表多对,所以要核对出处、多问几遍、请裁判,宁可让它说不知道;
- 执行 :多步任务的错误是复利式放大的(90% 单步正确率 × 10 步 ≈ 35%),所以要每步可验证、错了就回滚,让错误死在襁褓里。