云加社区

从Harness架构到Token经济学的探索

关注腾讯云开发者,一手技术干货提前解锁👇

本文基于真实工程实践,结合 Harness Engineering 领域的学术论文,分享 AI 辅助编程的架构思考、工程落地与 Token 成本优化。

01

Part 1 ·什么是 Harness,它从哪儿来
1.1一个让所有人都很沮丧的问题

你有没有遇到过这种情况——

  • 花半小时纠正 AI 的一个错误,在 Prompt 里写清楚「不要这样做」,第二天开了新会话,AI 毫不犹豫地……又犯了同样的错

  • 换了个更贵的模型,效果并没有你期望的那么好

  • 同一套代码,别人的 AI 跑得很顺,你接进来却各种翻车

2025 年,LangChain 发布了一组实验数据:

给同一个大语言模型换上一套更精巧的 Harness 架构,它在 TerminalBench 2.0(AI 编程能力权威榜单)的通过率,从 52.8% 直接拉升到 66.5%。 底层模型权重一个字节没改,单靠换壳,排名从 30 名开外飙进前 5。

这说明一件事:很多时候卡住你的,不是模型,是模型外面那层「壳」。

1.2 Harness 是什么

Harness(直译「挽具/线束」)是包裹在大模型外面的那套代码,它决定三件事:

模型能看到什么(存什么、取什么、怎么呈现)模型的行为边界在哪里(什么能做、什么不能做)模型如何知道自己做对了(验证、反馈、修正)

「The model contains the intelligence and the harness is the system that makes that intelligence useful.」 —— LangChain, The Anatomy of an Agent Harness, 2026.03

一个公式:Agent = Model + Harness

1.3 Harness Engineering 的诞生史

这个概念并不是一夜冒出来的,而是被一个个真实 Bug 逼出来的。

时间
里程碑
核心贡献
2022
ReAct 论文
(Yao et al., ICLR 2023)
提出 Thought-Action-Observation 循环,推理与行动交错
2023
Reflexion 论文
(Shinn et al., NeurIPS 2023)
失败→反思报告→写入长期记忆,实现「语言强化学习」
2023
Tree of Thoughts
(Yao et al., NeurIPS 2023)
推理从「链」扩展为「树」,支持 BFS/DFS 多路径搜索+回溯
2025.11
Anthropic: Effective Harnesses for Long-Running Agents
双 Agent 架构 + 进度追踪文件,解决长任务跨窗口失忆
2026.02
Mitchell Hashimoto 命名 Harness Engineering
「每次发现 Agent 犯错,就设计一个让它永远不再犯的方案」
2026.02
OpenAI: Harness Engineering(Codex)
3 人 5 月,100 万行代码,1500 PR,零行人工编写代码
2026.03
LangChain: Anatomy of an Agent Harness
将 Cybernetics(控制论)引入 Harness 框架
2026.04
Thoughtworks(martinfowler.com)
前馈控制 vs 反馈控制的系统化分类
2026
Meta-Harness
(Stanford/MIT/KRAFTON)
AI 自动搜索最优 Harness 代码,同一模型性能差距最高 6 倍
1.4 支撑 Harness 的核心数学与算法

Harness 不是玄学,它有扎实的理论基础。


① 反馈控制论(Cybernetics)— Wiener, 1948

Harness 的本质可以用控制论的「双环控制」来描述:

┌──────────────────────────────────────────────────────────────────┐│                  Harness 双环控制结构                             ││                                                                  ││  ┌─────────────────────────────────────────────────────────┐     ││  │               前馈控制(开环)                            │     ││  │                                                         │     ││  │  设计时注入 ──► Rules / Skills ──► AI 推理上下文          │     ││  │  (先验知识)    (约束边界)        (行动之前就生效)      │     ││  └─────────────────────────────────────────────────────────┘     ││                                                                  ││  ┌─────────────────────────────────────────────────────────┐     ││  │               反馈控制(闭环)                            │     ││  │                                                         │     ││  │  AI 行动 ──► 检测结果 ──► 偏差计算 ──► 阻止/纠正            │     ││  │             (Hooks)    (质量阈值)   (deny/ask)       │     ││  └─────────────────────────────────────────────────────────┘     ││                                                                  ││  工程映射:Rules(前馈)+ Hooks(反馈)= Harness 的双保险            │└──────────────────────────────────────────────────────────────────┘

数学基础:负反馈系统的稳定性定理(Nyquist, 1932)——只要反馈增益 < 1,系统趋于稳定。Hooks 的 deny 机制本质上是一个「增益截断器」。


② ReAct 循环(Thought-Action-Observation)

> 论文:ReAct: Synergizing Reasoning and Acting in Language Models,Yao et al., ICLR 2023

ReAct 的本质是一个推理与行动交替的循环:

Thought(思考)→ Action(工具调用)→ Observation(观察结果)→ Thought(下一轮)...

每一次工具调用就是 ReAct 的一次迭代。而在项目的 Harness 中,这个循环的三阶段分别被 Rules 和 Hooks 接管:

ReAct 阶段
Harness 对应层
.codebuddy 配置
Thought
(AI 思考该怎么做)
Rules
 约束推理方向
project-rules.md
 规定了技术栈和目录结构,让 AI 不会想错方向
Action
(AI 决定调用工具)
PreToolUse Hooks
 拦截
settings.json
 中配置了 guard-commands.sh、protect-files.sh 等,在行动前检查安全性
Observation
(工具返回结果)
PostToolUse Hooks
 反馈
impact-analysis.sh
 检测到改了公共组件后,自动 grep 全仓库引用方,把影响面报告追加到 Observation

以 settings.json 中的 Hook 配置为例:

// .codebuddy/settings.json — PreToolUse 阶段{  "matcher": "Write|Edit",  "hooks": [    { "command": ".../protect-files.sh" },      // Action 前:敏感文件保护    { "command": ".../search-gate.js" },        // Action 前:首次写入提醒先搜索    { "command": ".../suggest-compact.js" }     // Action 前:工具调用次数检查  ]}

ReAct + Harness 的关键洞察:没有 Harness 的 ReAct 就像没有刹车的车——它能跑,但不知道什么时候该停。Hooks 就是在 Action 阶段加的「刹车系统」。


③ Reflexion — 反思记忆机制

论文:Reflexion: Language Agents with Verbal Reinforcement Learning,Shinn et al., NeurIPS 2023

Reflexion 的核心是从失败中提取反思,写入长期记忆,供下次任务召回。 把流程从「AI 自动生成」变成了「工程师手工沉淀 + 自动注入」的工程化版本。

Reflexion 在 项目中的三层实现:

第一层:反思提取 → ai-coding-defense.md

原始论文中,AI 在任务失败后自动生成反思报告。我们从真实 Bug 中手工提炼规则:

<!-- .codebuddy/rules/ai-coding-defense.md(alwaysApply) -->## 8 条编码红线(来自真实 Bug)1. 方案切换必须清理残留 —— 切换后全文搜索旧关键词2. 通用控件保护 —— 改公共组件前先评估引用方3. 改动完整性 —— template/script/style 同步4. 场景全覆盖 —— 多端、多调用方、多层守卫5. 避免策略反复 —— 先了解全部约束再定方案6. 异步操作所有路径必须有终态 —— loading 必须重置7. Vue 响应式纯净性 —— computed/Pinia getter 禁止副作用8. 调试硬编码必须打标记并清理 —— [xxx-debug] / __DEBUG_*__

每一条都对应一个或一组真实踩过的坑。这就是 Reflexion 中「失败 → 反思」的人工版。

第二层:记忆持久化 → .codebuddy/memory/

# .codebuddy/memory/ 目录结构memory/├── MEMORY.md          # 长期记忆(项目约定、技术决策等核心结论)├── 2026-06-09.md      # 当日工作记录(每次完成实质性工作后追加)└── archive/           # 归档(30天以上的旧记录,不再注入)

memory 是 CodeBuddy 的内部记忆——单个 memory 文件本身不会被注入上下文、不消耗 token,它只是 AI 跨会话持续学习的存储介质。archive-old-memories.sh 负责把过期记录归档,保持目录整洁。

第三层:记忆召回 → alwaysApply: true + SessionStart Hook

// .codebuddy/settings.json"SessionStart": [{  "matcher": "compact",  "hooks": [{    "command": "echo '项目 关键约定(compact 后重新注入):1) pnpm 2) request.ts ...'"  }]}]

/compact 会清空上下文,导致 AI「失忆」。SessionStart Hook 在 compact 触发后自动重新注入关键约定,这是 Reflexion 中「episodic memory 持久化」的工程实现。

对比总结:

Reflexion 论文
项目工程化
配置文件
AI 自动生成反思报告
工程师从 Bug 中提炼规则
ai-coding-defense.md
写入 episodic memory
写入 memory/ 目录
memory/*.md
记忆老化(未覆盖)
30 天自动归档
archive-old-memories.sh
下次任务自动召回
alwaysApply + SessionStart Hook
settings.json
 SessionStart

④ 蒙特卡洛树搜索(MCTS)

相关论文:CodeTree (Li et al., 2023)、RethinkMCTS (Zhang et al., 2024)

MCTS 的核心是「不一条路走到黑」:生成多个候选方案 → 模拟评估 → 选择最优 → 必要时回溯。这在 Harness 工程中有三层映射。

映射一:dev 阶段2 = MCTS 的「展开 + 选择」

<!-- .codebuddy/skills/项目-dev/SKILL.md 阶段2 节选 -->## 阶段 2:代码设计1. 搜索项目中类似功能的现有实现2. 评估复用 vs 新建 → 优先复用3. 如果新建,出 2-3 个方案 → 列出每个的优缺点4. 用户确认方案后再进入阶段3

这和 MCTS 的 Expansion + Selection 完全对应:不是直接写代码,而是先出方案树,评估后再选。

映射二:Rules 分级体系 = MCTS 的「剪枝」

<!-- .codebuddy/rules/ 分级设计 -->L1 核心(alwaysApply):project-rules.md / ai-coding-defense.md  → 永久剪枝:AI 永远不会考虑「用 npm 而不是 pnpm」这种错误分支
L2 场景(按需):atomic-step-commit / search-first / debug-residue  → 条件剪枝:只在特定场景下才生效,不浪费 token

Rules 分级本质上是对 AI 搜索空间的剪枝——L1 永久剪掉明显错误的分支,L2 按需剪掉不需要的路径。

映射三:suggest-compact 阈值调优 = MCTS 的「模拟评估参数调优」

// .codebuddy/hooks/suggest-compact.jsconst THRESHOLD = 35;  // 从 50 调优到 35// 工具调用超过 35 次 → 建议 /compact

MCTS 中模拟次数(rollout count)决定了评估的准确度。suggest-compact 的阈值从 50→35,就是根据实际观察(AI 在 35 次后质量明显下降)对「何时该回溯(compact)」这个参数的调优。

映射四:impact-analysis.sh = MCTS 的「节点评估函数」

# .codebuddy/hooks/impact-analysis.sh# 改公共组件时,自动 grep 全仓库引用方# 输出:影响 N 个文件,M 个调用点# → 评估值 = 影响面大小,帮助决定是否继续展开这个分支

一句话总结:MCTS 教我们的不是「让 AI 更聪明」,而是「给 AI 设计一个能试错的机制」——出方案 → 评估 → 选最优 → compact 后重来。


⑤ 信息熵压缩

无 Harness 的搜索空间:  N 个可能的操作,每步有 N 种选择 → 路径空间 = N!(阶乘爆炸)
加上 Rules(约束)后:  「禁止 10 类操作」+ 「必须按 5 步流程」→ 路径空间 ≈ k×N(线性)
信息论解释:  Rules = 先验知识注入 → H(行动|规则) << H(行动) → 搜索熵大幅下降
这就是为什么「壳越精巧,模型表现越好」:  不是模型变聪明了,是它需要搜索的空间被大幅压缩了。

02

Part 2 · .codebuddy 的 Harness 实践

以下所有内容均来自 .codebuddy/ 的真实配置,不是理想状态,是我们现在正在用的东西。

2.1 架构全景

.codebuddy/ 由四层能力组成:

┌─────────────────────────────────────────────────────────────────┐│                     CodeBuddy IDE Runtime                       │├─────────────────────────────────────────────────────────────────┤│                                                                 ││  Commands(入口)    Skills(能力)       Rules(约束)            ││  /review-commit     项目-dev            ai-coding-defense      ││  /review-branch     quick-iterate        project-rules          ││  /deploy-test       figma-to-code        search-first           ││                     proto-sync           atomic-step-commit     ││                     git-commit-push      debug-residue          ││                                                                 ││  Hooks(自动兜底)                                               ││  guard-commands / commit-quality / protect-files                ││  config-protection / search-gate / suggest-compact              ││  post-edit-accumulator / large-file-blocker / impact-analysis   ││  stop-format-typecheck                                          ││                                                                 │└─────────────────────────────────────────────────────────────────┘

四层的职责分工:

层
定位
触发方式
Token 消耗
Commands
流程入口(/review-commit、/deploy-test)
用户手动执行
极低(轻量指令)
Skills
领域能力包(项目-dev、quick-iterate 等)
用户 Prompt 触发
2K ~ 11K
Rules
约束层(始终激活 or 按需加载)
alwaysApply 或关键词匹配
0 ~ 5.8K
Hooks
自动化兜底(AI 生命周期钩子)
工具调用自动触发
0(脚本执行)
2.2 Hooks 体系——反馈控制的工程实现

Hooks 是 Harness「反馈控制」层最具体的落地,也是我们花时间最多的部分。

所有 Hook 都在 AI 生命周期的三个时机自动触发:

用户发出指令    │    ▼Agent 决定调用工具(Write / Edit / Bash)    │    ├──► PreToolUse Hooks(行动之前)    │    ├── guard-commands.sh    ─ 危险命令?→ deny 阻止    │    ├── commit-quality.sh   ─ 质量不过?→ deny 阻止    │    ├── protect-files.sh    ─ 敏感文件?→ deny 阻止    │    ├── config-protection.sh─ 配置文件?→ ask 询问用户    │    ├── search-gate.js      ─ 首次写入业务目录?→ allow + 提醒    │    └── suggest-compact.js  ─ 调用超 35 次?→ allow + 提醒    │    ▼ 全部放行后,工具执行    │    ├──► PostToolUse Hooks(行动之后)    │    ├── post-edit-accumulator.js ─ 累积编辑文件路径    │    ├── large-file-blocker.sh    ─ 文件 > 400 行?→ 提醒拆分    │    ├── impact-analysis.sh       ─ 改公共组件?→ 自动影响面分析    │    └── post-commit-review.sh    ─ commit ≥ 3 文件?→ 提醒 /review-commit    │    ▼ Agent 停止时    │    └──► Stop Hook         └── stop-format-typecheck.js ─ 批量 eslint --fix + 调试扫描

每个 Hook 解决的真实问题:

Hook
解决什么问题
对应的 AI 常见错误
commit-quality.sh
拦截裸 console、调试残留、非规范 commit msg
AI 忘记清理调试代码就提交
search-gate.js
首次写入业务目录时提醒先搜索
AI 重复造轮子,不知道项目已有实现
suggest-compact.js
调用 35 次后建议 /compact
上下文膨胀导致 AI 质量下降
impact-analysis.sh
改公共组件时自动分析引用方
AI 改了 BlockUploader 却不知道影响了多少页面
stop-format-typecheck.js
每次停止前批量格式化
AI 改完不跑 lint,留下格式问题
config-protection.sh
修改构建配置时询问
AI 随意动 nuxt.config / eslint.config
large-file-blocker.sh
写入 > 400 行文件时提醒拆分
AI 把所有逻辑堆在一个文件
SessionStart compact
compact 后重新注入 7 条关键约定
compact 后 AI 「忘记」项目规范
2.3 Rules 体系——前馈控制的工程实现

Rules 对应控制论的「前馈控制」:在 AI 行动之前,就把约束注入到上下文中。

分级体系(避免把所有规则都 alwaysApply):

级别
加载方式
文件
作用
L1 核心
(always)
每次对话自动注入
project-rules.md
(~3.5K tokens)
技术栈、目录、接口规范、8 条 DO NOT
L1 核心
(always)
每次对话自动注入
ai-coding-defense.md
(~1.5K tokens)
8 条编码红线(历史 Bug 提炼)
L1 核心
(always)
每次对话自动注入
plan-cleanup.mdc
(~800 tokens)
Plan 文件管理规范
L2 场景
(按需)
关键词触发
atomic-step-commit.mdc
多步骤任务原子化提交工作流
L2 场景
(按需)
写入业务目录时
search-first.md
编码前先搜索复用
L2 场景
(按需)
调试/commit 场景
debug-residue.md
调试残留统一标记格式

ai-coding-defense.md 的 8 条编码红线(全来自项目真实 Bug):

  1. 方案切换必须清理残留 — 切换方案后全文搜索旧关键词(防止两套方案并存)

  2. 通用控件保护 — 改公共组件前先评估所有引用方影响面

  3. 改动完整性 — template/script/style 同步,ref() vs 普通变量,导出与引用同步

  4. 场景全覆盖 — 多端(PC/Mobile)、多调用方、多层守卫、tab 缓存

  5. 避免策略反复 — 先了解全部约束再定方案,确定后不轻易切换

  6. 异步操作所有路径必须有终态 — 所有退出路径(成功/失败/提前 return)都必须重置 loading

  7. Vue 响应式纯净性 — computed/Pinia getter 禁止副作用

  8. 调试硬编码必须打标记并清理 — 统一格式:[xxx-debug]、__DEBUG_*__、TODO(debug-only):

这 8 条规则的特殊之处:不是「建议」,是「工具会拦」。commit-quality.sh 在 git commit 前自动扫描 [xxx-debug]__DEBUG_*__TODO(debug-only) 标记,命中即拒绝提交。

这就是 Reflexion 论文的工程版:历史 Bug → 提炼反思 → 写入「记忆」→ 每次对话注入 → AI 不再犯同类错误。

2.4 Skills 体系——领域知识封装(最新:disable-model-invocation)

Skills 是领域能力包,把「怎么在项目里做一件事」的完整工作流封装起来。

Skills 决策树:

用户说了什么?├── 提到 Figma 链接              → figma-to-code├── 「更新 proto」「同步接口」     → proto-sync(disable-model-invocation)├── 完整需求 + 设计稿 + 多文件    → 项目-dev├── 简短修改指令(< 20 字)       → quick-iterate├── 「提交」「推送」「commit」     → git-commit-push(disable-model-invocation)└── 不确定                       → 不加载 Skill,按 rules 执行
Skill
触发场景
Token 消耗
核心价值
dev
完整新功能、多文件联动、含设计稿
~11K
完整的 5 阶段工作流:需求理解→设计→编码→验证→沉淀
quick-iterate
样式微调、文案修改、小交互变更
~2K
精准定位改动范围,避免过度推断
figma-to-code
Figma 链接设计稿还原
~5K
Figma API + 项目组件规范的结合
proto-sync
Proto 文件更新
~3K
类型生成→接口封装→调用方更新的固定流程
git-commit-push
提交代码
~2K
conventional commits + TAPD 关联

dev 的 5 阶段工作流(对应 ReAct 的 Plan→Execute→Verify 循环):

阶段 1:需求理解 + Plan 创建  → 读 Figma/需求文档 → 拆解步骤 → 两轮自我优化(边界条件 + 测试矩阵)
阶段 2:代码设计  → 读现有类似实现 → 确定方案(不新建轮子)→ 用户确认
阶段 3:编码实现  → 按 Plan 分步 → 每步 lint/type-check → 每步提交
阶段 4:验证测试  → 端到端验证 → 边界回归 → 再优化一轮
阶段 5:沉淀  → 写 plan 实施记录 → 更新 memory → 更新 docs/dev/
2.5 原子化提交工作流

这是 atomic-step-commit.mdc 的核心设计,也是我们避免「大 PR 噩梦」的关键。

核心原则:每步 = 最小可独立验证单元

错误做法(反模式):  一口气改 10 个文件 → 统一提交 → 发现问题不知道哪步引入的正确做法:  步骤 1:store 新增字段 → lint + type-check → commit feat(store): ...  步骤 2:API 层封装 → lint + type-check → commit feat(api): ...  步骤 3:组件消费 → lint + type-check → commit feat(component): ...  最终:整体验证 + 再优化一轮 → 用户 review

三种 Review 模式(根据任务风险选择):

模式
场景
AI 行为
A. 自行 review
低风险日常开发
每步 lint/type-check 后自动 commit,直接继续,不打断用户
B. 用户 review
高风险改动
每步完成后停下等用户确认,确认才继续
C. 传统模式
改动关联性强
统一修改所有步骤,中间不 commit,最后一起 review

03

Part 3 · 模型选型与配额策略
3.1可用模型一览
模型
定位
适合场景
上下文窗口
Claude
复杂推理、大上下文、指令遵循最强
多文件联动、架构设计、代码审查、新功能开发
大(100K+)
DeepSeek
代码理解强、性价比高、速度快
日常开发主力:单文件 bug fix、样式调整、proto 同步
中等(32K)
GLM
轻量省 token、长时自主任务
批量操作、文案文档、零碎问答
中等(32K)
Hy3 preview
内部新模型,日常开发能力好
DeepSeek 的替代方案,可尝鲜日常开发
中等
3.2 按开发场景选型(决策树)
任务有多复杂?├── 3+ 文件联动 / Skill 加载 / 架构设计   → Claude│   (原因:需要大窗口承载 Skill ~11K + Rules ~15K + 多文件代码)├── 单文件修改 / 中等 bug / proto 同步     → DeepSeek / Hy3│   (原因:上下文需求小,性价比高,速度快)├── 批量操作 / 文案文档 / 零碎问答        → GLM│   (原因:不需要复杂推理,最省 token)└── 不确定                               → Auto 或 DeepSeek
3.3 每日配额分配建议
Claude(~25%)    → 关键任务:新功能开发、代码审查、架构设计、上线前 reviewDeepSeek(~50%)  → 日常主力:bug fix、样式调整、proto 同步、git 提交GLM(~15%)       → 批量/轻量:改文案、问答、文档注释Hy3(~10%)       → 尝鲜/备选:日常开发验证
3.4 注意事项
  • 小窗口模型 + dev Skill:Skill ~11K + Rules ~15K ≈ 26K,32K 窗口只剩 ~6K → 建议拆分任务,每次只执行 1 阶段,或改用 Claude

  • 长文件(> 300 行)建议用 Claude,小窗口模型可能截断

  • 多轮对话超过 5 轮深度建议切 Claude,小模型容易丢失早期上下文

  • 流程型 Skill(proto-sync / git-commit-push)已设 disable-model-invocation: true,可用 DeepSeek/GLM 执行,不浪费大模型配额

04

Part 4 · Token 经济学:成本从哪里来、怎么省
4.1每次对话的固定开销从哪里来

先搞清楚一次对话的「账单」:

每次对话基础开销分解(项目,优化后):─────────────────────────────────────────────System Prompt(IDE 内置,不可控)          ~5K tokens─────────────────────────────────────────────alwaysApply Rules├── project-rules.md(精简后)             ~3.5K tokens├── ai-coding-defense.md                  ~1.5K tokens└── plan-cleanup.mdc                      ~800 tokens小计                                       ~5.8K tokens─────────────────────────────────────────────workspace_rules(IDE 自动注入)            ~5K tokens(去重后)─────────────────────────────────────────────Memories(自动注入)                       ~500-1K tokens─────────────────────────────────────────────合计基础开销                               ~15K tokens═════════════════════════════════════════════

Transformer 的 KV Cache 机制(理解成本的关键)

要真正理解 Token 成本,必须先理解 KV Cache。

什么是 KV Cache?

Transformer 的自注意力机制中,每个 token 在处理时需要与序列中所有之前的 token 计算注意力。对于序列中第 i 个 token,注意力计算为:

Attention(Q, K, V) = softmax(QK^T / √d_k) · V
其中:  Q = 当前 token 的 Query 向量  K = 所有历史 token 的 Key 向量矩阵  ← 每次推理都要重新计算,代价极大  V = 所有历史 token 的 Value 向量矩阵 ← 同上
KV Cache:把已经计算过的 K/V 向量缓存起来,下次推理直接复用  → 前缀相同的请求,缓存命中 → 计算成本降至 ×0.1

KV Cache 在工程中的三层意义:

┌─────────────────────────────────────────────────────────────────┐│                  KV Cache 工程全景                               ││                                                                 ││  1. 前缀缓存(Prefix Caching)                                   ││  ─────────────────────────────                                  ││  System Prompt + alwaysApply Rules(~15K tokens)               ││       │                                                         ││       ▼ 第一次请求:full compute                                 ││       ▼ 后续请求:cache hit → ×0.1 成本                          ││                                                                 ││  结论:稳定的 Rules 文本 = 高命中率 = 实际成本远低于字面字数         ││                                                                 ││  2. 多轮对话复用                                                 ││  ──────────────                                                 ││  同一会话多轮 → 相同前缀 KV 直接复用,不重新 prefill                ││  这是为什么「长对话」不如「长×单价」那么贵                           ││                                                                 ││  3. Agent 多轮工具调用                                           ││  ───────────────────                                            ││  ReAct 循环中,每次 Observation 追加到序列尾部                     ││  前面的 KV 已缓存 → 只需计算新增 token 的 KV                       ││  智能体密集调用工具时,KV Cache 是性能的关键支撑                     │└─────────────────────────────────────────────────────────────────┘

Harness 调度层的 KV 管理职责:

智能体多轮工具调用、长代码库上下文极度依赖高性能 KV Cache。Harness 调度层还要做:
├── 多会话 KV 隔离│   不同用户的会话 KV 不能共用(安全边界),│   但同一用户的多轮对话要尽量复用(命中前缀缓存)│├── 过期上下文回收│   超过窗口的 KV 及时释放(prevent memory leak),│   /compact 命令触发的就是这个机制的应用层接口│└── 前缀树管理(Radix Tree)    相同前缀的请求共享 KV 存储,    这是 alwaysApply Rules「一次计算,多次复用」的底层支撑
4.3 优化前后对比:-36% 的从何而来
指标
优化前
优化后
降幅
alwaysApply Rules
~11K
~5.8K
-47%
workspace_rules
~12.5K
~5K
-60%
每对话基础开销
~23.5K
~15K
-36%
项目-dev Skill
~15K
~11K
-27%
32K 窗口剩余空间
~8.5K
~17K
+100%

对于流程型 Skill(proto-sync、git-commit-push),新增了 disable-model-invocation: true 标记——这类 Skill 是纯脚本执行流程,加载后 AI 按步骤执行即可,不需要再次调用大模型推理,直接节省每步骤的推理 token。

根因分析(三类问题):

原始问题:~23.5K 基础开销中,有 ~8.5K 是「重复注入」或「不必要的 alwaysApply」
① 重复注入(~6K)  ├── my-rule.mdc 内容 = workspace_rules「Homepage 项目规则」→ 注入两遍  └── project-rules.md §4 内容 ≈ workspace_rules 各条目描述 → 逐字重复
② 不必要的 alwaysApply(~4.3K)  ├── atomic-step-commit:只有 10% 的对话需要多步骤流程  └── search-first:已有 search-gate.js hook 物理提醒,规则层面双重冗余
③ 空白占位(~500)  └── TODO 占位符、空的章节头、模板示范修复逻辑:消除重复 + 按需加载 + 清理空白 = 节省 ~8.5K tokens

Rules 分级最终状态

级别
文件
alwaysApply
每对话消耗
L1 核心project-rules.md
✅
~3.5K
L1 核心ai-coding-defense.md
✅
~1.5K
L1 核心plan-cleanup.mdc
✅
~800
L2 场景atomic-step-commit.mdc
❌
0(按需)
L2 场景search-first.md
❌
0(按需)
L2 场景debug-residue.md
❌
0(按需)
L2 场景my-rule.mdc
(占位)
❌
0
4.4 四层配置成本控制策略
层
核心原则
具体做法
Rules
只有「每次都必须遵守」的才 alwaysApply
3 条 L1 核心 + 3 条 L2 按需
Skills
按场景精准选择,流程型 Skill 设 disable-model-invocation
简单改动用 quick-iterate(~2K),不用项目-dev(~11K)
Memory
只存核心结论,30 天以上自动归档
控制在 ~500 字以内,archive-old-memories.sh 定期执行
Plans
不自动注入,0 固定消耗
保留作参考,不删除
4.5 用户习惯对 Token 的影响
低效做法
高效做法
Token 差距
「帮我看看 Editor 有什么问题」
@Editor.vue:63 insertBlock 无 catch
~3K
「优化一下这个页面」
@Banner.vue 按钮圆角改 12px
~5K
「帮我加个功能」
需求:投票按钮 文件:ActivityCard.vue + useVoteStore
~8K
一次说 5 个需求
每个需求独立对话
~15K+
长对话一直跑
35 次工具调用后 /compact
~5-10K

Token 估算公式(快速心算):

Token 数 ≈ 中文字符数 ÷ 1.5 + 英文字符数 ÷ 4快速估算 ≈ 文件字符数 ÷ 2

05

Part 5 · 马上就能用上的实战 Tips
5.1Prompt 模板速查
场景
推荐格式
示例
Bug 修复@文件:行号 现象:X 预期:Y@Editor.vue:63 点击按钮没反应,预期弹出侧栏
样式调整@文件 把 A 改成 B
(附截图)
@Banner.vue 圆角改成 12px
(附设计稿截图)
新功能需求:X 涉及文件:A,B 注意:Y需求:加投票按钮 涉及:ActivityCard.vue + useVoteStore 注意:SSR 兼容
代码审查/review-commit 关注:X/review-commit 关注:类型安全和 SSR 兼容
设计稿还原按 Figma 还原 {链接}按 Figma 还原 https://www.figma.com/design/ABC?node-id=123
proto 同步/proto-sync
触发 proto-sync Skill(disable-model-invocation,省配额)
提交代码/git-commit-push
触发 git-commit-push Skill,自动关联 TAPD
5.2 对话管理策略
✅ 推荐做法
效果
每个主题开新对话
上下文干净,AI 不混淆
改完一个模块就 /review-commit
及时发现问题
任务切换时执行 /compact
清理 5-10K 过期上下文(SessionStart Hook 会自动重新注入项目约定)
用 @文件:行号 精确指定位置
减少 2-3 轮搜索
流程型任务用对应 Skill
proto-sync/git-commit-push 设了 disable-model-invocation,省大模型配额
❌ 避免做法
问题
一个对话混杂多个不相关任务
上下文膨胀,质量下降
遇到报错在同一对话反复重试
应贴报错 + compact + 精准重试
说「帮我优化一下」但不给方向
AI 会过度重构
遇到 Hook 拦截就绕过
Hook 拦截意味着有风险,要读原因
5.3 7 条黄金法则
  1. 先搜后写 — 动手写代码前,先搜索项目中是否已有可复用实现(search-gate.js 会自动提醒)

  2. 精准定位 — 用 @文件:行号 而不是模糊描述

  3. 单一职责 — 每次对话只做一件事

  4. 选对 Skill — 简单修改不加载 Skill,流程型任务用 disable-model-invocation Skill

  5. 及时 compact — 35 次工具调用后考虑 /compact(compact 后 SessionStart Hook 自动重注入约定)

  6. 信任 Hooks — Hook 拦截意味着有风险,不要绕过

  7. 沉淀经验 — 重要决策写 plan,核心结论存 memory(30天自动归档)

5.4 常见误区纠正

误区 1:「换更好的模型就能解决问题」 LangChain 实验证明仅改 Harness 可提升 13 个百分点。先检查 Harness,再换模型。

误区 2:「Rules 越多越好」 Rules 有成本。只有「每次对话都必须遵守」的才值得 alwaysApply,其余一律按需加载。

误区 3:「Hook 很烦,直接 --no-verify 绕过」 Hook 拦截说明有潜在风险。先读拦截原因,修正后再提交。--no-verify 在 Code Review 时可见。

误区 4:「Memory 越详细越好」 Memory 每次都注入。只存核心结论,定期运行 archive-old-memories.sh 归档老记录。

误区 5:「compact 之后项目规范就丢了」 不会了。SessionStart Hook 会在 compact 触发后自动重新注入 7 条关键约定。

误区 6:「所有 Skill 都需要 AI 推理」 流程型 Skill(proto-sync/git-commit-push)设了 disable-model-invocation: true,加载后按固定步骤执行,不触发额外推理,可以用更省配额的模型跑。

5.5 快速审计你自己的 .codebuddy
# 查看所有 alwaysApply Rules 的大小grep -rl "alwaysApply: true" .codebuddy/rules/ | xargs wc -m
# 查看 memory 总大小find .codebuddy/memory -name "*.md" -exec wc -m {} + | tail -1
# 检查是否有新增的 alwaysApply 规则grep -l "alwaysApply: true" .codebuddy/rules/*.md .codebuddy/rules/*.mdc 2>/dev/null
# 查看哪些 Skill 没有设置退出条件(exit condition)grep -rL "exit\|退出\|DONE\|complete" .codebuddy/skills/*/SKILL.md
# 查看哪些 Skill 是流程型但未设 disable-model-invocationgrep -rL "disable-model-invocation" .codebuddy/skills/*/SKILL.md

判断标准:

  • alwaysApply Rules 总字符数控制在 20K 以内(约 10K tokens),超出就要做一次规则降级或精简

  • memory 文件超过 30 天的,运行 archive-old-memories.sh 归档

  • 流程型 Skill(固定步骤执行)建议设 disable-model-invocation: true

参考资料

学术论文

论文
作者/机构
发表
核心贡献
ReAct: Synergizing Reasoning and Acting in Language Models
Yao et al.
ICLR 2023
Thought-Action-Observation 循环
Reflexion: Language Agents with Verbal Reinforcement Learning
Shinn et al.
NeurIPS 2023
语言形式反思记忆
Tree of Thoughts: Deliberate Problem Solving with Large Language Models
Yao et al.
NeurIPS 2023
多路径推理树 + BFS/DFS
Efficient Memory Management for Large Language Model Serving with PagedAttention
Kwon et al.
SOSP 2023
KV Cache 页式内存管理
GQA: Training Generalized Multi-Query Transformer Models from Multi-Head Checkpoints
Ainslie et al.
EMNLP 2023
分组查询注意力,KV 显存减少 70%+
Meta-Harness: End-to-End Optimization of Model Harnesses
Lee et al.
arXiv 2026
自动搜索最优 Harness 代码
Dive into Claude Code: The Design Space of AI Agent Systems
VILA-Lab
arXiv 2026.04
1.6% AI 逻辑 + 98.4% 基础设施
SWE-bench: Can Language Models Resolve Real-world Github Issues?
—
ICLR 2024
AI 编程能力评测基准

工程文章

文章
机构
时间
Effective Harnesses for Long-Running Agents
Anthropic
2025.11
My AI Adoption Journey(命名 Harness Engineering)
Mitchell Hashimoto
2026.02
Harness Engineering: Leveraging Codex in an Agent-First World
OpenAI
2026.02
The Anatomy of an Agent Harness
LangChain
2026.03
Harness Design for Long-Running Application Development
Anthropic
2026.03
Harness Engineering for Coding Agent Users
Thoughtworks(martinfowler.com)
2026.04

项目文件(.codebuddy/)

  • README.md — AI 编程辅助体系总览

  • ai-infra-analysis.md — Token 消耗深度分析(含优化前后对比)

  • rules/ai-coding-defense.md — 8 条编码红线

  • rules/atomic-step-commit.mdc — 原子化提交工作流

  • hooks/README.md — Hooks 体系完整文档

  • scripts/archive-old-memories.sh — memory 归档脚本

  • scripts/impact-analysis.sh — 影响面分析脚本

-End-
原创作者|马俊昌

感谢你读到这里,不如关注一下?👇

图片
📢📢来抢开发者限席名额!点击下方图片直达👇
Image
Image
你对本文内容有哪些看法?同意、反对、困惑的地方是?欢迎留言,我们将邀请作者针对性回复你的评论,欢迎评论留言补充。我们将选取1则优质的评论,送出腾讯云定制文件袋套装1个(见下图)。6月30日中午12点开奖。
Image
扫码领取腾讯云开发者专属服务器代金券!
图片
Image
Image
Image
Image
Image