只说真话,十分钟快速理解如何开始设计一个 Agent 产品

92 阅读11分钟

Agent 产品与技术架构:模型能力和工程结构的结合

LLM 对传统工程的冲击

工程确定性与 LLM 概率性的交叉互补

  • 能用明确代码写清楚的逻辑属于工程逻辑。
  • 在规则难以完整枚举,或需要处理自然语言、文档等非结构化内容时,LLM 才有价值。
    (反面典型例如用大模型点奶茶)

虽然方法论已经被广泛认可,但实现起来却不容易。

因为当下基于 LLM 的产品和技术架构仍处于早期探索阶段(虽然与传统技术相比发展速度快得不可思议,但主要聚焦于少数几个商业价值极高的方向)。

研发是个非常依赖过往经验的工种,多数人并不擅长颠覆式的技术创新,更习惯于在一个成熟框架内做少量方向的探索。

并且基于 LLM 的产品和技术架构,其耦合程度之高,远超传统产品,对现有产品与研发的分工合作是个很大的挑战。

所以我以产品 + 研发的双重视角,简单梳理下一个围绕 LLM 搭建的 Agent 产品可能遇到的问题和基本的思考流程。

强大的模型,粗糙的交互,万能 Chat 的局限性

结合业务设计一套能充分发挥 LLM 能力的交互形态是首要任务。那非 Chat 莫属了。

Chat 决定了一款复杂 Agent 产品的高能力上限,但 Chat 的交互体验是非常差的,我们对交互层的设计,就是围绕着 Chat 做能力抽象,核心是既保留 Chat 的高自由度,又尽可能地提高交互体验。

最经典的例子是在 Chat 之上加一些固定助手,提供快速触发任务的快捷入口,减少手动交互频率。这种优化看似很小,但极其重要,并且积少成多。我认为起码要优化到将原本 Chat 中 50% 以上的交互成本迁移到各种辅助工具中,才能算一款可用的产品。

Codex 作为通用 Agent 的第一梯队,设计上做了极大创新,包括废除代码视图的主入口、丰富的侧边栏、内置的终端和浏览器、任务的多种模式等等。

https://p0-xtjj-private.juejin.cn/tos-cn-i-73owjymdk6/6cf15ee8654a4e6dbb658d29ac739ac2~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg6Zi_56WWenU=:q75.awebp?policy=eyJ2bSI6MywidWlkIjoiMzgyNTk1NjE5NDM2NzIzMCJ9&rk3s=e9ecf3d6&x-orig-authkey=f32326d3454f2ac7e96d3d06cdbb035152127018&x-orig-expires=1790248677&x-orig-sign=%2B4ltvzrk64mYL3U1YsUsmMWWv7Q%3D

LLM 很强大,但能力极其单一,要充分发挥 LLM 和 Agent 的能力,将人的心智负担逐渐从自然语言中抽象出来,是一款好的产品交互形成的过程。

Agent 产品的交互设计,非常考验产品的想象力,大部分都是从无到有的设计,同样也考验产品对于 Agent 本身能力的理解和实际业务场景的理解,交互做不好就是个垃圾,Agent 能力再强也没用。

现在所有主打 AI Agent 在传统领域落地的产品,你打开它们的入口,只要是干巴巴的 Chat,一律都是垃圾。

沿着一条简洁的 Agent 主线去设计

Agent 的设计通常要兼顾各种任务,任务执行的维度经常是混乱的,例如有些要意图分析、有些要取特殊上下文、有些要调外部工具、有的需要循环 LLM,有些甚至都不需要 LLM。以工程思维解释就是无法做精准的抽象、封装、拓展(如果可以做就没必要设计 Agent 了)。

这种情况下,普通技术团队很容易设计出几种架构:

  1. 一刀切,固定流程
    例如:前置上下文收集 + 统一意图识别 + 统一 Tools 列表 / 子 Agent / Skill + 统一 LLM 汇总。
    方案虽然简洁,但牺牲了体验。很多任务不需要意图分析,统一加上会浪费 token,又增加耗时,功能拓展也受固定流程限制。
  2. 全耦合,任务定制
    给不同的任务编排不同的 workflow,所有的流程耦合到一起,功能效果优先,但流程多了很难梳理,任务之间可能有冲突,不适合复杂的任务场景。
  3. 复杂架构
    很多人喜欢设计一套复杂的架构,提供丰富的拓展方式去接入,但维护成本高,Agent 场景下很容易随时出现一些新的概念,与原架构相融很麻烦,Agent 架构还是要以简洁为主。

我的思路是保持主线简洁,先按任务的时效性分流:

  • 短时效任务:用户需要立即拿到结果,每优化一秒,用户体验就会提升很多。
  • 长时效任务:时间不敏感,执行 1 分钟还是 5 分钟差别不大。

用户输入“你好”,必须立即回复。

但有人困惑,如果提问确实涉及到某个内部知识,结合检索结果回复更优,要保证速度还是质量?
肯定是速度(优先体验),不可为了展现能力的强大而牺牲体验,优化方向一定是先保证时效再分析如何提高质量,质量一定是先被牺牲后优化的,优先保证质量的是实验室的试验,不是产品。

主 Agent 的意图分析的目标要极其清晰,只暴露高频、边界清楚的能力,避免歧义,一般情况下做个常用 Tools 的简单循环即可,不要同时接入 Tools、Skill、MCP 等等。

例如 Skill 一旦触发,执行时间通常很长,所以 Skill 压根没必要耦合到主线中,所有的 Skill 都交给一个子 Agent 单独处理即可,主线只需要合理推断是否有必要调用 Skill 即可。

所有的支线统一封装进 Tools 中给主线调度,各自分发,这样我们就得到一条干净简洁快速回复的主线,以及通过 Tools 封装的支线,以及各个支线下封装的子 Agent、固定 workflow、Skill 等长任务。

主 Agent 保持快速响应,通过 Tools 将长任务交给支线

Server Agent 的局限性与沙箱环境的建设

多数 Agent 会部署在服务端而非客户端,一个强大的 Agent 非常依赖端上(电脑)的系统级能力,例如文件系统、编程环境、网络请求甚至是浏览器调用,而在服务端极难利用服务器的系统级能力,持久化、安全性、并发方面的问题都很难解决。

所以 Agent 要建设复杂长任务的能力,独立的沙箱环境必不可少,我认为当下 Agent 标配起码是一个 Server Agent + 至少一个独立沙箱。

沙箱是一个概念吧,只要能提供端上系统能力,并且与服务端做隔离,无论是任何机器都可以称为独立的沙箱,是否要做任务隔离、自动销毁、开放多少系统能力完全取决于 Agent 的长任务特性。

沙箱可作为 Agent 支线中复杂任务的能力拓展端,例如将代码拉到沙箱去跑、自动写脚本运行、剪辑视频之类,要频繁进行 I/O 操作、网络请求和编程就可以作为扩展能力放进去。也可以直接将一个复杂的 Agent 与一个沙箱深度绑定,将入口放到服务端供主 Agent 调用即可。

服务端通过任务支线调用独立沙箱,沙箱提供文件与代码执行能力

固定流程编排(workflow)的重要性

如果你目前还抱着搞个超级 Agent 产品,底层设计通用型扩展插口(例如 MCP、Skill)来实现以 LLM 自由主导的 Agent 设计,是非常幼稚的,不亚于将一个发动机和四个轮胎装在箱子里,然后期望它能自己跑起来。

workflow 的主要逻辑由固定代码主导,LLM 辅助,适合步骤稳定、风险较高、需要明确验收的任务。动态流程由模型根据当前信息决定下一步,适合搜索、诊断、研究和其他难以提前枚举路径的任务。

实际系统很少需要在两者之间二选一。更可靠的方式是固定外壳包住动态执行。例如一项复杂任务可以稳定地分成:准备输入、校验权限、执行、验证结果、保存产物。中间的“执行”阶段允许 Agent 动态选择搜索、读取文件、调用工具或委派子 Agent,其他阶段仍由程序控制。

固定流程包住动态执行,输入、权限、验证和保存由程序控制

在现实中,workflow 的设计程度,与 LLM 基础能力的进步息息相关,曾出现过提倡以 workflow 为主导(保守派),和以自由 LLM 为主导(激进派),两个完全相反的思路。但就目前来看,虽然 LLM 能力屡破想象,但纯以 LLM 为主导的 Agent 设计仍然是效果很差的。

Tools、Skill、MCP 如何选择

1. MCP 可以直接放弃

MCP 没有必要再用,过于鸡肋了,它封装的维度非常狭窄,只提供基础描述和接口调用方法,作为独立模块过于单薄,作为 Agent 内嵌工具又很难掌控。

作为独立模块需要耦合业务 Agent 能力,放到 Agent 中又过于独立无法与 Agent 设计相融合,我宁愿把里面的接口扒出来放到 Agent 中作为基础 Tool 使用。

MCP 是一个中间态的产物,它促进了 Agent 从自然语言能力发展到复杂任务执行,在实际场景发挥价值很小。

2. Skill:封装外部能力的拓展

经过 MCP 的验证后,Skill 真正地将功能模块封装到 Agent 扩展中,可以理解为一个 LLM + 一个 Skill,就已经组成了一个专业的子 Agent,非常适合复杂的外部能力作为通用模块接入当前 Agent 系统的场景。

但也是有代价的,调用 Skill 会有更多的损耗,提高成本,执行时间长,适合对时间不敏感的长任务。

3. Tools:Agent 内部工具

无论是 MCP 还是 Skill,都是给 Agent 加上执行的能力,前两者的思想都是对能力做通用型封装然后交给 Agent 自发调用。相比之下 Tool 就是内部封装的能力,直接嵌入到 Agent 上下文中,与业务逻辑紧密结合,Tools 才是 Agent 基本能力的主要来源。

总结

可以按时效性理解,Agent 中 LLM 快速回复是秒级(1–5 秒),涉及 Tools 执行在分钟级(1–3 分钟),子 Agent 或 Skill 为异步长任务(5–30 分钟)。

这样你就能理解,你的产品中,应该以什么设计为主了。

附加 1:调优思路

有非常多技术上调优的角度,我提一些容易被忽略的角度。

可回溯性要覆盖整条执行链路

可回溯的链路是一切调优的基础,进入 Agent 后,无论是 workflow 还是动态流程,都要留存足够完整的执行链路信息。

Agent 动态流程的固化

纯 LLM 自驱的动态流程一定是很慢的,每次运行都会形成一条临时路径:读取哪些信息,做过哪些判断,调用哪些工具,如何重试,最终如何验证交付。

每次实时分析,成本高、体验差。之所以要实时是因为我们要猜测用户的意图,但随着产品投入使用,用户常用的能力一定是有限的几种,可以将最常用的能力抽象成新交互、新 workflow,引导用户快速使用,提高体验、降低成本。

附加 2:知识库

知识库是个很复杂的话题,更多请看我之前写的关于知识库的文章:
《别再优化 RAG 了,适配 Agent 的 LLM Wiki 知识库理念》

在 Agent 设计上我主要想表达:

  1. 无论企业还是个人,文档里真正高价值的内容只占很小一部分。低价值资料不会因为被交给 LLM 就变成高价值。
  2. 强大知识库 + 万能 Agent 的组合思路不可行。
  3. Agent 中大量知识依赖的场景一定是小众需求。
  4. 知识库对一般 Agent 的增强有限,除非是涉及大量知识的业务场景,例如智能客服。
  5. 把依赖大量外部知识、优化 RAG 检索作为增强 Agent 能力的方向,在效率、体验和性价比上都非常低。

附加 3:一套可以落地的最小架构

把前面的思路放在一起,最小架构其实很简单:

  • 产品入口:Chat 保留自由表达,高频任务做成短路由跳过意图分析、消息增加表单交互,减少反复输入。
  • 主 Agent:只负责快速响应和任务分发,接入少量高频、边界清楚的 Tools,保持主线简洁。
  • 任务支线:统一通过 Tools 暴露入口。内部用固定 workflow、子 Agent 还是 Skill,由具体任务决定。
  • 独立沙箱:承接需要文件系统、代码执行等系统能力的复杂任务,结果再返回产品。

例如用户要分析一份文件并生成报告,主 Agent 判断后交给对应支线,支线在沙箱中读取文件、执行分析、生成产物。产品展示任务进度和结果,主线仍然可以继续响应用户。

原创声明

原创文章,转载请注明作者和文章原链接,插图来源 AI 生成,关注公众号看更多文章哦!

内容创作 AI 自律声明

内容创作 AI 自律声明