打牢地基:LLM 原理与 API · 里程碑长文:100 行代码,是你与框架之间的门票
这个里程碑要做什么
不用任何框架(不碰 LangChain、LlamaIndex 以及任何 SDK 的高级封装),只用最基础的 HTTP 请求或官方 SDK 的原始对话接口,手写一个 100 行以内的对话 Agent:能持续多轮对话,至少会调用两个工具——比如一个查天气(可以 mock)、一个做算数。
核心不是功能,而是你要亲手实现 tool calling 的完整循环:发 messages → 收到 tool_calls → 执行本地函数 → 把结果以 tool 角色塞回 messages → 再发给模型 → 拿到最终回答。规格约束:单文件、≤100 行;工具用 JSON schema 声明,走模型原生 tool calling;循环直到模型不再请求工具为止;命令行交互即可,不需要 UI。
为什么是它(设计意图)
100 行这个限制是有意的。它逼你把 Agent 拆到最简形态:一个 messages 数组、一个 while 循环、一个工具分发字典。写完你会发现「Agent = LLM + 循环」不是口号,而是字面事实。
只有亲手处理过 tool_calls 的结构、finish_reason、tool_call_id 的对应关系,你才真正理解框架替你封装了什么——也才有能力在框架出问题时调试。自己维护 messages 数组,你才会肉疼地看到每一轮对话历史都在重复计费,「Token 即成本」从此不是概念而是账单。模型偶尔输出不合规的结构化内容,也只有亲手踩过才记得住。
这个里程碑还会校准你对上下文窗口的直觉。当你亲手把每一轮 tool 结果追加进 messages、看着数组一轮轮变长,「上下文是 Agent 的工作记忆」就不再是比喻:RAG、摘要、记忆分层,后续阶段的所有设计都是在跟这块有限的记忆做斗争,而斗争的痛感你现在就能提前体会到。
检验标准就一个:写得出来,你配用框架;写不出来,先去补课。
配套资源怎么用
- 先看 3Blue1Brown 神经网络系列(注意力那一集至少两遍),建立「注意力是加权信息筛选」的直觉——这是后面理解幻觉与遗忘的地基。
- 然后读 Anthropic Prompt Engineering 文档与 OpenAI Cookbook 中 function calling / 结构化输出的官方示例——这两份是本里程碑的直接施工图纸。
- 写代码时对照 Cookbook 的示例,把它的逻辑压缩进你自己的 100 行,不要直接复制封装层。
- 想加深原理:MIT 6.S191(2026 版自 3 月 30 日起每周公开讲座与实验)补深度学习地基;Stanford CS224N(Winter 2026,Diyi Yang 与 Yejin Choi 主讲)的 Transformer 讲次作进阶选读,不必从头刷完。
- 写完代码后再看李沐的 GPT/LLM 论文精读,用来回答「模型为什么会这样行为」。
- CS336(Percy Liang 与 Tatsunori Hashimoto 主讲,Spring 2026 在授)是给想把地基打到基岩层的人准备的,本阶段只需知道它的存在与定位。编程基础薄弱者可用 Harvard CS50 AI 补「前深度学习时代」的搜索与知识表示。
常见翻车点
- 死循环:模型反复调同一个工具。原因通常是工具返回了对模型不友好的内容(比如 Python 对象的 repr,而不是 JSON 或自然语言字符串)。
- tool 消息塞错:tool_call_id 对不上,API 直接报错;或把工具结果当成 user 消息塞回去,语义全乱。
- 用正则解析模型输出:那是原生 tool calling 之前的考古做法,别用。
- 偷偷引入框架:用任何 @tool 装饰器都算作弊,这个里程碑的意义就没了。
- 没处理模型不调工具的分支:模型直接回答时循环逻辑出错或崩溃。
- 上下文无限增长:多聊几轮 messages 越来越长,没有截断或摘要意识——这正是理解「上下文窗口是工作记忆」最好的时刻。
验收清单
- 单文件、无框架依赖,总行数 ≤100 行
- 至少两个工具,用 JSON schema 声明,走模型原生 tool calling
- 支持多轮对话,能完成需要连续两次工具调用的任务(如「查北京天气,再把温度换算成华氏度」)
- 模型选择直接回答(不调工具)时不崩溃,循环能正常退出
- 工具返回是 JSON 或自然语言字符串,不是对象 repr
- 能说出这个 Agent 每轮对话消耗多少 token、折多少成本
- 能向他人讲清 messages 数组在整个循环里的演化过程
延伸建议
把这个 100 行版本留着——第二到第五阶段的每次重构都以它为对照基线。试试同一份代码换不同厂商的 API,体会各家 tool calling 协议的细节差异。再加第三个工具,感受工具 description 的写法对模型选择准确率的影响——那是第二阶段「工具设计比模型选择更重要」的预习。