Skip to content

视频 02 来源笔记:百行代码手搓 Agent Loop

来源元信息

  • 讲者:小单说AI
  • Bilibili:BV19JdzBMESc
  • 本地字幕:从零实现自己的agent第二期:百行代码从零手搓agent.ai-zh.srt
  • 字幕覆盖:00:00:00–00:10:43
  • 对照材料:bilibili-transcripts/02-百行代码从零手搓Agent.txtppt/第二期-手搓agent.html
  • 对应代码:step01_single_call.pystep06_skills.py

按时间顺序的主题窗口

[00:00:00–00:01:18] 第一次模型调用

先选择模型服务与 SDK,再提交一条用户消息并打印回答。这个阶段只有 LLM Call,还没有持续状态、工具执行或 Agent Loop。

[00:01:18–00:02:14] 外层对话循环

把模型调用放入 while 后,程序可以连续接受输入,但每轮仍是孤立请求。“能反复聊天”不等于“有记忆”。

[00:02:14–00:02:58] History 带来上下文连续性

把用户消息和助手回答依次追加到 history,下一次调用再传回模型。1+1 → 再加 1 的演示说明,代词和省略表达依赖历史上下文。

[00:02:58–00:04:05] 系统提示词

系统提示定义身份、语气与固定规则,让同一个模型表现出稳定角色。它适合放长期规则,但不能替代外部状态、权限检查和确定性验证。

[00:04:05–00:05:13] 从回答到 Tool Use

当用户要求查看桌面文件,模型本身无法完成。代码注册 run_command 的名称、描述和输入 Schema;模型返回工具调用,运行时执行后再把 tool_result 送回上下文。

[00:05:13–00:06:04] 第一次工具演示

工具成功执行,但命令查看了当前目录而不是桌面。这个“看似成功但语义不完全正确”的案例很重要:工具无报错不等于任务完成,必须检查结果是否满足用户目标。

[00:06:04–00:06:43] 为什么需要 Skill

Tool Use 已经能完成很多任务,但复杂领域方法若全部塞进系统提示会扩大上下文。Skill 把可复用流程从常驻提示中分离出来。

[00:06:43–00:07:32] 渐进式披露

启动时只暴露 Skill 名称和短描述,Agent 判断需要时再读取完整 SKILL.md。这让发现成本较低,同时保留按需加载的专业步骤。

[00:07:32–00:08:27] Skill Loader 与 load_skill

加载器扫描 Skill 目录、解析元数据,并把摘要注入系统提示。模型选择 load_skill 后,完整正文通过工具结果进入下一轮上下文。

[00:08:27–00:09:27] 联网搜索演示

Agent 先加载搜索 Skill,再调用网页工具。它因为训练知识时间而使用旧年份,用户纠正当前年份后再次搜索,说明实时事实必须由外部来源与时间上下文校正。

[00:09:27–00:10:23] 六步能力合成

视频回顾单次调用、外层循环、History、系统提示、Tool Use 与 Skill。真正的 Agent Loop 还有一层内部工具循环:只要模型继续请求工具,就执行并观察;停止请求后才向用户返回。

[00:10:23–00:10:43] 最小实现与生产系统的差距

百行代码足以揭示骨架,但 Claude Code、Codex 一类产品还需要权限、安全、事件、重试、上下文管理和评估。教学代码的价值是看清主干,而不是直接作为生产模板。

主教学论点

Agent 不是一次模型调用。它由两个循环逐步长出来:外层循环承接用户多轮对话,内层循环处理模型与工具的多次往返。History、系统提示、工具和 Skill 分别解决连续性、规则、行动和方法复用。

演示序列

阶段文件新能力用什么现象验证
1step01_single_call.py单次回答程序回答后退出
2step02_loop_no_memory.py连续输入可再次提问但不理解“再加一”
3step03_history.py上下文能延续上一轮算式
4step04_system_prompt.py稳定规则固定身份与称呼
5step05_tool_use.py行动闭环出现 tool_use/tool_result
6step06_skills.py按需方法先加载 Skill,再调用工具

重要比喻

  • LLM 是大脑,工具是鱼竿:说明知道怎么做与真的能做是两回事。
  • Skill 是按需翻阅的宝典:重点是渐进式披露,不是把 Skill 当可执行函数。

术语与纠正

  • 本地字幕把 Anthropic 多次识别为 “AERROPIC”;实际代码使用 anthropic.Anthropic 与 Messages API。
  • 仓库文本稿在 [00:00:50–00:01:06] 写成 “OpenAI 格式”,但固定提交的 step01_single_call.py 实际是 Anthropic SDK。学习时以代码为准。
  • “Tool Use”“Function Calling”在本视频里指同类模型工具调用机制,具体消息格式因供应商而异。
  • “load skill / lotus skill”应为 load_skill

需要工程限定的说法

  • subprocess.run(..., shell=True) 只是教学捷径,不能直接暴露给不可信输入。
  • 工具执行成功仍可能答非所问;桌面与当前目录的偏差就是反例。
  • History 无限增长会增加成本并最终溢出,第 3 期专门修正。
  • Skill 不能因为被模型选中就获得新权限;工具白名单仍由 Harness 决定。
  • “Skill 让 Agent 自我进化”只说明可扩展性。真正进化需要轨迹、评估、审批、版本和回滚。

来源映射

  • CAE:build-agent-example/code/step01_single_call.pystep06_skills.py,以及同名 doc/ 文件。
  • 《深入理解 AI Agent》:第 2 章“API 的上下文结构”“带工具调用的多轮交互”“用代码实现核心循环”;第 4 章工具设计。
  • Mini Emperor:model.py 的模型适配、agent.py 的内部循环和最大迭代次数、skills.py 的 Skill 解析与注册。
  • 进入正文:book/02-百行Agent-Loop.md

内容差异与待核对

  • PPT 以六个概念页组织内容,与代码 Step 01–06 对齐;视频口述先演示现象再解释代码。
  • 固定代码是 22、23、27、36、73、217 行的累积实现,视频中“20/72/200 行”为近似说法。
  • 视频把模型的旧年份归因于训练语料截止时间;真实原因也可能是提示缺少当前日期,不能据此推断具体模型知识截止日期。

Markdown 是唯一内容源,HTML 由构建流程生成。