零基础复现Claude Code(八):反思与展望——我们得到了什么,还缺什么?

0 阅读14分钟

零基础复现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版能做什么?

让我们用具体的任务来衡量:

✅ 能做到的任务:

  1. 简单Bug修复

    任务:修复calculator.py中的加法Bug
    Agent:搜索→读取→修改→测试→完成
    成功率:约70%(如果Bug明显)
    
  2. 创建简单文件

    任务:写一个hello.py输出Hello World
    Agent:创建→运行→验证→完成
    成功率:约90%
    
  3. 代码搜索

    任务:找到所有用到requests库的地方
    Agent:搜索→列出文件和行号→完成
    成功率:约80%
    

❌ 做不到的任务:

  1. 复杂重构

    任务:把这个类改成异步的
    原因:需要理解代码结构、依赖关系,我们的Agent只会字面匹配
    
  2. 多文件协同修改

    任务:重命名一个被10个文件引用的函数
    原因:没有代码图谱,找不全所有引用
    
  3. 需要上下文理解的任务

    任务:优化这个函数的性能
    原因:需要理解算法复杂度、数据流,我们的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_fileRead, 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.rsMcpServerConfig

学习资源

2. 权限系统

是什么:细粒度的权限控制,用户可以批准/拒绝每个工具调用。

为什么重要

  • 安全:防止Agent执行危险操作
  • 可控:用户能审查每一步

真实代码位置

  • 权限系统:crates/runtime/src/permissions.rs
  • 权限提示:PermissionPrompter trait

我们的差距

  • 我们只有黑名单/白名单,没有运行时权限控制
  • 用户无法在Agent运行时批准/拒绝操作

3. 会话持久化

是什么:保存对话历史到磁盘,下次启动时恢复。

为什么重要

  • 长期记忆:Agent能记住之前的对话
  • 断点续传:Agent崩溃后能恢复

真实代码位置

  • 会话管理:crates/runtime/src/session.rs
  • 消息序列化:ConversationMessage 的序列化逻辑

我们的差距

  • 我们的Agent每次启动都是"失忆"的
  • 无法跨会话保持上下文

4. 多模态能力

是什么:处理图片、PDF等非文本输入。

为什么重要

  • 看截图:用户可以发送UI截图,Agent能看懂
  • 读文档:Agent能读取PDF、图片中的文字

真实代码位置

  • 图片处理:crates/runtime/src/file_ops.rsread_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代码的能力。

下一步建议

  1. 选一个模块(如read_file),对比你的实现和真实版本
  2. 找出3个关键差异(如错误处理、性能优化、边界情况)
  3. 思考:为什么真实版本要这样设计?
  4. 尝试把一个真实版本的特性移植到你的Mini版

这就是从"教学原型"到"理解工业实现"的桥梁。

延伸学习地图:下一步学什么?

如果你想继续深入,这里是一份具体的学习路线

路线1:深入理解真实Claude Code

目标:看懂工业级实现的每个模块。

学习步骤

  1. 克隆仓库

    git clone https://github.com/soongenwong/claudecode
    cd claudecode/rust
    
  2. 从入口开始读

    • 文件:crates/claw-cli/src/main.rs
    • 关注:命令行参数解析、Agent初始化
  3. 理解核心循环

    • 文件:crates/runtime/src/conversation.rs
    • 关注:ConversationRuntime::run_turn() 方法
    • 对比:我们的ReActAgent.run()
  4. 学习工具系统

    • 文件:crates/tools/src/lib.rs
    • 关注:ToolRegistryToolExecutor trait
    • 对比:我们的execute_tool()
  5. 研究上下文压缩

    • 文件:crates/runtime/src/compact.rs
    • 关注:compact_session() 的压缩策略
    • 对比:我们的滑动窗口

预计时间:2-3周(每天1-2小时)

路线2:学习Agent框架

目标:不想手写循环时,用现成框架。

推荐框架

  1. LangGraph(推荐)

  2. LangChain

    • 官网:python.langchain.com/
    • 特点:丰富的工具生态,快速原型
    • 适合:快速搭建Agent原型
  3. AutoGPT

学习建议

  • 先用我们的Mini版理解原理
  • 再用框架快速实现复杂功能
  • 对比框架和我们的实现,理解框架的价值

路线3:学习代码索引技术

目标:让Agent真正"理解"代码。

关键技术

  1. tree-sitter

  2. Language Server Protocol(LSP)

  3. 代码向量化

    • 模型:CodeBERT、GraphCodeBERT
    • 作用:语义搜索代码
    • 学习:用Sentence Transformers实现代码搜索

学习路径

  1. 先学tree-sitter,理解AST
  2. 再学LSP,理解符号信息
  3. 最后学向量化,理解语义搜索

路线4:学习Agent评估

目标:量化Agent的能力。

评估维度

  1. 任务成功率

    • 准备测试集(如SWE-bench)
    • 运行Agent,统计成功/失败
    • 分析失败原因
  2. Token效率

    • 统计每个任务的Token消耗
    • 对比不同System Prompt的效率
    • 优化上下文管理策略
  3. 工具使用效率

    • 统计每个工具的调用次数
    • 分析哪些工具最常用
    • 优化工具设计

推荐资源

  • SWE-bench:www.swebench.com/
  • Agent评估论文:搜索"Agent Evaluation Benchmark"

技术复现的真正价值

最后,让我们回到最初的问题:为什么要复现Claude Code?

不是为了做出完美产品

如果你的目标是"做一个能用的Agent",直接用Claude Code或LangChain就好了。

我们花8篇文章、写300行代码,不是为了做出一个"更好的Claude Code"。

而是为了拆解黑盒

技术复现的价值在于

  1. 理解原理

    • 看到ReAct循环的每一步
    • 理解工具调用的完整闭环
    • 知道上下文管理的权衡
  2. 建立直觉

    • 知道Agent为什么会"卡住"
    • 知道什么任务Agent能做、什么做不了
    • 知道如何设计System Prompt
  3. 获得改造能力

    • 能给Agent加新工具
    • 能调整循环逻辑
    • 能优化上下文策略
  4. 看懂工业级代码

    • 读真实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…

下一步推荐

  1. 把我们的Mini版跑起来,做几个真实任务
  2. 读真实Claude Code的源码,对比我们的实现
  3. 选一个方向深入(MCP、LSP、评估)
  4. 分享你的学习心得

再次恭喜你完成了这个旅程! 🎉