《如何构建类似 Claude Code 的智能代理》读书笔记

原文地址: https://minusx.ai/blog/decoding-claude-code/

核心理念

保持简单(Keep Things Simple) - 这是最重要的原则。LLM 本身就很难调试和评估,任何额外的复杂性(多代理、代理切换或复杂的 RAG 搜索算法)只会让调试难度增加 10 倍。

一、控制循环设计

1.1 保持单一主循环

  • 避免多代理系统:尽管多代理很流行,但 Claude Code 只使用一个主线程
  • 最多一层分支:只在复杂任务时创建一个子代理(不能再创建子代理),结果会添加回主消息历史
  • 扁平化消息历史:维护一个简单的消息列表,便于调试
  • 原因:每增加一层抽象都会让系统更难调试,并偏离通用模型改进的轨道

1.2 大量使用小型模型

  • 超过 50% 的重要调用使用 Claude-3.5-Haiku
  • 应用场景:读取大文件、解析网页、处理 git 历史、总结长对话、生成单词标签(每次按键都用!)
  • 成本优势:小模型比标准模型便宜 70-80%,可以大量使用

二、提示词设计

2.1 使用 claude.md 协作管理用户偏好

  • 上下文文件:类似 Cursor Rules/agent.md
  • 作用:让开发者传达无法从代码库推断的上下文,明确用户偏好
  • 示例:强制 LLM 跳过某些文件夹或使用特定库
  • 效果:有无 claude.md 的性能差异巨大

2.2 使用 XML 标签、Markdown 和大量示例

关键 XML 标签:

  • <system-reminder>: 提醒 LLM 容易遗忘的事项
  • <good-example><bad-example>: 对比正确和错误的做法,明确偏好路径

Markdown 结构化:使用标题组织系统提示(语气风格、主动性、遵循约定、代码风格、任务管理等)

提示词规模

  • 系统提示:~2800 tokens
  • 工具描述:~9400 tokens
  • claude.md:1000-2000 tokens

三、工具设计

3.1 LLM 搜索 >>> RAG 搜索

  • 方法:使用复杂的 ripgrep、jq 和 find 命令直接搜索,就像人类开发者一样
  • 优势
    • 避免 RAG 的隐藏故障模式(相似度函数、重排序、代码分块等问题)
    • 可以像人类一样查看 10 行理解结构,需要时再看更多
    • 可通过强化学习改进
    • 减少系统复杂度
  • 比喻:这是 LLM 时代的"相机 vs 激光雷达"之争

3.2 低级 vs 高级工具的选择

权衡标准:工具使用频率 vs 使用准确性

Claude Code 的工具层次

  • 低级:Bash, Read, Write
  • 中级:Edit, Grep, Glob
  • 高级:Task, WebFetch, exit_plan_mode

设计原则

  • 高频使用的操作应该有专门的工具(如 Grep、Glob)
  • 特殊场景仍可使用通用 bash 命令
  • 高级工具用于确定性强的操作,避免多次低级操作

工具列表:Task, Bash, Glob, Grep, LS, ExitPlanMode, Read, Edit, MultiEdit, Write, NotebookEdit, WebFetch, TodoWrite, WebSearch, mcp__ide__getDiagnostics, mcp__ide__executeCode

3.3 让代理管理自己的待办事项

优势

  • 解决上下文衰减问题(长期运行的代理容易偏离目标)
  • 保持 LLM 专注(提示词要求频繁参考待办列表)
  • 保持灵活性:允许代理中途调整方向
  • 利用模型的交错思考能力动态调整待办项

对比:优于多代理切换+验证模式(PRD/PM → 实现 → QA)

四、可控性

4.1 语气和风格

  • 系统提示中专门有关于语气、风格和主动性的章节
  • 示例规则
    • 不要不必要的开场白或结束语
    • 不要添加额外的代码解释总结
    • 拒绝帮助时不要说明原因(显得说教和烦人)
    • 除非明确要求,否则不使用表情符号

4.2 "这很重要"仍是最先进方法

  • 使用 IMPORTANTVERY IMPORTANTNEVERALWAYS 等强调词
  • 示例
    • "IMPORTANT: 不要添加任何注释,除非被要求"
    • "VERY IMPORTANT: 必须避免使用 findgrep,改用 Grep、Glob 或 Task"
    • "IMPORTANT: 永远不要猜测 URL"

4.3 编写算法(含启发式规则和示例)

关键做法

  • 识别 LLM 需要执行的最重要任务
  • 为其编写明确的算法流程
  • 使用流程图形式组织决策点
  • 避免:一堆无组织的"做什么"和"不做什么"列表

Claude Code 的实践:任务管理、执行任务和工具使用策略章节清晰地描述了算法流程,包含大量启发式规则和场景示例。

额外收获:为什么关注大公司的提示词?

  • 帮助逆向工程 LLM 的后训练/RLHF 数据分布
  • 了解最佳实践:使用 JSON 还是 XML?工具描述放在哪?
  • Claude Code 的设计非常有主见,可以参考借鉴

总结

再次强调核心原则:保持简单。过度的脚手架框架弊大于利。Claude Code 证明了"代理"可以既简单又极其强大。

关键教训是减少活动部件,让 LLM 承担大部分重任,建立良好的模型约束,然后让它发挥作用。这种端到端的方法是否会像自动驾驶领域一样最终胜出?值得关注。


©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容