ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

DeepBot上下文工程揭秘:history-pruner与token压缩背后的代码实现原理

DeepBot上下文工程揭秘:history-pruner与token压缩背后的代码实现原理 DeepBot上下文工程揭秘history-pruner与token压缩背后的代码实现原理【免费下载链接】deepbotDeepBot is a system-level AI assistant built for both personal productivity and enterprise workflows — one-click setup, seamless experience, and native Feishu integration.项目地址: https://gitcode.com/gh_mirrors/de/deepbotDeepBot 是一款面向个人效率与企业工作流的系统级 AI 助手它的长期对话不跑偏体验核心靠的是一套上下文工程体系history-pruner历史消息裁剪器 工具结果两级压缩 精细的 token 估算。本文将带你深入源码揭秘这套 token 压缩机制背后的代码实现原理无需深奥背景也能看懂。为什么 AI 助手需要上下文工程大模型的上下文窗口Context Window是有上限的——比如 32K、128K token。对话越久、工具调用越多塞给模型的内容就越膨胀用户与助手的对话历史轮次越多token 越多工具调用结果一次网页抓取、一次命令执行可能就返回几千行系统提示词 工具定义每次请求都固定占用的固定开销一旦超过窗口上限请求直接报错。DeepBot 的解法不是简单粗暴删历史而是一套分级、分层、有保护机制的上下文压缩流水线。所有相关代码集中在 src/main/context/ 目录配合 src/main/utils/token-estimator.ts 和 src/main/utils/message-chunker.ts 两个基础工具模块。第一步token 怎么估算的压缩的前提是知道现在用了多少 token。DeepBot 没有调用昂贵的 tokenizer 接口而是用一套启发式估算见 src/main/utils/token-estimator.ts内容类型估算规则中/日/韩文字符约 1.5 token/字符英文/数字/符号约 0.25 token/字符4 字符 ≈ 1 token图片固定按 2000 token 计未知消息兜底 64 token上下文窗口大小也有优先级用户配置 → 内置配置表 → 模糊匹配模型 ID → 默认 32K见 getContextWindowTokens。估算虽不精确但足够快、足够准——对压缩决策来说偏差在可接受范围内。history-pruner4 种历史裁剪策略核心文件是 src/main/context/history-pruner.ts它提供了 4 个裁剪函数按精细程度递进1️⃣ 按上下文份额裁剪主策略pruneHistoryForContextShare 是生产环境实际使用的函数逻辑非常巧妙先算出预算上下文窗口 × 50%历史占比上限× 1.2安全边界只要当前消息总量超过预算就借助 splitMessagesByTokenShare 把消息按 token 均分成 2 块丢弃最旧的那一块循环往复直到回到预算之内 为什么要按块丢而不是按条丢因为消息可能配对出现用户消息 工具结果 助手回复按 token 份额分块能保证每次丢弃等量的内容裁剪节奏更平滑。2️⃣ 智能裁剪 smartPrunesmartPrune 体现了上下文工程的人文关怀——不是所有消息都一样重要️保护第一条 user 消息通常是最初的任务描述丢了就失忆️保护最后 10 条消息最近的对话上下文✂️ 只裁剪中间的消息且同样从新到旧优先保留如果保护的消息本身就超预算则自动降级为简单按 token 限制裁剪pruneByTokenLimit保证函数永远有解。3️⃣ 简单粗暴的两种pruneOldestMessages直接保留最后 N 条适合快速兜底pruneByTokenLimit从后往前累加 token加不进就停工具结果的两级压缩Soft Trim 与 Hard Clear工具结果是 token 的大头。src/main/context/tool-result-pruner.ts 设计了温和与激进两级手段级别触发时机做法Soft Trim软裁剪使用率 ≥ 70%保留工具结果的前 500 后 500 字符中间替换为省略号并附裁剪说明Hard Clear硬清除使用率 ≥ 85%整个结果替换为占位符[工具结果已清除以节省上下文空间]同样有保护区域设计最近 1 个 assistant 轮次的工具结果绝不动——因为助手此刻正在基于这些结果推理动了就会断片。包含图片的结果也会被跳过保护见 softTrimToolResult。统一入口70% 与 85% 的两段式阈值上面这些能力都由 manageContext位于 context-manager.ts统一编排整个流程像一部自动变速箱使用率 70% → 什么都不做性能优先不浪费 70% ~ 85% → 裁剪工具结果Soft Trim / Hard Clear 85% → 再裁剪历史消息丢弃最旧块几个值得注意的工程细节固定开销被精确计入系统提示词 所有工具定义的 token 先被估算出来L124-L139避免只算消息不算提示词导致的误判每一步都重算使用率软裁剪后如果已降到 85% 以下就不再触发历史裁剪——伤害最小化全程输出统计ContextStats记录压缩前后消息数、token 数、使用率并打印 开始压缩 → ✂️ 工具结果裁剪 → ️ 历史消息裁剪 → ✅ 完成的完整日志链方便排查真实调用场景压缩发生在什么时候压缩不是孤立模块它嵌在两个关键时机都在 agent-runtime 中每次发送消息前agent-message-processor.ts 在请求发出前调用manageContext若result.compressed为真就回写压缩后的消息列表加载历史会话时agent-runtime.ts 从 Session 加载最近对话后先压缩一遍再交给 Agent此外还有一层队列护栏 maintainMessageQueue最多保留50 轮用户对话最近 10 轮保留完整细节含工具调用与结果第 11~50 轮自动剥离toolCall 和 toolResult 只留纯文本——相当于给旧对话做瘦身快照。写在最后这套设计好在哪设计点收益启发式 token 估算区分中英文零外部依赖毫秒级完成70% / 85% 分级阈值平时零开销紧张时分级出手保护首条任务 最近对话压缩不丢主线模型不失忆工具结果先软裁后硬清在可逆与激进之间取平衡完整统计与日志每次压缩可审计、可调试一句话总结DeepBot 的上下文工程 精准的 token 账本 有温度的保护策略 分级的裁剪动作。想动手研究建议按 token-estimator.ts → tool-result-pruner.ts → history-pruner.ts → context-manager.ts 的顺序阅读正好对应计量 → 软压缩 → 硬裁剪 → 总控的完整脉络。【免费下载链接】deepbotDeepBot is a system-level AI assistant built for both personal productivity and enterprise workflows — one-click setup, seamless experience, and native Feishu integration.项目地址: https://gitcode.com/gh_mirrors/de/deepbot创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进