打牢地基:LLM 原理与 API · 里程碑长文:100 行代码,是你与框架之间的门票

日期:2026年10月19日 · 路径:Agent 专业开发人员 · 阶段 s1

这个里程碑要做什么

不用任何框架(不碰 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、摘要、记忆分层,后续阶段的所有设计都是在跟这块有限的记忆做斗争,而斗争的痛感你现在就能提前体会到。

检验标准就一个:写得出来,你配用框架;写不出来,先去补课。

配套资源怎么用

常见翻车点

验收清单

延伸建议

把这个 100 行版本留着——第二到第五阶段的每次重构都以它为对照基线。试试同一份代码换不同厂商的 API,体会各家 tool calling 协议的细节差异。再加第三个工具,感受工具 description 的写法对模型选择准确率的影响——那是第二阶段「工具设计比模型选择更重要」的预习。