Claude Code Harness深度分析:从RAG、Skill、Memory到企业Agent落地
Claude Code Harness深度分析:从RAG、Skill、Memory到企业Agent落地
这篇文章我想解决的不是“Claude Code 源码里有哪些文件”,而是三个更实际的问题:
- 看完源码后,
RAG在 agent harness 里到底应该怎么理解? skill和memory到底是什么,它们和 prompt、tool、agent 的边界在哪里?- 如果我后面要在公司里做提效、做 skill、做 agent,有哪些东西可以直接借鉴?
如果你也有类似困惑,那这篇会比普通源码感想更适合你。
先说明边界:
本文基于 Claude Code 相关公开发布包和还原出来的工程样本做分析,也参考了 Claude Code 源码教学指南 这种章节化讲解方式,但下面的内容是我结合自己阅读源码后的原创整理与判断,重点放在“怎样用这些理解去做自己的系统”。
一、先给一张图:Claude Code 这类 harness 到底在干嘛
很多人会把 Claude Code 理解成:
1 | 用户输入 -> 模型回答 -> 偶尔调工具 |
但如果你从源码角度看,它其实更像下面这套系统:
flowchart LR
U[用户请求] --> R[路由与任务识别]
R --> SK[Skill 选择]
R --> Q[Query Engine / Turn Loop]
SK --> Q
M1[静态规则\nCLAUDE.md / instructions] --> Q
M2[动态记忆\nmemdir relevant memories] --> Q
M3[会话摘要\nSession Memory / compact summary] --> Q
S1[Skill Search\nloadSkillsDir / skillSearch] --> Q
Q --> T[工具运行时]
T --> L[本地工具\nRead/Edit/Bash]
T --> X[MCP / 外部系统]
T --> SE[结构化 Session]
Q --> SE
SE --> C[Compaction / Summary]
C --> M3
SE --> E[Resume / Export / Inspect]
这张图里最重要的结论是:
RAG不是孤立模块,而是上下文装配机制skill不是一段 prompt,而是任务方法包memory不是神秘长期记忆,而是多层上下文系统session不是聊天记录,而是运行时状态资产
你如果把这几层关系看懂了,后面自己做 agent 时就不会只盯着模型。
二、一次任务是怎么跑完的:流程图先立住
flowchart TD
A[用户输入需求 / 问题 / 指令] --> B[命令路由 / 意图判断]
B --> C{是否命中特定 skill}
C -->|是| D[装配 skill workflow]
C -->|否| E[走通用 agent 路径]
D --> F[读取长期规则\nCLAUDE.md / 项目 instructions]
E --> F
F --> G[检索相关 skills / memories / resources]
G --> H[构建当前回合上下文]
H --> I[模型决定是否调用工具]
I --> J[执行工具 / MCP]
J --> K[把 tool_use / tool_result 写入 session]
K --> L{上下文是否逼近上限}
L -->|否| M[继续下一轮]
L -->|是| N[compact / session memory 更新]
N --> M
这条链路说明,真正的 agent runtime 在做的是:
- 把任务放到正确轨道
- 给当前轨道装配合适上下文
- 让执行结果能沉淀回系统
这比“让模型回答更聪明”重要得多。
三、看完源码后,我对 RAG 的理解改变了
这是我最想讲清楚的一段。
很多人一说 RAG,脑子里只剩:
- chunk
- embedding
- vector db
- top-k
但看完 Claude Code 这类 harness 以后,我现在更愿意把 RAG 定义成:
在任务执行前,把当前这轮真正需要的上下文,从多个知识源里检出来,再装配进模型可用上下文。
这个定义比“向量检索”大很多,也更接近工程现实。
1. 在 Claude 这类 harness 里,RAG 至少有四层
| 层 | 来源 | 它解决什么问题 | 更像什么 |
|---|---|---|---|
| 静态规则检索 | CLAUDE.md / instructions |
这次执行必须遵守哪些长期规则 | 文件注入 |
| skill 检索 | loadSkillsDir / skillSearch |
这类任务该走哪套 workflow | 方法检索 |
| memory 检索 | memdir/findRelevantMemories |
当前 query 还需要哪些经验或提醒 | 相关经验检索 |
| session 检索 | SessionMemory / compact summary |
当前会话已经形成了哪些阶段性结论 | 状态回收 |
所以从 harness 角度讲,RAG 不只是“查知识库”,而是:
规则、方法、经验、状态,这四类上下文的统一检索与装配。
2. 这份源码里最有启发的一点:它不迷信“必须向量化”
比如 findRelevantMemories.ts 的思路,给我的冲击挺大。
它没有一上来就做那种标准企业宣传版 RAG:
1 | 全量切块 -> embedding -> ANN 检索 -> rerank |
它更像是:
- 先扫描 memory 文件头部和描述
- 形成结构化候选列表
- 再用一个侧路模型判断哪些 memory 确实有帮助
这说明一个很重要的现实:
很多企业内部知识场景,先把知识组织好、先把候选缩小,再做模型选择,已经比盲目全量向量化更有性价比。
这对你后面在公司里做提效特别重要,因为它意味着你完全可以先走这条更稳的路线:
- 先把知识做成结构化文档、规则文件、FAQ、案例卡片
- 再做目录扫描、标签过滤、头部摘要
- 最后让模型做轻量选择
如果连知识组织都没做好,直接上向量库,通常只是把混乱放大。
3. 所以,企业里真正该做的 RAG,不是“搭一个库”,而是“搭一条检索链”
我现在会把企业 agent 的 RAG 拆成这几个动作:
- 当前任务属于哪个域
- 这个域有哪些固定规则
- 这个任务要不要命中特定 skill
- 这个 skill 需要哪些工具和资料
- 当前会话已有结论里哪些需要带入下一轮
- 有没有历史案例值得补进来
这才是一个真正能工作的 RAG。
四、看完源码后,我对 skill 的理解是什么
如果说以前我会把 skill 理解成“一个写得不错的提示词模板”,那现在我会更明确地说:
skill 是 workflow + policy + tool contract 的组合。
为什么?
因为从 loadSkillsDir.ts 暴露出来的字段看,一个 skill 不是只有正文,它还会带上这些信息:
descriptionwhen_to_useallowed-toolsargumentshooksmodeleffortpathsexecutionContext
这意味着 skill 的职责不是“多说几句怎么做”,而是把整个任务方法显式化。
1. skill 不是知识点,而是方法包
这点非常关键。
比如:
remember不是在讲记忆理论,而是在告诉系统“什么时候该沉淀记忆”verify不是在讲测试概念,而是在固化“做完以后怎么验证”stuck不是在讲 debugging,而是在约束“卡住时怎么脱困”
这说明好的 skill 不是“解释”,而是“带执行语义的工作流”。
2. skill 和 tool 的边界
这也是很多人做 agent 时最容易混掉的地方。
-
tool是动作能力
比如读文件、改文件、跑命令、查 MCP 资源 -
skill是动作编排
比如先搜代码,再找相似实现,再改,再跑测试,再总结
一个 skill 可能会用到多个 tool;
一个 tool 也会被多个 skill 复用。
所以 skill 永远不该被做成“某个工具的说明书”,而应该是“某类任务的最佳路径”。
3. skill 和 agent 的边界
我现在会这么分:
skill负责沉淀做事方法agent负责执行和调度tool负责完成具体动作
这三层拆开以后,你的系统才能复用。
如果把 skill 和 agent 写死绑定,后面一旦流程变化,整个系统很快会变得很重。
4. 对你做公司 skill 的直接帮助
以后你在公司里写 skill,建议强制自己回答这 6 个问题:
- 这个 skill 解决哪类任务?
- 触发时先查什么?
- 哪些工具优先用?
- 输出格式是什么?
- 成功标准是什么?
- 如果证据不够或执行失败,下一步怎么补救?
如果这 6 个问题答不清,这个 skill 大概率还是 prompt,不是 workflow。
五、看完源码后,我对 memory 的理解是什么
以前很多人一听 memory,会先想到“长期记忆”“跨会话记住用户偏好”。
但从 Claude Code 这类 harness 的实现来看,memory 的价值其实更工程化:
memory 的本质不是记住一切,而是让系统在多轮和跨轮执行中保持稳定工作方式。
更具体一点说,它是个分层系统。
1. 第一层:静态规则型 memory
比如:
CLAUDE.md.claude/instructions.md- 项目级约束文件
这一层保存的不是临时事实,而是长期有效的约束:
- 项目规范
- 测试命令
- 提交约定
- 工具偏好
- 风险边界
这一层对企业最有价值,因为它:
- 可见
- 可 review
- 可 diff
- 可版本化
- 可协作
它比“神秘自动记忆”更适合团队环境。
2. 第二层:会话摘要型 memory
SessionMemory/sessionMemory.ts 非常有意思。
它不是让主线程每一轮都自己回忆,而是后台周期性提取当前会话里的关键结论,整理成 markdown 形式的会话记忆。
这意味着它在做的其实是:
把长链路、多噪声的会话过程,提纯成可继续利用的阶段状态。
对企业任务这非常重要,因为真实工作流往往是:
- 先澄清需求
- 再查代码
- 再查日志
- 再试修改
- 再验证
- 再回顾
如果没有这层摘要型 memory,任务一长,系统就会开始遗忘自己已经做到了哪一步。
3. 第三层:动态相关 memory
这层最像 memdir/findRelevantMemories.ts。
它不是把所有 memory 全塞进上下文,而是只选当前 query 真能用上的几个。
所以动态 memory 的重点不是“多存”,而是“选准”。
4. 我现在对 memory 的最终理解
如果让我压成一句话:
- 静态规则 memory 负责稳定约束
- 会话摘要 memory 负责阶段状态
- 动态相关 memory 负责当前命中
这三层加起来,才是一个真正可运行的 memory 系统。
六、把 RAG、Skill、Memory 放在一起看,它们分别扮演什么角色
这一段最适合你后面做自己的系统时反复回来看。
| 能力 | 回答的问题 | 最像什么 | 对系统的价值 |
|---|---|---|---|
| RAG | 这轮需要什么上下文? | 检索与装配 | 降低上下文噪声 |
| Skill | 这类任务应该怎么做? | 工作流模板 | 提高执行稳定性 |
| Memory | 系统应该记住什么? | 规则与状态层 | 提高多轮连续性 |
如果把它们混在一起,你的系统会很难长大。
最常见的错误是:
错误 1:把 skill 写成 memory
比如把一整个排障流程写进长期规则里。
结果是规则文件越来越臃肿,系统每轮都背着无关流程跑。
错误 2:把 memory 当 skill
比如把“数据库表 owner 是谁”“某个接口调用链是什么”这类知识写进 skill。
结果 skill 变成知识垃圾桶。
错误 3:把 RAG 当成万能修复器
很多系统上下文乱、方法乱、状态乱,最后希望“多检索一点”来补。
但 RAG 解决的是“拿什么上下文”,不是“方法本身对不对”。
七、如果你后面要做公司提效,最值得借鉴什么
我尽量只讲可落地的。
1. 先跑通一个高价值闭环,不要一开始做“大而全平台”
看完这类源码后很容易上头,想做“公司版 Claude Code”。
但更现实的做法是先只打通一个高价值闭环,比如:
- 需求单 -> 技术方案草稿
- traceId / issue -> 问题分析报告
- 代码 diff -> 风险点与测试建议
- 发布单 -> 发布前核对清单
先把一条链路打深,比同时做十条半残链路更值钱。
2. 最先值得 skill 化的,一定是高频、稳定、可标准化的流程
我会优先选这些:
- 问题排查 skill
- 技术方案生成 skill
- 代码审查 / 风险评估 skill
- 集成测试设计 skill
- 发布校验 skill
为什么?
因为这些场景:
- 高频出现
- 步骤相对稳定
- 输出格式容易约束
- 特别适合把经验沉淀下来
3. 企业 memory 先做“文件化规则”,不要急着做“超级记忆大脑”
第一批最值钱的 memory,通常是这些:
- 项目规范
- 模块边界说明
- 常见故障案例
- 术语字典
- 默认链路与 owner 约定
- 工具选路约定
只要这些能被结构化、可检索、可维护,你的 agent 就已经比“裸模型”强很多。
4. 真正要补的不是“万能问答”,而是“上下文装配”
很多企业 agent 做不起来,不是模型弱,而是每次执行前拿到的上下文太乱。
你真正该补的是:
- 当前任务归属哪个域
- 对应 skill 是什么
- 该加载哪些规则文件
- 该检索哪些经验
- 允许调用哪些工具
- 当前会话已经产出了哪些阶段结论
这就是 harness 思维。
5. session 一定要当资产管理
如果你做公司 agent,session 至少要做到:
- 可回放
- 可审计
- 可恢复
- 可摘要
- 可导出
否则它永远只能停留在 demo 阶段。
八、如果你现在就要做一个公司内提效 agent,我建议的最小架构
别追求完整,先做下面这个:
flowchart LR
A[用户请求\n需求 / 故障 / 改动] --> B[任务分类器]
B --> C[选择 skill]
C --> D[加载静态规则\n规范 / 指令 / 约束]
C --> E[检索动态记忆\n案例 / FAQ / 经验]
D --> F[组装当前上下文]
E --> F
F --> G[Agent 执行]
G --> H[工具层\n代码 / 日志 / 配置 / 数据 / 发布]
H --> I[产出结果\n方案 / 结论 / 修复建议]
I --> J[写入 session / summary]
J --> K[把可复用经验沉淀回 memory]
这套最小架构里,最该先补的不是更强模型,而是这五层:
- 任务分类
- skill 选择
- 静态规则装配
- 动态记忆检索
- session summary
这五件事顺起来,你的系统就会开始从“偶尔有用”变成“逐渐稳定”。
九、你可以马上做的 3 类 skill
如果你现在就想动手,我建议你优先做下面这三类。
1. 问题分析型 skill
适用场景:
- 线上报错
- traceId 排查
- Jira 问题定位
输出应该固定为:
- 现象
- 证据
- 归属模块
- 风险面
- 下一步建议
2. 方案生成型 skill
适用场景:
- 需求评审前
- 技术方案初稿
- 系统边界梳理
输出应该固定为:
- 背景
- 现状
- 目标
- 改造点
- 风险点
- 测试点
3. 变更验证型 skill
适用场景:
- 代码改完以后
- 提交 PR / MR 前
- 联调前
输出应该固定为:
- 改动摘要
- 风险点
- 覆盖测试
- 未验证项
- 发布注意事项
这三类 skill 的共同点是:
- 高频
- 复用价值高
- 对稳定格式有强需求
最适合当企业提效的第一批抓手。
十、你可以马上做的 2 种 agent 形态
我不建议一开始就做十几个 agent team。
先做这两种就够了:
1. 单主控 + 多 skill 的 agent
特点:
- 一个主 agent 负责理解任务
- 按需选择 skill
- 统一调工具
- 统一写 session 与 memory
优点是简单、稳、容易审计。
2. 主控 agent + 子 agent 的有限协作
适合场景:
- 主 agent 做调度
- 子 agent 分别负责搜索、实现、验证
但前提是你已经把:
- session
- memory
- tool contract
- 输出格式
这些基础设施打稳。
否则 multi-agent 只会放大混乱。
十一、最后压一句最关键的话
如果要我把整篇文章只压成一句判断,我会说:
Claude Code 这类 harness 真正值得学的,不是它“用了哪个模型”,而是它把 检索、方法、记忆、执行、压缩 做成了一个能长期运转的系统。
对你后面做公司提效来说,这个启发非常直接:
- 别先追求“万能智能体”
- 先做清楚上下文装配
- 先沉淀高频 skill
- 先建立文件化 memory
- 先把 session 当资产
当这些基础设施长出来以后,agent 才会开始真的有复利。
延伸阅读
- 如果你想先看更偏基础的骨架梳理,可以读 Claude Code Agent Harness入门:从Skills、Session到Memory说起。
- 如果你想看更偏工程拆解的版本,可以读 Claude Code Agent Harness工程拆解:Skills、Session与记忆系统的实现骨架。
- 如果你想把这些理解放回自己的 AI 规划里,可以读 关于AI的思考与未来方向。




