Agent 与 Workflow 的边界——控制权归谁

T3-1模块 3 · Agent 开发面试权重 更新于 2026-08-19
前置T1-3T2-1
关联题目Q3-01Q3-02

这篇学完你能回答什么

  1. 什么是 Agent?它和 workflow、和「调用一次大模型」的本质区别在哪?
  2. 什么时候该用 workflow,什么时候该上 Agent?盲目上 Agent 会踩什么坑?
  3. 你怎么向面试官证明:你上的那个 Agent,不是把 workflow 硬叫成 Agent?

从一个真实故障讲起

一个财务报销审核系统,原本是四步流水线:OCR 识别发票 → 字段抽取 → 规则校验 → 生成审核结论。稳定跑了半年,P99 延迟 4 秒,单张成本约 ¥0.02。

团队看到「Agentic」火起来,把它重构成了自主 Agent:给模型挂上 OCR 工具、发票查验工具、规则库检索工具、工单系统写入工具,system prompt 里写「你是资深财务审核专家,请自主完成审核」。

上线一周后的账单和监控:

  • 单张发票平均消耗从 1 次模型调用变成 6~11 次,成本涨到 ¥0.14 上下;
  • P99 延迟从 4 秒涨到 90 秒以上,前端超时告警刷屏;
  • 出现了流水线时代不可能出现的故障:同一张发票被重复写入三条工单——模型调用写工单工具后没拿到明确成功信号,"想了想"决定重试;
  • 最要命的是复现不了。财务同事截图说"昨天这张判错了",开发按同样输入重跑一遍,模型走了另一条路径,判对了。

复盘结论只有一句话:这个任务的路径是可枚举的,把它交给模型自主决策,等于把确定性系统换成了概率性系统,还额外付了钱。

后来的修法不是回滚,而是切开:主干四步回到代码编排的 workflow;只在「规则校验判不了、需要跨系统追查上下文」的那 6% 长尾случае里,才把控制权交给一个带工具的 Agent 子流程。成本回到 ¥0.03,长尾问题的人工介入率下降了四成。

这个故障是本篇的全部主题:Agent 不是更高级的 workflow,它是一种交换——用确定性换适应性。你得知道自己在换什么。

路径只有四步,却交给模型自己决定
财务报销审核重构一周:账单、延迟、重复写入三处同时出事,最要命的是复现不了

  1. 四步流水线稳跑半年

    P99 4 秒,单张成本约 ¥0.02

  2. 重构成自主 Agent

    挂四个工具,prompt 写「自主完成审核」

  3. 写工单没拿到成功信号断点

    模型「想了想」决定重试

  4. 同一发票写进三条工单

    根因是工具没做幂等,不是模型

  5. 同输入复现不出来

    重跑走了另一条路径,这次判对了

单张的模型调用次数1 次6~11 次
单张成本约 ¥0.02涨到 ¥0.14 上下
P99 延迟4 秒90 秒以上,前端超时刷屏
切开之后主干回到 workflow成本 ¥0.03,人工介入率降四成
修法不是回滚,是切开:主干四步回到代码编排,只有判不了的 6% 长尾才把控制权交给 Agent 子流程。Agent 不是更高级的 workflow,它是用确定性换适应性 —— 你得知道自己在换什么。

核心概念:先打比方,再给定义

比喻:workflow 是地铁,Agent 是出租车。

地铁的轨道是提前铺好的,几号线停几站、换乘在哪里,发车前就确定了。它便宜、准时、可预测,出了问题你知道去查哪一段轨道。出租车没有固定路线,司机根据实时路况自己决定往哪拐——遇到堵车能绕路(适应性),但也可能绕远、可能在环岛上转三圈,车费按表跳,事后你无法保证同一趟能复现同一条路线。

大部分公司真正需要的是地铁。只有当"起点终点组合太多、没法为每一对铺一条轨道"时,出租车才划算。

定义

  • Workflow(工作流):由预先编写的代码路径编排 LLM 和工具的系统。哪一步调模型、哪一步调工具、什么条件下走哪个分支,都写死在代码里。模型是流程中的一个算子。
  • Agent(智能体):LLM 在循环自主决定下一步动作,用工具执行结果作为反馈驱动下一轮,并自己判断何时结束的系统。
  • 单次 LLM 调用:一进一出,无循环、无工具、无状态。

判别只看一件事:下一步做什么,是代码决定的,还是模型决定的? 这就是「控制权归属」。控制权在代码 → workflow;控制权在模型 → Agent。

术语对照:

  • Agentic(智能体式)——形容词,泛指"带一定自主决策成分",是一个光谱而不是开关。
  • Autonomy(自主度)——模型能自行决定的决策点占全部决策点的比例。
  • Harness(外壳/执行框架)——包在模型外面的循环、工具、护栏、状态管理那一整套工程代码。同一个模型套不同 harness,能力差距极大(详见 T3-10)。
大部分公司真正需要的是地铁
判别只看一件事:下一步做什么,是代码决定的,还是模型决定的

地铁 · 轨道提前铺好

便宜、准时、可预测,出事知道查哪段轨道

起点终点组合太多时,没法为每一对都铺一条轨道

对应
Workflow · 工作流

预先编写的代码路径编排模型与工具

哪一步调模型、什么条件走哪个分支都写死在代码里,模型只是流程中的一个算子

路径可枚举秒级 SLA可复现
出租车 · 司机现场拐弯

遇到堵车能绕路,按实时路况改主意

可能绕远、在环岛上转三圈,车费按表跳,同一趟复现不了

对应
Agent · 智能体

在循环中自主决定下一步动作

拿工具执行结果当反馈驱动下一轮,并自己判断何时结束

AgenticAutonomyHarness
术语得配套记住三个:Agentic 是形容词,指一个光谱而不是开关;Autonomy 是模型自决的决策点占全部决策点的比例;Harness 是包在模型外的循环、工具、护栏与状态管理 —— 同一个模型套不同 harness,能力差距极大。

原理拆解

越往右走,交出去的是控制权
[1] 单次调用 → [5] 自主 Agent,中间还有链式、路由、编排器-执行器三档

  1. 单次调用prompt → 答案,无循环无工具无状态
  2. 链式A → B → C 固定顺序跑完
  3. 路由模型只决定走哪个分支
  4. 编排器-执行器代码定框架,模型决定拆几个子任务
  5. 自主 Agent模型决定每一步和何时停
自主度低自主度高
控制权代码模型
可复现
成本

收益只在四种情况下才真实存在:路径无法枚举(先看执行计划还是先看表统计,取决于上一步看到了什么)、需要中途改主意回头重查、输入分布开放长尾多、验证比生成便宜(写代码难、跑测试容易)。一条都不满足,交出控制权换来的只有成本、延迟和不可复现。

走到第 5 档时,代码只剩三件事:提供工具、忠实执行、兜底。「下一步干什么」整个交给模型 —— 这是全部收益的来源,也是全部风险的来源。唯一的硬约束是步数上限,而兜底分支必须写。

面试里最常见的失分点,是把这条光谱压成「用没用 Agent 框架」。用 LangGraph 写一条固定的三节点直线图,那仍然是 workflow;用 200 行裸 Python 写一个带工具的 while 循环让模型自己决定何时退出,那就是 Agent。

自主度是一条光谱,不是二选一

原文示意
自主度低 ←──────────────────────────────────────────────→ 自主度高

[1] 单次调用      [2] 链式       [3] 路由       [4] 编排器-执行器   [5] 自主 Agent
 prompt→答案    A→B→C 固定    模型只决定    代码定框架,模型      模型决定每一步
                              走哪个分支    决定拆几个子任务      和何时停

控制权:代码 ████████████████████████░░░░░░░░░░░░░░░░ 模型
可复现:高 ███████████████████░░░░░░░░░░░░░░░░░░░░░░░ 低
成本  :低 ██████████░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ 高

面试里最常见的失分点,是把这条光谱压缩成"用没用 Agent 框架"。用了 LangGraph 写一条固定的三节点直线图,那仍然是 workflow;用 200 行裸 Python 写一个带工具的 while 循环让模型自己决定何时退出,那就是 Agent。框架不决定性质,控制权决定性质。

两段伪代码,差别一目了然

# Workflow:路径写死在代码里,模型只负责单点判断
def review_invoice(file):
    fields = ocr_extract(file)                 # 代码决定:第一步一定是 OCR
    checked = rule_engine.validate(fields)     # 代码决定:第二步一定是规则校验
    if checked.all_passed:                     # 代码决定:分支条件
        return approve(fields)
    reason = llm.complete(REVIEW_PROMPT, ...)  # 模型只在这一点上做判断
    return reject(fields, reason)
# Agent:路径由模型每一轮现场决定
def review_invoice_agent(file, max_steps=12):
    messages = [system(AGENT_PROMPT), user(f"审核这张发票:{file}")]
    for step in range(max_steps):                    # ← 唯一的硬约束:步数上限
        resp = llm.chat(messages, tools=TOOLS)       # ← 模型决定:调哪个工具、还是收工
        if not resp.tool_calls:
            return resp.content                      # ← 模型决定:什么时候结束
        for call in resp.tool_calls:
            result = dispatch(call)                  # 代码只负责忠实执行
            messages.append(tool_result(call.id, result))
        messages.append(resp)
    return fallback("超出步数上限,转人工")            # ← 兜底必须有

第二段里,代码只做三件事:提供工具、忠实执行、兜底。"下一步干什么"这个决策,整个交给了模型——这是全部收益的来源,也是全部风险的来源。

收益从哪来:为什么有时候必须交出控制权

Agent 的适应性收益,只在下面这几种情况下才真实存在:

  1. 路径无法枚举。"这条 SQL 为什么慢"——可能要看执行计划,可能要看表统计信息,可能要查最近的 DDL 变更,具体先看哪个取决于前一步看到了什么。你没法为所有组合铺轨道。
  2. 需要中途改主意。检索发现文档里说的是旧版本 API,得回头换关键词重查——workflow 的直线结构表达不了这种回溯。
  3. 输入分布开放。用户可能问任何东西,长尾占比高且形态各异。
  4. 验证比生成便宜。写代码难,跑测试确认对不对很容易——这类任务模型可以自己迭代逼近,闭环成立。

反过来,如果你的任务不满足这几条中的任何一条,Agent 带来的只有成本、延迟和不可复现。

工程实践(截至 2026-08)

选型判据表:五个问题定生死

判据 倾向 workflow 倾向 Agent
任务路径能否枚举 能列出 ≤10 条主路径 组合爆炸、无法穷举
单次错误代价 高(涉及资金/合规/写库) 低(可重试、可人工兜底)
延迟预算 秒级 SLA、同步接口 分钟级可接受、异步交付
可解释性要求 需要向审计/监管说明每一步 只需最终结果可核验
输入分布 收敛、格式稳定 开放、长尾多

经验法则:五条里有三条倒向 workflow,就别上 Agent;如果只有"老板想要 Agent"这一条理由,那是零条。

混合架构才是 2026 年的主流答案

生产系统里纯 workflow 和纯 Agent 都少见,主流是确定性主干 + 自主长尾

原文示意
用户请求
   │
   ├─ 意图分类(一次轻量模型调用,代码决定分支)
   │
   ├─→ 命中已知场景 (94%)  →  固定 workflow  →  秒级返回,成本可控
   │
   └─→ 长尾/复杂 (6%)      →  Agent 子流程   →  带步数与预算上限
                                    │
                                    └─ 超限/低置信 → 转人工

这套结构在面试里的说服力远高于"我们全上了 Agent",因为它证明你算过账。

进阶技术三段式:自主 Agent

  • 解决什么:路径不可枚举、需要回溯改主意的开放任务;把"穷举分支"的工程成本转移给模型的运行时决策。
  • 代价是什么:① token 成本通常是等价 workflow 的数倍(每轮都要重发历史与工具定义,实际倍数取决于步数与上下文长度,务必自己实测);② 延迟从单次调用变成 N 次串行;③ 不可复现,同输入不同路径,测试和归因都变难;④ 故障面扩大——工具的每一次副作用都可能被模型重试;⑤ 可观测成本,你必须建 trace 才知道它在干嘛(T3-11)。
  • 什么时候不该用:路径固定的流水线;单步高危且不可回滚的操作(转账、删库、对外发消息)作为主干;有硬性同步 SLA 的接口;需要逐步向监管解释决策依据的场景。这几种情况下,正确答案是 workflow,并把模型限制在单点判断上。

避坑清单

  • 必须有步数上限和预算上限,两者都要。只有步数上限,模型可能在第 3 步就吃掉 20 万 token。
  • 写操作默认需要确认。高危工具走分级自治(T3-10),不要让模型直接落库。
  • 工具必须幂等或带幂等键。开篇那个"重复写三条工单"的故障,根因不在模型而在工具没做幂等——模型重试是常态,不是异常。
  • 别用 Agent 做本可以用一次 SQL 解决的事。见过用 Agent 三轮工具调用去查"某用户今日订单数"的系统,这是纯粹的浪费。
  • 框架不是自主度的证据。评审里问一句"哪些决策点是模型定的",就能戳穿伪 Agent。
三条倒向 workflow,就别上 Agent
五个问题定生死;只有「老板想要 Agent」这一条理由时,算作零条

选型判据
判据倾向 workflow倾向 Agent
任务路径能否枚举开篇故障栽在这条能列出 ≤10 条主路径组合爆炸、无法穷举
单次错误代价高(涉及资金 / 合规 / 写库)低(可重试、可人工兜底)
延迟预算秒级 SLA、同步接口分钟级可接受、异步交付
可解释性要求需要向审计 / 监管说明每一步只需最终结果可核验
输入分布收敛、格式稳定开放、长尾多
混合架构与四条避坑
经验法则
五条里有三条倒向 workflow 就别上 Agent;如果只有「老板想要 Agent」这一条理由,那是零条
主流架构
确定性主干 + 自主长尾:意图分类分流 → 已知场景 94% 走固定 workflow,长尾 6% 走 Agent 子流程,超限或低置信转人工
两个上限都要
只有步数上限时,模型可能在第 3 步就吃掉 20 万 token —— 预算上限必须同时设
幂等与写操作
那三条工单的根因是工具没做幂等 —— 模型重试是常态;写操作默认要确认,高危工具走分级自治(T3-10)
别为上而上
见过用 Agent 三轮工具调用去查「某用户今日订单数」的系统 —— 一次 SQL 能解决的事,别上 Agent
代价清单
token 数倍(每轮重发历史与工具定义)、延迟变 N 次串行、不可复现、故障面扩大、必须建 trace 才知道它在干嘛
生产系统里纯 workflow 和纯 Agent 都少见。面试时讲得出「主干走 workflow、6% 长尾进 Agent 子流程」,说服力远高于「我们全上了 Agent」—— 因为它证明你算过账。

面试视角

面试官第一刀:你这个为什么不是 workflow
一面暖场问定义,二面追反套路题;简历里写了 Agent,这一刀躲不掉

  1. 先给判据,再给定义「下一步动作是代码决定的,还是模型决定的」
  2. 画光谱不是二元对立,中间有路由、编排器-执行器
  3. 举自己的例子并交代代价6% 长尾走 Agent,主干仍是 workflow
  4. 补一句反向判断「强合规场景,我会把模型压回单点判断」
只读过:这些回答会暴露你
  • 把 Agent 定义成「会调用工具的大模型」—— 那是 Function Calling
  • 用框架名回答本质问题:「我们用了 LangGraph,所以是 Agent」
  • 说 Agent 的优点是「更智能、更灵活」,报不出任何量化代价
  • 认为 workflow 落后、Agent 先进,技术鄙视链写在脸上
  • 问到兜底就卡住:步数上限多少、超限之后怎么办,答不上来
真做过:这些细节骗不了人
  • 判别一句话给完 —— 下一步动作是代码定的还是模型定的
  • 反问一句「哪些决策点是模型定的」,伪 Agent 当场现形
  • 报得出成本与延迟的倍数,还说得清倍数从哪来(每轮重发历史 + 工具定义)
  • 讲得出「什么时候我劝团队别上 Agent」,理由是算过的账不是感觉
  • 谈不可复现给评测的麻烦,并给应对:固定随机性做回归、看轨迹而非只看结果
答这一刀最省力的两个词是幂等算过的账:前者是被重试坑过的人才会条件反射说出来的,后者把「我觉得」换成了倍数。反向判断同样加分 —— 「强合规场景我会建议把模型压回单点判断」。

面试官怎么问

一面几乎必问 Q3-01("什么是 Agent")作为暖场,这题的作用是筛掉只会背概念的人。二面会追 Q3-02("什么时候不该上 Agent")——这是一道反套路题,面试官想看你有没有被 2025 年那波 Agent 热冲昏头。如果你简历上写了 Agent 项目,几乎一定会被问「你这个为什么不是 workflow」,这是简历深挖阶段最常见的第一刀(详见拷打模板 P2)。

答题结构建议

  1. 先给判据,再给定义:"我判断一个系统是不是 Agent,只看下一步动作是代码决定的还是模型决定的。"——一句话把你和背书的人分开。
  2. 画光谱:说明这不是二元对立,中间有路由、编排器-执行器等形态。
  3. 举自己的例子并主动交代代价:"我们那个场景 6% 的长尾走 Agent,主干还是 workflow,因为主干路径只有四条,上 Agent 会让成本涨 7 倍、延迟涨 20 倍。"
  4. 补一句反向判断:"如果面的是一个强合规场景,我会建议把模型压回单点判断。"

分水岭信号

只读过资料的回答

  • 把 Agent 定义成"会调用工具的大模型"——那是 Function Calling,不是 Agent。
  • 用框架名回答本质问题:"我们用了 LangGraph,所以是 Agent。"
  • 说 Agent 的优点是"更智能、更灵活",说不出任何量化代价。
  • 认为 workflow 是落后的、Agent 是先进的,存在明显的技术鄙视链。

真做过的回答

  • 主动报出成本与延迟的倍数关系,且能说清倍数从哪来(每轮重发历史 + 工具定义)。
  • 提到幂等性——这是被重试坑过的人才会条件反射说出的词。
  • 说得出自己的兜底策略:步数上限多少、超限之后怎么办、有没有无进展检测。
  • 能给出"什么时候我劝团队别上 Agent"的具体案例,而且理由是算过的账,不是感觉。
  • 谈到不可复现给评测带来的麻烦,并说了怎么应对(固定随机性做回归、看轨迹而非只看结果)。

小结与延伸

  • Agent 与 workflow 的唯一判别标准是控制权归属:下一步动作由模型决定还是由代码决定。
  • 自主度是光谱,不是开关;框架不决定性质。
  • Agent 用确定性换适应性,收益只在路径不可枚举、需要回溯、输入开放、验证便宜时才成立。
  • 生产主流是混合架构:确定性主干 + 长尾自主 + 步数/预算/人工三层兜底。

延伸:下一篇 T3-2 讲控制权交出去之后,模型是怎么"动手"的——Function Calling 的完整机制,以及工具设计为什么是 Agent 效果的一半。想先看循环骨架的,可以直接跳 T3-3。关于"另一半能力在 harness 上"这个 2026 年高频进阶考点,见 T3-10

继续深入

本篇归属第 3 章「Agent 开发」,去做这一章的题