很多人第一次听到 Agent,会以为它是“更聪明的聊天机器人”。这个说法只对了一小半。
更工程化的定义是:
Agent 是一个围绕大模型构建的运行时系统。它维护状态,把用户目标转换成多轮模型请求,允许模型调用工具,接收工具结果,再决定下一步。
换句话说,Agent 不是一个单独的模型调用,而是一条闭环。
flowchart TD
U["用户目标"] --> C["构造上下文"]
C --> M["请求大模型"]
M --> R{"模型输出"}
R -->|"普通文本"| A["返回给用户"]
R -->|"工具调用"| T["执行工具"]
T --> O["工具结果写回消息"]
O --> C一个最小 Agent 只需要五个概念:
| 概念 | 做什么 | 如果没有它 |
|---|---|---|
消息 Message |
保存用户、助手、工具结果 | 模型不知道前面发生过什么 |
模型 Model |
根据上下文生成下一步 | 系统没有推理和规划能力 |
工具 Tool |
把模型连接到外部世界 | 只能聊天,不能读文件、执行命令、改代码 |
循环 Loop |
反复处理“模型输出 -> 工具结果 -> 再请求模型” | 只能执行一步,无法完成复杂任务 |
事件 Event |
把过程暴露给 UI 和日志 | 前端只能看到最终答案,看不到中间发生了什么 |
假设用户说:“读一下 README,帮我修正文档里的安装命令。”
单次请求会遇到三个问题:
Agent 的做法是把这个任务拆成多轮:
sequenceDiagram participant User as 用户 participant Agent as Agent Loop participant LLM as 大模型 participant Tool as 文件工具 User->>Agent: 修正文档安装命令 Agent->>LLM: 目标 + 当前消息 + 可用工具 LLM-->>Agent: toolCall read(README.md) Agent->>Tool: 读取 README.md Tool-->>Agent: 文件内容 Agent->>LLM: 工具结果 LLM-->>Agent: toolCall edit(README.md) Agent->>Tool: 修改文件 Tool-->>Agent: 修改结果 Agent->>LLM: 工具结果 LLM-->>Agent: 总结完成情况 Agent-->>User: 已修正,并说明验证方式
Pi 官方文档把 Pi 称为一个 minimal terminal coding harness。这个说法很关键:Pi 的野心不是把所有工作流都写死进核心,而是保持核心小,把能力放到工具、扩展、技能、提示模板和包里。
参考 Pi 仓库可以看到三层很清楚:
| 包 | 教程里的理解 | 关键职责 |
|---|---|---|
@earendil-works/pi-ai |
模型适配层 | 统一多家模型 API、流式事件、消息格式、工具 schema |
@earendil-works/pi-agent-core |
Agent 内核层 | Agent Loop、工具调用、事件、状态、队列 |
@earendil-works/pi-coding-agent |
产品运行层 | 会话管理、资源加载、内置工具、扩展、TUI/RPC/print 模式 |
我们后面的教学版项目会保留这三层思想,但把代码缩小到适合学习的规模。
试着回答:如果一个 Agent 没有工具,只保留消息和模型,它还能算 Agent 吗?
一个合理答案是:可以算最弱形式的 Agent,因为它仍有状态和循环;但它无法观察和改变外部世界,所以在编程任务里能力非常有限。