欧易数字资产管理平台
284.76MB · 2025-09-15
前面两篇文章我们聊了 AI Agent上下文管理的策略,以及上下文压缩的策略和细节。
上下文的管理策略一般可以分为写入、选择、压缩和隔离。
聊完压缩,今天我们再聊一下上下文策略中的隔离。
当我们让 AI Agent 去完成一个复杂任务时,比如重构一个 React 项目,它可能需要同时处理文件编辑、代码执行、测试运行、文档查询等多个子任务。如果这些任务的上下文混在一起,就像在一个嘈杂的办公室里同时进行十个会议——每个人都听不清自己该听的内容。
今天还是以 Gemini CLI 和 Claude Code 为例来聊下上下文管理的隔离策略。
在有限上下文文窗口的前提下,如果没有上下文隔离,会引发出错误的 LLM 上下文管理,从而会产生四种比较严重的问题:
这些问题在 Agent 场景下被严重放大,因为 Agent 需要收集多源信息、进行顺序工具调用、多轮推理,极易导致上下文膨胀和失控。
Claude Code 的隔离策略让我想起了潜艇的水密舱设计——即使一个舱室进水,也不会影响整艘潜艇。
Claude Code 最核心的设计是主 Agent (nO循环引擎) 和 SubAgent (I2A实例) 的分离。主 Agent 就像一个项目经理,负责统筹全局,而具体的开发任务会分配给不同的 SubAgent 去执行。
每个 SubAgent 都在自己独立的执行环境中工作,通过 Task 工具实现单向通信,避免上下文污染。当一个 SubAgent 在处理文件编辑任务时出了问题,不会影响另一个正在执行代码测试的 SubAgent。它们之间唯一的联系就是通过主 Agent 传递最终结果。
Claude Code 把对话历史分成三层来管理:
短期记忆层——当前会话的实时消息数组,O(1) 时间复杂度访问,自动进行 Token 统计。
中期记忆层——当短期记忆使用率达到 92% 时,系统会触发 AU2 算法进行 8 段式结构化压缩。这不是简单地删除旧消息,而是智能提炼成:背景上下文、关键决策、工具使用记录、用户意图演进、执行结果汇总、错误与解决、未解决问题、后续计划。
长期记忆层——CLAUDE.md 系统存储项目级别的信息,包括项目上下文、用户偏好、代码风格、开发环境、安全配置等,实现跨会话的持久化记忆。
Claude Code 的 MH1 工具执行引擎实现了严格的6阶段流水线:
UH1 调度器把工具分成两类处理:
并发安全工具(可同时执行,最多10个):
非并发安全工具(必须串行执行):
这种分类确保了读操作可以高效并发,而写操作必须严格串行,避免了资源竞争和数据冲突。
每个对话轮次都有独立的状态管理:
currentTurnState = {
compacted: true,
turnId: generateTurnId(), // 独立轮次ID
turnCounter: 0 // 独立计数器
};
这确保了即使在处理第 20 轮对话时出现问题,也不会影响到前面已经完成的工作。系统可以随时回滚到之前的某个状态,就像 Git 的 commit 一样。
SubAgent 提供了最强的隔离保证:
当需要查看项目文件时,系统有严格的限制:
这防止了恶意或错误的请求导致系统过载。
Claude Code 实现了企业级的 6 层安全防护:
相比 Claude Code 的「严格」,Gemini CLI 采用了更加实用主义的策略(或者说简单、简陋?)。
Gemini CLI 的核心策略是通过文件系统实现物理隔离。每个对话会话都有独立的存储文件:
const timestamp = new Date().toISOString().slice(0, 16).replace(/:/g, '-');
const filename = `session-${timestamp}-${this.sessionId.slice(0, 8)}.json`;
this.conversationFile = path.join(chatsDir, filename);
这个命名策略包含时间戳和会话ID,既保证了唯一性,又方便查找和管理。
对话记录按项目哈希值组织,不同项目的对话存在完全不同的目录中:
this.projectHash = getProjectHash(config.getProjectRoot());
const chatsDir = path.join(this.config.storage.getProjectTempDir(), 'chats');
这种设计让项目之间的上下文天然隔离,你在项目 A 中的对话历史永远不会影响到项目 B。
Gemini CLI 提供了灵活的会话管理机制:
会话重置——随时可以创建全新的对话上下文
async resetChat(): Promise<void> {
this.chat = await this.startChat();
}
会话恢复——可以从之前的会话继续,同时保持隔离
if (resumedSessionData) {
this.conversationFile = resumedSessionData.filePath;
this.sessionId = resumedSessionData.conversation.sessionId;
}
Gemini CLI 在模型切换时采用了一个相对简单的策略——共享历史记录,但中断当前查询。这种设计是实用主义的体现:保留有价值的上下文信息,同时通过中断来防止潜在的不一致性。
这就像你换了一个新同事接手项目,你会把之前的讨论记录都给他看,但当前正在进行的讨论会重新开始。
基于这些分析,如果你要构建自己的 Agent 系统,有几个建议:
不要一开始就构建复杂的多层隔离系统。可以先从 Gemini CLI 这样的文件级隔离开始,随着需求增长再逐步增加隔离层次。
清楚地定义什么信息可以跨边界传递,什么不可以。Claude Code 的单向数据流原则值得借鉴——上下文只能从高层向低层传递。
建立指标来监控隔离的效果:
即使有完善的隔离机制,也要为失败做准备。Claude Code 的六层安全防护体系就是一个很好的例子——每一层都为 Agent 的安全执行提供保障。
更强的隔离通常意味着更高的成本。Anthropic 的数据显示:
要确保隔离带来的价值匹配增加的成本。
研究了这么些 Agent 系统的实现细节后,我觉得可能:上下文就是 Agent 的操作系统。就像操作系统通过进程隔离、内存管理、权限控制来保证计算机的稳定运行,优秀的 Agent 系统也需要通过精心设计的上下文隔离策略来确保任务的可靠执行。Claude Code 的严格隔离和 Gemini CLI 的实用主线,虽然实现方式不同,但都在解决同一个核心问题:如何让 AI 在复杂环境中保持清醒。
从技术演进的角度来看,上下文隔离正在从「锦上添花」变成「必备基础」。早期的 AI Agent 就像在一个嘈杂的开放办公室里工作,所有信息混在一起,难免会出现混乱。而现在,通过 SubAgent 架构、分层记忆、智能压缩等技术,我们正在给每个 Agent 构建独立的「工作空间」。这种演进让我想起了从单任务 DOS 到多任务 Windows 的跃迁——隔离不是为了分离,而是为了更好地协作。
未来的 Agent 系统会走向何方?我相信会出现更多创新:自适应的隔离策略、跨 Agent 的安全通信协议、甚至是 Agent 专属的「虚拟操作系统」。但无论技术如何演进,有一点是确定的:好的隔离策略不是技术炫技,而是让 Agent 能够心无旁骛地解决问题。这就像给一个优秀的程序员提供安静的办公环境——不是奢侈,而是必需。
以上。
284.76MB · 2025-09-15
96.3MB · 2025-09-15
63.0MB · 2025-09-15