Agent 不是更长的回答
从 LLM、Tool Calling 与 Agent Loop 开始,建立后续阅读 Pi 所需的最小心智模型。
5bc1c2c0从函数到循环
LLM 更像一个函数:输入一段上下文,输出下一段内容。Agent 则把这个函数放进一个可观察、可中断的循环:模型可以请求工具,运行时执行工具,把结果放回上下文,再让模型继续。
Chatbot 像问答柜台:你问一次,它答一次。Agent 像带着工作台的工程师:先理解任务,必要时查文件或运行命令,再根据结果决定下一步。
Agent = model policy + state + tools + loop control。模型决定意图,runtime 决定何时调用、如何验证、如何记录、何时停止。
Pi 的 runLoop() 包含内外两层循环:内层处理 tool calls 与 steering messages;外层在原本将停止时检查 follow-up queue。
消息进入队列
五个基础对象
- Message:用户、助手和工具结果组成的对话事实。
- Context:这次模型调用真正能看到的 system prompt、messages 与 tools。
- Tool:带名称、描述、参数 schema 和执行函数的能力。
- Event:让 UI、日志或扩展观察运行过程的增量信号。
- Session:跨多次调用保存历史与分支的持久结构。
packages/ai/src/types.ts:323-491Message · Tool · Context · Event
一次 turn 和一次 run
一个 turn 是“一次 assistant response + 由它触发的全部 tool calls/results”。一个 run 可以有多个 turn:只要模型继续发出工具调用、用户插入 steering message,或队列中存在 follow-up,循环就继续。
run
└─ turn 1: assistant → tool call → tool result
└─ turn 2: assistant → tool call → tool result
└─ turn 3: assistant → final answer
Why / What / How / Trade-off
Why
纯文本生成无法直接读取真实文件、调用 API 或观察执行结果。循环让语言模型获得反馈。
What
Agent runtime 解决“意图如何变成动作,以及动作结果如何进入下一轮推理”。
How
Pi 在模型边界前把 AgentMessage[] 转成标准 Message[];模型流式返回内容或 tool call;runtime 校验参数并执行;tool result 重新进入 messages。
packages/agent/src/agent-loop.ts:281-371streamAssistantResponse()
Trade-off
循环越自动,潜在副作用越大;控制越严格,用户打断和确认越多。Pi 的选择不是替所有人做权限政策,而是暴露 hooks、队列和事件,让宿主决定。
读完这一章,你应能解释
- 为什么 LLM 不等于 Agent。
- tool result 为什么必须回到上下文。
- turn、run 与 session 的时间尺度为何不同。
- runtime 为什么是工程可信度的中心。