惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Project Zero
Project Zero
D
Docker
爱范儿
爱范儿
V
V2EX
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
人人都是产品经理
人人都是产品经理
博客园 - Franky
IT之家
IT之家
C
CXSECURITY Database RSS Feed - CXSecurity.com
美团技术团队
博客园 - 三生石上(FineUI控件)
小众软件
小众软件
Y
Y Combinator Blog
Cyberwarzone
Cyberwarzone
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Engineering at Meta
Engineering at Meta
D
DataBreaches.Net
WordPress大学
WordPress大学
宝玉的分享
宝玉的分享
C
Cyber Attacks, Cyber Crime and Cyber Security
Apple Machine Learning Research
Apple Machine Learning Research
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
大猫的无限游戏
大猫的无限游戏
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
S
Security Affairs
The Hacker News
The Hacker News
N
News and Events Feed by Topic
Attack and Defense Labs
Attack and Defense Labs
Vercel News
Vercel News
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
Hacker News: Ask HN
Hacker News: Ask HN
博客园_首页
H
Hacker News: Front Page
S
Secure Thoughts
L
LINUX DO - 最新话题
C
CERT Recently Published Vulnerability Notes
雷峰网
雷峰网
The Last Watchdog
The Last Watchdog
P
Palo Alto Networks Blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Hacker News - Newest:
Hacker News - Newest: "LLM"
G
GRAHAM CLULEY
Simon Willison's Weblog
Simon Willison's Weblog
T
The Blog of Author Tim Ferriss
Latest news
Latest news
H
Hackread – Cybersecurity News, Data Breaches, AI and More
Scott Helme
Scott Helme
Security Latest
Security Latest
N
Netflix TechBlog - Medium
阮一峰的网络日志
阮一峰的网络日志

博客园_首页

Plist 二进制格式 Milvus 和 PGVector,哪个更好? OpenClaw 已过时?在 VS Code 中运行 Hermes Agent! 第30篇文章:一个大三计科生的自白 Manim如何在数学公式中完美显示中文? Docker 部署 RocketMQ 5 并发编程核心概念辨析 C#事务处理最佳实践:别再让“主表存了、明细丢了”的破事发生 CLI 是什么?为什么大厂突然集体卷命令行? 【从0到1构建一个ClaudeAgent】协作-自主Agent UIImageView 设置图片不生效的原因排查 最小二乘问题详解20:无先验约束下的增量式SFM自由网平差 痞子衡嵌入式:大话双核i.MXRT1180之XIP应用里借助MU实现可靠Flash IAP的方法 AI Chat 封装, SemanticKerne.AiProvider.Unified 已发布 Windows下右键编辑js文件无法打开记事本——在注册表中使用环境变量 在后台服务中使用 Scoped 服务,为什么总是报错? H200 安装驱动并使用sglang启动模型 wireshark 抓包Trap上报告警内容 我用 AI 辅助开发了一系列小工具(2):图片压缩工具 [A Primer On MC and CC] 2.1 Memory Consistency 1 - 指令重排序和 SC 模型 Oracle数据库SCN推进技术详解与实践指南 玩转控件:封装个带图片的Label控件 Claude Code 4.7 真正该升级的不是模型,而是你的工作流 前端小白一句话,AI 帮我做了个颜值拉满的桌面媒体播放器。当代码不再是门槛,一句话编程就是现实。 5. WorkBuddy: 小龙虾的灵魂三件套,让你的小龙虾不只是工具 SQLite 分片方案实战:三种分片策略的深度对比 告别简陋 UI!一款基于 Fluent Design 和基于 WinUI 的开源免费、现代化的 Avalonia UI 控件库 关于二进制排列组合枚举的总结 AI开发-python-LangGraph框架(3-27-LangGraph从零实现大模型智能决策工作流) ElasticSearch主分片和副本分片概念详解 【002】HTTPS 粗解:证书、TLS 握手与对后端配置的影响 Hermes Agent 一周暴涨五万 Star,但我劝你别急着追 明明连接的是Redis的DB0,为什么能查到DB3的数据? 【从0到1构建一个ClaudeAgent】协作-Agent团队 熟悉电子元器件之后,电子小白下一步该怎么走? MAF快速入门(23)通过C#类定义Skills .NET 高级开发 | 手写一个对象映射框架 FastAPI数据库ORM怎么选?我肝了三个Demo后,终于不再纠结了 mysqldump 参数拾遗:在遗忘与铭记之间 C# .NET 周刊|2026年3月5期 Claude code入门 - 陈彦斌 一文学习入门 ThingsBoard 开源物联网平台 GitHub 热门项目 | 2026年04月16日 如何为GIT设置全局勾子,为每次提交追加信息 Number.isFinite和isFinite与isNaN()和Number.isNaN的区别 PortSwigger SQL注入LAB2 推荐一个测试人必备的Skills,从功能到性能全搞定(附详细实操和安装下载方式) 筑基期:掌握Odoo基础核心知识点02(Odoo XML 开发方式详解) GLM模型这么火,咱们用vllm也咧一个呗! 深入理解 AbortController:从底层原理到跨语言设计哲学 字符串学习笔记 多租户系统框架的基础模块设计和分析设计 Apache SeaTunnel Zeta 为什么能做到“又快又稳”? AI开发-python-LangGraph框架(3-26-LangGraph基本概念及第一个简单样例) Vue 3 组件通信,别只会用 Props 和 Emits 了,这几个狠活儿你得看看 ElasticSearch7.X版本配置密码 用Manim实现动态交点计算--从一个动点问题说起 团结引擎+Addressable+Instant Game打包抖音小游戏 function call 实战:让 LLM 自动判断 pod 异常、调用日志工具并完成故障分析 bubseek —— 让 Agent 的足迹,变成团队的洞察 通过 C# 读取并导出 PDF 书签 如何用 GitHub Actions 实现 Steam 自动化发布 【从0到1构建一个ClaudeAgent】并发-后台任务 .NET 高级开发 | 定制 ASP.NET Core 框架 电子小白:什么是运算放大器(运放) zero2Agent:面向大厂面试的 Agent 工程教程,从概念到生产的完整学习路线 堆上的ORW HC32F460 USB CDC通信异常:非对齐访问异常排查 20260413-Hyperbridge 攻击事件:发生在默克尔山上的验证绕过 那些喊着AI 要淘汰你的人,正在靠你的焦虑赚大钱! 深度学习进阶(八)Swin Transformer 最小二乘问题详解19:带先验约束的增量式SFM优化与实现 SnapTranslate 3.0 正式发布:全局划词翻译 + 完整英语学习闭环,一站式搞定查词、记词、复习 工作的意义、工作的困难认知再思考 .NET + AI 进阶实战:基于类的技能开发 - 打造可治理的 Agent 能力模块 【从0到1构建一个ClaudeAgent】规划与协调-技能 上周热点回顾(4.6-4.12) 电子小白的工具三件套:面包板、杜邦线、万能板 单表五亿数据的查询优化 | Mysql、StarRocks 2. WorkBuddy:从“我是谁”到“帮我干活” C# 如何减少代码运行时间:7 个实战技巧 基于HelixToolkit.SharpDX 渲染3D模型 - 笺上知微 从零开始的双臂具身VLA起源及现阶段发展综述 - SkyXZ 记对 xonsh shell 的使用, 脚本编写, 迁移及调优 - pluvium27 受够了Vibe Coding的失控?换个起点,让AI事半功倍 从开始配置漏洞环境到漏洞复现流程 - 難しい 关于10年工作经验的程序员对OpenClaw的实战经验分享以及看法 - 虚无境 Any metadata 的内存布局 C# .NET 周刊|2026年3月2期 - InCerry 我帮你测过了,测试圈排名第二的 Skill 依然很牛逼 Skill Discovery | 无监督技能发现的经典工作总结 - MoonOut 上下文工程是什么?过时了么?一文讲明白! - 一枫说码 开了 TUN 模式还是直连?90% 的人都踩过这个坑 AScript扩展多种脚本语言 - rockey627 AI 学习笔记:Agent 的记忆机制 你能被装进一个文件里吗?——7 万人把同事"蒸馏"成了 AI - 我没有三颗心脏 Claude Code 通关手册(七):给 AI 装上技能包——Skills 完全指南 - 暮色之狐 在浏览器中快速编辑代码:VSCode Web 集成实践 - Newbe36524 蒸馏自己 skill?基于 Deepseek 的蒸馏器,丐版蒸馏方式,简单便捷 - To_Carpe_Diem Spring AI Aliababa和AgentScope,哪个更好? - 苏三说技术
OpenClaw.NET 祭出 TokenJuice:Agent 时代的"Token 瘦身引擎",让 LLM 上下文不再膨胀
张善友 · 2026-06-19 · via 博客园_首页

一、一个让后端工程师深夜崩溃的场景

凌晨两点,你被 飞书 消息震醒。生产环境出问题了,你赶紧打开终端,让 AI Agent 帮你排查。

> 帮我看看为什么最新的部署失败了

Agent 很敬业地开始执行:先 git diff 看变更,再 dotnet build 检查编译,然后 docker ps -a 看容器状态,最后 curl 一下健康检查端点——结果返回了一个 2.5MB 的 HTML 错误页面。

几轮工具调用下来,你的对话历史已经膨胀到十几万字。每一轮,这些原始输出——带着 ANSI 颜色代码、重复的构建日志、数百行的 .dll 清单——都被原封不动地塞回 LLM 的上下文窗口。你的 Token 账单像火箭一样飙升,而 Agent 的响应速度却越来越慢,因为模型要在越来越长的"噪音"中寻找关键信号。

这不是虚构的场景。这是每一个在生产环境使用 AI Agent 的开发者都在经历的现实。Token 消耗随轮次呈二次方增长,而你的钱包和耐心都在同步衰减。

OpenClaw.NET 社区刚刚交出的 PR #155 —— TokenJuice,正是为了解决这个痛点而生的"Token 瘦身引擎"。


二、OpenClaw 生态与 .NET 版图的扩围

在深入 TokenJuice 之前,有必要先厘清它所处的生态位。

OpenClaw.NETclawdotnet/openclaw.net)是 OpenClaw 的独立 .NET 实现,并非官方移植,而是由 .NET 社区自发维护的平行版本。它面向 .NET 开发者生态,目前拥有约 400 Stars,技术栈基于 .NET 10 和 C# 13,设计上对 NativeAOT 高度友好。

别小看这 400 Stars。OpenClaw.NET 包含了 60 个原生工具9 个通道适配器 和原生 LLM Provider,已经是一个功能完整的 Agent 运行时。对于大量深耕 .NET 技术栈的企业来说,这意味着可以在不引入 Node.js 基础设施的情况下,将 OpenClaw 的能力无缝集成到现有的 .NET 架构中。

TokenJuice 正是由社区贡献者 geffzhang 提交给 OpenClaw.NET 的一个大型功能 PR,规模达到 21 次提交、+9555/-1469 行代码变更、涉及 276 个文件。它解决的是一个看似细小却极其致命的问题:如何让工具输出在到达 LLM 之前,既保持语义完整,又大幅压缩体积


三、Token 消耗的"二次方陷阱"

在自主 Agent 工作流中,每一次工具调用的结果都会被追加到对话历史,然后在下一轮重新发送给模型。这意味着什么?

假设第一轮 Agent 执行了一个 dotnet build,输出了 1.28MB 的日志(包含大量冗余信息)。这 1.28MB 被送入 LLM。第二轮,Agent 基于第一轮的分析又执行了一个 docker ps -a,输出了 48KB。此时对话历史变成:系统提示 + 第一轮对话 + 1.28MB 构建日志 + 第二轮对话 + 48KB 容器列表。每一轮都在前面所有轮次的基础上累加

原始的工具输出通常包含大量对 LLM 而言的"噪音":

噪音类型 典型来源 危害程度
ANSI 转义序列 彩色终端输出 低——但纯浪费空间
冗余构建产物清单 dotnet build 输出的数百行 .dll/.pdb 路径 极高——几百行对诊断零贡献
轮询循环的重复状态行 docker pullnpm install 的进度条 ——几百行重复内容
完整 HTML 页面 curl 抓取网页时的误操作返回 极高——可能数 MB
日志中的相邻重复行 日志轮转、重试机制的重复输出 中高——信息密度极低

如果不做任何处理,一个正常的 10 轮 Agent 会话,Token 消耗可能轻松突破数十万。而很多输出中真正对决策有用的信息,可能只占 5%-10%。

业界当然意识到了这个问题。常见的解法是什么?让 LLM 自己来总结。但这本身就是一个悖论——你用消耗 Token 的方式来节省 Token,延迟从毫秒级变成秒级,而且 LLM 的总结是非确定性的,可能漏掉关键错误信息。

TokenJuice 的思路截然不同:与其让 LLM 来理解输出,不如在输出进入 LLM 之前,用确定性规则把它压缩到只剩精华


四、TokenJuice 核心架构:规则驱动的"外科手术式"压缩

4.1 管道顺序:输出必须经过的最后一道关卡

TokenJuice 在 OpenClaw.NET 中被定位为系统级内置插件,实现 IToolResultInterceptor 接口,在 Gateway 启动时显式注册。它在工具执行链路中的位置非常关键:

Tool.Execute
    ↓
Redaction(敏感信息脱敏)
    ↓
【Interceptor Pipeline — TokenJuice 介入】
    ↓
IToolHook.AfterExecute
    ↓
LLM 上下文

也就是说,工具输出先经过脱敏处理,然后进入 TokenJuice 的归约管道,最后才到达 LLM。这个顺序确保了安全和效率两个目标都被满足。

4.2 三步决策流程

TokenJuice 并非无脑压缩,而是遵循一个精细的决策流程:

第一步:逃逸检测。如果命令行中包含 --raw--full 参数,说明用户需要精确、完整的输出(比如调试二进制问题时),TokenJuice 直接跳过,不做任何处理。此外,程序也可以通过 BypassReduction API 编程式地绕过归约。

第二步:规则匹配。这是 TokenJuice 的核心。系统根据工具名、命令参数、退出码、输出模式等 9 个匹配维度,在规则库中寻找最匹配的归约策略。每条规则都是静态声明的 JSON,匹配成功后执行对应的转换和归约。

第三步:兜底策略。如果没有规则命中,系统会计算输出的语义密度(公式:ρ = U/max(L,1) · N/max(C,1))。当密度 ρ < 0.3 时,自动启用通用的 HeadTail 截断策略作为兜底。这个密度公式的含义是:有效信息单元占比越低,越需要压缩。

4.3 九步归约管道

当一条规则命中后,原始输出会依次经过 9 步处理:

原始输出
    ↓
1. StripAnsi        — 剥离 ANSI 颜色代码
2. TrimEmptyEdges   — 去除首尾空白行
3. DedupeAdjacent   — 合并相邻重复行
4. SkipPatterns     — 按正则跳过匹配行
5. KeepPatterns     — 按正则保留匹配行
6. OutputMatches    — 提取关键匹配内容
7. Counters         — 统计 error/warning 数量
8. HeadTail         — 保留头部+尾部,截断中间
9. Inline Format    — 内联格式化输出

这个管道的设计非常精巧。它不是粗暴地截断,而是层层递进地剥离噪音——先去掉纯视觉噪音(ANSI 颜色),再去掉格式噪音(空行),然后是信息噪音(重复行),最后才是结构噪音(中间不重要的行)。每一步都在保留语义的前提下,最大化压缩率。


五、技术亮点深度解析

5.1 规则引擎:129 条内置规则覆盖 17 大类别

TokenJuice 的规则库是其最核心的资产。PR 中包含 129+ 内置规则,覆盖了以下 17 大类别:

buildgitnetworkdevopstestslintpackageclouddatabasefilesystem 等。

每条规则的结构如下(JSON 格式):

{
  "id": "dotnet-build-errors-only",
  "match": {
    "tool": "dotnet",
    "args": ["build"],
    "exitCodes": [1, 2],
    "outputPattern": ".*"
  },
  "transforms": ["stripAnsi", "trimEmpty"],
  "summarize": {
    "strategy": "headTail",
    "headLines": 5,
    "tailLines": 20
  },
  "failure": "retainFull",
  "counters": ["error", "warning"]
}

规则匹配覆盖 9 个维度:工具名、子命令、参数模式、退出码范围、输出长度阈值、输出模式正则、环境变量条件、会话状态标志、以及自定义匹配器。这种多维匹配确保了规则的精确命中——既不会漏掉需要处理的情况,也不会误伤不该处理的输出。

5.2 三层配置体系:内置 → 用户 → 项目

规则配置采用三层优先级体系:

层级 路径 优先级 用途
内置规则 嵌入程序集资源 最低 提供开箱即用的 129 条规则
用户规则 ~/.config/tokenjuice/rules/*.json 中等 个人偏好,全局生效
项目规则 .tokenjuice/rules/*.json 最高(同 ID 覆盖) 团队共识,随代码仓库版本管理

这个设计非常贴合工程实践。个人开发者可以在家目录下放自己的规则,企业团队则可以把规则文件放进代码仓库,确保所有成员使用一致的归约策略。项目级规则可以覆盖内置规则中同名 ID 的规则,这种覆盖机制给予了团队极大的灵活性。

5.3 Fail-open 设计:宁可不压缩,绝不丢数据

TokenJuice 有一个非常关键的设计哲学:任何管道异常都安全回退到原始输出

想象一下:Agent 正在执行一个关键的数据库迁移命令,如果归约管道因为某个边界情况抛出异常,导致工具输出被截断或丢失,那后果可能是灾难性的。TokenJuice 的 Fail-open 策略确保了——

  • 规则解析失败 → 输出原样通过
  • 正则匹配超时 → 输出原样通过
  • 管道步骤异常 → 输出原样通过
  • 内存压力超限 → 输出原样通过

这种"宁滥勿缺"的保守策略,在 AI Agent 这种对可靠性要求极高的场景中是完全正确的取舍。TokenJuice 是一个优化层,不是功能层——它只应该让系统更好,绝不应该让系统出错

5.4 零额外 Token,毫秒级延迟

与基于 LLM 的总结方案相比,TokenJuice 的优势是数量级的:

维度 TokenJuice LLM 总结
方式 静态 JSON 规则匹配 调用 LLM 生成摘要
Token 成本 数百到数千 Token
延迟 < 5ms / 100KB 数百毫秒到数秒
确定性 100% 可复现 非确定性(温度影响)
外部依赖 依赖 LLM API 可用性
信息丢失风险 极低(规则可控) 存在(LLM 可能遗漏)

"用 Token 换 Token"的 LLM 总结方案,在小规模场景下或许可用,但在生产级 Agent 工作流中,延迟和成本的叠加是不可接受的。TokenJuice 的确定性规则引擎在 < 5ms 内完成处理,这个延迟对于大多数 Agent 场景来说完全可以忽略。

5.5 NativeAOT 兼容:为 .NET 生态量身打造

OpenClaw.NET 的一个核心卖点是对 NativeAOT 的友好支持。TokenJuice 完全遵循了这一设计原则——零反射、零运行时代码生成

这意味着 TokenJuice 可以被完整地编译进 NativeAOT 二进制中,不需要任何 JIT 支持,不产生运行时代码生成的开销。对于需要部署为自包含单文件可执行文件的场景(比如容器化、边缘计算、IoT),这是至关重要的特性。PR 的目标是将 NativeAOT 二进制增量控制在 < 500KB


六、实测数据:压缩率有多猛?

PR 提供了一组基准测试数据,涵盖了开发者日常最频繁使用的命令:

测试命令 原始体积 归约后体积 压缩率
git diff 412.5 KB 98.2 KB 76.2%
dotnet build 1,280 KB 64.0 KB 95.0%
docker ps -a 48.0 KB 8.1 KB 83.1%
curl 返回 HTML 2,540 KB 381 KB 85.0%
git status 12.0 KB 2.1 KB 82.5%

最 impressive 的是 dotnet build95% 压缩率——1.28MB 的构建日志被压缩到仅剩 64KB。这是因为 .NET 构建输出中有大量的重复信息(编译的每个 .dll 都输出一行路径,警告信息多次重复等),TokenJuice 的 DedupeAdjacentSkipPatterns 步骤对这类结构化冗余非常有效。

再看性能指标:

指标 目标值
单次调用延迟(100KB 输入) < 5 ms
冷启动规则加载(129 条) < 50 ms
内存开销 < 输入体积的 1.2 倍
NativeAOT 二进制增量 < 500 KB

5ms 处理 100KB、50ms 冷启动加载 129 条规则——这些数据意味着 TokenJuice 的性能开销对于 Agent 工作流来说是完全可忽略的。内存开销控制在输入的 1.2 倍以内,也避免了在处理大输出时的内存压力。


七、对 .NET 生态 AI Agent 建设的意义

TokenJuice 这个 PR 的价值,远不止于一个"压缩工具"那么简单。它在多个层面都具有示范意义:

第一,它证明了 OpenClaw.NET 社区的工程成熟度。 一个 400 Stars 的非官方 .NET 实现,能够产出近万行代码的高质量 PR,包含 11 个集成测试、2181 个测试全量通过、完整的双语文档——这已经达到了生产级开源项目的交付标准。

第二,它为 .NET AI Agent 生态提供了一个关键的运行时优化组件。 Agent 的性能不仅取决于模型本身,也取决于运行时的工程效率。TokenJuice 通过降低 Token 消耗,直接降低了 LLM 调用成本、提升了响应速度、扩大了有效上下文窗口——这三点对 Agent 的实际体验都有质的提升。

第三,它的架构设计为同类工具提供了参考。 三层规则配置体系、Fail-open 安全策略、九步归约管道、语义密度兜底——这些设计模式可以被推广到其他 Agent 运行时甚至其他语言的实现中。实际上,TokenJuice 本身就是受到了上游 vincentkoc/tokenjuice(Python 实现)的启发,这种跨语言的技术迁移和本地化改造,正是开源社区协作的典范。

第四,NativeAOT 兼容性为 .NET 在 AI 基础设施领域的竞争力加分。 在 AI 基础设施普遍追求高性能、低延迟、小部署体积的趋势下,.NET 的 NativeAOT 能力是一个差异化优势。TokenJuice 坚持零反射、零运行时代码生成,是对这一技术路线的有力背书。


八、总结与展望

TokenJuice 是 OpenClaw.NET 生态中一个非常扎实的大型功能 PR。它没有追逐花哨的概念,而是直面一个每个 Agent 开发者都遇到过的真实痛点:上下文窗口被工具输出中的噪音无限膨胀

它的解决方案也足够优雅——不引入额外的 LLM 调用,不牺牲确定性,不增加外部依赖,用静态规则 + 流水线处理,在 < 5ms 内完成 50%-95% 的压缩。Fail-open 的设计哲学、三层规则配置体系、NativeAOT 兼容性,都体现了对生产环境的深刻理解。

目前 PR 处于待合并状态。如果最终合并,OpenClaw.NET 将成为 .NET 生态中第一个内置原生工具输出归约引擎的 Agent 平台——这对在生产环境部署 Agent 的 .NET 团队来说,是一个非常有吸引力的差异化能力。

而对于更广泛的 AI Agent 开发者社区,TokenJuice 的设计思路也提供了一个重要启示:优化 LLM 上下文的质量,和优化模型本身一样重要。在你急着升级到下一个更大参数的模型之前,也许应该先问问自己——你的上下文窗口里,有多少是真正有用的信息?

毕竟,减掉不该存在的东西,往往比增加更多东西更有价值。


参考链接

  1. OpenClaw.NET PR #155 — TokenJuice: https://github.com/clawdotnet/openclaw.net/pull/155
  2. OpenClaw.NET 仓库: https://github.com/clawdotnet/openclaw.net
  3. 上游 TokenJuice (Python 实现): https://github.com/vincentkoc/tokenjuice