关注腾讯云开发者,一手技术干货提前解锁👇
本文基于真实工程实践,结合 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
→ 条件剪枝:只在特定场景下才生效,不浪费 tokenRules 分级本质上是对 AI 搜索空间的剪枝——L1 永久剪掉明显错误的分支,L2 按需剪掉不需要的路径。
映射三:suggest-compact 阈值调优 = MCTS 的「模拟评估参数调优」
// .codebuddy/hooks/suggest-compact.js
const THRESHOLD = 35; // 从 50 调优到 35
// 工具调用超过 35 次 → 建议 /compactMCTS 中模拟次数(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):
-
方案切换必须清理残留 — 切换方案后全文搜索旧关键词(防止两套方案并存)
-
通用控件保护 — 改公共组件前先评估所有引用方影响面
-
改动完整性 — template/script/style 同步,
ref()vs 普通变量,导出与引用同步 -
场景全覆盖 — 多端(PC/Mobile)、多调用方、多层守卫、tab 缓存
-
避免策略反复 — 先了解全部约束再定方案,确定后不轻易切换
-
异步操作所有路径必须有终态 — 所有退出路径(成功/失败/提前 return)都必须重置 loading
-
Vue 响应式纯净性 —
computed/Pinia getter 禁止副作用 -
调试硬编码必须打标记并清理 — 统一格式:
[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 或 DeepSeek3.3 每日配额分配建议
Claude(~25%) → 关键任务:新功能开发、代码审查、架构设计、上线前 review
DeepSeek(~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.1KV 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 tokensRules 分级最终状态
| 级别 | 文件 | 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
快速估算 ≈ 文件字符数 ÷ 205
Part 5 · 马上就能用上的实战 Tips
5.1 Prompt 模板速查****
| 场景 | 推荐格式 | 示例 |
|---|---|---|
| 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 条黄金法则****
-
先搜后写 — 动手写代码前,先搜索项目中是否已有可复用实现(
search-gate.js会自动提醒) -
精准定位 — 用
@文件:行号而不是模糊描述 -
单一职责 — 每次对话只做一件事
-
选对 Skill — 简单修改不加载 Skill,流程型任务用 disable-model-invocation Skill
-
及时 compact — 35 次工具调用后考虑
/compact(compact 后 SessionStart Hook 自动重注入约定) -
信任 Hooks — Hook 拦截意味着有风险,不要绕过
-
沉淀经验 — 重要决策写 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-invocation
grep -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-
原创作者|马俊昌
感谢你读到这里,不如关注一下?👇

📢📢****来抢开发者限席名额!点击下方图片直达👇


你对本文内容有哪些看法?同意、反对、困惑的地方是?欢迎留言,我们将邀请作者针对性回复你的评论,欢迎评论留言补充。我们将选取1则优质的评论,送出腾讯云定制文件袋套装1个(见下图)。6月30日中午12点开奖。

扫码领取腾讯云开发者专属服务器代金券!


[

[

[


