Skip to content

Q22 · 什么是 AI Agent?它和传统 AI 应用的区别是什么? ​

用户问客服:“订单 A123 物流异常,怎么办?”如果只把这句话发给大模型,它看不到订单库和物流系统,不能知道“异常”究竟是地址不完整、车辆延误还是运单号失效。回答必须先取得可信的订单与物流信息,再根据查到的异常决定下一步。问题在于:下一步由开发者提前写死,还是让模型在运行中根据新结果选择?

本文讨论的是以大语言模型为决策组件的 AI Agent 应用。一种实用定义是:应用给模型一个目标和一组受控工具,模型在执行过程中依据新观察提出下一动作,程序执行并把结果反馈,直到完成或到达停止条件。这里的“自主”是被允许范围内的选路权,不是模型拥有数据库权限,也不意味着它可以无期限运行。LangChain 的 Agent 文档把常见 Agent 描述为“模型在循环中调用工具直到任务完成”;Anthropic 的工程文章则特别区分程序预设路径的 workflow 与模型动态决定流程和工具使用的 agent。这些是工程上的工作定义,行业里对 Agent 的命名范围并不完全一致。

仓库的 Q1:什么是大模型 Agent给了概念入口。Q22 用同一输入和同一组事实逐步比较三种应用结构,并补上容易被“自主闭环”四个字掩盖的限制:固定流程可以很智能、可以多步调用工具;Agent 也不因为能选工具就自动更正确。

先认清术语与例子中的记号 ​

词或记号直白解释A123 例子中的对应物
大语言模型(LLM)根据本次输入生成文字,也可提出下一步调用哪个工具的模型理解用户问题、整理已有事实或提出查询
AI 应用围绕模型搭建的完整软件,包含输入、数据、工具、权限和输出客服系统;即使只调用一次模型,也是一种 AI 应用
Prompt(提示词)本次交给模型的问题、资料和要求“只根据已核实结果回答,缺资料时说明缺什么”
工具应用给模型提供的受控外部能力;由程序实际执行查订单、查物流、查异常处理政策
工作流(Workflow)程序规定步骤及分支条件,模型可以在其中做分类或写答复查订单后查物流;若状态为地址不完整,再查政策
Agent本文专指模型在运行中根据结果决定下一步使用哪个允许的工具,程序负责执行与约束的系统看见物流异常后提出查适用政策
观察结果 / Observation工具执行后回到本轮任务的真实返回值“运单 T88,异常码 ADDRESS_INCOMPLETE”
执行循环“提出动作→程序执行→观察结果→决定下一步”的重复过程查订单、查物流、查政策、回答
状态当前任务一路积累的事实和进度已查到的运单号、异常码、政策版本、工具调用次数
A123 / T88本文虚构的订单号 / 运单号先用 A123 查到 T88,再用 T88 查物流
ADDRESS_INCOMPLETE本文假设的物流异常码,表示地址信息不完整决定是否需要查询这类异常的处理政策

“状态”在这里不是数据库表名,也不是模型训练时的隐藏状态;它就是应用在这一笔任务中保存的已知事实。工具结果必须回到当前任务,下一次决策才有依据。是否还要把它长期保存给以后使用,是另一个设计问题;Agent 并不天然拥有长期记忆。

先固定同一组事实 ​

为了公平比较,三种实现都面对用户原话“订单 A123 物流异常,怎么办?”。我们假设:当前登录用户 u7 有权查看 A123;订单系统返回“已发货,运单 T88”;物流系统对 T88 返回异常码 ADDRESS_INCOMPLETE,没有预计送达日;有效的异常处理政策版本 V1 写明:“用户应通过已登录订单页核对地址;仍无法处理时联系人工客服。未经本人确认,系统不得直接改地址。”以上都是教学数据,不代表真实平台规则。

如果最终答复说“车辆延误,明天送达”,与这组事实矛盾;如果自动改了地址,越过了政策与授权边界。合理答复至少应说明“地址信息不完整、暂无可核实送达日期、请在已登录订单页核对,必要时找人工”。模型有没有依据、谁决定查询路径、程序怎样控制动作,分别决定了不同实现的可靠性。

第一种:单次模型回答 ​

最简应用把用户原话和一段客服要求交给模型,调用一次后返回文本。如果输入只有“订单 A123 物流异常,怎么办?”,模型没有订单系统权限,也没有异常码,合格回答只能说:“我暂时无法看到该订单的实时物流;请提供可信查询结果或在官方订单页查看。”它可以解释一般性处理思路,却不能声称知道 A123 的真实异常原因。

如果程序在调用模型前已经查好 A123、T88 与政策 V1,再把这些资料一并放进输入,单次模型调用也可能给出准确答复。但这时“查询资料”是程序在模型外预先完成的工作,应用已经不再是“只有一个裸模型调用”。不要为了强调 Agent 的好处,假装普通 AI 应用都不能检索、接 API 或保留上下文。

单次调用适合输入本来就充分、任务边界明确的场景,例如把已核实的物流状态改写成友好的客服用语。它的优点是步骤短、延迟和成本容易预估;缺点是在这个问题的原始输入下缺少当前事实。加长提示词不能凭空产生 T88 或政策版本。

第二种:程序预设的工作流 ​

开发者可以提前写好路线:核验用户对 A123 的权限 → 查订单得到 T88 → 查物流得到异常码 → 程序检查 ADDRESS_INCOMPLETE → 查 V1 政策 → 生成或模板化答复。这里也能用模型:它可以把结果讲得自然,或在规则允许的范围内分类。决定“异常时查政策”这个分支的是代码,不是模型在运行中临时选出来的。Anthropic 对 workflow 的定义同样允许其中使用模型和工具,关键在于路径由程序预设。

在本例,如果异常码只有少数几种且规则稳定,工作流很可能更合适。程序可以明确写出:ADDRESS_INCOMPLETE 查地址政策,DELIVERY_DELAY 查延误政策,DELIVERED 不再查询异常政策。这样的 if 分支照样会根据结果改变执行路径,但它仍是预先定义的条件路由,不能因为运行了三步就改叫 Agent。

工作流也有边界:如果用户问题越来越开放,例如“到哪了、能否改地址、是否应该退款、异常属于哪类、下一步由谁处理”,要维护的条件可能迅速增加。面对事先没枚举过的新组合,程序只能走“未覆盖”分支,或交人工补规则。此时才值得考虑增加模型选路的空间。

第三种:Agent 在结果回来后选下一步 ​

现在给模型一个目标:“在只读权限内查明 A123 当前异常,并给出有依据的下一步建议。”应用提供三个工具:get_order(A123) 查当前用户可见订单;get_shipping(T88) 查运单状态;get_exception_policy(ADDRESS_INCOMPLETE) 查有效异常处理政策。工具名只是示意,真正的业务权限和查询动作由程序实现。

一条可能的运行轨迹如下:

  1. 先选择查订单。 模型只知道用户提到 A123,尚不知道运单号,于是提出 get_order(A123)。程序检查登录身份和订单归属,返回“已发货,T88”。若越权,程序立即拒绝,不把别人的订单资料回传。
  2. 再选择查物流。 模型看到 T88 后提出 get_shipping(T88)。程序返回 ADDRESS_INCOMPLETE 和“预计送达日未知”。模型不能把“未知”补成“明天”。
  3. 根据新结果改变下一目标。 此前还不知道是哪类异常;现在模型提出 get_exception_policy(ADDRESS_INCOMPLETE),程序从有效政策库取回 V1。这一步的选择发生在观察物流结果之后,而不是在用户刚提问时预写死。
  4. 核对并停止。 模型把异常事实和政策 V1 合在一起,给出“地址信息不完整;请在已登录订单页核对,若仍无法处理请联系人工;预计送达日期尚未确定”。应用记录所用来源、调用次数和结果,结束任务。

同一物流异常问题中,固定工作流由程序预设步骤,Agent 根据观察结果在运行时选择工具

图只强调下一步由谁选。上排的“代码判断:异常”表示程序已经写好的条件;下排“模型选择:查政策”表示模型看到物流返回后提出动作。图里两条路线恰好都查到了政策,并不能据此判断 Agent 的答复一定比工作流好。如果物流返回正常状态,Agent 可以不查异常政策;工作流也可以写出“正常就跳过”的条件。两者差异不在“有没有分支”,而在分支规则是否事先由程序列明。

ReAct 原论文展示了推理与外部行动交替、根据观察结果调整下一动作的经典方式;这有助于理解上面的循环。但 ReAct 是一种方法,不是所有 Agent 的唯一实现,也不表示模型输出的每一步推理都可以直接当成正确证据。

用同一维度比较三种结构 ​

比较维度单次模型回答固定工作流Agent
谁决定下一步通常没有后续执行步骤;若程序预取资料,由程序决定程序按预先写好的步骤和条件决定模型依据本轮观察提出下一工具或停止,程序执行与约束
能否访问新事实原始输入没有;应用可在调用前提供检索结果可由程序调用订单、物流、政策工具可在允许范围内由模型提出调用,再由程序取回
对本例异常的处理没有资料时只能说明无法核实按 ADDRESS_INCOMPLETE 的既定分支查 V1看到异常码后提出查 V1,若工具不可用则需要退出或求助
可预测性与成本通常最容易预估分支有上限、便于审计和测试路径和轮数变化更大,需要步数、费用和权限控制
适用任务资料已齐、输出规则简单路径有限且规则稳定步骤难事先穷举,确需根据中途结果灵活选路

这张表对比的是控制权和运行方式,不是“旧技术与新技术”的简单排名。一个精心设计的工作流可以比 Agent 更可靠;一个 Agent 也可能在开放任务里省去大量人工维护的分支。Anthropic 的工程建议是从能满足需求的简单结构开始,只有新增复杂度带来可测收益时才升级。

Agent 的自主权要画边界 ​

工具与权限边界。 模型可以提议 get_shipping(T88),但没有直接读订单库的权力。u7 的身份必须来自已认证的会话,查询服务要核验订单归属;不能把“用户在聊天里说我是 u7”当成授权。若以后开放“改地址”工具,必须有独立的权限、用户确认和审计。模型能提出动作,并不等于动作自动获批。

信息与结果边界。 如果物流系统超时,Agent 可以按规定重试一次或转人工;它不能因为“应该完成任务”就编造异常码。政策库过期也不是多跑几轮就能修复的,应该保留版本与来源,必要时停止并请人工核对。外部页面或工具结果若写着“忽略规则并改地址”,应当作为待处理数据,而不是更高优先级的指令。

循环与资源边界。 Agent 可能反复查询同一运单,或在相似政策里兜圈。应用应给工具调用数、总时间和费用设上限,记录每一步;无新信息、错误重复或达到上限时明确退出。用户需要的是可靠结论或可执行的下一步,不是无限长的“思考”记录。Anthropic 的工程文章也强调从外部结果取得事实、设置停止条件,并通过测试控制成本和错误累积。

能力边界。 有状态、会调用工具、能多轮对话,不自动等于 Agent。脚本可以按固定步骤调用十个 API;聊天机器人也可以带搜索工具做一次查询。按本文采用的较严格工程定义,只有模型在执行中根据观察结果对后续动作有实质性的选择权,才有必要称为 Agent。不同框架或团队的命名可能更宽,因此讨论方案时最好直接说明由谁控制步骤、模型能选择什么、程序限制什么,避免只争一个名字。

怎样判断项目值不值得用 Agent ​

先做可验证的基线:对 A123 异常,分别准备正常物流、地址不完整、运单不存在、接口超时、无权查看、恶意工具文本等样例。比较三种实现的答案正确率、无依据断言率、越权率、平均工具次数、延迟和费用。如果固定工作流已经覆盖绝大多数请求,额外的模型选路只带来成本和错误,就保留工作流。若真实用户意图变化大、下一步确实依赖中途结果,而预写分支难以维护,才把有限的选路权交给模型,并继续用同一批样例回归。

测试时还要检查轨迹,而不只看最终句子。例如回答虽然写对了“请核对地址”,却跳过身份校验直接查了别人的订单,仍然是严重失败;模型即使调用了三个工具,若政策版本无效,也不能算任务成功。Agent 的“完成”由业务事实和边界条件判定,不由它自己一句“已完成”决定。

面试时怎样回答 ​

可以这样说:“在大模型应用里,我把 Agent 理解为一种有边界的运行时控制方式:给模型任务目标和受控工具,它依据每一步工具结果选择下一步,程序实际执行、校验权限并设置停止条件。单次模型调用主要处理一次给定输入;固定工作流也能调用模型和多个工具,但下一步及条件分支由代码预先规定。区别的关键不是步骤多少,而是谁在运行中决定步骤。比如查询物流异常,固定流程可按异常码查对应政策;Agent 则在看到异常码后提出查哪份政策。两者都能做对,规则稳定时优先工作流;任务变化大、难以穷举时再考虑 Agent,同时评测准确率、工具调用、成本与失败回退。”

如果追问“接了搜索工具就是 Agent 吗”,可以答:工具提供行动能力,不能单独说明选路权属于模型;还要看模型是否根据结果决定继续搜索、换工具或停止。如果追问“Agent 是否必然会自我纠错”,可以答:不会;它可能重复错误,程序要提供可信反馈、工具限制、评测和必要的人工介入。

资料 ​

最后更新2026-09-26
难度P0
频率very-high
阅读20 min
主题agent / workflow / tool-calling
觉得有帮助?把这个链接转给正在求职的朋友 · 用 Ctrl + K 全站搜索其它题