聊天机器人和 AI Agent 之间的区别,到底在哪?
我以前以为是模型的好坏。
后来以为是上下文的多少。
跟着《Harness Engineering:从 Claude Code 看 AI 编码工程》这本书读到第三章,我有了一个新答案——
区别在于:聊天机器人跑的是普通循环,Agent 跑的是会自己改自己的循环。
你以为 AI 在"思考",其实它跑的是 8 个阶段的流水线
你在 Claude Code 里输入一句话:"帮我把这个文件里所有的 console.log 删掉"。
回车按下去之后,到模型说出第一个字之前,内部跑了 8 个阶段:
- 上下文预处理:检查现在的对话有多长,太长就开始裁剪
- 历史 Snip:把旧的消息直接砍掉
- 微压缩:保留信息密度,把啰嗦的部分压成精炼的
- 上下文折叠:跨多轮的历史折叠成摘要
- Autocompact:实在太长了就重写整个历史
- 上下文注入:把你的 CLAUDE.md、当前目录、Git 状态等塞进去
- 消息标准化:调整附件顺序、修复工具调用配对、剥离不该传的字段
- API 调用:终于把请求发给 Anthropic 服务器
注意第 1-5 步——这 5 步只有在"上下文不够装下当前对话"时才启动。
每一步都有它的代价:
第 1 步只是修一修,便宜 第 5 步要重写整个历史,贵
Claude Code 的设计原则是"从轻到重"——能用第 1 步搞定的,绝不动第 2 步。
这是工程上一个很优雅的细节:不要为了一致性,把简单情况也跑一遍重活。

自修改循环:循环每跑一圈,循环本身都不一样了
回到开头那句话——会自己改自己的循环。
普通的 while 循环长这样:
while (没结束) {做点事}
每一圈都一样,做完该做的就进入下一圈。
Claude Code 的 Agent Loop 长这样:
while (没结束) {做点事顺便修改"什么算结束"顺便修改"做点事的时候有多少 token 可用"顺便修改"用哪个模型"顺便修改"对话历史长什么样"}
每一圈结束之后,循环本身的运行条件都不一样了:
历史可能被压缩了一遍——下一圈看到的"上下文"比这一圈短 模型可能从 Sonnet 切到 Haiku 了——下一圈用的"思考能力"不一样 输出限制可能从 8K 升到 64K 了——下一圈能说的话变多了
这个循环不是在"重复执行",是在"每次自我重塑之后再继续"。
这本书里讲到,Claude Code 给这个循环安排了 7 种"continue 转换"——也就是 7 种不同的"为什么我要再跑一圈":
- next_turn:模型刚说了句话+调了工具,等工具结果回来继续
- max_output_tokens_escalate:模型一句话没说完就被掐断了,把限制从 8K 升到 64K 再来一次
- max_output_tokens_recovery:升到 64K 还说不完,注入一句"接着说,别道歉",最多 3 次
- reactive_compact_retry:上下文太长 API 拒绝了,压缩一下再来
- collapse_drain_retry:历史折叠完了,提交一下再来
- stop_hook_blocking:权限钩子说"不行",注入一条消息再来
- token_budget_continuation:预算还有富余,主动再问一句
还有 10 种终止原因——一个 query 可以死于 10 种不同的死法。
完成了死、容量爆了死、图片错了死、模型挂了死、用户按 Ctrl+C 死、权限拒绝死、轮次到顶死……
这套东西摊开来看,是一份生产级状态机。

为什么这件事重要:因为 AI 经常出错
讲到这里你可能想问——为什么要搞这么复杂?
答案很扎心——
因为 AI 经常出错。
AI 不是确定性程序。
你问它同一个问题问 10 次,可能 9 次答得对、1 次胡说八道。
你让它调一个工具,可能 9 次参数对、1 次参数错。
你给它 100 行的对话历史,可能 99 次能装下、1 次超长。
传统软件是"出错就崩"——产品经理眼中是 bug。
AI 软件是"出错就恢复"——产品经理眼中必须是工程能力。
Claude Code 的循环里塞了三层错误恢复:
第一层:max_output_tokens 出错
模型话没说完?把限制从 8K 升到 64K,再来一次。还说不完?给它注入一句"接着说,别道歉",最多重复 3 次。
第二层:prompt-too-long 出错
请求太长被 API 拒了?先尝试做"上下文折叠"——把历史摘要化。还是太长?做完整的压缩,把整个对话历史改写成一个精简版。
第三层:模型挂了
模型本身回错了或者请求超时?切换模型——从主模型切到备用模型,把消息历史里的 thinking blocks 剥掉,重新发一次。
这三层兜底,是把"AI 经常出错"这件事,从产品事故变成工程能力的过程。
每一层都有死循环保护——不会无限重试。
每一层都有日志埋点——出问题能查。
每一层都有"信息损失最小"的优先级——能用便宜手段恢复就不用贵的。
Agent 和聊天机器人的本质区别,藏在循环里
回到开头那个问题——Agent 和聊天机器人的本质区别在哪?
不在模型。
不在 UI。
不在工具数量。
在那个会自我修改的循环里。
聊天机器人的循环是无状态的——你说一句它说一句,错了你刷新重来。
Agent 的循环是带状态机的——它跟踪自己跑了几圈、试过了哪些恢复手段、当前还能用什么模型、上下文还剩多少 token、为什么这一圈是必要的。
每跑一圈,循环本身都在更新自己的运行条件。
这种东西不是写出来的,是被无数次生产事故磨出来的。
Anthropic 的工程师不可能从第一天就想到"模型会被掐断在第 8000 个 token","prompt 会因为 thinking signature 不一致拒收","Bash 工具的子命令需要被并行性识别"——这些都是用户量上来之后,一次又一次踩出来的坑。
89 个 Feature Flag 是他们对不确定方向的回答。
这 7+10 种状态转换,是他们对确定的失败模式的回答。
夜雨聆风