共计 1718 个字符,预计需要花费 5 分钟才能阅读完成。
业务场景痛点分析
在开发 AI 对话框时,我们常常遇到两类典型场景:

- 文档型对话:需要快速渲染用户手册、API 文档等结构化内容,这类场景要求高效解析和展示文本,但对交互性要求不高。
- 交互型对话:例如电商客服机器人需要动态生成商品卡片、表单等复杂 UI 组件,要求能实时响应用户操作。
传统方案往往面临两难选择:用 Markdown 渲染缺少交互能力,用生成式 UI 又担心性能损耗。下面我们就从技术角度拆解这个问题。
技术方案对比
Markdown 渲染方案
优势:
- 解析效率高:静态内容只需一次 AST 转换(如 remark 解析耗时 <5ms)
- 开发成本低:已有成熟库(如 React-Markdown)可直接集成
- 内容可控:输出为纯文本,XSS 风险较低
局限性:
- 交互能力弱:无法直接嵌入 React 组件
- 样式定制难:需要额外处理 CSS-in-JS 兼容
- 动态更新差:大文档重复解析开销大
生成式 UI 方案
特点:
- 动态构建:通过 JSON Schema 实时生成表单、按钮等(如Formily)
- 交互丰富:支持自定义事件绑定与状态管理
- 扩展性强:可组合业务组件库
潜在问题:
- 运行时开销:需要维护虚拟 DOM 树
- 包体积增大:动态加载组件可能增加首屏加载时间
- 安全风险:需要严格校验动态 JSON 输入
核心实现示例
Markdown 优化方案(React)
import ReactMarkdown from 'react-markdown';
import remarkGfm from 'remark-gfm';
// 使用 memo 避免重复解析
const MemoizedMarkdown = React.memo(({content}) => (
<ReactMarkdown
remarkPlugins={[remarkGfm]} // 支持表格等扩展语法
components={{
// 自定义链接组件
a: ({node, ...props}) => (<a {...props} onClick={handleLinkClick} />
)
}}
>
{content}
</ReactMarkdown>
));
// 使用 Web Worker 预解析大文档
const worker = new Worker('markdown-parser.js');
worker.postMessage(largeContent);
生成式 UI 方案(JSON Schema)
{
"type": "object",
"properties": {
"product": {
"type": "string",
"x-component": "Select",
"x-component-props": {
"options": [{ "label": "iPhone 13", "value": "p1"},
{"label": "MacBook Pro", "value": "p2"}
]
}
},
"submit": {
"type": "void",
"x-component": "Button",
"x-component-props": {"onClick": "handleSubmit"}
}
}
}
性能与安全考量
基准测试数据(1MB 内容)
| 指标 | Markdown | 生成式 UI |
|---|---|---|
| 首屏时间(3G) | 320ms | 680ms |
| 内存占用 | 15MB | 42MB |
| 交互延迟 | 高 | <10ms |
安全建议
- Markdown 防护:
- 使用 DOMPurify 清理 HTML 标签
-
禁用
javascript:协议链接 -
生成式 UI 防护:
- 校验 JSON Schema 完整性
- 沙箱隔离动态组件
生产环境选型建议
选择 Markdown 当:
- 内容以静态文本为主
- 需要极致的渲染性能
- 内容来源完全可信
选择生成式 UI 当:
- 需要动态表单 / 图表等复杂交互
- 业务组件需要热更新
- 已具备完善的 Schema 管理系统
混合架构设计
flowchart LR
A[用户请求] --> B{内容类型}
B -->| 文档 | C[Markdown 微前端]
B -->| 交互 | D[UI 生成器]
C & D --> E[统一消息队列]
开放思考
- 在 Serverless 架构下,如何预编译 Markdown 减少客户端压力?
- 当生成式 UI 需要支持跨平台(Web/iOS/Android)时,Schema 设计该如何权衡?
- 如何设计性能监控指标来动态切换两种方案?
技术选型没有银弹,关键在于理解业务场景的真实需求。希望本文能帮助你做出更明智的架构决策。
正文完
发表至: 技术分享
近两天内
