深度解析Claude Code在Prompt_Context_Harness的设计与实践
深度解析 Claude Code 在 Prompt / Context / Harness 的设计与实践
公众号: 阿里云开发者 发布时间: 2026-04-20 08:32 原文链接: https://mp.weixin.qq.com/s/YgGW92VBP8s846yzIxjVWQ
核心观点
Claude Code 的卓越表现不仅源于 Claude Opus 4.6 基座模型本身的强大,更得益于其在 Prompt Engineering、Context Engineering 和 Harness Engineering 三个维度上的顶级工程设计。这三大关键阶段分别聚焦于"如何说"、"让AI看什么"以及"构建怎样的运行环境",层层递进,共同致力于提升大模型在复杂任务中的可靠性与可控性。
要构建一个 95 分的 Agent 系统:直接通过 Prompt Engineering 只能实现 70+ 分,通过 Context Engineering 可以提升到 80~85 分,最后再通过 Harness Engineering 的约束,才能将其提升到 90~95 分。
Prompt Engineering:静态与动态信息的组装
System Prompt 的动态组装过程
Claude Code 的 System Prompt 是一个多层级、动态组装的过程,由多个文件协同工作,最终拼装成一个字符串数组发送给 Claude API。
组装流程:
- QueryEngine 发起请求:
QueryEngine.ask()→fetchSystemPromptParts()→buildEffectiveSystemPrompt()→query() - 获取三大组件:
defaultSystemPrompt:调用constants/prompts.ts中的getSystemPrompt()构建默认 promptsystemContext:调用context.ts获取 Git 状态信息userContext:获取 CLAUDE.md 内容 + 当前日期
- 组装默认 System Prompt:分为静态部分和动态部分
- 优先级决策:按优先级选择最终 prompt(overrideSystemPrompt > Coordinator prompt > Agent prompt > customSystemPrompt > defaultSystemPrompt)
- 注入上下文信息:追加 Git 状态,在用户消息列表最前面插入 CLAUDE.md 和日期
- 缓存分块:拆分成缓存友好的块,显式走 KV Cache
静态 Prompt 部分
包含 7 大模块,每个用户都会有这些静态 Prompt:
- 身份介绍:告诉 Claude 它是谁,应该做什么
- 系统行为规则:输出规则、权限模式、安全防护等
- 任务执行指南:编码风格、避免过度工程、不添加未要求的功能
- 操作安全守则:考虑可逆性和影响范围,不要随便删东西、推代码
- 工具使用指南:优先使用专用工具(Read、Edit、Write)而不是 Bash 命令
- 语气和风格:简洁、不用 emoji、引用代码时带行号
- 输出效率:要求 Claude 简洁输出,直奔主题
动态 Prompt 部分
在静态 Prompt 和动态 Prompt 之间有一个 __SYSTEM_PROMPT_DYNAMIC_BOUNDARY__ 边界,包含 11 个模块:
- 会话特定指导:根据当前会话启用的工具动态生成
- 自动记忆:加载用户的持久化记忆文件(MEMORY.md 等)
- 环境信息:工作目录、git 仓库、平台、shell、OS 版本、模型信息等
- 语言偏好:如果用户设置了语言偏好
- 输出风格:如果用户配置了自定义输出风格
- MCP 服务器指令:如果有连接的 MCP 服务器提供了使用说明
- 临时文件目录:如果启用了 Scratchpad 功能
- 函数结果清理:Old tool results 会自动清理
- 工具结果总结提示:提醒写下重要信息
- 长度锚点:内部版本的长度限制
- Token 预算:用户指定 token 目标时显示
给子 Agent 分配任务的 Prompt
Multi-Agent 架构中,Agent 之间的通信是一个难题。Claude Code 在 AgentTool 里的 Prompt 教主 Agent 怎么使用 AgentTool 来派遣子 Agent,包括:
- 有哪些下属(Agent 列表)
- 什么时候该自己干、什么时候该委派(When NOT to use)
- 怎么写工作说明(Writing the prompt)
- 反模式警告
Context Engineering:引导、压缩和记忆
CLAUDE.md 项目说明
CLAUDE.md 是给 Claude Code 写的"项目说明书"和"行为规范",内容会被注入到 System Prompt 中,作为对话的第一条消息,用 标签包裹,优先级很高。
四种路径:
- 个人通用偏好类:
~/.claude/CLAUDE.md,全局人设,跨项目生效 - 项目共享规范:项目根目录下的
CLAUDE.md,团队协作基石,提交到 Git - 个人私有指令:
CLAUDE.local.md,不该公开但必需的上下文,不提交到 Git - 按文件类型分类的规则:
.claude/rules/*.md目录,按文件类型或业务领域进行拆分
三层渐进式压缩体系
按照激进程度递增,在"保留关键信息"与"节省 token 成本"之间找到平衡:
Layer 1: MicroCompact(微压缩)
- 无 LLM 调用,纯规则驱动,极致轻量
- 定义可压缩工具白名单(Bash、Read、Grep、Glob 等)
- 对涉及核心状态变更的操作(Edit、Write)完整保留
- 图片内容统一按 2000 token 估算
- 两条执行路径:基于时间的路径(超时间阈值的旧消息截断)和基于缓存的路径(KV Cache 边界外压缩)
Layer 2: Session Memory Compact(会话记忆压缩)
- 基于已有会话记忆进行替换,零额外推理成本
- 触发门槛:Token 数 ≥ 10,000 且文本消息条数 ≥ 5 条
- 压缩上限:单次最大压缩 40,000 token
- 将符合条件的旧消息替换为会话记忆摘要,保留最近几轮消息
Layer 3: Full LLM Compact(完全压缩)
- 调用 LLM 生成结构化摘要,精度最高但成本也最高
- 强制模型遵循严格的 9 段式结构化模板:Primary Request and Intent、Key Technical Concepts、Files and Code Sections、Errors and fixes、Problem Solving、All user messages、Pending Tasks、Current Work、Optional Next Step
- 隐式思维链(Implicit CoT)优化:要求模型在
标签内进行全面推理,然后在标签中输出结果,程序剥离块,只保留纯净摘要 - 反工具调用保护:严厉禁止模型在压缩过程中调用任何工具
自动压缩触发机制
设定安全缓冲水位线(AUTOCOMPACT_BUFFER_TOKENS = 13,000),当上下文窗口剩余空间低于这个阈值时,自动介入判断。分级回退策略:
- 首选快速路径:首先尝试 Session Memory Compact
- 降级重型路径:如果 SM Compact 不满足条件或压缩后仍无法满足要求,回退到 Full LLM Compact
Memdir 结构化记忆系统
Memdir 将记忆明确拆解为四种核心类型:
- User(用户级):记录用户的个人偏好、操作习惯及特定指令风格
- Feedback(反馈级):存储模型行为的修正记录和历史纠错案例
- Project(项目级):固化项目层面的技术选型、架构决策和约束条件
- Reference(参考级):沉淀通用的文档片段和代码模式
记忆加载与检索
loadMemoryPrompt作为记忆加载的主入口,扫描记忆目录按类型归类整理,应用预算限制,动态裁剪记忆内容- LLM-in-the-loop 的检索策略:使用 Sonnet 模型充当"图书管理员",对候选记忆进行语义相关性判断,强制约束只返回最多 5 条最相关的记忆
Harness Engineering:环境、约束与控制
Harness Engineering 是在大模型之外构建一套外部的运行环境与约束机制,通过接口(Interface)、钩子(Hooks)、护栏(Guardrails)等手段,约束、引导、检验、评估 Agent 的行为。
系统级强提醒引导
System Reminder 动态注入机制
wrapInSystemReminder函数将所有需要注入系统的元信息统一包裹在标签中... - 应用场景:用户上下文初始化(CLAUDE.md、当前日期)、工具结果反馈、钩子反馈、周期性任务与能力描述
- 集成到消息规范化流程
normalizeMessagesForAPI中,标准化、可复用
六大系统内置 Agent Tool
1. General-Purpose Agent:万能打工人
- 工具权限:
tools: ['*'],拥有所有工具的使用权限 - 不指定模型:使用系统默认的子 Agent 模型
- System Prompt 简洁:把活干完,别镀金,也别干一半就跑
- 典型使用场景:搜索关键词、跨文件调查、执行多步骤的研究任务
2. Explore Agent:代码库侦察兵
- 速度优先的只读搜索专家
- 严格只读:禁止创建、修改、删除任何文件
- 使用 Haiku 模型:小、快、便宜
- 不加载 CLAUDE.md:
omitClaudeMd: true - 强调效率:尽可能多地并行调用工具
- 可指定搜索的"彻底程度":quick、medium、very thorough
3. Plan Agent:软件架构师
- 制定实施方案
- 严格只读:不能修改任何文件
- 继承父模型:用和主 Agent 一样的聪明模型
- 结构化输出:计划、步骤、关键文件、权衡
- 工作流程:理解需求 → 深入探索代码库 → 设计解决方案 → 详细规划
4. Verification Agent:质量检验官
最精妙、提示词最长的一个,体现 Harness Engineering 精髓。
五种设计哲学:
- 红蓝对抗:你的工作不是确认代码能跑——而是想办法把它搞崩
- 不要随便给 PASS:避免验证逃避(Verification Avoidance)和被前 80% 迷惑(Seduced by the First 80%)
- 严格的权限控制:只能看,不能改。唯一例外是可以往 /tmp 写临时测试脚本
- 按变更类型分类的验证策略:前端变更、后端/API、CLI/脚本、基础设施、Bug 修复、数据库迁移、重构、移动端
- 反偷懒话术:拆穿 AI 常见的自我开脱话术(代码看起来是对的、实现者的测试已经通过了、这大概没问题等)
5. Claude Code Guide Agent:Claude Code 使用说明书
- 知识领域:Claude Code CLI、Claude Agent SDK、Claude API
- 使用 Haiku 模型
- 权限模式 dontAsk:不需要向用户请求权限
- 动态上下文注入:System Prompt 会动态包含自定义技能、Agent、MCP 服务器配置和用户设置
6. Statusline Setup Agent:状态栏安装
- 只有两个工具:Read 和 Edit
- 使用 Sonnet 模型
- 橙色标识:表示"装修中"
- 知道怎么转换 PS1:能把 Shell 的 PS1 变量转成 Claude Code 的 statusLine 配置
7. Fork Sub Agent:隐藏的第七人
- 主 Agent 的"分身",继承完整对话历史
- 共享 Prompt Cache:fork 出来的子进程和父进程共享 prompt cache
- 严格的输出格式:以
Scope:开头,报告控制在 500 字以内 - 防止递归 fork:通过检测
标签阻止子进程再 fork - Worktree 隔离:可以在独立的 git worktree 中运行
设计思考:
- Token 成本:Explore、Guide 都用 Haiku,比 Opus 便宜很多
- 安全隔离:通过禁用工具实现"最小权限原则"
- 上下文管理:子 Agent 的工具输出不会污染主 Agent 的上下文窗口
- 并行效率:Verification Agent 在后台运行,不阻塞用户
精细化的安全体系
Permission Engine:规则的精细化权限控制
- 定义清晰的"三行为模型":Allow(自动允许)、Deny(自动拒绝)、Ask(请求确认)
- 多源规则配置,优先级覆盖机制:
settings.json→ CLI 参数 → 命令行规则 → session 规则
Sandbox Isolation:操作系统原型的沙箱隔离
- 基于
bubblewrap (bwrap)构建轻量级沙箱 - 文件系统隔离:只读挂载根目录和白名单目录机制
- 网络与进程隔离:独立的 Network 和 PID 命名空间
- 用户权限降级:强制以非 root 用户身份运行
- 智能决策逻辑:检测命令特征,按需隔离
异步生成器驱动的主循环
主循环被重构为一个 async function*(异步生成器),带来四个维度的质的飞跃:
- 流式处理与实时反馈:通过
yield关键字,逐步推送中间状态 - 协作式控制:调用者拥有对执行流的"暂停/恢复"权
- 优雅的取消机制:支持
return()方法,优雅地终止当前迭代 - 有状态的上下文维持:在多次
yield之间维护局部变量和运行时状态
六步 Pipeline:
- 消息预处理 Pipeline:对输入消息进行清洗、格式化及元数据注入
- 大模型 API 调用
- 响应解析与规划
- 工具执行与安全校验
- 结果产出:通过
yield抛给上层调用者 - 终止条件检查
错误重试与恢复策略:
- 上下文超长保护:启动三级压缩机制
- 输出截断自动续写:最多 3 次自动重试,发送
continue指令 - 网络波动平滑处理:指数退避重试算法
可编程的钩子拦截机制
在 hooks.ts 中实现了一个庞大的钩子系统,覆盖 20+ 种关键事件类型:
- 工具生命周期:PreToolUse、PostToolUse、ToolError
- 会话生命周期:SessionStart、SessionEnd、SessionPause、SessionResume
- 消息生命周期:PreSampling、PostSampling、UserPromptSubmit
- 文件操作:PreFileEdit、PostFileEdit、PreFileWrite、PostFileWrite
钩子的强大之处:
- 阻断执行:返回
{ "blocked": true, "reason": "..." }可直接熔断高危操作 - 动态篡改:通过
{ "input": {...} }或{ "output": {...} }实时修正工具的输入参数或清洗输出结果 - 反馈注入:利用
{ "message": "..." }向对话流中插入系统提示或用户通知 - 超时保护:全局常量
TOOL_HOOK_EXECUTION_TIMEOUT_MS(默认 10 分钟),超时强制终止
有趣的彩蛋
Caffeinate——给电脑灌咖啡,防止休眠
- 利用 macOS 内置命令
caffeinate阻止电脑休眠 - 只阻止空闲休眠,5 分钟后自动退出
- 每 4 分钟重启一次 caffeinate 进程,确保持续生效
Anti-Distillation:反蒸馏,防止模型被"偷学"
- 假的工具注入:设置
anti_distillation: ['fake_tools'],在数据里投毒 - 输出格式的蒸馏抵抗:精简输出模式,隐藏详细工具调用链,丢弃 Thinking Content
Undercover Mode:卧底模式
- Anthropic 的内部员工为公共/开源项目贡献代码时,隐藏 AI 身份
- 禁止出现"Claude Code"、"Co-Authored-By"、任何模型代号
Dogfooding 内部吃狗粮模式
- 通过
process.env.USER_TYPE === 'ant'区分内部和外部用户 - "ant" 是 Anthropic 的缩写,内部员工使用各种内部功能
用户情绪辱骂处理:AI 也知道你在骂它
- 用正则表达式匹配用户输入中的负面关键词
- 检测到用户在骂人后,弹出反馈调查,邀请分享对话记录
荒诞的加载动词:让等待变得有趣
- 一百多个疯狂的动词列表中随机选择:Boondoggling(做无意义的工作)、Flibbertigibbeting(话唠)、Discombobulating(把人搞迷糊)、Lollygagging(磨洋工)、Canoodling(卿卿我我)、Prestidigitating(变魔术)等
Buddy System:养个电子宠物
- 用
/buddy命令"孵化"一个专属电子宠物 - 十几种宠物:猫、鸭子、企鹅、水蜥、仙人掌、蘑菇、chonk(胖墩)
- 由用户 ID 通过 Mulberry32 伪随机数生成器确定性生成,同一个用户永远得到同一只宠物
- 稀有度系统:common(60%)、uncommon(25%)、rare(10%)、epic(4%)、legendary(1%)
- 五大属性:DEBUGGING(调试能力)、PATIENCE(耐心)、CHAOS(混乱值)、WISDOM(智慧)、SNARK(毒舌)
- 骨骼(Bones)和灵魂(Soul):骨骼确定性生成不存储,灵魂由 AI 模型生成存储在配置中
关键概念
- Prompt Engineering:如何说,70+ 分基线
- Context Engineering:让 AI 看什么,提升到 80~85 分
- Harness Engineering:构建怎样的运行环境,提升到 90~95 分
- Agent:能自主完成任务的 AI 系统
- Claude Code:Anthropic 官方 AI 编程 Agent
- CLAUDE.md:项目说明书和行为规范
- Multi-Agent:多 Agent 架构
- Memdir:结构化记忆系统
- System Reminder:系统级强提醒引导机制
- Permission Engine:规则的精细化权限控制
- Sandbox Isolation:操作系统原型的沙箱隔离
- KV Cache:键值缓存,提高缓存命中率
关联页面
- Claude Code
- Prompt Engineering
- Context Engineering
- Harness Engineering
- Agent
- 最近爆火的HarnessEngineering到底是啥?一期讲透!
- 模型不是关键,Harness 才是
- Harness刚火可能就要成为过去时了
- 万字干货理解HarnessEngineering
- OpenClaw