返回博客列表

一天省 60 刀:DeepSeek-Reasonix 把缓存命中率干到 99.82%

2026-05-29T22:15:00+08:00
DeepSeekReasonixCoding AgentPrefix CacheCLI开源

一天省 60 刀:DeepSeek-Reasonix 把缓存命中率干到 99.82%

用 DeepSeek API 写代码,你以为最贵的是模型调用?错。最贵的是重复发送同样的上下文

一个正常编程 session 里,系统提示词、工具定义、历史对话这些内容占了 90% 以上的 token,而且每次请求几乎一模一样。DeepSeek 提供了前缀缓存——命中时价格是正常输入的 10%。但问题是:大多数 Agent 框架的缓存命中率只有 20-60%,因为它们的循环设计会不断破坏前缀字节对齐。

DeepSeek-Reasonix 干了一件狠事:把整个 Agent 循环围绕缓存稳定性重新设计。结果?真实用户单日 4.35 亿输入 token,99.82% 缓存命中,花费 $1.38——没有缓存的话是 $61。

13,644 Stars,790 Forks,MIT 协议,TypeScript 实现。

本文提纲

  1. 为什么缓存命中率是 Coding Agent 的命脉
  2. 三根支柱:缓存优先循环、工具调用修复、成本控制
  3. 99.82% 命中率是怎么做到的
  4. 工具调用修复:应对 DeepSeek 的四个故障模式
  5. 成本控制:从 Flash 到 Pro 的分层策略
  6. 上手体验:五分钟跑起来

为什么缓存命中率是 Coding Agent 的命脉

先算一笔账。DeepSeek v4-flash 的定价(每百万 token):

类型 价格
输入(缓存未命中) $0.14
输入(缓存命中) $0.0028
输出 $0.28

缓存命中时,输入成本降了 50 倍。一个长 session 动辄上亿输入 token,命中率的差别就是 $1 和 $60 的差别。

DeepSeek 的前缀缓存机制有一个硬性要求:请求的字节前缀必须和上一次请求完全一致。差一个字节,缓存就失效。

大多数 Agent 框架在循环中会做这些事:

  • 重新排列历史消息
  • 动态修改系统提示词(注入时间戳、计数器等)
  • 在对话中内联工具结果,改变前缀结构
  • 每次请求重新序列化工具定义

每一个操作都会破坏前缀字节对齐,缓存命中率直线下降。

三根支柱:缓存优先循环、工具调用修复、成本控制

Reasonix 的架构围绕三根支柱构建,每一根都解决通用 Agent 框架根本没注意到的问题:

graph TB
    subgraph ReasonixArchitecture
        P1["Pillar 1
Cache-First Loop
Immutable prefix design"] P2["Pillar 2
Tool-Call Repair
4-pass error recovery"] P3["Pillar 3
Cost Control
Flash-first tiering"] end P1 -->|stable prefix| P2 P2 -->|clean calls| P3 P3 -->|low cost| GOAL["Leave-it-running agent"]

Pillar 1 — 缓存优先循环

Reasonix 把上下文分成三个区域:

┌─────────────────────────────────────────┐
│ IMMUTABLE PREFIX                        │ ← session 内固定不变
│   system + tool_specs + few_shots        │   缓存命中候选
├─────────────────────────────────────────┤
│ APPEND-ONLY LOG                         │ ← 单调增长
│   [assistant₁][tool₁][assistant₂]...    │   保持之前 turn 的前缀
├─────────────────────────────────────────┤
│ VOLATILE SCRATCH                        │ ← 每 turn 重置
│   R1 thought, transient plan state      │   永远不发送上游
└─────────────────────────────────────────┘

三条不变量:

  1. 前缀只算一次,计算后哈希并锁定,session 内不再变
  2. 日志只追加,不重写、不重排
  3. 临时草稿独立存储,通过 Pillar 2 提炼后才折叠进日志

当上下文接近上限时,Reasonix 不会重写已有内容——而是把旧 turn 摘要成一条新消息追加到前缀后面。前缀本身不变,缓存照常命中。

99.82% 命中率是怎么做到的

这不是理论数字,是真实用户 2026-05-01 的 DeepSeek 后台截图:

指标 数值
缓存命中 token 435,033,856
缓存未命中 token 767,616
缓存命中率 99.82%
当日实际花费 $1.38(v4-flash)
无缓存同等负载 $61.06

对比其他客户端的典型命中率:

  • DeepSeek 官方网页聊天:60-80%(单对话内),新 session 归零
  • Cherry Studio / Open WebUI 等通用 SDK:30-60%
  • Cline / Continue 等 XML 工具调用客户端:更低(工具结果内联到对话,移位字节)

Reasonix 的 99.82% 来自四个设计决策的叠加效果:

  1. ImmutablePrefix — 系统提示词 + 工具规格在 session 启动时冻结
  2. AppendOnlyLog — turn 只追加,不重排不编辑
  3. VolatileScratch — 思维链和临时状态放在缓存前缀之外
  4. Auto-compact — 上下文溢出时折叠旧 turn,但不修改前缀

这四个机制各守一个防线,缺一个都达不到这个数字。

工具调用修复:应对 DeepSeek 的四个故障模式

DeepSeek 模型在工具调用上有一些经验性的故障模式。Reasonix 没有假装它们不存在,而是为每种模式建了专门的修复管线:

Pass 1 — flatten(扁平化)

参数超过 10 个或嵌套深度超过 2 层时,DeepSeek 容易丢参数。flatten 自动检测复杂 schema,把参数展开成点分 notation 给模型看,调用时再重新嵌套回去。

Pass 2 — scavenge(回收)

有时候 DeepSeek 会把工具调用的 JSON 写在 reasoning_content(思维过程)里,但忘记在最终消息中输出。scavenge 用正则 + JSON 解析器扫描思维过程,把遗漏的工具调用捡回来。

Pass 3 — truncation(截断修复)

max_tokens 限制导致 JSON 输出被截断。truncation 检测不平衡的 JSON,尝试自动闭合括号,或者请求一个续写补全。

Pass 4 — storm(风暴抑制)

同一 (tool, args) 在滑动窗口内重复出现——模型反复调用同一个工具。storm 直接抑制重复调用,注入一条反思 turn 让模型换个方向。

这四个 pass 串联运行,每 pass 独立处理自己的故障模式。它们不是可选优化——是 Reasonix 循环的固定环节。

成本控制:从 Flash 到 Pro 的分层策略

Reasonix v0.6 引入了完整的成本控制体系。核心思路:大部分 turn 不需要最强模型

三档预设

预设 模型 适用场景 成本倍率
flash v4-flash 日常编码
auto(默认) flash → 按需升级 pro 混合场景 1-3×
pro v4-pro 复杂推理 ~12×

默认 auto 模式下,大部分 turn 跑 flash,遇到困难 turn 自动升级到 pro。所有辅助调用(摘要、子 agent、截断修复重试)强制使用 flash,没有理由用 pro 价格跑"把工具结果改写成自然语言"这种任务。

模型自我升级

模型自己判断当前任务是否超出自己的能力范围。如果 flash 模型觉得这个任务需要更强的推理,它会在回复的第一行输出 <<<NEEDS_PRO>>> 标记。系统立即中止当前 flash 调用,用 pro 重跑这个 turn。

没有失败计数器,没有工具错误统计,纯粹靠模型自省。简单直接。

Turn 级自动压缩

每个工具结果超过 3000 token 的,在 turn 结束时自动压缩到这个上限。模型在当前 turn 看到完整内容,后续 turn 只看到摘要。如果后续需要细节,多一次 read_file 调用比把 12KB 拖进每个未来 prompt 便宜得多。

上手体验:五分钟跑起来

# 安装(Node >= 22)
npm install -g reasonix

# 进入项目目录,启动
cd my-project
reasonix code

首次运行会要求粘贴 DeepSeek API Key。之后自动记住。

不想全局安装的话:

npx reasonix code   # 一次性运行,总是最新版

核心命令

命令 用途
reasonix code [dir] 编码 Agent,挂载文件系统和 Shell 工具
reasonix chat 纯聊天,不碰磁盘
reasonix run "task" 一次性执行,输出到 stdout
reasonix doctor 环境检查:Node、API Key、MCP

内建能力

  • SEARCH/REPLACE 编辑:Agent 提出修改建议,/apply 后才落盘
  • MCP 支持:stdio + SSE + Streamable HTTP
  • Skills 系统:Markdown 格式的可复用剧本,支持 subagent 隔离执行
  • Memory:用户私有知识钉入前缀,跨 session 保持
  • Hooks:生命周期事件触发 Shell 命令
  • Web 搜索:支持 Bing、百度、SearXNG、Tavily 等 8 种引擎
  • QQ 通道:把现有 session 延伸到 QQ,远程交互
  • 桌面客户端:Tauri 原生 GUI(预发布阶段)

与同类工具对比

特性 Reasonix Claude Code Cursor Aider
后端 DeepSeek Anthropic OpenAI/Anthropic 任意(OpenRouter)
协议 MIT 闭源 闭源 Apache 2
DeepSeek 前缀缓存 深度优化 不适用 不适用 偶发命中
单任务成本 订阅+用量 取决于模型
内建 Web Dashboard N/A

Reasonix 有意不支持多后端——绑定 DeepSeek 是特性不是限制。只有绑定一个后端,才能把缓存优化到极致。


作者: itech001 来源: 公众号:AI人工智能时代 网站: https://www.theaiera.cn/ 每日分享最前沿的AI新闻资讯和技术研究。

本文首发于 AI人工智能时代,转载请注明出处。

觉得文章不错?分享给更多人!