Deja:面向 AI 编程助手的本地上下文压缩系统
技术报告
摘要
Deja(deja-context)是一个运行于本地的智能代理系统,通过拦截并压缩发往大语言模型 API 的请求,在不改变用户工作流的前提下显著降低 Token 消耗。其核心是一套五阶段压缩流水线,结合语义去重、价值排序、自适应压缩、记忆注入与动态预算管理,在典型编码会话中可实现 30%–90% 的 Token 节省。本文从系统架构、核心机制、性能评估、生态与许可等维度,对 Deja 进行全面的技术剖析。
关键词:上下文压缩、Token 优化、AI Agent、本地代理、五阶段流水线
1. 引言
随着大语言模型(LLM)在编程辅助领域的深度应用,上下文窗口的 Token 消耗已成为制约成本和效率的核心瓶颈。以 Claude Code 为代表的 AI 编程助手在长时间、多轮对话中,历史消息、工具调用日志和代码上下文会迅速膨胀,导致每次请求的 Token 费用呈线性甚至超线性增长。
Deja 应运而生——它是一个运行在本地(默认端口 9090)的代理服务,对上层应用完全透明,自动拦截并优化发往 Claude API 的请求。其设计目标可概括为三点:零侵入(无需修改工作流)、高效率(显著降低 Token 消耗)、保质量(不影响模型响应效果)。
2. 系统架构
2.1 总体架构
Deja 采用本地代理(Local Proxy) 架构,部署在用户终端与 LLM API 之间:
1 | ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ |
所有压缩、去重、摘要等操作均在本地完成,API Key 等敏感信息不会经过任何第三方服务器。这种设计在保证数据安全的同时,也避免了额外的网络延迟。
2.2 技术栈与依赖
Deja 基于 Node.js 构建,要求 Node.js 18+ 运行环境,通过 npm 全局安装分发。其轻量级设计使其能够无缝集成到 Claude Code、Cursor、VS Code + Continue、Codex CLI 等多种 AI 编程工具中。
3. 核心机制:五阶段压缩流水线
Deja 的核心是其精密的五阶段处理流水线。该流水线对每次请求的上下文进行层层优化,每个阶段承担特定的压缩职责,且优先使用低成本方法——前几个阶段完全不调用任何 LLM,仅通过本地算法完成处理。
3.1 第一阶段:清理与去重(Cleanup)
目标:移除上下文中的冗余信息。
- 结构化去重:针对工具调用日志(如
read_file返回的代码块),计算相似度签名,将高度重复的内容块合并。 - 格式归一化:将非结构化文本转换为更紧凑的结构化表示。
- 安全例外:错误信息(
error、exception等)默认跳过去重,确保关键诊断信息完整保留。
此阶段通过Jaccard 相似度等纯本地算法完成,不产生任何额外 API 调用。
3.2 第二阶段:价值排序(Ranking)
目标:评估每条消息的“当前任务相关性”,为后续压缩提供依据。
Deja 采用多维度评分模型对上下文中的每条消息进行打分:
| 评分维度 | 权重 | 说明 |
|---|---|---|
| 时效性(Recency) | 40% | 越近的消息越重要,旧消息按指数衰减 |
| 内容密度(Content Density) | 30% | 信息量越大的消息越重要 |
| 角色权重(Role) | 20% | 用户指令通常比工具输出更重要 |
| 独特性(Uniqueness) | 10% | 与其他消息差异越大,价值越高 |
只有得分高于动态阈值的消息才进入下一阶段,其余直接被丢弃。
3.3 第三阶段:自适应压缩(Compression)
目标:对幸存消息进行“非破坏性”瘦身。
此阶段根据内容类型采用不同的压缩策略:
| 内容类型 | 压缩策略 |
|---|---|
| 代码/配置文件 | 保留函数签名、类定义、导入语句,精简实现体 |
| 长文本日志 | 根据用户问题提取关键实体,只保留匹配锚点的上下文 |
| 自然语言推理 | 调用本地小模型(如 BART)生成抽取式摘要 |
| 表格/JSON | 根据用户问题裁剪无关列 |
值得注意的是,此阶段全程不调用主模型,完全通过本地规则或开源小模型完成,确保零额外 Token 开销。
3.4 第四阶段:记忆注入(Memory Injection)
目标:防止因过度压缩而丢失关键的早期或跨会话信息。
Deja 在被压缩后的上下文发送给 LLM 之前,会从一个持久化的向量存储中检索与当前问题相关的历史信息,并将其前置(Prepend) 到上下文中。
这一机制实现了“短期压缩 + 长期记忆”的融合——被压缩掉的信息并未真正丢失,而是以摘要或向量的形式被保留,在需要时可以被重新激活。
3.5 第五阶段:Token 预算管理(Token Budget)
目标:硬性保证上下文不超过模型上限。
- 硬性截断:强制执行 Token 上限,确保请求不会因超长而被拒绝。
- 优先级保护:始终保留最后一条用户消息和核心系统指令,确保 Agent 的基本任务目标不受影响。
- 智能丢弃:若超限,根据第二阶段的相关性得分从低到高逐步丢弃历史,而非简单截断尾部。
3.6 安全透传模式
当上下文过长或检测到可能影响对话质量的风险时,Deja 会自动切换到安全透传模式(Safe Pass-through Mode) ——不对请求做任何压缩,直接转发。这种“宁可不少省,不可错省”的容错设计,优先保证了对话的可靠性。
4. 性能评估
4.1 Token 节省效果
根据官方数据,Deja 在不同场景下的 Token 节省效果如下:
| 使用场景 | Token 节省比例 |
|---|---|
| 普通编码会话(10–15 轮工具调用) | 30%–50% |
| 长时间连续对话(20 轮以上) | 50%–90% |
| 公测期间实测均值 | ~84% |
4.2 经济效益
以 Claude API 标准计费为参考,每节省 100 万 Token 约等于节省 $3。对于重度用户,Deja 每月可节省 $20–$60 的 API 费用。
4.3 质量影响
Deja 的压缩策略在显著降低 Token 消耗的同时,通过记忆注入机制保留了关键历史信息,实测表明其对响应质量的影响极小,甚至在部分场景中因去除了噪声信息而略有提升。
5. 使用与生态
5.1 安装与配置
Deja 的安装极为简便:
1 | # 前提:Node.js 18+ |
安装完成后,打开 Claude Code,右下角出现悬浮窗即表示 Deja 已成功运行。
5.2 常用命令
| 命令 | 功能 |
|---|---|
deja status |
查看运行状态和节省统计 |
deja dashboard |
打开 Web 可视化控制面板 |
deja logs --follow |
实时查看日志 |
deja bypass on/off |
手动暂停/恢复压缩 |
deja stop |
停止代理服务 |
5.3 支持的平台
Deja 支持多种主流 AI 编程工具,覆盖 Windows 和 macOS 平台:
| 工具 | Windows | macOS |
|---|---|---|
| Claude Code | ✅ | ✅ |
| Cursor | ✅ | ✅ |
| VS Code + Continue | ✅ | ✅ |
| Codex CLI | ✅ | ✅ |
6. 许可证与开源状态
Deja 的许可证为 BUSL-1.1(Business Source License 1.1)。
BUSL 是一种“源码可得(Source Available)”但非传统开源的许可证,其特点包括:
- 源码可见:用户可以查看和修改源代码。
- 非商业限制:严禁将代码用于商业性质的生产环境。
- 免费使用:公测期间对个人开发者免费。
- 未来可能变更:根据许可证条款,在特定时间后可能转换为真正的开源许可证(如 GPL 或 Apache 2.0)。
需要特别注意的是,Deja 的源代码仓库(github.com/Deja922/Deja)并未公开,目前仅通过 npm 分发编译后的包。这与市面上其他名称相似的开源项目(如 deja-vu、acoyfellow/deja)是不同的产品。
7. 总结与展望
7.1 核心贡献
Deja 的核心贡献在于将上下文压缩从一个被动的、启发式的优化,提升为一个系统化、可观测、有保障的工程实践。其五阶段流水线设计体现了几个重要的工程原则:
- 分层处理:从简单到复杂,从低成本到高成本,逐层优化。
- 安全优先:通过透传模式和硬性预算保障,确保压缩不影响核心功能。
- 可观测性:提供状态查询、Web 仪表盘和实时日志,让节省“看得见”。
- 无侵入集成:作为本地代理,对上层应用完全透明。
7.2 设计启示
Deja 的架构设计对更广泛的 AI Agent 系统具有重要的参考价值:
- “预算即服务”理念:将 Token 预算作为一级约束来管理,而非事后补救。
- 分层记忆架构:区分热记忆(短期上下文)、温记忆(向量库)和冷记忆(长期存储)。
- 自适应压缩策略:根据内容类型(代码、日志、自然语言)采用不同的压缩方法。
7.3 未来方向
随着 AI 编程助手的普及和上下文窗口的不断扩大,Deja 所代表的本地上下文优化层将成为 AI Agent 基础设施的重要组成部分。未来的演进方向可能包括:
- 更细粒度的语义压缩
- 跨会话的长期记忆增强
- 对更多 LLM 提供商和 Agent 框架的支持
- 从“被动压缩”向“主动预算调度”的演进
参考文献
[1] deja-context npm package. npmjs.com.
[2] Deja — Claude Code 省钱神器. npmjs.com.
[3] Five-stage progressive compaction (DESIGN.md §9). docs.rs.
[4] 多Agent上下文压缩策略深度解析. developer.baidu.com.
[5] Deja GitHub Issues. github.com/Deja922/Deja.
报告日期:2026年8月