AI 智能对话 — 右侧组件面板

Schema-Driven Artifact Rendering 产品方案
版本 v1.0 · 2024-05 · 产品架构组
1背景与问题定义

1.1 业务背景

平台为企业提供 AI 智能对话能力,对话窗口(左侧)已定义清晰的输入形态(文本/文件/图片/视频/压缩包)。目前 AI 回复仅以纯文本/Markdown 呈现,无法承载结构化业务输出(表格、图表、表单、审批流等),导致用户需要离开对话界面去业务系统操作,体验断裂。

1.2 核心问题

1.3 目标

一句话目标:在对话界面右侧增加「组件画布面板」,AI 工作流输出结构化 JSON,前端按 Schema 动态渲染对应组件,实现对话即操作

量化指标:

2系统架构总览

2.1 分层架构

用户交互层
对话输入框 文件上传 快捷指令 右侧面板交互
前端渲染层
Chat Container Artifact Panel Renderer Registry State Manager
网关层
API Gateway 推理网关 鉴权 / 限流 SSE 代理
编排引擎层
Dify Workflow 意图识别 条件路由 格式化输出 (Code)
能力层(产品线提供)
知识库 RAG API 工具 Skill 执行器 数据库/ERP/MES

2.2 核心数据流(四阶段)

阶段关键动作数据形态
① 请求用户发送消息 → 前端组装 → 网关转发{ session_id, message, files[] }
② 处理意图识别 → 路由场景 → 调用能力 → 格式化输出内部结构化数据 → Artifact JSON
③ 响应SSE 返回 → 提取 artifacts → Registry 路由 → 渲染{ artifacts: [{ type, title, data, actions }] }
④ 回流用户操作 → 事件注入对话上下文 → 新一轮请求{ action, params, artifact_id }
核心设计决策:对话文本通过 SSE 流式输出;artifacts 部分在流结束后一次性解析渲染,避免半成品 JSON 导致渲染异常。

2.3 前端渲染层核心组件职责

右侧面板的渲染能力由四个解耦组件协作完成,新增组件类型只需向 Renderer Registry 注册,不改动其余三者:

组件职责关键接口 / 输入
Chat Container承载对话流,解析 SSE 文本,识别消息体内的 artifact 引用并触发面板加载onMessage(chunk) / onArtifact(ref)
Artifact Panel右侧画布容器,管理多 artifact 的标签页/堆叠、展开收起、全屏,向下分发渲染请求render(artifact) / focus(id)
Renderer Registrytype 字段查表,把 Artifact JSON 路由到对应渲染器组件;未注册类型降级为 JSON 折叠视图register(type, Comp) / resolve(type)
State Manager维护 artifact 与会话的双向绑定,缓存历史 artifact,捕获组件内交互事件并回注对话上下文dispatch(action) / getContext()

2.4 渲染时序

从用户发送消息到 artifact 可交互,前端走如下时序,关键点是文本与 artifact 分离投递

① 建立连接
Chat Container 发起请求,网关建立 SSE 长连接,开始接收 token 流
T0 · 即时
② 文本流式渲染
对话气泡逐字呈现 AI 文本回复,用户先获得自然语言解释,感知零等待
T0 → 流结束
③ Artifact 解析
流结束信号到达后,State Manager 提取完整 artifacts 数组并校验 Schema,丢弃半成品避免渲染异常
流结束 · 一次性
④ 路由与挂载
Renderer Registry 按 type 解析渲染器,Artifact Panel 从右侧滑入并挂载组件,进入可交互态
+ 一帧
⑤ 交互回流
用户在组件内操作(提交表单/点击审批),事件经 State Manager 注入下一轮对话上下文,形成闭环
用户触发

2.5 状态管理与上下文回流

artifact 不是一次性渲染的死图,而是与会话绑定的活动状态。State Manager 维护三类状态,保证用户操作能反馈给 AI:

① Artifact 实例状态

每个 artifact 以 artifact_id 为主键缓存其 dataactions,支持历史消息回溯时重新挂载,刷新页面后可由会话快照恢复。

② 交互事件队列

组件内的用户操作统一抽象为 { action, params, artifact_id } 事件,入队后既更新本地视图(乐观更新),又异步注入对话上下文,作为下一轮请求的结构化输入。

③ 会话上下文映射

维护 artifact 与所属 message 的双向引用,AI 在后续轮次可引用"上一张表格的第 3 行"等指代,无需用户重新描述,支撑多轮连续操作。

回流约定:交互事件注入上下文时附带人类可读摘要(如"用户批准了报销单 #2024-038"),既让 AI 理解语义,也便于对话记录审计回溯。

2.6 技术选型与边界

选型说明
前端渲染React + 组件注册表渲染器按 type 动态加载,复用现有对话窗口技术栈
传输协议SSE(文本流)+ JSON(artifacts)文本走流式、artifacts 流末整体投递,互不阻塞
编排引擎Dify Workflow意图识别、条件路由、格式化输出节点产出 Artifact JSON
能力接入Skill 执行器 / API 工具 / RAG由各产品线提供,编排层只消费其结构化结果
架构边界:前端只认 Artifact JSON Schema,不感知后端用何种能力生成数据;能力层只产出结构化数据,不关心前端如何渲染。两侧通过 Schema 解耦,是"新场景零前端开发"目标的技术基础。
3输出协议规范 (Artifact JSON Schema)

3.1 顶层结构

{
  "message": "AI 的文本回复(展示在左侧对话)",
  "artifacts": [
    {
      "id": "artifact_001",
      "type": "table | chart | kpi | form | checklist | markdown | ...",
      "title": "费用明细",
      "data": { /* type-specific payload */ },
      "actions": [
        { "label": "导出Excel", "action": "download", "params": {} },
        { "label": "筛选", "action": "filter", "params": {} }
      ],
      "meta": {
        "source": "finance_query_skill",
        "timestamp": "2024-05-15T10:30:00Z",
        "ttl": 3600
      }
    }
  ]
}

3.2 各 type 的 data 结构

typedata 结构说明
table{ columns: [{key, label, type}], rows: [{}] }可排序、分页、导出
chart{ chartType, xAxis, yAxis, series: [] }ECharts 兼容格式
kpi{ items: [{label, value, delta, unit}] }指标卡片组
form{ fields: [{name, type, label, rules}], submitAction }动态表单,含校验规则
checklist{ items: [{text, required, checked}], progress }可勾选,含进度
markdown{ content: "..." }富文本渲染
approval{ steps: [{name, status, actor}], currentStep }审批流程可视化
file_preview{ url, mimeType, name, size }文件预览/下载
realtime{ wsEndpoint, dataPath, refreshMs }实时数据订阅
composite{ layout: "grid|tabs|steps", children: [] }容器,嵌套子组件

3.3 Action 协议(交互回流)

// 用户在右侧面板点击按钮/提交表单时,前端生成:
{
  "role": "user",
  "type": "artifact_action",
  "artifact_id": "artifact_001",
  "action": "submit",
  "content": "[用户操作] 在「报销申请」中提交了表单",
  "metadata": {
    "type": "artifact_action",
    "artifact_id": "artifact_001",
    "action": "submit",
    "params": {
      "expense_type": "差旅费",
      "amount": 4560,
      "date": "2024-05-08"
    },
    "request_id": "req_8f3a2b"
  }
}
// → 和用户手动打字走同一条 sendMessage 通道
// → 对网关和 Dify 来说,这就是一条新的用户消息

3.4 交互回流保障机制

右侧面板的用户操作能否可靠传递到模型/智能体并触发下一步,是方案成立的核心前提。保障分三层:

第一层:前端 — Action 标准化收口

// 所有面板交互统一通过 onAction 收口
function handleArtifactAction(artifact, action, params) {
  const actionMessage = {
    role: "user",
    content: `[用户操作] 在「${artifact.title}」中执行了「${action.label}」`,
    metadata: {
      type: "artifact_action",
      artifact_id: artifact.id,
      action: action.action,
      params: params,
      request_id: generateUUID() // 幂等键
    }
  };
  // 和普通对话消息走完全相同的 sendMessage 函数
  sendMessage(actionMessage);
}
双字段设计:
· content — 自然语言描述(降级保障:即使 metadata 解析失败,模型仍能理解用户意图)
· metadata — 结构化参数(主路径:工作流精确路由,跳过 LLM 意图识别)

第二层:Dify 工作流 — 智能路由

# 工作流入口的 Code 节点 — 判断消息来源
def route_input(message):
    metadata = message.get("metadata", {})
    if metadata.get("type") == "artifact_action":
        # 结构化操作 → 直接路由到对应 Skill,跳过意图识别
        return {
            "route": "skill_direct",
            "skill": resolve_skill_by_artifact(metadata["artifact_id"]),
            "action": metadata["action"],
            "params": metadata["params"]
        }
    else:
        # 普通文本 → 正常走意图识别 LLM 节点
        return {"route": "intent_classify"}

关键:artifact_action 类型的消息绕过 LLM 意图识别直接路由到 Skill,既省 token 又保证确定性。

第三层:可靠性保障

机制作用实现方式
artifact_id 关联 操作能追溯到哪个输出产生的 Skill 据此恢复上下文(如上一次查询的 session state)
幂等去重 重复提交不会重复执行 request_id 在 Skill 侧做去重,10min TTL
超时兜底 防止用户等太久 前端发出 action 后 10s 无响应 → 显示"处理中"+ 重试按钮
降级文本 metadata 解析失败时仍能工作 content 字段的自然语言走正常意图识别兜底
Action 白名单 防止非法操作 每个 artifact 声明允许的 actions,前端只渲染声明过的按钮
操作确认 高风险操作防误触 Skill 在 output_schema 中标记 requireConfirm 的 action,前端弹二次确认

完整回流链路一览

用户点击「提交审批」按钮 → 下一轮对话的完整路径
  1. 前端:onAction 收口 → 生成 actionMessage(含 content + metadata)
  2. 前端:调用 sendMessage() → 和打字发送走同一通道
  3. 网关:鉴权/限流 → 透传到 Dify Workflow API
  4. Dify 入口 Code 节点:检测 metadata.type === "artifact_action" → 走 skill_direct 路由
  5. Skill 执行器:接收 action + params → 执行业务逻辑(写数据库/调审批系统)
  6. Skill 返回:新的 Artifact JSON(如审批流状态更新)
  7. 前端:渲染新组件 → 右侧面板更新为审批进度视图
4组件清单与分类

4.1 五大分类 · 33 种组件

分类组件典型场景优先级
静态展示 数据表格 Table费用明细、订单列表P1
KPI 指标卡经营日报、设备概览P1
Markdown 文档会议纪要、报告P1
折线/柱状图销售趋势、能耗分析P1
饼图/环形图成本构成、用户分布P2
时间轴 Timeline项目进展、工单记录P2
树形结构 Tree组织架构、分类目录P3
地图热力图门店分布、设备位置P3
交互操作 动态表单 Form报销申请、工单填报P1
检查清单 Checklist质检、巡检、审计P1
审批流 Approval请假、采购审批P2
筛选器 Filter Panel多条件数据筛选P2
评分卡 Scorecard供应商评估、绩效P2
排程 Scheduler会议安排、排班P3
拖拽看板 Kanban项目管理、工单状态P3
实时数据 实时监控面板设备状态、生产线P2
日志流 Log Stream系统日志、操作审计P2
进度追踪 Progress任务执行、数据处理P1
告警卡片 Alert异常通知、阈值预警P2
仪表盘 Gauge实时指标可视化P3
文件与动作 文件预览PDF/图片/Office 预览P1
代码高亮 Code代码生成、配置展示P1
文件下载导出报表、生成合同P1
对比视图 Diff版本比较、修改审核P2
签名板 Signature电子签名P3
二维码 QRCode分享链接、设备绑定P3
复合容器 Tab 分组多视图切换P1
Grid 布局仪表盘式多卡片P1
Step 步骤条向导式操作P2
对比列 Compare方案对比、产品比较P2
折叠面板 CollapseFAQ、详情收纳P2
弹窗 Modal确认操作、详情展开P2
侧抽屉 Drawer关联信息展开P3

4.2 Renderer Registry 注册机制

// 前端注册一个新渲染器
rendererRegistry.register('table', {
  component: TableRenderer,
  validator: (data) => data.columns && data.rows,
  fallback: 'markdown'  // 验证失败时降级渲染
});

// 收到 artifact 后的调度逻辑
function renderArtifact(artifact) {
  const renderer = rendererRegistry.get(artifact.type);
  if (!renderer) return rendererRegistry.get('markdown'); // 兜底
  if (!renderer.validator(artifact.data)) {
    return rendererRegistry.get(renderer.fallback);
  }
  return renderer.component(artifact);
}
扩展方式:新增场景 = 注册一个 renderer + 写一个工作流的 Code 节点输出对应 JSON。前端框架代码无需改动。
5多智能体协同与统一输出层

5.1 现状:多智能体相互隔离

平台目前已有多个独立智能体,每个智能体是一个垂直领域的"专家"——接收用户输入后,自主理解意图并自动跑完它所负责的那条业务流程(多步骤编排),最终产出业务结果。但智能体之间当前是隔离孤岛

智能体 A · 财务
独立入口独立上下文财务流程编排
智能体 B · 人事
独立入口独立上下文人事流程编排
智能体 C · 运维
独立入口独立上下文运维流程编排
隔离维度现状表现
入口隔离用户需自行判断该进哪个智能体,办不同的事要切换不同入口
上下文隔离A 智能体产出的结果,B 智能体看不到、无法引用,跨域协作需用户手动搬运
能力隔离各智能体的 Skill 各自维护,相似能力(如"导出报表")重复建设
输出隔离各智能体输出形态不统一,前端难以用一套渲染层承接
关键判断:隔离不是缺陷,而是当前阶段的合理形态——它保证了每个智能体职责单一、可独立迭代和验证。本方案不要求立即打通智能体,而是先用「统一输出层」把它们的产出标准化,为后续协同留出演进路径。

5.2 统一输出层:组件面板作为所有智能体的共同出口

无论用户当前在哪个智能体对话,AI 的结构化产出都遵循同一套 Artifact JSON Schema(见第 3 章),渲染到同一个右侧组件面板。这让"多智能体隔离"与"体验一致"两者并不矛盾:

是否隔离说明
智能体编排(理解+流程)隔离每个智能体独立维护意图识别、流程步骤、领域 Skill
输出协议(Artifact Schema)统一所有智能体产出同一套 JSON 协议,前端无需为某个智能体定制
渲染层(组件面板)统一一套 Renderer Registry 承接全部智能体的输出,体验一致
交互回流统一组件内操作按同一 Action 协议回流到"当前所在智能体"的对话

5.3 从隔离到协同的演进路径

统一输出层只是第一步。在 Artifact 协议落地后,多智能体可沿如下三阶段渐进打通,每一阶段都不破坏前一阶段的隔离保证:

阶段一 · 输出标准化(本方案范围)
各智能体保持隔离,但统一输出 Artifact JSON,复用同一套组件面板与回流协议。用户体验先一致,能力先沉淀为可复用 Skill。
当前目标
阶段二 · 能力共享
通用 Skill(导出、审批、文件预览等)上提到共享 Skill 注册中心,多智能体引用同一实现,消除重复建设。智能体仍各自独立,但站在共同能力底座上。
演进
阶段三 · 编排协同
引入统一入口/路由层(Orchestrator),按用户意图把请求分发到对应智能体,并支持跨智能体上下文传递与串联调用(如"财务结果 → 触发人事流程"),形成多智能体协作网络。
远期
为什么这个顺序:先标准化输出(低风险、不动现有智能体),再共享能力(中等改造),最后才做编排协同(涉及上下文打通,复杂度最高)。统一的 Artifact 协议是这三步共同的地基——没有它,任何协同都会退化为点对点定制。
6Skill 驱动的组件输出方案

5.1 为什么需要 Skill 方案

Dify 工作流适合 AI 编排逻辑,但在以下场景存在局限:

痛点Dify 工作流Skill 方案
复杂业务逻辑Code 节点有执行时间/依赖限制独立运行时,无限制
输出 Schema 管理散落在各工作流的 Code 节点中集中声明在 skill.yaml
版本控制工作流整体版本,粒度粗每个 Skill 独立版本
复用性跨智能体复用困难Skill 可被多个智能体引用
测试依赖完整工作流运行Skill 可独立单测

5.2 Skill 输出 Schema 声明

# skill.yaml
name: finance_query
version: 1.2.0
description: 财务数据查询与报表生成

input_schema:
  type: object
  properties:
    query_type: { type: string, enum: [expense, revenue, budget] }
    date_range: { type: object, properties: { start: {type: string}, end: {type: string} } }
    department: { type: string }

output_schema:
  artifacts:
    - type: table
      data_schema:
        columns: { type: array, items: { properties: { key: {type: string}, label: {type: string} } } }
        rows: { type: array }
      actions: [download, filter, sort]
    - type: kpi
      data_schema:
        items: { type: array, items: { properties: { label: {}, value: {}, delta: {} } } }

triggers:
  - intent: ["查费用", "报销记录", "预算"]
  - entity: ["expense", "budget", "revenue"]

5.3 Skill 执行流(与 Dify 协同)

执行顺序
  1. Dify 工作流的意图识别节点确定用户需求
  2. 条件分支路由到对应的 Skill 调用节点(Dify 的 HTTP 请求节点 / 插件节点)
  3. Skill 执行器接收 input,执行业务逻辑(查数据库/调 API)
  4. Skill 按照声明的 output_schema 返回标准 Artifact JSON
  5. Dify 工作流的末端 Code 节点透传(或合并多个 Skill 输出)
  6. 前端接收并渲染

5.4 Skill vs Dify 选型建议

适合 Dify 工作流适合 Skill
轻量数据查询(单表/单接口)复杂业务逻辑(多步事务)
AI 生成类(文案/总结/翻译)精确计算类(报表/统计)
简单条件分支需要外部 SDK/依赖的场景
需频繁调整 prompt 的场景输出 Schema 稳定的场景
7智能体开发工作流集成

6.1 开发者视角:新增一个场景需要做什么

传统模式(无 Artifact 方案)
  1. 产品出需求文档
  2. 后端开发 API + 数据逻辑
  3. 前端开发专用页面/组件
  4. 联调 → 测试 → 上线

周期:2-4 周 / 场景

Artifact 方案
  1. Skill 开发者编写 skill.yaml(声明输入输出 Schema)
  2. 实现 Skill 业务逻辑(查数据/调接口),返回标准 JSON
  3. 在 Dify 工作流中添加 Skill 调用节点 + 意图触发词
  4. 完成 — 前端自动渲染,无需前端开发

周期:1-3 天 / 场景

6.2 智能体开发平台集成点

平台功能与 Artifact 方案的关系
Skill 注册中心管理所有 Skill 的 output_schema,前端据此预加载 renderer
Dify 工作流编辑器提供「Skill 调用」节点模板,自动填充 input/output 映射
组件预览沙盒开发者可上传 mock data,实时预览组件渲染效果
Schema 校验服务Skill 注册时校验 output_schema 是否符合 Artifact 协议
灰度/版本管理Skill 新版本可灰度切流,旧版 renderer 保持兼容

6.3 前端 Renderer 的开发流程

// 1. 创建渲染器文件
// src/renderers/ApprovalRenderer.tsx

// 2. 实现组件(接收标准 data + actions)
function ApprovalRenderer({ data, actions, onAction }) {
  return (
    <div className="approval-flow">
      {data.steps.map(step => (
        <StepCard key={step.name} {...step} />
      ))}
      {actions.map(act => (
        <Button onClick={() => onAction(act)}>{act.label}</Button>
      ))}
    </div>
  );
}

// 3. 注册到 Registry
rendererRegistry.register('approval', {
  component: ApprovalRenderer,
  validator: (data) => Array.isArray(data.steps),
  fallback: 'markdown'
});
8分期交付计划

7.1 三期交付路线

Phase 1 — 基础框架 + 核心组件
  • 左右分栏布局框架 + Renderer Registry 机制
  • Artifact JSON 协议 v1.0 定稿
  • 8 个 P1 组件:Table、Chart、KPI、Form、Checklist、Markdown、FilePreview、Code
  • 2 个容器:Tab、Grid
  • 交互回流机制(表单提交 → 注入上下文)
  • 3 个标杆场景:财务查询、质检清单、会议纪要
4 周 · 前端 2人 + Skill 1人
Phase 2 — 丰富组件 + Skill 平台
  • 新增 12 个 P2 组件(审批流、筛选器、实时监控、告警卡片等)
  • Skill 注册中心上线 + Schema 校验
  • 组件预览沙盒(开发者工具)
  • SSE 流式文本 + Artifact 分离渲染优化
  • 移动端适配(响应式渲染)
  • 新增 5+ 业务场景
6 周 · 前端 3人 + Skill 2人 + 后端 1人
Phase 3 — 高级能力 + 开放生态
  • 新增 13 个 P3 组件(Kanban、地图、签名、排程等)
  • 自定义 Renderer 开放 API(产品线可自行开发组件)
  • 实时数据订阅(WebSocket)
  • 多面板 / 画布模式(同时展示多个 Artifact)
  • AI 自主选择输出 type(基于上下文智能推荐组件类型)
  • 性能优化:虚拟滚动、懒加载、缓存
8 周 · 前端 3人 + 平台 2人 + Skill 3人

7.2 里程碑

时间里程碑验收标准
第 2 周框架 Demo左右分栏 + 1 个组件端到端跑通
第 4 周Phase 1 交付3 个标杆场景可演示,交互回流工作
第 7 周Skill 平台 Alpha开发者可自助注册 Skill + 预览输出
第 10 周Phase 2 交付10+ 场景上线,移动端可用
第 14 周Phase 3 Beta开放 API 文档完成,外部产品线试接入
第 18 周全量上线33 组件就绪,性能达标
9依赖项与风险

8.1 关键依赖

依赖提供方当前状态风险等级
Dify 工作流 HTTP 节点支持调用 Skill平台组已支持
推理网关 SSE 代理稳定性基础设施偶发 502
产品线提供标准 API(ERP/MES/财务)各产品线部分就绪
前端组件库技术选型前端组待定
Skill 执行器运行环境平台组方案中

8.2 风险与应对

风险影响应对策略
推理网关不稳定(502) 用户对话中断 前端增加重试 + 优雅降级提示;网关做健康检查自动摘除
Artifact JSON 格式不一致 渲染异常/白屏 Registry 强制 validator 校验 + fallback 降级为 Markdown
产品线 API 返回格式不统一 Skill 开发成本增加 提供 Adapter SDK,封装常见数据源的格式转换
组件数量膨胀导致前端包体积大 首屏加载慢 按 type 动态 import,只加载当前会话需要的 renderer
交互回流导致对话上下文过长 LLM Token 超限 设计 context window 管理策略:只保留最近 N 次交互摘要

8.3 开源参考

项目参考价值地址
assistant-uiGenerative UI 规范、组件协议设计github.com/assistant-ui/assistant-ui
Vercel AI SDK流式 UI + React Server Componentssdk.vercel.ai
Ant Design XAI 对话组件库、Thought Chainx.ant.design
shadcn AI Artifacts BlockArtifact Canvas 交互模式github.com/shadcn-ui/ui

AI 智能对话组件面板 · 产品方案 v1.0

附件:交互原型演示 · 数据流泳道图