
一切的起点
"为什么不能像其他应用那样,每个角色一条单独的消息?"
我们经常收到这个问题。说实话,这是个好问题。大多数聊天应用都是一人一条消息气泡,那我们的群聊为什么要把多个角色的回复放在一条消息里?
答案不是偷懒,也不是疏忽。这是一个深思熟虑的工程选择,源于我们对三种截然不同的技术方案进行了数月的实验。
三种技术架构
构建多角色 AI 对话时,每个平台都面临同样的抉择。实现方式只有三种,每种都对成本、质量和用户体验有着深远影响。
1. 结构化输出(JSON 数组)
行业内最常见的做法。让 AI 返回一个 JSON 数组,每个元素代表一个角色的回复:
[
{
"speaker": "夏洛克",
"emotion": "好奇",
"content": "有意思。这泥土的纹路说明..."
},
{
"speaker": "华生",
"emotion": "困惑",
"content": "福尔摩斯,你什么意思?"
}
]
优点:
- 单次 API 调用,积分只消耗一次
- 便于解析,可以渲染成独立的消息气泡
- 可以包含丰富的元数据(情绪、动作、场景描写)
- 适合生成用户回复建议
现实情况:
- 只有昂贵的高级模型(Claude、GPT-4)能可靠地支持结构化输出——大多数平价模型难以保持一致的 JSON 格式
- 格式错误会导致整个回复失败
- JSON 格式指令会消耗 token,挤占创作空间
- 模型被格式"束缚"——创意往往受限
- 内容限制变得更严格:结构化输出模式往往会触发更激进的内容过滤,让成人向或边缘化的角色扮演场景更容易失败
- 上下文污染:对话历史里充满了 JSON 结构
- 错误处理复杂:流式输出时解析失败怎么办?
大多数第三方角色对话平台都采用这种方案。能用,但限制是真实存在的。
2. 工具调用(Agent 模式)
最"智能"的方案。AI 自主决定下一个该说话的角色,调用工具指定角色,然后生成该角色的回复。如此循环直到场景完整。
AI 思考:"华生应该对这个发现做出反应"
→ 调用工具:next_speaker("华生")
→ 生成华生的回复
→ AI 思考:"现在夏洛克会插话"
→ 调用工具:next_speaker("夏洛克")
→ 生成夏洛克的回复
...
优点:
- 对话流程最自然
- AI 完全掌控场景节奏
- 每个角色的回复都能获得专注的生成质量
- 天然产出独立的消息
现实情况:
- 多次 API 调用 = 多次积分消耗
- 延迟累积:N 个角色 = N 次网络往返
- 只有高端模型(Claude、GPT-4)能可靠地处理工具调用——便宜的模型经常失败或产生幻觉式的工具调用
- 跨调用的状态管理很复杂
- 有无限循环或异常终止的风险
- 调试噩梦:问题难以复现
这是纸面上最美好的"梦想架构",但在规模化运营时会带来巨大的运维压力。
3. 自由文本输出(我们当前的选择)
最简单的方案。让 AI 自然地写出场景,由它决定如何在流畅的文字中呈现多个角色:
夏洛克身体前倾,目光锐利。"有意思。这泥土的纹路
说明我们的嫌疑人是从东边过来的。"
华生皱起眉头。"福尔摩斯,你什么意思?这不就是泥巴吗。"
"不就是泥巴?"夏洛克微微一笑。"亲爱的华生,
这世上没有什么是'不就是'的。"
优点:
- 兼容所有 AI 模型,无需特殊功能支持
- 创作自由度最高——AI 自然书写
- 干净的上下文:对话历史读起来像小说
- 流式输出体验极佳
- 单次调用,成本可预测
- 实现和维护最简单
现实情况:
- 所有角色在一个消息块里
- 无法单独重新生成某个角色的回复
- UI 灵活性受限
- 习惯聊天式气泡的用户可能会困惑
我们是踩过坑的
这是我们之前没有公开分享过的:我们群聊的第一个版本用的就是工具调用。
我们曾经相信"梦想架构"。AI 决定谁来发言,每个角色获得专属的生成质量,漂亮的独立消息气泡。它很优雅,很智能。但在生产环境中,它是一场灾难。
用户遭遇了不可预测的成本——有时同样的对话要多花 3 倍的积分。响应时间也随着 AI 决定让多少角色参与而剧烈波动。便宜的模型会产生幻觉式的工具调用,或者陷入死循环。我们的错误日志里塞满了从未预料到的边缘情况。
在几个月的修补和变通之后,我们做出了艰难的决定:从头开始,用自由文本输出重建。这感觉像是退步。但有时候,"不那么智能"的方案反而是更明智的选择。
我们为什么做出这个选择
在充分测试了三种方案——并把其中一种推上了生产环境——之后,我们为群聊选择了自由文本输出。原因如下:
稳定性优先 - 结构化输出会不可预测地失败。当群聊在对话中途崩溃时,用户不会在乎独立气泡了——他们只想让它正常工作。自由文本永远不会因为格式问题而失败。
质量优先 - 格式约束会微妙地降低 AI 的创造力。对比输出后我们发现,自由文本始终能产出更生动、更自然的角色互动。AI 可以专注于讲故事,而不是 JSON 语法。
成本可预测 - Agent 模式按角色按回复收费。一个五角色场景可能比预期贵 5-10 倍。用户应该享有可预测的定价。
通用兼容 - 我们支持多种 AI 模型。不是所有模型都同样支持结构化输出或工具调用。自由文本到处都能用,给用户更多模型选择。
我们接受的取舍
是的,我们牺牲了"每个角色一个气泡"的体验。但我们获得了:
- 坚如磐石的可靠性
- 更好的创作质量
- 可预测的成本
- 更广泛的模型支持
- 更干净的对话历史
对于群聊角色扮演来说,沉浸感最重要,我们相信这个取舍是值得的。
即将推出:故事模式
这里有个令人兴奋的消息:我们正在构建一个使用结构化输出的全新故事模式。
为什么采用不同的方案?因为故事模式有不同的优先级:
- 精确的场景控制比自由创作更重要
- 丰富的元数据(镜头角度、音乐提示、章节划分)能增加价值
- 格式更可预测(清晰的章节/场景结构)
- 用户期待更"精心制作"的体验
不同的使用场景需要不同的架构。我们不迷信任何单一方案——我们选择最能服务用户的那个。
诚实的真相
多角色 AI 对话没有完美的解决方案。每种方案都在用一些有价值的东西换取另一些。
那些展示独立气泡的平台?他们很可能在用结构化输出,并接受其局限性。那些有更"智能"场景控制的平台?大概是工具调用,伴随着更高的成本和延迟。
我们选择了优先考虑用户最看重的东西的道路:可靠、有创意、成本可控的群聊角色扮演。
独立气泡的体验确实不错。但不值得牺牲所有其他东西。
我们在探索的方向
我们正在实验混合方案:
- 后处理解析:使用轻量模型在生成后将自由文本拆分成角色片段
- 可选结构化模式:让高级用户在需要精确控制时选择结构化输出
- 智能场景检测:自动识别自然的分割点,提供更好的 UI 呈现
目标不是找到"正确"答案,而是在保持有效方案的同时持续改进体验。
对群聊应该如何运作有想法?我们很想听听你的意见。
