4385 字
约 14 分钟
29
1.1 从一个「会聊天的模型」到「会干活的系统」
2026-10-25
无标签

1.1 从一个「会聊天的模型」到「会干活的系统」

一句话结论:Agent 不是什么神秘的新物种。它只是一个被装上了「工具」和「循环」的模型——让模型能把话说完之后真正去做事,看到结果再决定下一步。理解这一点,后面所有内容才有落点。

读这篇之前

这是全系列第一篇,不需要前置知识。但你需要接受一个前提:接下来讨论的一切,都是模型 + 外围工程,而不是模型本身变聪明了。


一、先看一个具体的差距

假设你的服务连不上数据库。你打开一个聊天窗口,把现象描述给它:

「我的程序连不上数据库,报超时。」

它会回答:

「可能是数据库地址错误、端口错误、密码错误,或者网络不通。建议逐一检查。」

这个回答没有错,但也没有用。因为它说的每一句都是推测——它没有看过你的配置文件,也没读过你的错误日志。它只能用你给它的那几行字,加上训练时学到的通用规律,猜一个可能性最高的答案。

这就是一次性调用模型的全部能力边界:输入是什么,它就只能基于什么回答。

现在换一种方式。同样的问题,但这次系统被允许自己去找证据:

第 1 轮:模型判断「需要先看日志」
        → 执行:读取日志
        → 结果:「数据库连接超时」

第 2 轮:模型判断「超时可能是地址或网络问题,需要看配置」
        → 执行:读取配置文件
        → 结果:配置里的地址还是旧服务器

第 3 轮:模型判断「证据已够,可以给结论」
        → 输出:数据库地址是旧的,改成新地址后重启

差别在哪?第二种方式里,模型有能力去获得新信息,并根据新信息修正判断。 第一种只能猜,第二种能查。

这个「能查」的能力,就是 Agent 与聊天模型的根本分界。

换个说法:普通大模型像一个知识丰富的回答者——你问它什么,它从已有知识和上下文里组织出答案;Agent 像一个能完成任务的执行者——它不仅生成文字,还能根据任务去调用搜索引擎、数据库、文件系统、代码执行器这些外部工具。[原文 538]


二、Agent 的最小内核

把上面那个过程拆开,一个 Agent 由四样东西组成,缺一不可:

组成 作用 缺了会怎样
LLM 读懂任务、判断下一步该做什么 没有判断力,只能按固定流程走
上下文 保存已经发生了什么(含工具返回的结果) 每一轮都从零开始,无法利用上一轮的发现
工具 真正去读文件、查库、发请求 只能"说",不能"做",退化成聊天模型
循环 决定要不要再来一轮、什么时候停 只有一次机会,无法根据结果调整

所以最小内核可以写成一行:

Agent = LLM + 上下文 + 工具 + 循环 [原文 538][原文 4577]

这个公式看起来很朴素,但它是后面所有章节的地基:

  • 第 2 章讲 LLM 的能力边界——为什么模型自己干不了这些事
  • 第 3、4 章讲上下文和工具——Agent 的输入输出两头
  • 第 5、6 章讲记忆——上下文怎么撑过更长的任务
  • 第 10 章讲循环和运行时的工程化——用 Harness 把这套东西跑稳

五要素与四要素,是同一件事的两种说法

上面那个四件套是工程视角的说法。如果把「循环」再拆细一点,就成了更常见的五要素:

五要素 对应四件套里的哪部分 作用
大语言模型 LLM 理解任务、决定下一步
工具集合 工具 搜索、计算、读文件、执行操作
记忆 / 上下文 上下文 保存已经发生的事情
控制循环 循环 决定是否继续执行
终止条件 循环的一部分 判断任务是否已经完成

后面的「终止条件」值得单独强调,因为它是工程上最容易出事的地方。一个没有终止条件的循环,轻则烧光 token,重则陷入死循环反复调用工具。常见做法有三种:达到最大轮数、模型显式输出「已完成」、外部校验通过。[原文 538]

同一个公式,三层理解

这个公式可以从三个层次理解,随着你的用途不同而深浅不同:[原文 4577]

  • 实现层:四样东西各自的选型——用什么模型、接什么工具、上下文怎么存、循环写在哪。这是写代码时的视角。
  • 直觉层:LLM 是「大脑」,工具是「手和眼睛」,上下文是「笔记」,循环是「不办完不罢休的劲头」。这是跟人解释时的视角。
  • 学术层:Agent 是在部分可观测环境中、通过动作获取信息、以最大化任务完成度为目标的策略系统。这是读论文时的视角。

三层说的是同一件事。你不需要先搞懂学术层才能动手——但如果你要判断一个 Agent 设计得好不好,学术层那个「部分可观测」的视角会很有用:它提醒你,Agent 永远看不到全部真相,只能通过动作逐步获取信息。

从工作流到自主 Agent,是一条光谱而不是两个格子

「Workflow 还是 Agent」这个问法本身有点误导。真实系统几乎都落在这条光谱的中间地带:[原文 4577]

完全固定流程 ──────────────────────────────── 完全自主
   代码决定每一步        代码定骨架+模型填细节        模型每步自主决策

绝大多数生产系统在中间:外层用代码控制阶段,内层让模型决定具体动作。所以不要纠结「我这个算不算 Agent」,而要问「哪些环节需要模型现场判断,哪些环节可以写死」。


三、那个「循环」到底长什么样

业内把这种「想—做—看」的循环叫 ReAct,取自两个词:

  • Reasoning:推理,判断当前该做什么
  • Acting:行动,调用工具

但实际运行中还有第三个环节,而且它极其重要:

  • Observation:观察,把工具执行的结果收回来

完整的一轮是:

Reasoning(想)→ Acting(做)→ Observation(看结果)→ 再回到 Reasoning

用大白话说就是:分析当前情况 → 执行一个动作 → 看看结果 → 决定下一步。循环会一直转,直到任务完成或触达最大轮数上限。[原文 538]

关键在于 Observation 这一环。如果没有它,Agent 只是「连着调用好几次模型」,每次都在盲猜;有了它,每一轮的行动都会改变下一轮的判断依据——这才是从「猜」变成「查」的机制。


四、为什么必须「多次」调用

一个常见疑问:既然模型那么强,为什么不能一次就把事情办完?

原因很直接:一次调用里,模型能看到的只有你给它的那点信息。 它没办法「顺便」去读一个文件——除非你在这一轮里就允许它调用工具,然后把结果再喂回去。而工具返回的结果,需要下一次调用才能被模型「看见」并利用。

换句话说:

模型看到的信息量,取决于上下文里装了什么;而工具的结果,只能通过新的一次调用进入上下文。

这个「必须多次」的限制不是设计缺陷,而是当前架构的必然结果。理解它,你就能看懂为什么 Agent 的成本和延迟天然高于单次调用——每一轮都是一次完整的模型推理。


五、Agent、Workflow、Chatbot 三者的边界

这三个词经常被混用,但它们的差别是谁来决定下一步。

下一步由谁决定 流程可预测性 典型形态
Chatbot 没有人决定——就是一次问答 完全可预测 客服问答、单轮检索
Workflow 代码决定(预定义的固定路径) 高:输入相同则路径相同 文案流水线、数据清洗管道
Agent 模型决定(每轮看着情况判断) 低:同样输入可能走不同路径 Claude Code、Cursor、自主助理

一个可操作的判据是:

如果所有分支都能在写代码时枚举出来 → 用 Workflow。
如果分支依赖运行时才拿得到的信息 → 才需要 Agent。 【推导】

这条判据非常重要,因为大多数场景其实不需要 Agent。业界的反复验证是:能用一次调用加检索解决的事,不要引入 Agent 框架——它带来的延迟、成本、不确定性远大于收益。[原文 4627]

正确的复杂度阶梯是:

  1. 先试单次调用(优化提示词、加示例、调参数)
  2. 不够 → 加检索增强(让模型能查外部知识)
  3. 还不够 → 上 Workflow(代码控制的多步流程)
  4. 真的需要灵活决策 → 才用 Agent

每一步都要有「简单方案明确做不到」的理由,才往下走一级。


一个反例:连续对话为什么不是 Agent

判断一个系统是不是 Agent,有个很好用的测试:看它有没有"根据行动结果改变判断"的能力。

考虑你和聊天机器人连续聊了二十轮。看起来它有记忆、能接着上文说,但它从头到尾没有执行过任何动作——没有读过文件、没有查过数据库、没有发过请求。它二十轮做的事,都是「基于你已经告诉它的信息生成文本」。

所以它满足「有上下文」,但不满足「有工具」和「由结果驱动的循环」。它是多轮对话,不是 Agent。[原文 538]

反过来,如果一个系统只调一次模型、但这一次里模型调了三个工具拿到了真实数据——它反而更接近 Agent 的实质:信息是通过行动获得的。


六、五种编排模式:从简到繁

在真正写 Agent 之前,值得先看清 Workflow 这一档有哪几种形态。业界反复验证有效的编排模式,从简到繁大致是这五种:[原文 4627]

模式 怎么做 适合什么
1. 单次调用 一个提示词,一次请求 绝大多数任务——先验证这里够不够
2. 链式(Chaining) 把任务拆成有序步骤,上一步输出作为下一步输入 步骤明确、可以串行拆解的任务
3. 路由(Routing) 先判断输入类别,再分发给不同的专用提示词 输入类型差异大、混在一起会互相干扰
4. 并行(Parallelization) 多个调用同时进行,最后汇总 子任务互不依赖;或需要多角度交叉验证
5. 编排者-工作者(Orchestrator-Workers) 一个调用负责拆解任务,动态分派给多个执行者 子任务数量与内容事先不确定

注意第 5 种已经踩在 Agent 的边界上了——它由模型动态决定拆几个子任务。而前四种,流程都是代码写死的。

这五种模式的价值在于:当你觉得"需要一个 Agent"时,先在上面这张表里找找,很可能第 2 或第 3 种就够了,而它们比 Agent 便宜、稳定、好调试得多。


七、判断你需不需要 Agent:五道题

在动手之前,先回答五个问题。任何一个答"是",就说明你不需要 Agent。

# 问题 如果是"是"
1 所有分支都能在写代码时枚举出来吗? 用 Workflow
2 每次任务的步骤都一样吗? 用 Workflow
3 出错时必须能一模一样复现吗? 用 Workflow
4 需要给客户报固定价吗? 用 Workflow
5 只是为了少写几个 if-else? 用 Workflow

五道题都答"否",才继续往下看。

一个反例:为什么"智能客服"多数不需要 Agent

很多团队想给客服加 Agent,理由是"要能查订单、能退款、能转人工"。

但你仔细看这三件事:

查订单 → 固定调用一个接口
退款   → 固定校验 + 固定接口 + 需人工确认
转人工 → 固定判断规则

三步全是可枚举的。用 Agent 只会带来:不可预测的成本、难复现的行为、更难审核的执行。

正确答案是一个三步 Workflow + 明确的审批闸门。


八、动手:40 行看出 Agent 的全貌

理解了概念,最快的巩固方式是看一个能跑的最小实现。

def run_agent(task, tools, max_turns=10, budget_tokens=100000):
    messages = [
        {"role": "system", "content": SYSTEM_PROMPT},
        {"role": "user", "content": task},
    ]
    used = 0

    for turn in range(max_turns):                      # ① 终止条件1:轮数
        resp = llm.chat(messages, tools=tools)
        used += resp.usage.total_tokens
        if used > budget_tokens:                       # ② 终止条件2:预算
            return {"status": "budget_exceeded", "messages": messages}

        if not resp.tool_calls:                        # ③ 终止条件3:模型说完了
            return {"status": "done", "answer": resp.content}

        for call in resp.tool_calls:
            result = execute_tool(call, tools)         # ④ 执行(你的代码)
            messages.append({"role": "tool",
                             "tool_call_id": call.id,
                             "content": result})       # ⑤ 观察写回上下文

    return {"status": "max_turns", "messages": messages}

这 20 行包含了你需要知道的一切:

行 对应本文哪一节
messages 初始化 上下文(第二节)
for turn in range() 循环(第三节)
if not resp.tool_calls 模型判断完成
execute_tool 工具执行在外围(第四节)
messages.append(...) 观察写回——最关键的一步

最后一步最容易被忽略:忘了写回,模型下一轮就看不到结果,会反复调同一个工具(10.2 讲过的重复调用 bug)。

这个实现缺什么

它只是骨架,生产环境还需要:

缺什么 在哪一章
参数校验与失败回填 4.3
工具描述质量 4.2
上下文压缩 5.2
权限与沙箱 10.3、14.4
状态持久化 10.4
轨迹记录 10.5
评测 第 13 章

但结构是对的——后面所有章节都是在给这 20 行加东西,而不是换掉它。


九、常见误区

误区一:Agent 是「更长的提示词」。
不是。提示词再长,模型依然只能看到上下文里的东西;Agent 的关键是能通过工具获得上下文之外的信息。

误区二:连续对话就是 Agent。
连续聊天只是历史消息越攒越多,模型始终没有「做」的能力,也没有「根据结果调整」的循环。[原文 538]

误区三:Agent 越自主越好。
自主性是有代价的:不可预测、难调试、成本不可控。受约束的 Agent 通常比完全自主的更可靠,这也是第 14 章要讲的「人在环」的出发点。

误区四:用了框架就算 Agent。
框架只是把循环、工具、上下文管理这些零件封装好了。如果你的流程里模型根本没在做判断,那你用的是 Workflow,套了层框架的皮而已。

误区五:Agent 能解决模型幻觉。
不能。Agent 能通过工具获得真实信息,从而降低幻觉的发生概率,但模型依然可能读错、总结错。这是第 13 章「评估」要解决的问题。


十、下一篇

现在你知道 Agent 是「模型 + 工具 + 上下文 + 循环」了。但还有一个更基础的问题没答:模型本身到底能干什么、不能干什么? 为什么它必须依赖工具才能做事,而不是直接就把事办了?

下一篇我们从模型的工作方式讲起——包括那个决定 Agent 一切上限的东西:上下文窗口。

1.1 从一个「会聊天的模型」到「会干活的系统」
https://clxhxhhr.top/posts/4867/
作者
clxstart
发布于
2026-10-25
许可协议
CC BY-NC-SA 4.0
评论
0 条
还没有评论,先写一条吧。