Agent是什么:从chatbot到agent的演进

如果你刚接触”agent”这个词,可能会困惑:它和ChatGPT这种聊天机器人有什么不同?为什么大家都在谈agent?aptbot又是什么?这篇文章会从零开始,把”agent到底是什么”讲透,并对比市面几种主流agent的设计思路,最后落到aptbot的选择上。

一、概念:从chatbot到agent的演进

要理解agent,最好的方式是看AI对话系统是如何一步步演进到今天这个形态的。这条路径上主要有三种形态:chatbot、assistant、agent。它们看起来都能”对话”,但底层范式截然不同。

1.1 chatbot:被动应答系统

chatbot(聊天机器人) 是最基础的形态。它的核心循环是 用户输入 → 模型回复 → 回合结束。你问一句,它答一句,模型不主动做事,也不会连续执行多步任务。

早期的规则机器人(比如关键词匹配的客服)、RASA时代的意图识别机器人、再到ChatGPT默认的对话模式,本质上都属于chatbot。它们的共同特征是:模型只是”答话者”,决策权完全在用户手里。你问什么它答什么,答完就等下一句。

chatbot的优点是简单可控:每一轮交互边界清晰,不会”跑偏”。缺点也很明显——它无法承担”帮我完成一件事”这类任务,因为完成任务往往需要多步操作、调用外部工具、根据中间结果调整策略,而chatbot只会说话不会做事。

1.2 assistant:能力增强但决策在外

assistant(助手) 在chatbot之上加了一层”能力”:它可以调用工具了。比如你问”今天北京天气如何”,assistant会调用一个 weather_api 工具,拿到结果后组织成自然语言回答。

这看起来很像agent,但有一个关键区别:assistant的工具调用逻辑是开发者硬编码的。开发者预先定义”当用户问天气时调用weather_api””当用户问数学题时调用calculator”,模型只是在固定流程中充当触发器。做什么、何时做、按什么顺序做,都由开发者写死的规则决定。

1
2
assistant 的决策流程(开发者预设):
用户输入 → 意图识别 → 匹配规则 → 调用对应工具 → 返回结果

assistant已经能”做事”了,但它本质上是声明式流程编排——开发者把每条路径都规划好,模型只是执行。一旦遇到规则没覆盖的情况,assistant就会失灵。

1.3 agent:模型自主决策的范式跃迁

agent 的根本转变在于:模型自己决定做什么

给agent一个目标(比如”帮我修这个bug”),它会自己拆解子任务:先读代码理解问题、再定位报错位置、再编辑文件修复、再运行测试验证、最后给出总结。整个过程中,模型决定调用哪个工具、按什么顺序、何时算完成。

指令从”声明式”变成了”目标式”,决策权从开发者转移到了模型。这是范式级别的差异:

形态 输入 决策者 执行方式 终止条件
chatbot 一句话 无决策 一次回复 用户离开
assistant 一句话 + 触发规则 开发者(预设规则) 单次工具调用 规则链结束
agent 目标 模型(自主推理) 多步工具循环 模型判断完成

一个直观的对比:你问”如何删除一个git分支”——chatbot会告诉你命令,你自己复制粘贴执行;assistant可能在你点某个按钮时帮你执行一次;agent则是你说”把这个仓库里所有叫old-feature的本地分支删了”,它自己 git branch 列出、自己 git branch -D 删除、自己验证结果,给你一份完成报告。

1.4 ReAct循环:agent的心跳

agent之所以能”自主决策”,核心运行模式是 ReAct(Reasoning + Acting)。这个概念2022年由Yao等人提出,但直到LLM推理能力足够强之后才真正可用。

ReAct的循环结构是这样的:

  1. Reasoning(推理):模型思考当前状态、下一步该做什么、为什么这么做
  2. Acting(行动):模型调用一个工具(读文件、执行命令、搜索…)
  3. Observation(观察):工具返回结果,作为新的信息进入下一轮推理
  4. 重复:直到模型判断”任务完成”,输出最终答案

下图展示了ReAct循环的完整流程:

ReAct循环流程图

这个循环的关键不在于”调用了工具”,而在于模型在每一步都做推理。它不是 if-else 触发器,而是”我看到read的输出有X行报错,这暗示Y模块有问题,下一步应该edit那个文件”。每一步的决策都基于前一步的真实结果,不是预设脚本。

这意味着同一个agent面对同一个任务,两次执行可能走完全不同的路径——这正是agent与传统软件的本质区别:传统软件是声明式指令(开发者写好每一步),agent是自主决策(开发者只提供工具和目标,路径由模型现场决定)。

二、通用设计方案:agent的核心架构

理解了ReAct循环,接下来看工程上如何实现一个agent。虽然不同项目的实现各异,但几乎所有agent框架都围绕四个核心组件展开。

2.1四大核心组件

把agent拆开看,可以归纳为四个核心组件,用人体比喻便于记忆:

  • LLM大脑:负责推理、决策、语言理解与生成。是agent的”思考器官”,决定了agent的智力上限。
  • 工具双手:让agent能”做事”。读文件、执行命令、编辑代码、搜索网络——没有工具,agent只是会说话的chatbot。
  • 记忆长尾:短期记忆是对话历史,长期记忆是跨会话的累积。没有记忆,agent每次都从零开始,无法承担持续项目。
  • 流式嘴巴:agent的输出不是一次性给出,而是边思考边输出。流式不只是UX优化,是agent与人类协作的基本节奏——人类能实时看到agent在做什么,必要时中途打断。

这四个组件的关系如下图所示:

Agent四大核心组件架构图

2.2组件协作的数据流

一次完整的agent任务,数据流大致是这样的:

  1. 用户输入目标 → 进入agent loop
  2. 组装上下文:从记忆中取出对话历史 + 系统提示 + 工具定义,发给LLM
  3. LLM推理:返回”下一步该调用什么工具”或”最终回答”
  4. 若返回工具调用:执行工具,把结果作为observation追加到上下文,回到第2步
  5. 若返回最终回答:流式输出给用户,任务完成

关键在于第4步——工具结果会作为新的信息进入下一轮推理。这就是ReAct循环的工程化实现:上下文在每一轮不断增长,模型基于累积的上下文做下一步决策

这也引出了agent工程化的核心挑战:上下文会越滚越大,如何控制?如何保证工具执行不出错?如何让记忆不丢失关键信息?这些是后续每篇文章要拆解的主题。

2.3 agent循环的工程化实现

从代码层面看,agent loop通常是一个while循环(或生成器/async generator),每轮迭代包含:构造请求 → 调用LLM → 解析响应 → 执行工具 → 收集结果。循环的退出条件是”模型不再请求工具调用”或”达到最大轮次”。

不同框架在这个基础结构上做不同的工程化取舍:有的追求极简(核心循环100-150行),有的追求功能完整(循环内嵌错误恢复、上下文压缩、钩子机制)。这些取舍没有绝对优劣,取决于项目定位——是做SDK让别人扩展,还是做产品直接服务终端用户。

三、市面其他agent的设计方案对比

agent领域已有不少开源项目,它们在设计哲学上差异很大。理解这些差异,能帮助我们看清aptbot的选择。这里对比三种有代表性的设计路线,分别称为方案A、方案B、方案C(它们各自对应市面上的某些开源agent,但本文关注设计思路而非具体项目)。

3.1方案A:极简内核 + 类型安全路线

这条路线的核心哲学是”少即是多”——把agent loop做成无状态生成器函数,核心代码只有100-150行,上层harness/session可以自由组合。

设计特点:

  • 无状态内核:agent loop是纯函数,不持有状态,状态由上层session管理。这让内核可以任意组合、测试、复用。
  • 强类型系统:用TypeScript + schema校验(如TypeBox/Zod)保证全链路类型安全。工具定义、配置、事件流都有类型约束。
  • 事件流模型:agent的输出不是字符串,而是一个 EventStream<AgentEvent>,每个事件(文本块、工具调用、工具结果)都是类型化对象。上层UI可以精确订阅感兴趣的事件。
  • 复杂度上移:内核极简,但上层(比如coding agent的交互层)可能包了40+ 组件换交互体验。

适用场景: 想把agent嵌入自己产品的开发者(SDK路线),需要类型安全和可组合性。

代价: 内核虽小,但要做完整产品需要在上层补大量交互逻辑;事件流模型对简单场景偏重。

3.2方案B:自演化 + 极低token路线

这条路线最激进——不给agent预置技能,让它在解决任务时自己积累skill。agent用得越多越聪明。

设计特点:

  • 任务自动结晶:agent完成一个任务后,会把成功路径沉淀成新的skill,下次遇到类似任务直接复用。
  • 极低token消耗:通过”只传新消息”(而非全量历史)+ tag截断 + 工作记忆checkpoint,把每轮上下文压到30K以内,远低于动辄200K-1M的方案。
  • 原子工具集:不追求工具丰富,而是用9个原子工具(其中code_run一个工具包揽python+bash执行)覆盖所有能力。
  • 自举性:仓库自身就是agent创建的——agent不仅用工具,还能改进自己的代码。

适用场景: 个人桌面自动化、长期使用的个人助理(用得越久越聪明)。

代价: 初次使用时skill库为空,表现不如预置技能的方案;自演化路径不可控,可能结晶出低质量skill;threading + generator模型在多端接入时比async复杂。

3.3方案C:全栈工程化 + 多平台路线

这条路线追求”生产就绪”——从IM渠道到WebUI到定时任务全覆盖,配置驱动一切。

设计特点:

  • Channel抽象:把每个聊天平台(Telegram、Discord、Slack…)抽象成Channel,agent通过统一的MessageBus与所有平台通信。
  • 配置驱动:30+ 内置provider、20+ 内置channel,全部通过配置文件切换,不改代码。
  • 循环内嵌恢复:agent loop单方法400行,内置orphan修复、backfill、microcompact、tool_result_budget等多种错误恢复路径。
  • 弱类型:运行时大量dict传递,Pydantic仅覆盖配置层,类型安全不完整。

适用场景: 需要快速接入多个IM平台、追求生产可用的运维场景。

代价: 单方法400行的循环可读性差;弱类型在重构时风险高;功能全但每个模块都不够”精炼”。

3.4设计哲学对比

维度 方案A(极简SDK) 方案B(自演化) 方案C(全栈工程)
核心哲学 少即是多,可组合 不预置技能,用中演化 生产就绪,配置驱动
核心循环规模 ~150行 ~100行 ~400行
类型安全 强(全链路) 弱(几乎无类型) 弱(仅配置层)
token策略 中等 极低(<30K) 高(大context window)
工具策略 用户手写 + 内置 原子工具 + 自动结晶 内置丰富
多平台 无(纯SDK) 有限(多前端非channel) 20+ channel
适合谁 开发者嵌入 个人长期使用 运维多平台

这三种路线没有绝对优劣,是不同定位下的取舍。方案A把复杂度留给上层,换内核纯粹;方案B用不可控换极低token和自演化;方案C用臃肿换全功能。

四、aptbot的设计特点

aptbot作为一个”学习型个人助理项目”,在设计时需要从上述方案中汲取经验,同时立足自己的定位做取舍。

4.1项目定位:学习型 + 个人助理

aptbot有双重身份:

  • 学习型项目:它的代码本身就是为了让人理解agent而存在的——每一层架构清晰、可读、有文档,能作为”从0理解agent”的教材。
  • 个人助理:它又要真正能用,能帮开发者处理日常任务(代码维护、文档生成、自动化操作),不是玩具。

这个双重定位决定了aptbot的设计基调:架构要清晰到能教学,功能要完整到能用。它不能像方案A那样只做SDK(学习者看不到完整产品),也不能像方案C那样堆功能(学习者会被淹没),更不能像方案B那样追求自演化(初学者无法理解不可控的skill结晶)。

4.2架构取舍

基于这一定位,aptbot在关键维度上做了如下选择:

  • 类型安全:选择TypeScript + Zod,向方案A看齐。类型安全既是工程质量保证,也是教学优势——读代码就能看出每个数据的形状。
  • 核心循环:参考方案A的分层思路(无状态内核 + 有状态session),保持核心loop在150行左右,复杂度上移到session和harness层。这样新手能先理解最小循环,再逐步看上层。
  • 事件流:采用类型化EventStream(而非方案B的字符串yield),保证可读性和类型安全。
  • 工具系统:预置清晰、文档齐全的工具集(而非方案B的原子工具自结晶),让学习者一眼看懂agent能做什么。
  • 多端接入:MVP聚焦CLI + WebSocket,IM集成留到后续版本。不追求方案C的20+ channel,但保留Channel抽象为未来扩展留空间。
  • 记忆与可靠性:这是aptbot最下功夫的地方——Provider故障转移、工具安全边界、记忆压缩、Hook插件机制,每一项都在解决”如何让agent更可靠”。

4.3与其他方案的差异

和三种方案相比,aptbot的独特之处在于”教学优先的可读性约束“。其他方案优化的是性能、token、功能覆盖;aptbot在这些之上还多一条:代码和架构必须能让初学者读懂。这意味着aptbot会主动放弃一些”聪明但晦涩”的实现,选择”朴素但清晰”的写法。

这不是技术退让,而是项目定位的必然——一个让人学习agent的项目,自己不能是黑盒。

五、下一步可能的发展方向

理解了agent的基本概念和aptbot的定位,后续演进方向有几个值得关注的点:

  • 更智能的上下文管理:当前agent的上下文会越滚越大,未来需要更精细的压缩策略(比如基于注意力的记忆保留、分层记忆系统)。
  • skill的半自动积累:借鉴方案B的思路,但保持可控——让用户审核每个沉淀的skill,而非全自动结晶。
  • 多agent协作:单个agent能力有限,未来可能引入subagent机制,让主agent派发子任务给专门的子agent。
  • 更自然的交互节奏:当前的流式输出 + 工具调用展示已经不错,但人类打断、纠偏、补充指令的体验还有提升空间(steering机制)。
  • 可靠性工具链:如何让agent自己发现错误、回退、重试,而不是把错误抛给用户。

这些方向aptbot会在后续版本逐步探索,本系列的最后一篇文章会专门讨论演进路线。

小结

这一篇我们从三个层面理解了agent:

  1. 概念演进:chatbot是被动答话,assistant是按规则调用工具,agent是模型自主决策。ReAct循环(推理→行动→观察)是agent的心跳。
  2. 通用架构:四大组件(LLM大脑 / 工具双手 / 记忆长尾 / 流式嘴巴)+ agent loop编排,是几乎所有agent框架的骨架。
  3. 设计对比:市面方案在”极简/自演化/全栈”之间取舍,aptbot选择”类型安全 + 清晰分层 + 教学可读”的路线。

理解了这个心智模型,接下来11篇文章里讨论的每一项设计决策,都能对号入座:它属于大脑、双手、长尾还是嘴巴?它解决的是哪一类可靠性问题?下一篇文章,我们会看aptbot的整体架构如何承载这套心智模型。