做 AI 歌曲生成器 LyricsGift 的复盘:个人内容(婚礼、纪念歌曲)接受窗口几乎为零,发现失败时已消耗完算力;核心教训是把审核节点前置到慢、便宜的阶段。
我们在构建 LyricGift(一个把某人的故事转成完整定制歌曲的工具)时,把大部分时间花在了模型管线上,而花在审核环节的时间几乎为零。本末倒置了。以下是我们上线之后的改变。
第一个版本是显而易见的设计:
story input -> lyric generation -> voice + music synthesis -> MP3
一个按钮,一次等待,一个结果。技术上跑通了。商业上却是一塌糊涂,原因跟模型质量毫无关系。
为什么一次性生成对个人内容不适用
通用内容有很宽的接受窗口。如果你让模型写一篇博客开场白,它给了你一个 80% 正确的版本,你会修改一下然后继续。
个人内容几乎没有任何接受窗口。为某人的已故父亲写的歌,或者为婚礼第一支舞写的歌,非对即错。当输出内容写错了城市,或者编造了一个不存在的兄弟姐妹,或者为一首纪念歌曲配上了欢快的大调副歌时,用户不会想"差不多得了,让我重新生成一下"。他们会想"这玩意儿根本不理解我。"
失败的原因不在于质量,而在于发现失败时已经太晚了。音乐合成是管线中最贵、最慢、不可逆的部分。每一次我们唱出的糟糕歌词,都是在烧计算资源,去产出一个谁都不会保留的输出。
在便宜/昂贵边界处拆分管线
修复方案是结构性的,而不是换一个更好的 prompt:
story input
-> lyric generation (cheap, fast, editable)
-> USER APPROVES / EDITS <- the gate
-> voice + music synthesis (expensive, slow, final)
-> MP3
由此产生了三件我们未曾预料到的事情。
每首交付歌曲的成本下降了。重新生成从昂贵阶段移到了便宜阶段。用户自由迭代文本,然后只合成一次。
感知延迟反而改善了,尽管总时间变长了。歌词在几秒内就出现,所以用户在慢的那部分运行期间有真实的东西可以反应。到一首完成曲目的墙上时钟时间是比一次性版本更长的。但它感觉上更快了,因为空白时间现在被填满了用户真正想做的事情。
失败的归属发生了改变。有了审核门之后,如果歌曲出错,那歌词是在屏幕上并且被批准过的。这听起来像是甩锅,但效果恰恰相反:人们不再把这个工具当作不可预测的老虎机,因为他们可以在它唱出来之前就看到它要唱什么。
可推广的规则
如果你的管线有一个便宜的、可逆的阶段和一个昂贵的、不可逆的阶段,在它们之间放一个人工检查点——尤其是当输出是个人的、情感化的、或者本质上一锤子的时候。
做生成式产品的直觉是隐藏中间表示,因为暴露它感觉像是在泄露实现细节。对于用户有情感投入的任何东西,中间表示就是界面。隐藏它才是 bug。
如果我们重来会怎么做得不同
先做审核门,再做合成。我们顺序做反了,前端重写了两次。
让中间表示可编辑,而不只是可批准。当有一行不对时,只读式批准仍然让人卡住。
记录用户编辑了什么。他们的编辑是你能得到的最高信号评估集——他们简直是在告诉你模型哪里没命中,而且是以模型输出的确切格式告诉你的。
如果你想看上线版本的流程,可以访问 lyricsgift.com——写故事,审核歌词,获取曲目。欢迎在评论区提问关于管线的问题。