惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

H
Help Net Security
G
Google Developers Blog
aimingoo的专栏
aimingoo的专栏
博客园 - 聂微东
酷 壳 – CoolShell
酷 壳 – CoolShell
小众软件
小众软件
Stack Overflow Blog
Stack Overflow Blog
美团技术团队
博客园_首页
T
Tailwind CSS Blog
博客园 - 三生石上(FineUI控件)
B
Blog
D
DataBreaches.Net
腾讯CDC
C
Check Point Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
U
Unit 42
月光博客
月光博客
V
V2EX
Vercel News
Vercel News
T
The Blog of Author Tim Ferriss
The Cloudflare Blog
博客园 - 叶小钗
Y
Y Combinator Blog

博客园 - 咖啡色

为什么要在.Net Core中使用MediatR library? Let’s Encrypt 项目计划自动化地提供免费的 CA 证书 论C#逼格手册 这些.NET开源项目你知道吗?让.NET开源来得更加猛烈些吧!(第二辑) Entity Framework where语句起作用的真正用法 ASP.NET Page_Load执行两次 .NET:在ASPX、ASHX和MVC中使用IOC容器(菜鸟必看) [转]SqlServer 表分区详细介绍 HttpPostedFileBase always null when upload file by asp.net mvc4 mobile 一步步构建大型网站架构 TCP/IP网络协议的通俗理解,socket,http,soap。 精妙Sql语句备忘 解决.net绘制的 WinForm 在 windows7下变形的方法 关于 ASP.net + JQuery + JQGrid + JSON.net 的简单应用(一) Entity Framework 连接 mysql 5.0出现的问题及解决方案 VSTO开发中VS2010和Office 2003的问题及解决方案 如何使用缓存提高程序性能 如何用Javascript写一个Class? 程序员装逼指南(网上看到的,笑喷了……)
拆解 Claude Code 源码:如何用软件工程思维约束 AI?
咖啡色 · 2026-04-03 · via 博客园 - 咖啡色

前言:AI 时代的“程序员手册”

在开发 AI Agent 时,很多人觉得 System Prompt(系统提示词)就是一段随手写的作文。但在阅读了 Claude Code 的源码后,你会发现:顶级的 Prompt 是一套精密设计的软件工程系统。

它通过模块化组装、字节级缓存对齐、以及严苛的逻辑约束,解决了 AI 运行中“贵、慢、乱”的三大痛点。

一、 模块化架构:像搭积木一样拼凑指令

constants/prompts.ts 中,系统提示词不是一个死板的字符串,而是一个由 getSystemPrompt() 函数动态生成的数组。 

// 源码逻辑:分段组装(prompts.ts:444-577)
export async function getSystemPrompt(...) {
  return [
    // 1. 静态段(Static):核心身份与安全准则
    getSimpleIntroSection(),       // 身份:我是 Claude Code
    getSimpleSystemSection(),      // 系统:防御 Prompt 注入、Hooks 处理
    getActionsSection(),           // 安全:文件操作的确认边界
    
    // 2. 缓存边界(Boundary):灵魂标记
    SYSTEM_PROMPT_DYNAMIC_BOUNDARY,

    // 3. 动态段(Dynamic):实时环境变量
    ...resolvedDynamicSections,    // CWD(当前路径)、MCP 扩展工具、环境信息
  ].filter(s => s !== null)
}

深度解析: 这种设计实现了状态分离。静态段是“宪法”,定义了 AI 的人格和底线;动态段是“任务书”,告诉 AI 现在的具体处境。

二、 极致性能:字节级的缓存对齐(Prompt Caching)

AI 响应速度慢、Token 贵?Claude Code 给出了教科书级的解决方案。通过 splitSysPromptPrefix 函数,它将提示词物理切分为不同的缓存块。

// utils/api.ts: 缓存块切分逻辑
export function splitSysPromptPrefix(systemPrompt: SystemPrompt) {
  // 块 1 & 2:Attribution Header(含版本号,易变,不缓存)
  result.push({ text: attributionHeader, cacheScope: null });
  
  // 块 3:核心静态规则(所有用户共享,设置 global 缓存)
  // 只要这几千字的核心逻辑不变,全球用户都在复用同一份内存快照
  result.push({ text: staticJoined, cacheScope: 'global' });

  // 块 4:动态内容(不缓存)
  result.push({ text: dynamicJoined, cacheScope: null });
}

博主点评: 这里最妙的地方在于它排除了版本号。如果版本号从 v0.25 升到 v0.26,虽然只变了一个数字,但会导致整个缓存失效。工程师特意把“变动项”剥离,保住了几千个 Token 的缓存命中率。这不仅是省钱,更是用户体验的巨大提升。

三、 确定性约束:消除 AI 的“空间错觉”

在复杂的终端操作中,AI 极容易产生路径幻觉。源码在 prompts.ts 中通过硬性补丁锁死了 AI 的行为路径:

const notes = `Notes: 
- Agent threads always have their cwd reset between bash calls, as a result please only use absolute file paths.
- In your final response, share file paths (always absolute, never relative)...`

为什么这么写?

  • 状态重置(CWD Reset): 子进程每执行完一条命令,工作目录都会重置。AI 经常以为自己还在上个文件夹。

  • 绝对路径强制化: 源码要求 AI 必须使用 /Users/.../index.js 这种全路径。通过在 System Prompt 里锁死这一点,从底层逻辑上消灭了“找不到文件”的报错。

四、 优先级模型:多指令下的“主从协议”

当用户自定义提示词与系统提示词冲突时,谁听谁的?utils/systemPrompt.ts 规定了清晰的覆盖协议:

// 优先级逻辑:override > agent > custom > default
export function buildEffectiveSystemPrompt({
  overrideSystemPrompt, // 强制替换(用于循环模式等特定场景)
  agentSystemPrompt,    // 用户定义的 Agent 配置文件
  defaultSystemPrompt,  // 标准系统手册
}) {
  // 核心逻辑:如果是 Proactive(主动执行)模式
  if (agentSystemPrompt && isProactiveActive) {
    // 策略:不是覆盖,而是“追加”(Append)
    // 确保 AI 既保留了官方的安全底线,又获得了用户的个性化指令
    return [...defaultSystemPrompt, agentSystemPrompt];
  }
}

五、 结语:给我们的启示

读完 Claude Code 的 Prompt 工程源码,你会发现 AI 开发的未来不在于“如何写出优美的句子”,而在于:

  1. 确定性管理:通过绝对路径等手段强行修正模型弱点。

  2. 成本敏感性:利用缓存边界实现大规模部署的经济性。

  3. 字节级工程:对字符、空格、版本号的极致掌控。

这才是生产级 AI Agent 真正该有的样子。