首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >从Harness架构到Token经济学的探索

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

作者头像
腾讯云开发者
发布2026-06-23 17:06:56
发布2026-06-23 17:06:56
80
举报

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

本文基于真实工程实践,结合 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(直译「挽具/线束」)是包裹在大模型外面的那套代码,它决定三件事:

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

「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 的本质可以用控制论的「双环控制」来描述:

代码语言:javascript
复制
┌──────────────────────────────────────────────────────────────────┐
│                  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 的本质是一个推理与行动交替的循环:

代码语言:javascript
复制
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 配置为例:

代码语言:javascript
复制
// .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 中手工提炼规则:

代码语言:javascript
复制
<!-- .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/

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

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

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

代码语言:javascript
复制
// .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 的「展开 + 选择」

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

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

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

代码语言:javascript
复制
<!-- .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 的「模拟评估参数调优」

代码语言:javascript
复制
// .codebuddy/hooks/suggest-compact.js
const THRESHOLD = 35;  // 从 50 调优到 35
// 工具调用超过 35 次 → 建议 /compact

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

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

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

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


⑤ 信息熵压缩

代码语言:javascript
复制
无 Harness 的搜索空间:
  N 个可能的操作,每步有 N 种选择 → 路径空间 = N!(阶乘爆炸)

加上 Rules(约束)后:
  「禁止 10 类操作」+ 「必须按 5 步流程」→ 路径空间 ≈ k×N(线性)

信息论解释:
  Rules = 先验知识注入 → H(行动|规则) << H(行动) → 搜索熵大幅下降

这就是为什么「壳越精巧,模型表现越好」:
  不是模型变聪明了,是它需要搜索的空间被大幅压缩了。

02

Part 2 · .codebuddy 的 Harness 实践

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

2.1 架构全景

.codebuddy/ 由四层能力组成:

代码语言:javascript
复制
┌─────────────────────────────────────────────────────────────────┐
│                     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 生命周期的三个时机自动触发:

代码语言:javascript
复制
用户发出指令
    │
    ▼
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 决策树:

代码语言:javascript
复制
用户说了什么?
├── 提到 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 循环):

代码语言:javascript
复制
阶段 1:需求理解 + Plan 创建
  → 读 Figma/需求文档 → 拆解步骤 → 两轮自我优化(边界条件 + 测试矩阵)

阶段 2:代码设计
  → 读现有类似实现 → 确定方案(不新建轮子)→ 用户确认

阶段 3:编码实现
  → 按 Plan 分步 → 每步 lint/type-check → 每步提交

阶段 4:验证测试
  → 端到端验证 → 边界回归 → 再优化一轮

阶段 5:沉淀
  → 写 plan 实施记录 → 更新 memory → 更新 docs/dev/

2.5 原子化提交工作流

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

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

代码语言:javascript
复制
错误做法(反模式):
  一口气改 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 按开发场景选型(决策树)

代码语言:javascript
复制
任务有多复杂?
├── 3+ 文件联动 / Skill 加载 / 架构设计   → Claude
│   (原因:需要大窗口承载 Skill ~11K + Rules ~15K + 多文件代码)
├── 单文件修改 / 中等 bug / proto 同步     → DeepSeek / Hy3
│   (原因:上下文需求小,性价比高,速度快)
├── 批量操作 / 文案文档 / 零碎问答        → GLM
│   (原因:不需要复杂推理,最省 token)
└── 不确定                               → Auto 或 DeepSeek

3.3 每日配额分配建议

代码语言:javascript
复制
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 每次对话的固定开销从哪里来

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

代码语言:javascript
复制
每次对话基础开销分解(项目,优化后):
─────────────────────────────────────────────
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,注意力计算为:

代码语言:javascript
复制
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 在工程中的三层意义:

代码语言:javascript
复制
┌─────────────────────────────────────────────────────────────────┐
│                  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 管理职责:

代码语言:javascript
复制
智能体多轮工具调用、长代码库上下文极度依赖高性能 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-syncgit-commit-push),新增了 disable-model-invocation: true 标记——这类 Skill 是纯脚本执行流程,加载后 AI 按步骤执行即可,不需要再次调用大模型推理,直接节省每步骤的推理 token。

根因分析(三类问题):

代码语言:javascript
复制
原始问题:~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 估算公式(快速心算):

代码语言:javascript
复制
Token 数 ≈ 中文字符数 ÷ 1.5 + 英文字符数 ÷ 4
快速估算 ≈ 文件字符数 ÷ 2

05

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 条黄金法则

  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

代码语言:javascript
复制
# 查看所有 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点开奖。

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

图片
图片
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2026-06-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 腾讯云开发者 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 01
    • ① 反馈控制论(Cybernetics)— Wiener, 1948
    • ② ReAct 循环(Thought-Action-Observation)
    • ③ Reflexion — 反思记忆机制
    • ④ 蒙特卡洛树搜索(MCTS)
  • 02
  • 03
  • 04
    • Transformer 的 KV Cache 机制(理解成本的关键)
    • Rules 分级最终状态
  • 05
    • 学术论文
    • 工程文章
    • 项目文件(.codebuddy/)
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档