前端工程化视角:深度拆解 AI Agent 与 Skill 插件系统的架构实践

0 阅读6分钟

2025年以后,前端开发的边界早已不再是单纯的页面渲染。随着 LLM(大语言模型)的爆发,AI Agent(智能体)Skills(技能/插件系统) 已经成为前端中后台系统的“标配”。

很多同学觉得 Agent 只是后端的业务逻辑,其实不然。Agent 的本质是交互逻辑的重构,而 Skills 则是前端能力的“协议化输出”。 本文将从实际工程方案出发,深度解析 Agent 的运行机制以及如何设计一个高可扩展的 Skill 系统。

image.png

一、 什么是 Agent?(别再把它当成单纯的 Chatbot)

这里用最通俗易懂的方式给大家解释一下agent和skill的关系

1. Agent (智能体) —— “大脑”与“决策者”

  • 是什么:它不仅仅是一个会聊天的机器人,而是一个能独立思考、规划任务的虚拟员工。
  • 干什么:它负责听懂你的话,然后拆解任务,最后决定该去调用哪个工具来帮你解决问题。
  • 比喻:像是一个全能私人助理。你告诉他“帮我安排明天的会议”,他会自己去想需要查日历、发邮件、订会议室。

2. Skills (技能/插件) —— “手脚”与“工具箱”

  • 是什么:Agent 本身只懂文字,无法直接操作真实世界。Skills 就是赋予它操作能力的具体功能接口 (API)
  • 干什么:它是具体干活的。比如“查询天气”、“发送邮件”、“读取数据库”、“生成报表”,这些都是一个个独立的 Skill。
  • 比喻:像是给这个助理配备的工具包手机 App。助理(Agent)本身不会预知天气,但他可以使用“天气 App”(Skill)来查到结果告诉你。

一句话总结关系: Agent 负责“想”(根据意图做决策),Skills 负责“做”(执行具体操作)。


在前端视野里,一个合格的 Agent = LLM(大脑) + Planning(规划) + Memory(记忆) + Tools/Skills(工具/手脚)

1. 从“确定性”到“模糊性”

传统的 UI 交互是确定的:用户点击 Button -> 触发 onClick -> 调用 API

Agent 的交互是模糊的:用户输入“帮我汇总上周的面试情况” -> Agent 分析意图 -> 拆解任务 -> 自行决定调用哪个 Skill。

2. Agent 的核心循环:ReAct 模式

大多数 Agent 遵循 ReAct (Reason + Act) 模式。

  • Thought: 大脑分析当前状态。
  • Action: 决定调用哪个 Skill。
  • Observation: 观察 Skill 执行后的结果(比如接口返回的数据)。
  • Response: 最终给出用户反馈。

二、 核心重头戏:如何设计 Skill(技能)系统?

如果把 Agent 比作操作系统,那么 Skill 就是驱动程序。在前端工程中,一个 Skill 绝不是一个简单的 API 调用,它是一套标准的协议

1. Skill 的结构定义

一个标准的 Skill 应该包含以下三部分:

A. 说明文档(Manifest/JSON Schema)

这是给 LLM 看的。LLM 并不是通过代码运行 Skill,而是通过阅读说明书来判断什么时候该用它。

{
  "name": "get_interview_record",
  "description": "获取特定候选人的面试记录详情",
  "parameters": {
    "type": "object",
    "properties": {
      "candidateId": { "type": "string", "description": "候选人唯一ID" },
      "startTime": { "type": "string", "format": "date", "description": "起始时间" }
    },
    "required": ["candidateId"]
  }
}

B. 执行逻辑(Executor)

这是给程序看的。可以是前端的一段函数,也可以是后端的一个 API。

async function get_interview_record(params) {
  const res = await fetch(`/api/records?id=${params.candidateId}`);
  return await res.json();
}

C. 渲染逻辑(UI Adapter/Renderer)

这是前端 Agent 的灵魂。 传统的聊天机器人只能回文字,但真正的 Agent 应该能回“卡片”、“图表”甚至“操作表单”。

三、 实战:前端如何集成 Agent 联动?

在实际项目中,我们经常遇到 iframe 嵌套或微前端集成的场景。如何让 Agent 真正“操纵”页面?

1. 跨域联动流(基于 postMessage)

正如我们在处理 Chathub 类似项目时遇到的问题,Agent 运行在 iframe 中,而业务数据在宿主页面。我们需要一套严谨的通信流程:

  1. INIT_CONFIG: 宿主页面动态创建 iframe,加载完成后发送配置,建立通信握手。
  2. SKILL_CALL: Agent 决定调用“发送消息”技能。
  3. POST_MESSAGE: iframe 发出指令。
  4. UI_UPDATE: 宿主页面接收指令,更新原生 DOM 或业务状态。

2. 避免“水合”与“竞态”坑

在开发 Agent 页面时,最忌讳的是 iframe 还没加载完就发消息。**“监听在前,注入在后”**是金科玉律。

  • 错误写法<iframe src="..." @load="init">(Vue 的异步钩子极大概率错失 load 事件)。
  • 正确写法:通过 document.createElement 动态创建,手动绑定 onload 后再给 src 赋值。

四、 为什么你的 Agent 会在生产环境“逃逸” Bug?

复盘近期的技术缺陷(如:安卓端滑动反向、ID 协议冲突、性能劣化),我们发现 Agent 系统的 Bug 逃逸通常有以下三个痛点:

1. 协议的“向前兼容性”

案例:新需求规定 id < 0 是数字员工,结果撞车了旧版逻辑中 id = -1 表示“所有人”。

教训:在设计 Skill 的参数协议时,必须进行“影响面评估”。新老协议打架,受灾的一定是无法强制更新的旧版客户端。

2. 性能“暗礁”:解析库的开销

案例:为了让 Agent 支持 Markdown 公式和高亮,接入了沉重的解析库,导致页面加载耗时增加。

优化建议

  • Lazy Load: 只有当 Agent 确实返回了代码块时,再动态加载高亮库。
  • Worker 化: 将复杂的 Markdown 解析丢到 Web Worker 中,避免阻塞主线程交互。

3. 环境差异:旧版 WebView 的背刺

案例:重构滚动方案后,旧版安卓端交互反向。

反思:Agent 往往涉及复杂的手势和 DOM 变换,开发不能只盯着最新的 Chrome,必须有一台“老破小”安卓机做基准测试。

五、 未来展望:从“搬砖”到“设计 Agent”

前端开发者的角色正在发生转变。过去我们是在实现“功能”,现在我们是在设计“技能”。

  • 原子化能力:将业务逻辑拆解成一个个独立的 Skill。
  • 协议化通信:定义一套全公司通用的 json-rpc 消息规范。
  • 体验闭环:不仅要让 Agent 跑得通,还要通过“骨架屏”和“流式输出”解决水合过程中的焦虑感。

结语

Agent 时代,前端不再是 UI 的搬运工,而是 AI 能力的最后一步交付者。理解 Agent 的思考链路,设计健壮的 Skill 协议,处理好跨端兼容性,才能在这一波 AI 浪潮中稳立潮头。

希望这篇文章能给正在探索 AI 集成的你带来一些启发。