从零认识ClaudeCode-01: 基于QwenCoderPlusd打造一个BashAgent

目录

1. 项目背景与参考 2. 基础模型调用流程 3. 单次调用的局限性与手动执行 4. Agentic Loop 核心概念 5. 工具调用 (Tool Use) 规范 6. 完整 Agent 循环实现 7. 测试与验证


1. 项目背景与参考 Content-[00:00]

视频开启了一个新系列,旨在从零开始构建类似 Claude Code 的编程助手。

  • 市场现状:目前市面上有许多编程工具,如 OpenAI 的 Codex、Toppy 的 Cloud Code,以及国内的 KimiMiniMax 等。
  • 差距分析:不同工具之间的体验差距主要源于两点:
    1. 基座模型的能力差异。
    2. 整个 Code 系统的设计架构。
  • 参考项目:本教程代码设计主要参考了 GitHub 上的开源项目 learn-claude-code (由 shanshail Lab 开发)。
    • 该项目 Star 数已达 17K+。
    • 核心依赖极少,仅依赖 Anthropic SDK
    • 代码简洁但系统设计经过深思熟虑。


2. 基础模型调用流程 Content-[00:55]

回顾最原始的模型调用方式,即“用户输入 Prompt -> 调用 Model API -> 返回文本结果”。

  • 环境配置:需要配置三个关键参数:
    1. BASE_URL
    2. API_KEY
    3. MODEL_NAME (例如 qwen-coder-plus)
  • 初始化客户端:使用 Base_URLAPI_KEY 初始化 Client。
  • 调用接口:使用 client.messages.create 方法。
    • 指定 model 名称。
    • 组织 messages 列表(包含 rolecontent)。
    • 设置 max_tokens (例如 200)。
  • 响应结构解析
    • role: 通常为 assistant
    • stop_reason: 标识对话是否结束(如 end_turn)。
    • content: 一个列表,包含具体的返回内容块。
      • type: 消息类型(如 text)。
      • text: 具体的文本内容。

测试案例 1:简单数学计算

  • 输入:1+1 等于几
  • 输出:模型正确返回文本结果 1+1=2

测试案例 2:文件操作尝试

  • 输入:统计 flow.md 这个文件有多少字符
  • 输出:模型返回文本建议(如使用 wc 命令),但无法直接读取本地文件或执行命令。因为它只能返回文本,没有后续动作能力。


3. 单次调用的局限性与手动执行 Content-[03:55]

为了解决模型无法执行命令的问题,初步尝试通过 Prompt 工程让模型只返回 Linux 命令。

  • Prompt 优化:告诉模型“只给我返回 Linux 命令”。
  • 效果:模型返回了 wc -c flow.md
  • 手动执行:用户在终端手动运行该命令,得到结果 1093
  • 自动化思路
    1. 提取命令:从模型的 response.content 中提取文本,去除 Markdown 格式(如 “`bash)。
    2. 执行命令:使用 Python 的 subprocess 模块运行提取出的命令。
    3. 获取输出:捕获 stdout 作为最终结果。

局限性:这种方法仅适用于单步任务。对于复杂任务(如“找到最大的 Python 文件,统计函数数量,并在文件头写入注释”),模型无法一次性给出所有步骤,因为每一步的输入依赖于上一步的输出。


4. Agentic Loop 核心概念 Content-[07:44]

为了解决多步任务问题,引入了 Agentic Loop (代理循环) 概念。

  • 核心逻辑:模型在循环中不断地 观察 (Observe) -> 决策 (Decide) -> 执行 (Execute)
  • 流程图对比
    • 原始模式:Chat Prompt -> Model API -> 返回文本 -> 结束。
    • Agent 模式:增加了工具调用和结果反馈的闭环。
  • 消息管理 (History)
    • 每次调用模型时,必须将之前所有的交互消息(包括用户指令、模型回复、工具执行结果)拼接进 messages 列表。
    • 这样模型才能“记住”上下文和上一步的执行结果。
  • 循环终止条件
    • 当模型返回 stop_reasonend_turn 且没有工具调用时,表示任务完成。
    • 或者达到最大迭代次数。


5. 工具调用 (Tool Use) 规范 Content-[09:46]

为了让模型知道可以调用工具,需要在 API 请求中定义 tools 参数。

  • Tools 定义结构:这是一个列表,每个工具包含以下字段:
    1. name: 工具名称(例如 bash)。
    2. description: 工具描述(告诉模型什么时候用这个工具)。
    3. input_schema: 输入参数的 JSON Schema。
      • type: object
      • properties: 定义参数(如 command 类型为 string)。
      • required: 必填参数字段列表。
  • System Prompt
    • 设定角色:You are a CLI agent...
    • 设定规则:优先使用工具,如何解释执行结果等。

响应变化

  • 当模型决定调用工具时,stop_reason 变为 tool_use
  • content 列表中会出现 type: tool_use 的块,包含 id, name, input 等信息。


6. 完整 Agent 循环实现 Content-[12:00]

基于上述概念,构建完整的 while True 循环逻辑。

  1. 初始化 History:将用户的初始 Prompt 放入 history 列表。
  2. 进入循环
    • 调用 API:传入 historytools 定义。
    • 保存回复:将模型的原始回复(Assistant Message)追加到 history
    • 判断结束:检查 stop_reason。如果是 end_turn,则跳出循环,输出最终文本。
    • 处理工具调用
      • 遍历 content 块,寻找 type == 'tool_use'
      • 提取工具名称(如 bash)和输入参数(如 command)。
      • 执行工具:使用 subprocess.run 执行命令,捕获 stdoutstderr
      • 构造结果:创建一个新的消息块,role: user, content: tool_result,包含工具执行的结果。
      • 更新 History:将工具执行结果追加到 history,供下一轮模型观察。
  3. 重复:直到任务完成。

代码关键点

  • 需要处理 tool_usetool_result 的配对(通过 tool_use_id)。
  • 确保 history 中消息角色的正确性(User/Assistant)。


7. 测试与验证 Content-[19:25]

对构建好的 BashAgent 进行实际任务测试。

  • 测试案例 1:统计文件字符数
    • 指令:统计 flow.md 有多少个字符
    • 过程:
      1. 模型调用 bash 工具,命令 wc -c flow.md
      2. 系统执行命令,返回 1093 flow.md
      3. 模型根据结果生成最终回复:flow.md 文件包含 1093 个字符
    • 结果:成功。

  • 测试案例 2:统计目录下 Python 文件数量
    • 指令:统计当前目录下有几个 python 文件
    • 过程:
      1. 模型调用 bash 工具,命令 find . -name "*.py" | wc -l (或类似命令)。
      2. 系统执行返回 6
      3. 模型总结:当前目录有 6 个 python 文件
    • 结果:成功。

后续计划

  • 当前工具仅支持 bash
  • 下一步将添加更多工具,如 read_file (读取文件), edit_file (编辑文件) 等,以增强 Agent 能力。

AI 总结

本视频详细演示了如何从零开始构建一个基于 QwenCoderPlus 模型的 BashAgent。内容涵盖了从最基础的 API 调用,到发现单次调用的局限性,再到引入 Agentic LoopTool Use 机制来实现自动化的命令执行与多步任务处理。

核心要点包括:

  1. 系统架构:参考 learn-claude-code 项目,保持核心依赖最小化。
  2. 交互闭环:通过 History 管理上下文,实现 Prompt -> Model -> Tool -> Result -> Model 的循环。
  3. 工具定义:利用 API 的 tools 参数规范模型行为,使其能够结构化地输出命令。
  4. 执行安全:使用 Python subprocess 安全地执行模型生成的 Bash 命令并捕获输出。

这为开发更复杂的 Coding Agent 奠定了坚实的基础。

Comments

No comments yet. Why don’t you start the discussion?

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注