---
layout: post.njk
source: https://yage.ai/share/context-governance-agent-runtime-20260707.html
speaker: yage.ai
title: 模型的窗口不是无限大的垃圾桶：为什么智能体需要上下文治理
date: '2026-07-08'
summary: 文章探讨了在构建智能体（agent）时，如何从简单的上下文窗口管理转向更复杂的上下文治理。核心观点是，仅仅依靠增大模型窗口或简单地拼接提示词是不够的，真正的挑战在于建立一套运行期管理机制，以保护模型的注意力免受海量无关信息污染。文章提出了通过分层状态管理、动态过滤与压缩中间生成物、以及将文件系统作为最终上下文存储等运行时架构改变，来解决高昂的开销和延迟问题，强调系统需要知道很多，但模型这一轮不该看太多。
area: PAI
category: ai-workflow
tags:
  - context-governance
  - agentic-workflow
  - state-management
  - token-optimization
people: []
companies_orgs: []
products_models: []
media_books: []
draft: true
status: evergreen
---

现在动手写一个 AI 智能体（agent），给它接上 GitHub 库、Slack
频道、Google
Drive、数据库和浏览器工具，通常用不了几行代码。但接完后，问题马上变成另一种。比如，你只是想让它帮忙看看“昨天的部署出了什么问题”，系统在把这行简单的提问发给模型之前，得先在上下文窗口里塞进二十个工具的
JSON 说明、当前的数据库表结构、用户的权限参数、最后五十行 commit
历史，还有上一步浏览网页抓回来的 HTML 内容。

用户那句不到二十个字的提问，瞬间被淹没在成千上万个 token
的机器废载荷里。工具接通这件事变得非常简单，但怎么让模型在这一堆噪音里保持注意力，去解决真正的问题，却成了一个巨大的工程麻烦。现在的问题已经变了：以前的系统常常缺上下文，现在的
agent 更容易吃进太多无关信息。

这听起来很像检索增强生成（RAG）：把相关的材料找出来，不相关的丢掉，不就解决了？

其实 RAG
只是解决了上下文治理里的前半步，也就是“去哪里找材料”。它负责在外部数据库里做向量检索，然后把挑出来的文本扔给模型。但是当材料被找回来，或者智能体真正跑起来以后，事情才刚刚开始。材料找回来后，哪些应该马上塞进模型窗口？哪些先留在本地文件系统里不占空间？工具执行到一半产生的海量调试日志怎么处理？哪些数据需要压缩？哪些过期的中间状态应该被丢弃？这些后续的信息调度、内存管理和状态维护，是
RAG 管不到的。

这并不意味着 RAG
没用了，也不意味着长上下文模型失去了价值。作为最稳定、最基本的数据接入手段，RAG
依然是智能体系统的底座。只是，单纯拼凑一条“切块、向量化、检索并拼接”的静态流水线，其工程溢价已经开始降低。现在的难点在于，当大容量窗口和海量外部通道同时打开时，如何利用一套运行期管理机制来保护模型的注意力，避免高昂的开销和泛滥的噪音拖垮系统。因为长上下文虽然解决了“装得下”的物理痛点，但它本身并不会带来低延迟、高缓存命中率以及清晰的决策路径。真正的变化只有一句话：系统可以知道很多，但模型这一轮不该看那么多。

## 工具接得越多，模型的上下文窗口越容易被污染

连接协议的普及让接工具变得前所未有的简单。像是 Model Context
Protocol（MCP）这样的协议，让 agent
调用外部资源变成了几行代码的事。不过，工具接入越容易，上下文窗口马上就会变得越脏。

在传统的调用方式中，为了让模型知道有哪些工具可以用，系统必须把所有工具的定义、参数类型和描述信息全塞进提示词。一套复杂的代码执行工具，可能包含十几个不同接口，光是这些工具定义就会吃掉几万个
token
的空间。更麻烦的是，代码在执行过程中产生的大量中间调试日志、报错堆栈、或者巨大的
JSON
数组，会随着每次对话反复在模型的注意力机制里穿过。这不仅让单次调用的财务成本极其昂贵，还容易让模型在后续执行中迷失，漏掉核心指令。

针对这一痛点，Anthropic 在 MCP
代码执行实践里尝试过一种解决思路。他们不再把所有的工具描述全拼在全局提示词中，而是让智能体在沙箱执行环境里动态地去发现工具、运行代码并自行过滤结果。如果原样把这套复杂工具的定义塞进窗口，会消耗超过
15 万
token，但通过让沙箱自己在本地跑代码、处理中间过程，最终呈现给模型这一轮调用窗口的核心高信号信息，可能只需要约
2000
token。这就把控制平面和数据平面分开了：连接层只负责打通工具的调用通道，而数据怎么过滤和进入，由治理层说了算。

## 上下文不该是简单拼接出来的提示词字符串

在生产级别的智能体应用里，上下文已经不能再被看作一个由代码硬拼接出来的、越变越长的字符串。它其实是整套系统运行状态在当前步骤下的一个临时编译投影。

为了解决这个多层状态的管理难题，谷歌在 Google
ADK
中提供了一套分层思路。他们把智能体运行期的状态空间拆成了几部分：工作上下文、会话状态、长期记忆，以及文件制品。模型当前能看见的窗口，只是这套深层状态在特定推理步骤下的一个快照。

在这套框架下，信息流动的规则发生了变化。

第一，大量的中间生成物和状态数据可以被安全地留在窗口之外。例如模型在完成任务时生成的各种临时文件、代码文件或数据表格，默认是“不占窗口”（off-prompt）的。它们以文件路径的形式存在于外部执行环境里。只有当模型在后续步骤里，通过自主指令明确要读取某个文件的内容时，系统才按需把该文件的部分内容加载进窗口。

第二，系统不会无差别地向后追加所有的长期记忆和会话历史，而是由治理层先进行动态的过滤与压缩，精炼后再让它们重新进入注意力。

这种运行时架构改变的是外部信息进入模型的时机。它解决的不再是简单的检索精准度，而是整个系统内部的信息路由和生命周期。

Context window
是执行界面而不是存储层：外部状态经过治理层编译成当前模型调用可见的高信号视图

## 生产环境的开销和延迟逼着开发者做状态管理

在将智能体投入实际生产时，推动开发者去打理上下文的，往往是实打实的账单开销和慢到影响体验的延迟。在复杂的长路径任务中，agent
输入和输出的 token 比例展现出了极其夸张的落差。

根据 Manus
披露的研发经验，他们在生产环境里运行智能体时，平均输入与输出的 token
比例差不多达到了 100:1。在如此惊人的输入占比下，模型提供商的键值缓存（KV
cache）命中率和前缀缓存的稳定性，直接决定了整个系统的经济可行性与响应延迟。如果系统在每一轮对话中，都把无规律的、波动极大的中间状态或频繁变化的时间戳塞在上下文的最前段，就会导致前缀缓存不断失效。每一次调用都要重新计算几万个
token，不仅调用成本暴涨，响应时间也会成倍增加。

为了解决这个痛点，Manus
采取了一套把文件系统和状态管理结合在一起的策略。

第一，他们把文件系统作为最终的上下文存储。原文保存在窗口之外的隔离沙箱里，模型在日常交互中只拿着文件路径这些可以随时恢复的标识。只要不执行读取操作，大文件就不会弄脏前缀缓存。

第二，通过固定、规范的工具调用格式，让每次请求的头部结构保持稳定，从而最大化地利用模型大厂的缓存机制。

第三，长上下文模型往往会遇到“中段迷失”的问题，也就是容易漏掉堆在提示词中间的信息。为了对抗这个问题，Manus
的治理层会定期在当前窗口的最后面更新并重写一个叫 todo.md
的任务看板，强行把当前任务的目标和关键变量拉回到模型的近期注意力中。这套做法展示了状态治理对系统性能指标的直接控制作用。

## 独立压缩中间件已经开始走向产品化

当上下文过载成为行业的普遍痛点，市场上也开始出现专门帮模型做上下文精简的独立工具。其中，以
Headroom
为代表的压缩层中间件，展示了这一思路走向产品化的一次窄带宽尝试。

Headroom 的做法是既不干涉 RAG
的检索，也不做前端的工具管理，而是像一个透明代理一样，卡在智能体应用和底层模型
API 之间。它针对的是那些即将进入模型的冗余载荷。比如极长的 JSON
数据、几千行的编译或构建日志、抓取回来的网页 HTML
抽取内容。在这些数据进窗口之前，它的微压缩引擎会基于对内容类型的识别，在确保错误信息、核心字段和关键边界数据不丢失的前提下，对这些数据进行压缩。根据其公开测试，在
JSON、日志和构建输出等特定场景中，它能帮模型砍掉 60% 到 95% 的 token
占用。

为了解决无损压缩后模型可能突然需要查看细节的问题，他们设计了一套叫“压缩-缓存-检索”（CCR）的机制。Headroom
在压缩段落时，会在原处留下一个体积很小的检索标识，而把原本完整的超大原文存放在本地数据库中。如果模型在后面的推理中，突然发现必须读取某个被压掉的具体报错字段，它可以自己调用内置的
ccr_retrieve 工具，把原文重新捞回来。这在工程上把“节省
token”和“保留可恢复性”做了解耦。

然而，这类中间件目前还只是一次窄带宽的尝试。必须指出的是，像 Headroom
这样的工具，对于解决复杂编程等高难度任务的智能体，实际的成功率依然缺乏大规模、系统性的验证。如果面对的是原本就极其紧凑的代码文件、精炼过的搜索结果或者日常短对话，这类压缩层不仅起不到压缩作用，反而可能因为破坏了大模型厂商本身的缓存对齐，或者增加了一次本地数据库往返捞数据的延迟，导致端到端的响应和成本体验变差。它的出现，更多是证明了“中间件过滤”这条思路在处理巨型机器生成数据时的潜力，而不是提供了一个能包治百病的万能配方。

## 做智能体系统不能只靠堆大窗口

从早期苦思冥想怎么写好一段提示词，到今天得在各种复杂的中间件、状态引擎和存储机制之间做权衡，我们设计外围系统的思路其实已经变了。以后做
agent
系统，决定成败的可能不再是谁的模型物理窗口有多大，而是看谁能搭出一套更合理的信息运行时（information
runtime）。

在这个视角下，一些旧的技术直觉需要被重新梳理。

第一，RAG 依然是基础。它就像数据库里的 SQL
语句，能帮我们把数据捞上来。但仅仅把 RAG
拼接提示词的流水线写顺，已经远远不够。真正有技术含量的，是上层怎么和复杂的工作流、多智能体协同做深度的配合与调度。

第二，文件系统不仅仅是用来存放最终结果的。原文可以一直留在外面，模型在隔离的沙箱环境里，只需要拿着路径和指针，自己来决定什么时候去读、读多少。这才是控制信息流进入模型时机的办法。

第三，原始的聊天日志、中间工具输出和执行路径，不等于智能体的记忆。如果把这些零碎的执行记录一字不漏地放进之后的上下文里回放，不仅账单贵得吓人，模型也会被这些无意义的噪音带偏，导致任务跑崩。真正对系统有用的记忆，需要定期去重、提炼，把具体的过程变成一条条标准作业程序，并且把没用的废话及时回收掉。

大窗口和 RAG
为我们打通了和外部世界的数据通道，但这只是第一步。入口处的数据缺少精细、克制的管理，再聪明的模型也迟早会在泛滥的信息里变得迟钝，最终变成一个成本高、难以审计、难以长期托付的系统。