Session First 和 Agent First,本身并没有高低之分

最近在思考一个问题:系统究竟把谁当成第一类公民。

现在我们看到很多的 AI 产品,,本质上还是「把聊天框做得更厚一点」。用户打开一个窗口,对着通识大模型说需求,模型在一个长 session 里记上下文、调几个工具、写几段内容、偶尔执行点操作。这个模式我称它为「Session First」。

「Session First」的模式跑得起来,落地也快。过去一段时间,桌面端的很多产品,包括一些 codex cc 一类的形态,都是这么长出来的。先有聊天,再把能力缝进去。先有 session,再把工具挂上去。整个产品又快又省,因为它继承的是大模型最自然的交互方式:对话。

但如果把时间线拉长,我觉得 Session First 像是一个过渡层。它把大模型带进软件,却没有真正重写软件。

另一个逻辑是 「Agent First」。

这里说的 Agent First,不是把 prompt 包一层 workflow 就算 agent。这里说的是一种更彻底的软件设计取向:系统从一开始就假设调用者不只是人,也包括 agent;系统的能力边界、接口形态、文档组织、安全机制、运行时观测,都优先围绕 agent 来设计。聊天只是入口之一,不再是核心结构。

过去我们是在和「通识大模型」对话,未来更多时候,我们是在和「带有领域知识、工具能力、任务规划能力的专用 agent」协作。再往前走,单一 agent 很可能都不够,基于 MaaS 的 agent teams 会逐步成为复杂任务的常态。Sakana AI 这类工作给了行业一个很有代表性的信号:多智能体协作,不只是研究兴趣,它在复杂探索任务上确实可能优于单体。

这种两种不同的范式,其实也没有高级和低级之分。二者背后的系统假设不同,工程代价不同,性能瓶颈不同,能解决的问题类型也不同。

Session First 和 Agent First 的不同

Session First 和 Agent First,表面上都可能长得像「用户输入一句话,系统输出一个结果」。很多人可能会觉得两者只是包装差异。其实差异蛮大的。

Session First 的中心对象是「会话」。系统假设一切能力都围绕一个持续增长的上下文展开。用户说一句,模型接一句;模型靠历史消息理解意图,靠当前 prompt 决定行为。工具调用存在,但工具通常是会话的附属物。它们由模型在 session 内临时选择、临时编排、临时解释。

所以在 Session First 里,能力组织方式通常是这样的:

  1. 先有一个大而全的聊天入口;
  2. 再有一组工具函数;
  3. 再在 system prompt 或 tool spec 里告诉模型什么时候调用它们;
  4. 复杂任务靠更长的上下文、更复杂的提示词、更精细的 few-shot 去兜。

这个模式最大的好处,是产品和研发都能快速起跑。我们不需要先把系统抽象成可组合能力,也不需要先考虑 agent 的长期运行、恢复、权限边界、状态持久化。只要模型够强、上下文够长、工具挂得上去,很多事情都能先做出来。

Agent First 的中心对象则是「行动体」。系统假设执行任务的主体是 agent,它会自己读取规范、规划步骤、调用工具、检查结果、重试修正。人在这个系统里依然重要,但人不再是唯一的控制中心。更准确地说,系统从「为人类交互而生」转向「为可委托执行而生」。

这个变化会连锁改写很多设计决策。

传统软件里,人是第一类公民。系统主要通过 UI 提供能力,文档写给人看,按钮给人点,异常信息也默认人会读。Agent First 里,agent 变成第一类公民。系统的关键界面不再是页面和按钮,而是 API、工具协议、语义化描述、状态机、权限模型、回调事件、执行日志。

传统模式是:

  • 人读文档;
  • 人理解业务逻辑;
  • 人决定点哪个按钮;
  • 人承担串联流程的责任。

Agent 模式是:

  • Agent 读取规范;
  • Agent 形成计划;
  • Agent 调用工具;
  • Agent 分析返回值;
  • Agent 根据反馈继续执行或者回滚。

这不是交互方式的小修小补,这是控制权和复杂性承载位置的转移。

Session First 把复杂性藏在会话里。
Agent First 把复杂性显式地放进系统结构里。

我更倾向后者。因为在规模化阶段会 Session First 开始需要大量的修补并且还不合脚。

Session First 的红利

Session First 也不是说不行了,落后了,它只是有自己的舒适区或边界。

它为什么会成为大多数团队的第一个选择?因为它天然适合模型的原生能力。

大模型最成熟的接口就是聊天接口。你给它上下文,它续写;你给它 instruction,它服从;你给它工具定义,它在概率空间里学着调用。这是当前已经成熟了的,并且对于大家的谁知来说没有门槛的。。产品经理能理解,前端能接,后端能包,用户也能马上用。

从落地顺序看,Session First 有三个明显优势。

交付速度快

最早一批 AI 应用能起量,基本都吃到了这个红利。做一个对话框,叠一层历史上下文,挂几类工具,外加 prompt 工程和少量业务逻辑,一个可卖的产品就出来了。

如果团队处在探索期,需求还没稳定,任务边界也不清晰,Session First 的性价比很高。因为我们可以把大量未定型的业务规则临时编码进 prompt,而不是过早地固化到接口和状态机里。说白了,它适合试错。

交互弹性高

很多需求在早期根本说不清。用户自己也不知道该点哪个按钮,只知道「我想把这堆信息处理一下」。这时聊天入口比传统 UI 更自然。Session First 天然适合承接模糊需求,尤其适合开放式任务、咨询类任务、内容类任务。

对通识模型友好

Session First 依赖的是模型在语言理解和上下文整合上的强项。很多场景下,不需要精细建模世界状态,只需要让模型在一个较长的 session 里维持语义连贯,效果就已经够用了。

所以如果一个产品主要解决的是下面这些问题,Session First 我认为完全合理:

  • 单轮或短链路任务;
  • 任务结果主要是文本、建议、草稿、分析;
  • 工具调用数量少,失败代价低;
  • 用户愿意在回路中持续确认;
  • 业务状态变化弱,对幂等性和恢复能力要求不高。

比如代码解释、文档问答、简历润色、轻量报表分析、知识库检索助手,这些都很适合。

问题出在很多团队做着做着,把它用到了不该用的地方。

Session 的代价

Session First 最大的问题,不是效果问题,而是系统复杂性的位置不对。

我们可以把 session 理解成一个不断膨胀的黑盒。任务描述、历史记录、工具调用痕迹、失败重试信息、用户偏好、临时约束,全都塞进去。模型在黑盒里靠注意力机制和 token 预算自行判断什么重要、什么该忽略、什么该继续执行。

短任务还行。链路一长,问题就开始多了。

状态污染

会话越长,状态越容易脏。一个典型问题是历史上下文对当前决策的隐性干扰。模型没有传统意义上的干净状态管理,它只有一段被不断续写的上下文。早期的一句错误假设、一次失败调用、一个过时约束,都可能在后续步骤中持续影响行为。

工程上我们会看到一些很烦的现象:

  • 明明用户已经修改目标,模型还沿着旧计划跑;
  • 明明工具返回了失败,模型把失败结果当成成功上下文继续推理;
  • 明明当前任务和上个任务无关,模型还把旧 session 里的偏好带进来。

这些都不是 prompt 多写两句能解决的。因为根因在于 session 本身不是一个严谨的状态容器。

上下文成本失控

Session First 很吃上下文。任务越复杂,历史越长,系统 prompt 越复杂,tool spec 越多,token 消耗越惊人。很多团队前期盯着模型单价,后期才发现账单真正膨胀的是「无效上下文」。

更糟的是,这部分成本并不总能换来线性收益。超过某个长度以后,模型对上下文的利用率明显下降。你花了更多 token,只换来更模糊的关注分布、更高的遗漏概率。

有一些系统,一次复杂任务真正有价值的工作 token 可能只占总 token 的 20% 到 30%,剩下的都在重复喂历史、喂规则、喂工具描述、喂先前失败记录。这样的系统,成本结构很难看。

工具选择不稳定

在 Session First 里,工具往往是通过提示词暴露给模型。模型根据自然语言描述决定什么时候调哪个工具。这种方式灵活,但稳定性一般。尤其当工具数量上来以后,工具间语义重叠、参数边界相近、返回格式不一致,模型的选择质量会迅速下降。

一个常见误区,是以为给工具写更长更详细的 description 就能解决。实际经验正相反:description 越长,竞争工具越多,模型越容易在语义相邻区域摇摆。最终你会发现,问题不是模型笨,而是整个工具层根本没有被设计成适合被模型消费。

可恢复性差

Session 是连续流,不擅长离散恢复。任务执行到一半,模型挂了、超时了、工具限流了、用户关闭页面了,系统怎么从中间恢复?很多 Session First 产品的恢复策略要么是重放整个对话,要么让模型读历史「自己想起来」。

这个策略在低风险任务里还能接受,在执行型任务里就很危险。因为它没有明确的检查点,没有确定的已完成步骤,没有结构化的执行日志,恢复质量完全依赖模型在长上下文里的自我理解。

可观测性弱

你问一个 Session First 系统:「为什么它刚才这么做?」答案通常很难给。因为真正的决策过程埋在 session 和模型隐状态里。你最多能看到 prompt、工具调用记录和输出,但很难形成稳定的、可归因的行为分析。

这会直接影响调试、评估、审计和优化。团队很容易陷入一种很熟悉的工作流:改 prompt、跑样例、感觉好一点、上线、再出新问题、继续改 prompt。系统像在「训一头很聪明但脾气不稳定的动物」,而不是在维护一个可控软件。

转向 Agent

Agent First 出现,本质上是在回答一个问题:当任务不再是聊天,而是委托执行时,系统该怎么设计?

用一名话来概括:Session First 优先组织对话,Agent First 优先组织能力、状态和约束。

这两者的差别,在简单场景里不明显;一旦任务变成多步骤、长周期、高风险、强工具依赖,这个差别会迅速放大。

Agent First 的核心变化有三层。

第一层,agent 拥有独立的任务身份。
它不再只是当前聊天窗口里的一个响应函数,而是一个可启动、可暂停、可恢复、可审计的执行单元。它有自己的目标、记忆、工具权限、运行环境和生命周期。

第二层,系统能力被显式结构化。
什么能力能调用,输入输出是什么,失败怎么表示,重试边界在哪,副作用怎么隔离,全部要写清楚。因为 agent 不是靠「猜」来用系统,它得靠规范来用系统。

第三层,任务执行被流程化和可观测化。
agent 的计划、步骤、结果检查、异常处理、人工介入点,都需要成为系统的一部分,而不是 prompt 里的一段希望。

这就是为什么我说 Agent First 更像软件设计理念,而不只是交互升级。它要求开发者从一开始就考虑 agent 的接入体验。注意,这里的「接入体验」不是 SDK 文档写得漂不漂亮,而是系统有没有把 agent 当成真正的使用者来对待。

对人友好的系统,重点是 UI。
对 agent 友好的系统,重点是 API、协议、文档、沙箱、日志。

这个顺序一换,整套架构都会变。

第一类公民

传统软件的第一类公民是人。因为系统操作链条默认由人承担:读页面、理解状态、做选择、点按钮、确认风险、处理异常。

Agent First 的变化在于,这条链路开始迁移给 agent。系统如果还保留「很多关键信息只藏在页面里、很多操作只能靠人脑理解、很多异常只有人看得懂」的设计,那 agent 就只能在外面绕路,最后产品体验会非常拧巴。

所以所谓「agent 是第一类公民」,落到工程上至少意味着四件事。

能力必须接口化

页面点击不是能力,API 才是。
表格展示不是能力,结构化查询和变更才是。
人工读懂的描述不算完成,机器可消费的 schema 才算完成。

很多团队表面上说在做 agent,实际上只是让模型去模拟用户点页面,或者让 Playwright 去跑浏览器自动化。这能用,但我通常把它看成过渡手段,不会把它当成长期基建。因为 UI 自动化的脆弱性太高,成本也太高。一旦页面变了、字段换了、弹窗多了、权限策略改了,整个链路就坏了。

如果一项业务能力值得被 agent 使用,那它应该先被抽成稳定接口。

语义必须外显

我们靠经验猜按钮含义,agent 不行。我们得把操作语义、字段含义、约束条件、异常语义都写出来。很多传统系统文档的问题,不是文档少,而是文档默认阅读者是熟悉业务的人。里面有大量省略、上下文跳跃、术语别名、口头约定。

人能脑补。agent 不会脑补,它会误解。

机器友好的文档,不是把原文档丢给 RAG 就结束了。它要求内容可索引、可切片、可定位、可引用、可验证。最好还能区分「定义」「约束」「样例」「反例」「危险操作」「返回码语义」。

权限必须细粒度

给人开的权限,往往是按角色开的。给 agent 开权限,粒度要更细。因为 agent 的调用频率高、组合能力强、自动化程度高,任何一个权限放大,都可能把小问题变成系统性事故。

我见过一些团队初期为了快,直接给 agent 一个「管理员 token」,想着先把链路跑通。跑通确实跑通了,后面风控和审计基本没法收场。Agent First 里,权限模型必须从 day 1 就设计进去。至少要做到工具级、资源级、动作级的边界清晰。

结果必须可审计

如果 agent 能执行动作,那所有关键动作都要留痕,谁发起、为什么发起、使用了哪些上下文、调用了哪些工具、拿到了哪些结果、做了什么决策、是否有人确认,都得能追出来。

这不是为了满足审计部门,而是为了我们自己能把系统维护下去。没有可审计性,复杂 agent 系统很快会变成「偶尔非常惊艳,偶尔完全失控」的黑箱。

四层结构

如果我们把 Agent First 的工程原则压缩成一个递进结构,它可以拆成四层:能力层、理解层、连接层、信任层。

API 优先

最底下是能力层,也就是 API 优先。它解决的是「Agent 能做什么」。

很多 AI 团队容易犯一个错误:先做 prompt,再做工具,再补 API。顺序反了。只要你准备认真做 agent,API 就应该先于 prompt 存在。

因为 prompt 负责引导决策,API 才负责承载能力。没有稳定能力面,agent 的执行质量永远靠运气。

我看一个系统适不适合 Agent First,第一眼就看它的 API 长什么样。重点不在 REST 还是 GraphQL,也不在用不用 MCP,而在这几个问题:

  • 接口语义是否单一清晰;
  • 参数是否结构化且有约束;
  • 返回值是否可判定成功失败;
  • 幂等性是否明确;
  • 长任务是否支持异步和回调;
  • 副作用操作是否支持 dry-run 或预检查;
  • 错误码是否可用于 agent 自恢复。

举个很实际的坑。很多内部系统的 API 是给前端页面写的,不是给 agent 写的。于是你会看到:

  • 一个接口返回几十个业务无关字段;
  • 失败时只返回「操作失败,请联系管理员」;
  • 同一个字段在不同接口里名字还不一样;
  • 创建和更新共用一个入口,副作用混杂;
  • 数据查询支持模糊匹配,但没有稳定过滤条件。

这种 API 给前端开发凑合能用,给 agent 基本就是灾难。因为 agent 消费接口时最怕三件事:语义不稳定、返回不可判定、失败不可恢复。

API 优先不是一句口号,它意味着你要为了 agent 重写一部分服务边界。代价不小,但省下的是后面无数轮 prompt 补丁。

机器文档

有了能力层,还不够。Agent 知道系统「能做什么」,不代表它知道「怎么正确地做」。

这就是理解层,也就是机器友好文档。

很多团队对文档的理解还停留在「给模型塞进知识库」。坦白说,这一步最多算资料接入,不算文档工程。机器友好文档要求内容本身就是为 agent 理解和执行设计的。

我们写文档喜欢写背景、写故事、写注意事项穿插在长段落里。机器文档要反过来,尽量消除叙事性,强化检索和判定性。什么场景能用哪个接口,前置条件是什么,参数组合有什么限制,成功条件是什么,失败后应该重试还是终止,全部要能被定位出来。

我比较推崇一种写法:把文档拆成五类最小单元。

  1. 定义单元:术语、对象、字段、状态含义。
  2. 操作单元:动作描述、输入输出、前置条件、后置条件。
  3. 约束单元:权限要求、配额、时序、互斥关系。
  4. 异常单元:错误码、成因、恢复建议、是否可重试。
  5. 样例单元:正确示例、错误示例、边界示例。

这样写出来的文档,对人读可能不友好,但对 agent 非常友好。因为 agent 需要的不是阅读体验,而是最短路径上的高密度语义。

还有一个容易被忽略的点:文档版本化。
如果系统能力在变,而 agent 依赖旧文档决策,事故几乎是必然的。机器文档必须带版本、带生效范围、带弃用说明。更进一步,文档变更最好能够被 agent 订阅或者被平台主动推送。否则你会得到一堆「以前能跑今天突然不行」的鬼问题。

协议层

再往上一层是连接层,也就是标准化协议。我们都知道 MCP,它当前重要性确实在上升。

Agent First 一旦进入平台化阶段,连接成本会成为瓶颈。每接一个系统都重新对工具做 schema 包装、鉴权对接、错误语义映射、流式交互适配,团队很快就会被集成工作拖死。标准协议的价值就在这里:让 agent 对外部能力做到尽可能低摩擦的即插即用。

协议不是为了优雅,是为了降低耦合和重复劳动。它至少解决三个问题:

  • 能力发现:agent 如何知道外部提供了哪些工具和资源;
  • 调用协商:参数 schema、返回 schema、流式能力、状态反馈如何统一;
  • 安全边界:认证、授权、调用隔离、资源限制如何标准化表达。

MCP 这类协议的意义,不只是统一 tool calling 的表面格式,更重要的是把「能力元数据」变成平台可理解的对象。一旦元数据标准化,很多平台能力才能长出来:自动装配、权限编排、调用治理、能力市场、兼容性检查、离线评测。

协议统一不会自动带来效果统一。现实里最常见的问题是:大家都说自己支持标准,结果 schema 质量参差不齐,语义粒度不一致,错误处理风格也不同。最后 agent 虽然能连上,依旧很难稳定用好。

所以协议层只是接入下限,不是体验上限。系统方如果指望「支持 MCP 了,agent 就能用了」,十有八九会失望。

信任成本

最上面一层是信任层:安全、沙箱、可观测性。它解决的是「Agent 如何被安全地使用」。

这层往往是被低估的。因为很多团队在前期更关心效果演示,安全和观测总想放后面补。等 agent 真开始执行动作,补起来就很痛苦。

Agent 系统的风险和传统自动化脚本不完全一样。脚本通常路径固定、输入有限、行为可枚举。Agent 的输入是开放的,计划是动态的,工具组合是可变的,自修正带来恢复能力,也带来行为不可预测性。这种系统如果没有信任层,部署规模一上来迟早出事。

信任层可以分为三块。

安全边界

包括权限控制、数据隔离、密钥管理、配额限制、危险操作确认机制。所有高风险动作都要能分级:只读、可写、可执行、不可逆。不同级别的动作,对应不同的确认和审计策略。

还有一件事必须单独说:prompt injection。
只要 agent 会读取外部内容、再基于内容调用工具,prompt injection 就不是附加风险,而是基本风险。你不能假设模型会自己免疫。系统层必须有输入隔离、指令优先级控制、工具调用白名单、敏感动作二次确认、结果验证。

沙箱执行

如果 agent 能运行代码、操作文件、访问网络,就必须有沙箱。别指望靠「模型会守规矩」来兜底。资源限制、网络出口策略、文件系统隔离、进程生命周期管理,这些都是必须项。

很多桌面端产品今天还在用一个比较重的本地 session 容器去承接 agent 行为,这在早期合理,因为本地环境天然带着用户上下文和工具可得性。但一旦平台化,执行环境一定要可控、可回收、可复制。否则你会发现 bug 根本没法稳定复现。

可观测性

这一块经常被做得太浅。普通日志不够。你需要的是面向 agent 的运行时观测:任务级 trace、步骤级事件、工具调用链、上下文快照、计划变更、重试原因、人工接管点、最终结果评估。

有了这些数据,很多事情才有可能做:行为分析、失败归因、离线回放、A/B 对比、策略优化、合规审计。

我甚至会说,没有可观测性,Agent First 根本不成立。因为你没法持续优化一个你看不见的系统。

单体与团队

再往前一步,Agent First 还会带来一个自然演进:从单一 agent 走向 agent teams。

这个趋势不难理解。单体 agent 的优势是简单、上下文统一、决策路径短。缺点也明显:任务一复杂,规划、执行、验证、知识检索、异常恢复全压在一个主体上,容易出现上下文拥堵和角色冲突。模型一边要想战略,一边要写细节,一边还要检查自己,稳定性会下降。

多 agent 协作的思路,是把不同职责拆开。比如规划 agent 负责分解任务,执行 agent 负责调用工具,验证 agent 负责检查输出,审计 agent 负责看风险和合规。你提到 Sakana AI,我觉得它给行业的启发就在这里:复杂问题的效果上限,未必来自更大的单体,而可能来自更合理的协作结构。

但别高估 agent teams 的短期收益。它的工程成本很高。

第一,通信成本会增加。
agent 之间传递的信息如果不够压缩,token 成本会迅速膨胀。很多团队做多 agent,最后账单翻倍,效果提升却不明显,问题就出在这里。

第二,错误归因更难。
单体 agent 出错,你还知道看一条链。多 agent 出错,很可能是上游规划有偏差、中游执行误解了任务、下游验证规则又太松。没有细致的 trace,很难定位。

第三,协作协议本身就是复杂度。
谁能给谁发任务,谁对谁有覆盖权,冲突怎么解决,结果以谁为准,失败是否回滚,人工在什么点介入,这些全得定规则。规则一多,系统会变得很重。

它是复杂任务的方向,但不是所有产品都该急着上。很多团队连单体 agent 的能力边界、观测体系、权限模型都没建好,就直接跳多 agent,最后只会把问题放大。

个人的判断

如果今天让我给团队定路线,我不会在所有场景里一刀切推 Agent First,也不会继续把 Session First 当主架构。

我的判断是这样的:

凡是以「理解、生成、陪伴、咨询」为主,任务链条短,用户始终在线,副作用低的场景,Session First 依然是最有效率的方案。别把简单问题搞复杂。一个高质量 session 产品,照样能有非常强的竞争力。

凡是以「委托执行、跨系统操作、长周期任务、可恢复流程、强审计要求」为主的场景,应该尽早转向 Agent First。拖得越久,后面迁移成本越高。因为你的 prompt、工具、日志、权限、数据结构都会按 Session First 的惯性越长越歪,最后很难矫正。

从行业演进看,我认为我们会经历三个阶段:

第一阶段,通识模型 + 聊天入口主导。
第二阶段,聊天入口还在,但底层逐步 agent 化,能力和状态开始结构化。
第三阶段,很多系统默认面向 agent 开放,我们反而通过 agent 间接使用软件。

今天大多数团队还处在第一阶段和第二阶段之间。很多产品表面上已经在说 agent,骨子里还是 session 产品。这个阶段没什么丢人的,行业本来就处在过渡期。问题在于,团队自己得知道自己在哪,不要把一个 prompt-heavy 的聊天系统误以为已经完成了架构升级。

小结

Session First 帮行业把 AI 快速带进了产品。它的重要性不用否认。没有这一阶段,大量需求不会被激活,很多团队也不会积累起对模型能力边界的真实理解。

但它的问题也越来越明显:状态管理松散、成本结构失真、工具使用脆弱、恢复和审计能力薄弱。任务越复杂,缺点越放大。

Agent First 把软件重新组织了一遍:把会话里的隐含复杂性,搬回系统里显式管理;把面向人的操作界面,扩展成面向 agent 的能力界面;把「模型偶尔能做成」变成「系统可稳定交付」。

如果要走这条路,我们就需要重写 API,补文档债,需要重做权限和日志,就会发现以前很多偷过的懒都要补回来。可如果我们的目标不是做一个会聊天的功能,而是做一个能被委托工作的系统,这些账早晚都要还。

所以我现在看一个 AI 产品会更关心它底下埋的是 session,还是 agent。前者决定它今天看起来多聪明,后者决定它一年后还能不能继续长。

以上。