差异一:确定性 vs 概率性
概率性 - 同一段代码,两次结果可能不一样
前端场景:做了某种操作一定是可预测且确定的
Agent场景:同一个 prompt 发给模型,两次的输出话术不同、结构不同甚至两次结果相悖
在前端场景是确定因为我们的代码逻辑确定、数据确定能保证每次操作的确定性。但是 Agent 不同,Agent 是以LLM 全称 Large Language Model(大语言模型)为主,LLM 就像我们的大脑,每次思考的结果可能不是一致的,这时候就需要对 N 次思考结果进行评估,统计通过率。
Agent 的思考是基于概率采样Temperature控制随机程度,即使相同的 prompt,采到的 token 序列也可能不同。
- Temperature 参数控制采样随机性(temperature=0 时输出基本确定)
- 采样策略(top-p / top-k)从概率分布里选词
- 同一 prompt 在不同上下文位置可能激活不同的注意力路径
差异二:一次性响应 vs 流式持续生成
流式持续生成 - 边等待边处理
前端场景:调用 API —> Loading 交互 —> 拿到完整响应结果 —> setState —> 渲染。用户看到加载中 -> 数据完整显示
Agent场景:常规来说我们使用 SSE, 在 SSE 链接建立后,模型按 token 进行推送,前端边收边渲染,用户看到的是字一个个出来,就像我们真实的说话一样,一个个字说出来
LLM 也能使用非流式一次性输出,但是由于 LLM 输出相对较慢,特别是深度思考的时候。同时,一次性输出的时候,我们没法看到 LLM 逐步的思考过程,前端、服务端都需要等待模型返回,很容易让人有功能卡顿甚至卡死的感觉,所以我们常使用流式输出来体现出大模型的思考过程及结果,交互。整体交互上更加友好。
同时流式是LLM 的性能刚需,解决的是 TTFE(Time To First Token,首 Token 延迟) 问题 — 模型生成可能要 10 秒或者更久,但是 首 Token 可能 1s 就会出来,用户感知上能够从 “卡顿 10 秒” 变为 “1 秒开始读”。
差异三:事件驱动 vs 推理驱动
前端场景:在前端场景中事件驱动通常是是我点了什么、做了什么操作 来 触发其他操作,比如调接口、页面跳转等等。流程:用户点击 —> 触发事件 —> 调用 API —> 拿到结果 —> 更新 UI —> 用户再进行其他操作。在整个闭环中,驱动者是用户的行为
Agent 场景:但在 Agent 场景中,推理驱动虽然大部分也以用户触发为起点,但后续流程是由LLM 去决策执行并给出最终结果的。流程:用户给出问题 —> 模型判断需要调用工具 —> 调工具 —> 拿结果 —> 模型继续推理 —> … —> 最终输出。整个闭环是由用户触发,但是由LLM来驱动
在原始前端场景中,我们需要通过不断地操作来获取我们想要的信息,代码层面属于被动执行,被操作了才执行。 但是在 Agent 场景中,我们只需要告诉 LLM 我们需要什么东西,其他都由 Agent 去决策:该调用什么工具、查什么数据等等。在 Agent 开发中,整体由Agent主动决策,我们需要做的是告诉 LLM 能用哪些工具、设定终止条件(拿到完整结果、超出一定推理次数)
总结
| 维度 | 前端开发 | Agent 开发 |
|---|---|---|
| 输出 | 确定性 | 概率性 |
| 响应 | 一次性完整返回 | 流式逐 token |
| 闭环驱动 | 用户行为 | 模型推理 |
| 调试方式 | 断点 + 单测断言 | 评估集 + 通过率 |
| 成本敏感 | 带宽/计算 | token 计费 |
前端主要关注 带宽/计算资源 以及 FCP/LCP 等等,但是 Agent 开发 更关注 token 的消耗以及 TTFE。
长 prompt、多轮对话、复杂推理每次都是使用的 token, 然而每个 token 都是费用。所以控制 Agent 费用,需要想办法控制token 用量,包括:prompt 精简、模型路由(便宜模型兜底)、结果缓存、上下文压缩等等手段。