当代码库超过 5 万行、依赖图深至 6 层时,Agent 平均每 7 轮对话就会重新问一次 “某文件在哪”。这不是模型不够聪明,而是上下文窗口被无关细节撑爆,关键信号被挤出窗外。把 200k token 做成可滑动的 “ Repo 级缓冲区”,让 Agent 像操作系统的虚拟内存一样按需换入换出,才能把幻觉率从 18% 压到 3% 以下。
一、200k 窗口不是 “一口气全塞”,而是三段式切片
- 热区(Hot 0–30k):当前编辑文件及其直接 import,常驻内存,不允许滑出。
- 温区(Warm 30–100k):同模块内最近修改的 10 个文件,按 LRU 淘汰。
- 冷区(Cold 100–200k):仓库级摘要、核心接口定义、依赖关系图,用向量检索动态换入。
把 token 当缓存页管理,就能在 O (1) 时间内完成 “滑出 - 换入” 决策,而无需每次重新计算整库 embedding。
二、滑动窗口的 “三表一图” 实现
- 窗口表:
deque(maxlen=window_turns)保存最近 N 轮对话,超窗自动丢弃。 - 预算表:实时累加 GPT-4 tokenizer 输出的 token 长度,触顶即触发压缩。
- 摘要表:用 LLM 把滑出窗口的对话压成 128 token 的事实陈述,追加到冷区。
- 依赖图:提前离线解析
import与require,把文件节点连边,用于热区预加载。
代码骨架 20 行即可跑通:
from collections import deque
class RepoSlidingWindow:
def __init__(self, hot_ids, budget=200_000):
self.hot = set(hot_ids) # 常驻文件 id
self.deque = deque(maxlen=8) # 8 轮对话
self.budget = budget
self.used = 0
def add_turn(self, user, assistant):
tokens = gpt4_tokenizer(user+assistant)
while self.used + tokens > self.budget:
old = self.deque.popleft()
self.used -= old['tokens']
cold_summary = llm_summarize(old)
self.append_cold(cold_summary)
self.deque.append({'user':user, 'assistant':assistant, 'tokens':tokens})
self.used += tokens
三、持续注入 repo 级上下文的三种策略
-
热区预置
在 Agent 启动前把README、package.json、pyproject.toml等元数据一次性压入热区,占 2k token,换来后续 0 次 “项目结构” 提问。 -
摘要缓冲区
每滑出 1 轮对话,就用 LLM 生成 128 token 的 “事实句”,例如 “用户已把utils/logger.ts的重试次数改为 3”。摘要追加到冷区头部,保证长期记忆不丢。 -
向量检索冷区
把冷区摘要做 embedding,用户新问题先过向量检索,取 Top-3 相关摘要拼进 prompt。实测可把冷区命中率从 22% 提到 67%,减少 40% 幻觉。
四、幻觉率对比:滑窗 vs 全量 vs 摘要
| 方案 | 平均 token / 轮 | 幻觉率 | 重复提问率 | 首响延迟 |
|---|---|---|---|---|
| 全量历史 | 180k | 18.2% | 26% | 3.1s |
| 简单滑窗 | 50k | 9.4% | 12% | 1.2s |
| 三区分级滑窗 | 75k | 3.1% | 4% | 1.4s |
数据来自工业级 Agent 记忆优化实验,任务域为 10 个开源后端项目,每项目 300 轮对话。
五、可直接落地的参数清单
- 窗口轮次:8~10 轮,折中记忆与成本。
- 热区预算:≤30k token,用
cloc先算好核心文件体积。 - 摘要长度:128 token,强制 JSON 输出,方便正则解析。
- 向量检索阈值:cosine < 0.28 才拼入,防止引入噪声。
- 监控指标:
window_utilization > 85%持续 3 轮即触发扩容告警,避免硬截断。
六、上线后必开的 3 个告警
- token_budget_exceeded:单轮滑窗后仍超 200k,提示需要分层摘要。
- cold_miss_rate > 30%:向量检索没命中,摘要质量或 embedding 模型需要更新。
- duplicate_ask_rate > 5%:用户重复问同一文件位置,说明热区预置不完整。
把上述参数写进 Prometheus,配上 Grafana 面板,两周就能把 Agent 的 “健忘” 问题压到可接受范围。
参考资料
[1] 工业级 Agent 记忆优化:从滑动窗口到 OS 级管理的九大技术实践,CSDN, 2025.
[2] Claude 4 200K token 上下文窗口官方文档,Anthropic, 2025.