零基础复现Claude Code(八):反思与展望——我们得到了什么,还缺什么?
开篇:诚实的对照
第7篇的成就:我们给Agent装上了"搜索能力"——它能在整个项目中找到相关代码,不再需要你明确指定文件。
恭喜!你从零开始,用8篇文章、约300行Python代码,复现了Claude Code的核心骨架。
但在庆祝之前,让我们诚实地看看:我们做到了什么?还缺什么?
💡 回到"实习生"比喻:经过8篇文章的训练,我们的实习生现在能:
- 理解你的指令(System Prompt)
- 自主思考和行动(ReAct循环)
- 读写文件、执行命令、搜索代码(工具箱)
但他还是个"新手实习生",和"资深工程师"(真实Claude Code)相比,差距在哪?
这一篇,我们要做一次诚实的技术复盘。
本节目标
读完这篇文章,你将:
- 清楚地知道你学到了什么:不是模糊的"理解了Agent",而是具体的能力清单
- 诚实地认识差距:我们的Mini版和真实Claude Code的具体差异
- 获得下一步学习路线:如果想继续深入,应该学什么、看什么代码
- 理解技术复现的价值:不是做出完美产品,而是拆解黑盒
成果回顾:你真正做到了什么
对照第一篇的架构图
还记得第一篇的三层架构吗?让我们逐项打勾:
✅ 用户输入层
- 命令行入口(python agent.py "任务")
✅ Agent大脑层
- LLM API调用(LLMClient)
- System Prompt设计
- ReAct循环(Think→Act→Observe)
- 对话历史管理(滑动窗口)
✅ 工具手脚层
- read_file:读取文件
- write_file:写入文件(带备份)
- run_cmd:执行命令(黑名单+白名单)
- search_code:搜索代码(关键词匹配)
✅ 操作系统层
- 真实的文件系统操作
- 真实的Shell命令执行
你的Mini版能做什么?
让我们用具体的任务来衡量:
✅ 能做到的任务:
-
简单Bug修复
任务:修复calculator.py中的加法Bug Agent:搜索→读取→修改→测试→完成 成功率:约70%(如果Bug明显) -
创建简单文件
任务:写一个hello.py输出Hello World Agent:创建→运行→验证→完成 成功率:约90% -
代码搜索
任务:找到所有用到requests库的地方 Agent:搜索→列出文件和行号→完成 成功率:约80%
❌ 做不到的任务:
-
复杂重构
任务:把这个类改成异步的 原因:需要理解代码结构、依赖关系,我们的Agent只会字面匹配 -
多文件协同修改
任务:重命名一个被10个文件引用的函数 原因:没有代码图谱,找不全所有引用 -
需要上下文理解的任务
任务:优化这个函数的性能 原因:需要理解算法复杂度、数据流,我们的Agent只会表面修改
代码量统计
让我们统计一下我们写了多少代码:
llm_client.py: ~30行 # LLM API封装
tools.py: ~150行 # 4个工具 + 分发器
react_agent.py: ~100行 # ReAct循环 + 解析
agent.py: ~30行 # 命令行入口
─────────────────────────────
总计: ~310行
对比:真实Claude Code(rust版本)约数万行代码。
我们用1%的代码量,实现了核心骨架。
诚实对比:我们的Mini版 vs 真实Claude Code
现在让我们做一次不留情面的对比。
维度1:工具数量与质量
| 工具类别 | 我们的Mini版 | 真实Claude Code | 差距分析 |
|---|---|---|---|
| 文件操作 | read_file, write_file | Read, Write, Edit, Glob, Grep | 真实版有Edit(diff模式),我们只能全文替换 |
| 命令执行 | run_cmd(白名单) | Bash(沙箱模式) | 真实版有完整的沙箱隔离 |
| 代码搜索 | search_code(关键词) | Grep(正则)+ LSP(语义) | 真实版支持正则、语义搜索 |
| Git操作 | 无 | 完整的Git工具集 | 我们完全没有Git支持 |
| 网络请求 | 无 | WebFetch, WebSearch | 我们完全没有网络能力 |
| 总计 | 4个工具 | 20+个工具 | 5倍差距 |
具体代码位置(GitHub: github.com/soongenwong…
- 文件操作:
crates/runtime/src/file_ops.rs - 命令执行:
crates/runtime/src/bash.rs - 工具注册:
crates/tools/src/lib.rs
维度2:上下文管理
| 维度 | 我们的Mini版 | 真实Claude Code | 差距分析 |
|---|---|---|---|
| 历史管理 | 滑动窗口(保留最近10轮) | 智能压缩(compact_session) | 真实版用语义压缩,保留关键信息 |
| Token估算 | 无 | 精确计数(estimate_session_tokens) | 我们不知道当前用了多少Token |
| 长上下文 | 不支持 | 支持100K+ Token模型 | 我们只能用8K窗口 |
| 上下文切片 | 无 | 智能切片(保留重要部分) | 真实版能识别哪些对话重要 |
具体代码位置:
- 压缩逻辑:
crates/runtime/src/compact.rs - Token计数:
crates/runtime/src/usage.rs
关键差距示例:
# 我们的简陋版
if len(messages) > 22:
messages = [messages[0], messages[1]] + messages[-20:]
# → 简单粗暴,可能丢失关键信息
# 真实版(伪代码)
if should_compact(messages, token_budget):
messages = compact_session(messages, strategy="semantic")
# → 识别哪些对话包含关键决策,优先保留
维度3:可靠性与错误处理
| 维度 | 我们的Mini版 | 真实Claude Code | 差距分析 |
|---|---|---|---|
| 错误重试 | 无 | 自动重试(最多3次) | 我们一次失败就放弃 |
| 自我纠错 | 无 | 检测到错误后自动调整 | 我们不会从错误中学习 |
| 工具失败处理 | 返回错误信息 | 分析错误原因,尝试替代方案 | 我们只是把错误告诉模型 |
| 循环检测 | 无 | 检测重复Action,主动打破 | 我们可能陷入死循环 |
| 超时处理 | 命令级超时(30秒) | 任务级超时 + 优雅降级 | 真实版能部分完成任务 |
具体代码位置:
- 错误处理:
crates/runtime/src/conversation.rs的错误恢复逻辑 - 循环检测:状态机中的重复检测
关键差距示例:
# 我们的简陋版
observation = execute_tool(action)
# → 工具失败了,就把错误信息返回给模型,模型可能不知道怎么办
# 真实版(伪代码)
for attempt in range(3):
result = execute_tool(action)
if result.success:
break
if result.error_type == "FileNotFound":
# 尝试搜索文件
alternative = search_similar_files(action.file_path)
if alternative:
action.file_path = alternative
continue
# → 主动尝试修复错误
维度4:代码理解能力
| 维度 | 我们的Mini版 | 真实Claude Code | 差距分析 |
|---|---|---|---|
| 代码搜索 | 关键词匹配 | 语义搜索 + 代码图谱 | 我们只能找字面匹配 |
| 符号跳转 | 无 | LSP支持(跳转到定义) | 我们不知道函数在哪定义 |
| 引用查找 | 无 | 完整的引用图谱 | 我们不知道谁调用了这个函数 |
| 类型推断 | 无 | 基于LSP的类型信息 | 我们不知道变量类型 |
| AST解析 | 无 | tree-sitter解析 | 我们不理解代码结构 |
具体代码位置:
- LSP集成:
crates/lsp/src/manager.rs - 代码图谱:通过LSP获取符号信息
关键差距示例:
用户:重命名函数 calculate_total
我们的Mini版:
→ 搜索"calculate_total"关键词
→ 找到10处匹配
→ 但不知道哪些是定义、哪些是调用、哪些是注释
真实Claude Code:
→ 用LSP找到函数定义
→ 用LSP找到所有引用
→ 区分定义、调用、类型注解、注释
→ 精确重命名,不误伤
维度5:性能与效率
| 维度 | 我们的Mini版 | 真实Claude Code | 差距分析 |
|---|---|---|---|
| 代码搜索速度 | O(n)遍历所有文件 | ripgrep(多线程) | 真实版快10-100倍 |
| 并发执行 | 无 | 工具可并行执行 | 我们串行执行所有工具 |
| 缓存 | 无 | 文件内容缓存、索引缓存 | 我们每次都重新读取 |
| 流式输出 | 无 | 逐Token流式返回 | 我们要等模型全部生成完 |
具体代码位置:
- 搜索优化:
crates/runtime/src/file_ops.rs使用ripgrep - 并发执行:
crates/runtime/src/conversation.rs的异步执行
我们没有实现的关键功能
让我们诚实地列出我们完全没有涉及的功能:
1. MCP(Model Context Protocol)
是什么:Anthropic推出的标准协议,让Agent能接入任意外部工具。
为什么重要:
- 不需要手写工具代码,直接接入现成的MCP服务器
- 社区有大量MCP工具(数据库、API、文件系统等)
真实代码位置:
- MCP客户端:
crates/runtime/src/mcp_client.rs - MCP配置:
crates/runtime/src/config.rs的McpServerConfig
学习资源:
- MCP官方文档:modelcontextprotocol.io/
- MCP服务器列表:github.com/modelcontex…
2. 权限系统
是什么:细粒度的权限控制,用户可以批准/拒绝每个工具调用。
为什么重要:
- 安全:防止Agent执行危险操作
- 可控:用户能审查每一步
真实代码位置:
- 权限系统:
crates/runtime/src/permissions.rs - 权限提示:
PermissionPromptertrait
我们的差距:
- 我们只有黑名单/白名单,没有运行时权限控制
- 用户无法在Agent运行时批准/拒绝操作
3. 会话持久化
是什么:保存对话历史到磁盘,下次启动时恢复。
为什么重要:
- 长期记忆:Agent能记住之前的对话
- 断点续传:Agent崩溃后能恢复
真实代码位置:
- 会话管理:
crates/runtime/src/session.rs - 消息序列化:
ConversationMessage的序列化逻辑
我们的差距:
- 我们的Agent每次启动都是"失忆"的
- 无法跨会话保持上下文
4. 多模态能力
是什么:处理图片、PDF等非文本输入。
为什么重要:
- 看截图:用户可以发送UI截图,Agent能看懂
- 读文档:Agent能读取PDF、图片中的文字
真实代码位置:
- 图片处理:
crates/runtime/src/file_ops.rs的read_file支持图片 - PDF处理:支持读取PDF的特定页
我们的差距:
- 我们只能处理纯文本
- 无法理解图片、PDF
5. 评估与监控
是什么:量化Agent的能力,监控成功率、Token消耗等。
为什么重要:
- 知道Agent哪里强、哪里弱
- 优化System Prompt和工具设计
真实代码位置:
- Token统计:
crates/runtime/src/usage.rs - 性能监控:
UsageTracker结构体
我们的差距:
- 我们不知道Agent的成功率
- 不知道每个任务消耗了多少Token
- 无法量化改进效果
与参考代码的最终对照:验证你的学习成果
现在,让我们做一个终极验证——打开真实的Claude Code仓库,检查你是否能找到对应的模块。
请打开参考代码,对照下表检查你是否能找到对应模块:
| 你实现的模块 | 参考代码位置 | 验证问题 |
|---|---|---|
LLMClient.chat() | crates/api/src/client.rs | 你能找到send_message()方法吗?它如何处理流式响应? |
| ReAct循环 | crates/runtime/src/conversation.rs | 你能找到run_turn()方法吗?它的状态机有哪些状态? |
read_file() | crates/runtime/src/file_ops.rs | 你能找到read_file()函数吗?它如何处理二进制文件? |
write_file() | crates/runtime/src/file_ops.rs | 你能找到write_file()函数吗?它的diff模式是怎么实现的? |
run_cmd() | crates/runtime/src/bash.rs | 你能找到execute_bash()函数吗?沙箱模式在哪里? |
| 工具注册 | crates/tools/src/lib.rs | 你能找到ToolRegistry结构体吗?工具是如何注册的? |
| 上下文压缩 | crates/runtime/src/compact.rs | 你能找到compact_session()函数吗?压缩策略是什么? |
| 权限系统 | crates/runtime/src/permissions.rs | 你能找到PermissionPrompter trait吗?权限如何检查? |
如果你能找到以上8个模块,恭喜你——你已经具备了阅读工业级Agent代码的能力。
下一步建议:
- 选一个模块(如
read_file),对比你的实现和真实版本 - 找出3个关键差异(如错误处理、性能优化、边界情况)
- 思考:为什么真实版本要这样设计?
- 尝试把一个真实版本的特性移植到你的Mini版
这就是从"教学原型"到"理解工业实现"的桥梁。
延伸学习地图:下一步学什么?
如果你想继续深入,这里是一份具体的学习路线。
路线1:深入理解真实Claude Code
目标:看懂工业级实现的每个模块。
学习步骤:
-
克隆仓库
git clone https://github.com/soongenwong/claudecode cd claudecode/rust -
从入口开始读
- 文件:
crates/claw-cli/src/main.rs - 关注:命令行参数解析、Agent初始化
- 文件:
-
理解核心循环
- 文件:
crates/runtime/src/conversation.rs - 关注:
ConversationRuntime::run_turn()方法 - 对比:我们的
ReActAgent.run()
- 文件:
-
学习工具系统
- 文件:
crates/tools/src/lib.rs - 关注:
ToolRegistry、ToolExecutortrait - 对比:我们的
execute_tool()
- 文件:
-
研究上下文压缩
- 文件:
crates/runtime/src/compact.rs - 关注:
compact_session()的压缩策略 - 对比:我们的滑动窗口
- 文件:
预计时间:2-3周(每天1-2小时)
路线2:学习Agent框架
目标:不想手写循环时,用现成框架。
推荐框架:
-
LangGraph(推荐)
- 官网:langchain-ai.github.io/langgraph/
- 特点:图结构定义Agent流程,支持复杂分支
- 适合:需要复杂决策流程的Agent
-
LangChain
- 官网:python.langchain.com/
- 特点:丰富的工具生态,快速原型
- 适合:快速搭建Agent原型
-
AutoGPT
- GitHub:github.com/Significant…
- 特点:完整的自主Agent实现
- 适合:学习自主Agent的设计模式
学习建议:
- 先用我们的Mini版理解原理
- 再用框架快速实现复杂功能
- 对比框架和我们的实现,理解框架的价值
路线3:学习代码索引技术
目标:让Agent真正"理解"代码。
关键技术:
-
tree-sitter
- 官网:tree-sitter.github.io/tree-sitter…
- 作用:解析代码,构建AST
- 学习:写一个简单的代码分析工具
-
Language Server Protocol(LSP)
- 官网:microsoft.github.io/language-se…
- 作用:提供IDE级别的代码理解(跳转、补全、重构)
- 学习:集成一个LSP客户端到你的Agent
-
代码向量化
- 模型:CodeBERT、GraphCodeBERT
- 作用:语义搜索代码
- 学习:用Sentence Transformers实现代码搜索
学习路径:
- 先学tree-sitter,理解AST
- 再学LSP,理解符号信息
- 最后学向量化,理解语义搜索
路线4:学习Agent评估
目标:量化Agent的能力。
评估维度:
-
任务成功率
- 准备测试集(如SWE-bench)
- 运行Agent,统计成功/失败
- 分析失败原因
-
Token效率
- 统计每个任务的Token消耗
- 对比不同System Prompt的效率
- 优化上下文管理策略
-
工具使用效率
- 统计每个工具的调用次数
- 分析哪些工具最常用
- 优化工具设计
推荐资源:
- SWE-bench:www.swebench.com/
- Agent评估论文:搜索"Agent Evaluation Benchmark"
技术复现的真正价值
最后,让我们回到最初的问题:为什么要复现Claude Code?
不是为了做出完美产品
如果你的目标是"做一个能用的Agent",直接用Claude Code或LangChain就好了。
我们花8篇文章、写300行代码,不是为了做出一个"更好的Claude Code"。
而是为了拆解黑盒
技术复现的价值在于:
-
理解原理
- 看到ReAct循环的每一步
- 理解工具调用的完整闭环
- 知道上下文管理的权衡
-
建立直觉
- 知道Agent为什么会"卡住"
- 知道什么任务Agent能做、什么做不了
- 知道如何设计System Prompt
-
获得改造能力
- 能给Agent加新工具
- 能调整循环逻辑
- 能优化上下文策略
-
看懂工业级代码
- 读真实Claude Code时,能对应到我们的实现
- 理解为什么真实版要那样设计
- 知道哪些是核心、哪些是优化
类比:学开车 vs 学修车
- 用Claude Code = 学开车:你会用,但不知道引擎怎么工作
- 复现Claude Code = 学修车:你拆开引擎,看到每个零件
学修车不是为了造一辆更好的车,而是为了:
- 车坏了,你知道怎么修
- 想改装,你知道改哪里
- 看到新车,你能看懂设计
结尾寄语:你已经不一样了
8篇文章前,你可能觉得Claude Code是"魔法"。
8篇文章后,你知道它是:
- LLM(大脑)
-
- System Prompt(职业说明书)
-
- ReAct循环(思考-行动-观察)
-
- 工具集(读写文件、执行命令、搜索代码)
-
- 上下文管理(滑动窗口)
你现在能做什么?
- ✅ 看懂Agent的工作原理
- ✅ 设计自己的Agent工具
- ✅ 优化System Prompt
- ✅ 调试Agent的行为
- ✅ 读懂工业级Agent代码
你还不能做什么?
- ❌ 做出生产级Agent(需要更多工程化)
- ❌ 处理复杂任务(需要更强的代码理解)
- ❌ 达到Claude Code的可靠性(需要错误恢复机制)
但这就够了。
因为你已经拆解了黑盒,看清了齿轮。
接下来,你可以:
- 用LangChain快速搭建Agent原型
- 给你的Agent加新工具
- 读懂Claude Code的源码
- 设计自己的Agent系统
技术的本质不是魔法,而是可以理解、可以复现、可以创造的工程方案。
希望这8篇文章,让你从"用户"变成了"创造者"。
系列完结
感谢你读完这8篇文章。如果你有任何问题或反馈,欢迎在GitHub仓库提Issue:
- 教学代码仓库:(你可以创建一个仓库,放上这8篇文章的代码)
- rust版本Claude Code:github.com/soongenwong…
下一步推荐:
- 把我们的Mini版跑起来,做几个真实任务
- 读真实Claude Code的源码,对比我们的实现
- 选一个方向深入(MCP、LSP、评估)
- 分享你的学习心得
再次恭喜你完成了这个旅程! 🎉