为什么豆包问答界面的后端接口除了返回数据之外,还把UI层面的比如点赞收藏等元素枚举,返回了?这样在接口层面我感觉数据很重呀
你观察到的这个现象,在AI对话类产品 (豆包、ChatGPT、文心一言等)里其实非常普遍。它背后不是简单的"接口设计失误",而是一套以"消息流可配置化"为核心的架构选择。可以从几个层面来理解。
一、你看到的"UI元素枚举"到底是什么
典型的豆包类接口返回,一条消息可能长这样(简化):
json
{
"message_id": "xxx",
"role": "assistant",
"content": "...",
"actions": [
{ "type": "like", "enabled": true },
{ "type": "dislike", "enabled": true },
{ "type": "copy", "enabled": true },
{ "type": "regenerate", "enabled": false },
{ "type": "share", "enabled": true }
],
"feedback_config": { ... },
"ui_hints": { ... }
}
这些确实属于"UI 层"的东西,按传统 REST 设计理念,接口应该只返回 content,前端自己决定显示哪些按钮。
二、为什么大厂反而要这么设计
1. 服务端驱动 UI(Server-Driven UI)
这是最核心的原因。AI 对话产品的交互逻辑变化极快:
-
今天只有点赞/点踩,明天要加"重新生成""换一版"
-
某些模型/某些场景下不能点赞(比如系统提示消息)
-
A/B 实验需要给不同用户返回不同的按钮组合
-
不同端(App、Web、小程序、插件)要展示不同操作
如果把这些逻辑写死在前端,每加一个按钮就要发版,App 审核、灰度、多端同步成本极高。放到接口里返回,服务端改配置就能立即生效,前端只做"渲染器"。
这就是 Server-Driven UI(SDUI) 的典型做法,Airbnb、Spotify、阿里系很多 App 都在用。
2. 按钮的"可用性"本质是业务状态,不是纯 UI
以"重新生成"为例:
-
只有最后一条 assistant 消息才能重新生成
-
流式输出未结束时不能点
-
某些模型不支持重新生成
-
免费用户可能没有这个权限
这些判断依赖服务端才知道的状态 (模型能力、用户权益、消息位置、会话上下文)。如果前端自己判断,就要把一大堆业务规则复制到客户端,既容易不一致,也容易泄露逻辑。服务端直接返回 enabled: false 反而更干净。
3. 多端一致性 & 动态配置
豆包有 App、Web、PC 客户端、浏览器插件、API 开放平台等。让服务端统一返回"这条消息支持哪些操作",各端只负责用各自的组件渲染,能保证行为一致,而不是各端各写一套判断。
4. 埋点、实验、风控的诉求
点赞/收藏按钮往往绑定:
-
埋点事件 ID
-
A/B 实验分组
-
风控策略(比如某些内容不允许分享)
这些也天然在服务端决策更合适。
三、你说的"数据很重"确实成立,但权衡后可以接受
你的直觉没错,这种设计有代价:
| 代价 | 说明 |
|---|---|
| 包体变大 | 每条消息多几十~几百字节,长会话累积明显 |
| 冗余 | 大量消息的 actions 其实完全一样 |
| 耦合 | UI 和数据结构耦合,前端灵活性下降 |
| 版本管理复杂 | 前后端要约定 action 协议 |
但对比收益:
-
发版成本:不用为改按钮发 App
-
实验效率:服务端改配置即可灰度
-
多端一致:一套协议多端渲染
-
业务状态准确:权限/能力判断在服务端
对豆包这种迭代极快、多端、重运营的产品,收益远大于成本。而且实际传输中还有 gzip/br 压缩,action 枚举这种高度重复的 JSON 压缩率极高,真实带宽开销比看起来小很多。
四、更"轻"的替代方案,以及为什么没被选
-
前端写死 + 服务端只返回能力位
比如只返回
can_regenerate: true,按钮长什么样前端定。→ 仍要发版才能加新按钮,实验不灵活。
-
GraphQL / 按需字段
前端声明要哪些字段。
→ AI 对话是流式、高频、低延迟场景,GraphQL 的解析和复杂度不划算。
-
完全前端判断
→ 业务规则泄露、多端不一致、权限判断不可信。
所以豆包这类产品普遍选择:接口返回"消息 + 可执行动作清单" ,前端当渲染器。这不是设计缺陷,而是在快速迭代和多端场景下的工程取舍。
五、一句话总结
它返回的不是"UI 元素",而是服务端对这条消息可执行操作的决策结果。用一点数据冗余,换来了不发版就能改交互、多端一致、权限/实验/风控统一管控的能力。对 AI 对话这种高频迭代产品,这笔账是划算的。
如果你是在做自己的 AI 产品,判断标准很简单:你的按钮逻辑会不会频繁变、要不要多端、要不要做实验。如果会,SDUI 值得;如果就是个固定聊天框,那确实没必要,前端写死更轻。