## 为什么给 AI 更多上下文,不一定更好? 现在的大模型上下文越来越长。 几十万 token、上百万 token,直觉上当然是一件好事:能放进去更多代码、文档、聊天记录和日志,模型能参考的信息也更多。 但如果你真的让 AI 持续参与一个几小时、几天甚至更久的软件项目,可能会遇到一种有点反直觉的情况: **材料明明都还在,它却越来越容易抓错重点。** 一个要求它看过。 一个 Bug 它调查过。 某个反例甚至曾经明确指出过。 可经过几轮搜索、修改、测试和新的任务以后,它仍然可能在最后做出一个与这些信息不一致的判断。 这时候问题就不只是: > 上下文够不够长? 而是另一个问题: > **模型能看到的信息越来越多以后,哪些信息还在真正影响当前判断?** --- 假设你让一个 AI 帮你持续维护一个软件项目。 过程中它可能看过: - 最初的用户需求 - 几十个源码文件 - 搜索结果 - 几万行日志 - 测试输出 - 三个失败方案 - 两次架构讨论 - 一堆临时假设 - 已经修掉的 Bug - 后来证明错误的判断 - 当前正在解决的问题 最直接的处理方式当然是: **只要装得下,就尽量都保留。** 但这里其实混在了一起的,是两个不同的问题: **Context capacity:能放进去多少。** 和 **Context utilization:放进去以后,模型能多可靠地利用它。** 一次推理中的 context,更像是: > **这一刻摊在模型面前的工作材料。** 它和人类“已经理解并长期内化了一项知识”的状态并不完全一样。 现代 Agent 系统当然可以使用 session、memory、RAG、数据库等方式保存长期状态,但某项信息最终想影响一次模型判断,仍然需要以某种形式成为这次推理可以使用的信息。 --- ## 信息在上下文里,不代表它一定会被同样好地利用 这不是一个新的观察。 2024 年发表于 TACL 的 **《Lost in the Middle》** 做了一个很直观的实验: 把回答问题所需要的信息放在长上下文中的不同位置。 结果发现,即使模型支持很长的 context window,重要信息所处的位置仍然会显著影响模型表现;在很多设置下,位于中间的信息利用效果明显更差。[1] 也就是说: > **“模型看得到”与“模型能稳定利用”之间还有距离。** 另一个 ICML 2023 的研究则向问题中加入与任务无关的信息,发现 irrelevant context(无关上下文)可以明显干扰大模型的推理表现。[2] 这意味着,当上下文越来越大时,我们真正需要考虑的已经不只是: > 能不能把资料塞进去? 还包括: > **真正重要的东西,会不会被其他同时存在的信息稀释?** Anthropic 在关于 Agent context engineering 的公开文章中也把 context 描述为一种需要管理的有限资源,并提出一个很实际的目标: 尽可能找到**足以产生目标行为的最小高信号信息集合**。[3] --- ## 那么,把以前的内容总结一下呢? 这是现在非常常见,也非常有效的方法。 但 summarization 解决容量问题时,也会产生另一个问题: **摘要本身就是一次新的语义判断。** 比如原始材料里有一句: > SDK 3.9.1 在某条路径下不会转发 idempotency header。 经过一次总结,它可能变成: > 存在 SDK compatibility issue。 再经过后续工作: > Compatibility handled. 最后留下: > Tests PASS. 这些表述并不一定哪一句是错的。 但它们显然已经不再携带完全相同的信息。 OpenAI 关于长 Session 的公开资料也提到 summarization 的几个典型代价,包括细节丢失、重要性权重发生变化、错误进入摘要,以及反复摘要带来的累计漂移。[4] 所以更稳妥的问题可能不是: > “哪些东西应该永远留在上下文里?” 而是把两个问题分开: > **现在需要模型看到什么?** 以及: > **以后需要时,什么还能重新找到?** --- ## 再进一步,就会碰到 Fresh Context 假设现在需要调查一个 Bug。 负责调查的 Agent 可能需要: - grep 几百个调用点; - 看三万行日志; - 试五个猜想; - 写临时脚本; - 排除四条错误路线; - 最后发现真正关键的两个事实。 这时候,负责整个任务最终判断的模型,是否真的需要继承: **三万行日志、五个猜想和四条死路?** 也许它真正需要的是: - 最终发现了什么; - 为什么可信; - 原始来源在哪里; - 还有什么没有确定。 这也是 multi-agent 除了“并行做事”以外,一个很重要的作用: > **不同的推理过程可以拥有不同的 working set。** 负责调查的人可以暂时沉入大量搜索结果。 负责实现的人只接收真正与实现有关的内容。 独立 Reviewer 可以从一个相对干净的上下文重新检查原始要求与候选实现,而不必完整继承实现过程中的全部假设。 负责全局判断的 Controller,则继续关注: > 用户最初到底需要什么? > 当前证据到底支持什么? --- ## 到这里,问题已经慢慢变了 一开始我们关注的是: > **怎样让 AI 拥有更多上下文?** 但在长期任务里,很快还会出现另一组问题: > 当前这次判断,究竟应该看到什么? > 哪些局部搜索过程完成以后可以退出当前工作集? > 哪些事实现在不用反复显示,但未来必须还能追溯? > 一个重要反例出现以后,怎样避免它被后来的局部 PASS 无意中盖过去? > 谁适合搜索,谁适合实现,什么时候值得重新用一个独立上下文挑战已有结论? > 一个项目持续很久、目标已经变化过多次以后,怎样保持项目级连续性,而不是每次重新认识整个仓库? 这些问题已经不完全是 **context length** 的问题。 它们更接近 **context engineering**,再继续往前,就是我现在很感兴趣的一个方向: **cognitive orchestration(认知编排)。** --- ## 这也是我做 Thaliris 的出发点 Thaliris 并不是单纯想把 context 压得更短。 它尝试把几类原本容易混在一起的东西拆开: 长期 Controller 保留项目目标、关键约束和最终判断责任。 调查、实现、审查可以拥有各自短期、聚焦的工作上下文。 一次调查可以读取大量材料,但后续不一定需要继承整个调查过程。 摘要可以很短,同时原始 evidence 和 provenance 仍然能够重新打开。 一次测试 `PASS`、一次 Agent `Completed`,都只代表有限范围内发生了什么,并不自动等于: > 用户最初的目标已经满足。 大量检索和机械工作也不一定需要最昂贵的模型亲自承担;高能力模型的注意力可以集中在更需要判断的地方。 而随着项目从一个目标进入另一个目标,局部工作上下文可以不断变化,控制层仍然可以维持一定的项目级连续性。 --- 我最近做了一支 Thaliris 的短片《案头 · ON THE DESK》。 回过头看,我发现影片里的很多设计——独立调查桌、被筛选后交回的卡片、重新打开原始材料、PASS 后重新审查——都建立在上面这些前提之上。 所以与其先解释某个具体项目,我更想先把这个问题本身讲清楚: > **长期 AI Agent 的难点,也许不只是让它看到更多信息。** > **还包括让正确的信息,在正确的时候,进入正确的判断。** --- ### 参考资料 **[1]** Liu, N. F. et al. (2024). *Lost in the Middle: How Language Models Use Long Contexts*. Transactions of the Association for Computational Linguistics, 12, 157–173. DOI: `10.1162/tacl_a_00638` **[2]** Shi, F. et al. (2023). *Large Language Models Can Be Easily Distracted by Irrelevant Context*. ICML 2023, PMLR 202:31210–31227. **[3]** Anthropic. *Effective context engineering for AI agents.* **[4]** OpenAI Cookbook. *Context Engineering — Short-Term Memory Management with Sessions.* 项目:**https://github.com/Iris0fTheValley/Thaliris** 支持dsh,codex,cloude
Nurziya_Zia

Bonjour !👋🏻 我是27届医学僧 计划转行大健康产品方向 ( 探索ing...

同感 给人太多上下文也让人眼花hhh
登录并发表评论

评论 · 1