当前位置: 首页 > news >正文

headroom_retrieve工具注入原理:LLM如何按需取回Headroom压缩掉的原始数据

headroom_retrieve工具注入原理:LLM如何按需取回Headroom压缩掉的原始数据

【免费下载链接】headroomCompress tool outputs, logs, files, and RAG chunks before they reach the LLM. 20% fewer tokens for coding agents, 60-95% fewer tokens for JSON, same answers. Library, proxy, MCP server.项目地址: https://gitcode.com/GitHub_Trending/head/headroom

Headroom 是一个开源的 LLM 上下文压缩项目:它在工具输出、日志、文件进入大模型之前先做压缩,为编码 Agent 节省约 20% token,JSON 类内容可节省 60%–95%。它的核心秘密是 CCR(Compress-Cache-Retrieve)架构——压缩永远可逆。本文将带你拆解headroom_retrieve工具注入的完整原理:Headroom 如何把一个"取回工具"偷偷塞进 LLM 的工具列表,让模型在压缩数据不够用时,自己按需取回原始数据,全程对客户端透明。

为什么压缩可以"不丢数据"?

传统压缩面临一个两难:

  • 压缩太狠→ 可能丢掉 LLM 真正需要的数据
  • 压缩太保守→ 省不下 token

Headroom 的 CCR 架构消除了这个权衡:压缩时把原始数据缓存在本地,并留下"取回凭证"(hash)。如果模型需要完整数据,随时可以取回。

方案风险节省比例
不压缩0%
传统有损压缩数据丢失70–90%
CCR 可逆压缩无(可取回)70–90%

四步走:从压缩到取回的完整链路

CCR 的完整流程分为四个阶段,全部在代理层自动完成,客户端零感知。

第 1 步:压缩 + 缓存(Compression Store)

当 SmartCrusher 压缩工具输出(比如 1000 条 JSON 压到 20 条)时:

  1. 原始内容存入本地 LRU 缓存
  2. 生成一个 hash 作为取回凭证
  3. 在压缩结果里留下标记,例如:
[1000 items compressed to 20. Retrieve more: hash=abc123]

这个标记就是模型日后"兑换"原始数据的钥匙。

第 2 步:工具注入(Tool Injection)——本文主角

代理在转发请求前,会扫描消息里的压缩标记,一旦发现就执行两件事:

  • 向 tools 数组注入headroom_retrieve工具定义(OpenAI、Anthropic、Google 三种格式自适应)
  • 向系统消息追加取回说明,告诉模型有哪些可用 hash

核心实现在 headroom/ccr/tool_injection.py 中的CCRToolInjector类。注入的工具定义长这样:

{ "name": "headroom_retrieve", "description": "Retrieve original uncompressed content that was compressed to save tokens...", "parameters": { "properties": { "hash": { "type": "string" } } } }

两个精巧的设计细节:

  • 🔒归属校验verify_ownership()会先确认缓存中真的存在该 hash 才注入工具——避免"别的上下文工具留下的相似标记"误导模型去取一个必然落空的数据(见 tests/test_ccr_golden_policy.py)
  • 📌会话粘性:一旦某会话用过 CCR,该工具会持续保留在后续所有请求的工具列表中。看似多余,实则是为了保护提示词缓存——工具列表字节级变化会导致 prompt cache 失效(详见 REALIGNMENT/04-phase-B-live-zone.md)

第 3 步:响应拦截(Response Handler)

当 LLM 决定调用headroom_retrieve(hash=abc123)时,神奇的一幕发生了——代理自己接管了这个工具调用

  1. Response Handler 在响应中检测到 CCR 工具调用
  2. 从本地缓存取回原始数据(约1 毫秒
  3. 把结果作为工具返回追加到对话,自动发起下一次 API 调用
  4. 直到 LLM 产出不再含 CCR 调用的最终响应,才返回给客户端

也就是说,你的应用代码从头到尾看不到这次工具调用。默认最多循环 3 轮取回(max_retrieval_rounds),防止死循环。实现在 headroom/ccr/response_handler.py 的CCRResponseHandler类。

第 4 步:跨轮次追踪(Context Tracker)

更"聪明"的能力:追踪器会记住每一轮被压缩的内容,并分析后续问题与缓存内容的相关性,在模型开口问之前就主动展开相关数据

Turn 1: 文件搜索返回 500 个文件 → 压缩到 15 个(hash=abc123) Turn 5: 用户问"auth 中间件呢?" → 追踪器判断 "auth" 可能就在 abc123 里 → 主动展开压缩内容 → 模型直接在完整列表里找到 auth_middleware.py

实现见 headroom/ccr/context_tracker.py,它防的正是"上下文失忆"——早期被压缩的数据被后来的对话遗忘。

一个完整的例子

工具输出 100 条文件记录(7,059 字符) ↓ SmartCrusher 压缩到 8 条(633 字符,节省 91%) ↓ 原始数据缓存,标记 hash=abc123 ↓ headroom_retrieve 工具注入 LLM 先用 8 条尝试回答 ↓ 不够用 → 调用 headroom_retrieve(hash="abc123") ↓ 代理拦截 → 本地取回 100 条 → 自动续跑 ↓ LLM 基于完整数据给出准确答案

跑一下官方演示就能看到全过程:python examples/ccr_demo.py,官方演示如下:

不经过代理也能用:MCP 模式

headroom_retrieve不止存在于代理路径。Headroom 还把它作为 MCP 工具对外暴露,Claude Code、Cursor、Codex 等任意 MCP 客户端都能直接使用。MCP 服务器提供三个工具:

工具作用
headroom_compress按需压缩内容,返回压缩文本 + hash
headroom_retrieve凭 hash 取回原始内容(支持 query 参数在原文中过滤)
headroom_stats查看会话压缩统计

注册一次即可:headroom mcp install。源码在 headroom/ccr/mcp_server.py,无需运行代理即可本地压缩+取回。

实用配置速查

  • 缓存保留时长:代理模式下原始数据默认保留 1800 秒(30 分钟)。长时 Agent 运行可用环境变量延长,如HEADROOM_CCR_TTL_SECONDS=7200 headroom proxy
  • 关闭响应处理headroom proxy --no-ccr-responses
  • 关闭主动展开headroom proxy --no-ccr-expansion
  • 查询缓存状态:访问/v1/retrieve/stats查看当前 TTL 与条目数

小结:为什么这个设计值得学习

headroom_retrieve的本质是把**"压缩"从一次性决策变成了可逆操作**:

  1. 缓存原始数据 + hash 标记 = 取回凭证
  2. 工具注入让模型"知道"可以取回
  3. 响应拦截让取回过程对客户端完全透明
  4. 跨轮次追踪甚至让展开先于需求发生

更妙的是,取回行为本身还会通过 TOIN 反馈机制反哺未来的压缩决策——模型取回过的内容模式,下次会被更谨慎地对待。

想深入阅读?推荐这两份仓库内置文档:

  • CCR 架构详解:wiki/ccr.md
  • 官方 CCR 指南:docs/content/docs/ccr.mdx
  • 工具注入实现:headroom/ccr/tool_injection.py
  • 响应拦截实现:headroom/ccr/response_handler.py

用激进的压缩省 token,用透明取回兜住正确性——这就是 Headroom 给 LLM 工程的一个完整答案。

【免费下载链接】headroomCompress tool outputs, logs, files, and RAG chunks before they reach the LLM. 20% fewer tokens for coding agents, 60-95% fewer tokens for JSON, same answers. Library, proxy, MCP server.项目地址: https://gitcode.com/GitHub_Trending/head/headroom

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

http://www.cnnetsun.cn/news/4308177.html

相关文章:

  • 岳阳空调维修正规服务怎么选?欧米到家全区域及代码故障检修
  • 2017年Java笔试题深度解析:核心考点为何至今仍高频?
  • STM32L4 UART DMA偶发数据错乱与卡死:根因分析及解决方案
  • Nginx如何成为智能电网与可再生能源能效优化的秘密武器?
  • 具身智能学习路线:从机械臂到机器狗的ROS2全栈实战指南
  • STM32+KSZ8863调试实录:RMII接口Link不上的排查与解决
  • 数据中心电池容量计算与造价清单:避免项目延期取消的关键
  • 基于SpringBoot的问卷调查管理系统(毕设源码+文档)
  • 虚实共生态势推演:实现野外驻训从被动观测到主动预判的技术升级
  • Thomas Wolf警示AI权力集中,开源模型本地部署如何破局?
  • Eclipse JEE版文件名解析与JVM启动配置指南
  • 系统化架构设计:从个人经验到可复用的技能闭环
  • AI风险治理实战:从安全评测到可信落地,守护技术价值
  • 五月前端面试复盘:Vue3原理、性能优化与系统设计题全解析
  • 水质砷超标133倍背后:检测标准、形态分析与质控全解读
  • STM32与CC1125低功耗组合:GPIO引脚状态导致漏电的排查与解决
  • Debian与LLM:许可证争议、打包规则与AI工具链实践
  • 银行信用卡风险评估模型设计与落地实践
  • 基于Python的面试题解析源码:从文本清洗到考点提取全实现
  • LangGraph核心模型与实战:从条件路由到并行分支的Agent状态机设计
  • 壹品慧优选品控到底怎么样?从选品、供应链到售后,深度拆解这个厨房专家的品控体系
  • 2026大模型商业化加速:从API选型到Agent架构的技术应对
  • Cursor Review 深度实测:AI 代码审查能否阻止劣质化
  • 德州空调维修正规服务怎么选?欧米到家全区域及代码故障检修
  • PyTorch入门:从张量计算到模型部署的完整链路
  • 基于RAG与知识图谱的AI医疗问诊平台系统搭建指南
  • 无屏AI硬件重构交互入口:从语音交互到端侧部署,开发者如何提前卡位
  • DeepSeek V4 Flash 接入 Codex CLI 完整配置教程
  • STM32MP257 SPI3从机NSS引脚claim失败排查与设备树配置
  • React面试八股文:组件化、Hooks与渲染机制核心解析