聊一聊做角色扮演大模型的经验

大模型向量数据库机器学习

在角色扮演这个领域也爬滚打了一段时间,分享一些自己的心得和思考。为了避免老板看到之后干掉我,有些细节就不展开了,多多包涵。


        
          
作者:何先生   
知乎:https://zhuanlan.zhihu.com/p/3641608640   

      

前面讲一些虚的,后面再上模型训练经验。

角色扮演大模型产品设计的重要性

有朋友就要问了,你明明是一个搞技术的,为什么要聊产品设计。实际上,产品设计直接影响了技术方案。产品的形态不仅决定了目标用户群体的范围,更为关键的是,它会从根本上影响模型的输出设计和交互模式。另外,我也想从技术人员的视角分享一下对这个行业的看法。

对角色扮演大模型的认知

Role-Play LLM 这个课题特别有意思。东家是搞青少年社区的,在社区里有一种玩法比较风靡,叫做「语C」。语C即是语言 cosplay,是一种文字游戏。看到一个段子,语C最早可以追溯到小时候的过家家,「我演白雪公主,你演王子,他演小矮人...」,这就是最原始的角色扮演。借着语C当中的术语,我们先聊聊「角色扮演大模型」。

在语C中,「皮」指的是你扮演的角色。那么角色扮演大模型,就是给 AI 穿上一层「皮」,让它不再是一个助手,而是变成一个有血有肉的角色。这与传统工具型的通用大模型有显著区别。通用大模型经过对齐训练,给人的感觉就是一种「老好人助手」。如果让它们来直接演戏,往往会表现出「AI感」。举个例子:


        
          
AI感:(微微皱眉,眼神透着关切)吴彩霞,这句话听起来有些复杂。如果你遇到了什么困难,随时可以跟我说,我会尽力帮助你。  
角色扮演感: (眼神一凛,语气严肃)吴彩霞,你这话是什么意思?我们需要的是真相,你这话可是在误导调查,你知道后果的严重性吗?  

      

角色扮演大模型希望模型有角色一致性,甚至要有「自我意识」。老板有一个判断方法,就是看它会不会说**「不」** 。

  • 比如说模型扮演的是一个商铺的老板,用户要白嫖商铺里的彩电,现实生活中老板都会拒绝,在你再三请求下甚至还会爆粗口。但,如果模型在用户的持续要求下偏离了角色立场,比如把彩电白送给用户了,这显然「崩皮」了。

再聊的深入一点,更优秀的角色扮演模型应当让用户有强烈的沉浸感,不仅仅是不脱离人设,甚至是主动引导用户去演绎,去推动剧情,为用户创造画面感 。如果模型聊的内容枯燥重复,经常把天聊死,这会直接反应在聊天轮数和用户留存降低上。毕竟是个泛娱乐向的应用场景,要尊重用户体验。

谁在消费角色扮演大模型

有个关于 C.AI 的报告,其中对谁在用是这么说的:他们想象力极强,喜欢通过在虚拟的世界观和人物中寄托自己的幻想,获得精神上的满足。并且愿意花大把的时间和金钱在自己幻想的世界中。C.AI 满足了用户逃避现实的需求,通过虚构故事情节来满足幻想,获得陪伴。如果没有它,那也会有其他方式来满足这种需求,比如电影、书籍、剧集、动画等。C.AI 为用户提供了更为立体生动的方式。

其实能从这段话品出隐含的意思,角色扮演产品的竞争对手不一定全是友商竞品,而很有可能是电影、书籍、剧集、动画这些非常成熟的产业 。我们曾经尝试过使用大模型做类 AVG 游戏,写了相当复杂的 prompt,模型上使用 Claude3.5 才勉强达到要求,但用户体验明显难以企及传统游戏产品,而且成本也是问题,最后效果就不展开说了。

  • 重复的产品形态,很容易被成熟产业打败,那么,留给大模型的空间又是什么?

语言大模型的特性是高自由度的聊天,在国内,如果问哪个人群可以在只有一个对话框和零星几张图片下,以半创作半消费的形式,达到颅内高潮呢?普遍认可的答案是年轻女性,而且最好玩乙游、混二次元、喜欢同人和语C,姑且将这部分用户概括为小女生吧 。这是业内走通的一个商业模式,我们也在尝试新的路径,希望这个行业可以一直进步,去持续探索新的用户群体。

相比之下,在国外,可以主打付费的NSFW。搞黄色是人的基本需求,没有上面那么多弯弯绕绕。大模型的出现给搞黄色提供了一种新的方式,与看小说的体验不同,会给人一定的互动感,这里就不展开了。

碎碎念:角色扮演大模型产品设计拾遗

在从业的这一段时间,看到了很多文章,介绍不同的角色扮演产品,在文章最后喜欢强调技术的发展和光明的未来。我有个同事经常说,要谨慎乐观。确实,务实的来说,在当前,应用环境还是比较艰难的,还没到只要去做就能成功的阶段,虽然我相信未来一定会达到的,但现在还是要保持清醒。这个小节会分享一些我不成体系的思考。

霸道总裁智能体 or 霸道总裁爱上我 :这个涉及到产品的卖点是什么,相对卖模型来说,我更倾向于产品卖的是「爱上我」这个过程,是一种满足人们对某种情感境遇的幻想式体验,是一种童话。而怎么设计「霸道总裁爱上我」的过程则体现了产品的诚意。

带os or 不带os :这个问题其实是在问要做情景演绎模型还是超拟人模型,如果你是在一个成熟产品上做增量功能,那需要具体分析。如果你是在一个新产品上进行选择,我个人认为带os的演绎模型风险会更低一点,更贴合主要群体的使用方式,也可能会带来更高的对话轮数。

多角色 or 单角色 :对于推荐流形式的多角色产品,用户消费的其实是人设 prompt,大模型只是通过聊天的方式一步一步展开并辅助用户消费了这个人设,人设消费完了,大部分用户很自然的就划走了。对于单角色,具有代表性的就是 AI男友/AI女友,更注重陪伴。但问题也很明显,如果这个角色的外观或人设用户不喜欢,用户就直接不使用了。相对来说,类似《恋与制作人》的产品可能是折中解法。

是否要降低用户输入门槛 :如果用户群体是小女生,我认为这个问题可以往后缓缓,因为写文对她们来说也是 play 的一环,最多做个魔法输入即可。尽量不要强行让用户选 ABC ,会改变产品的性质,你的用户群体和竞争对手也会相应的改变。

角色扮演大模型训练经验分享

数据生产

看了很多技术文章,在提到数据生产的时候,基本上都会强调**「质量优于数量」** ,这已经成为了共识。比如说,训练一个单角色的专有模型时,不到一千条高质量数据就可以取得不错的效果。因此,在产品运行的前期,还是要花时间肉眼筛数据,对工程师理解业务、基座及数据本身都很有帮助。下面展开讲讲角色扮演大模型的数据经验。

  • 人设卡

褪去角色扮演的外衣,微调训练本质上是在学习如何遵循指令。在构建通用角色模型时,训练数据中一定要有丰富的人设卡,丰富的人设卡代表了多样的 prompt,有助于避免模型对一个或几个 token 反复训练出现过拟合的现象,这种过拟合可能会让模型智商降低。而且不同的人设卡对应不同的性格和经历,能够帮助产运或 UGC 用户在线上构建各类人物,这些 prompt 也得到更好的响应。

需要注意的是,每个人设卡下的数据不要太多。某些数据集中针对特定人设的对话量过大,测了下感觉还是会出现一些过拟合。同时,数据集中 user 的输入最好有较大的变化性,以激发人设卡不同的性格,比如不要都是夸夸,还要有指责的。人设卡当中的条目可以参考 character eval 或者 socail bench 这两篇论文,或者自己再编一点,目标是尽量丰富,并且在训练数据的对话中反映出部分人设特征。

关于人设卡怎么来,可以从整本小说里抽取,或者使用开源人设卡。不太建议直接用大模型生成,多样性会降低。

  • 小说语料

小说是丰富的训练数据来源,如何有效利用小说数据至关重要。小说是天然的带剧情的聊天,这里强调了带剧情,因为如果你是不带剧情的超拟人模型,直接用小说中的对话可能会产生割裂感,从而破坏模型的多轮对话逻辑。另外,在提取小说数据时,需关注提取片段与人设之间的关系,最好片段可以体现人设中的部分性格,从而让 prompt 都有自己合适的响应。

  • 生成对话

可以使用已有的人设卡,并借助更强大的模型生成对话,作为数据来源。如果预算充足,我建议是使用 Claude3.5 ,用过都说好。这里只提供一个 trick,当你让两张人设卡进行对话时,最好引入一个「导演」角色,生成出场景和故事。这样可以避免大模型左右互搏,从而减少生成对话的假大空感。

  • 数据中的bias

在合成数据时,通常会使用其他更强大的大模型,比如 Claude3.5/GPT-4/Qwen-72B,但要警惕出现数据 bias。这里的合成数据不仅包括直接由大模型生成的数据,还包括使用大模型提取小说或其他有大模型参与的环节。因为不同的大模型有自己的表达偏好,这在角色扮演中可能是致命的。当模型重复某一口癖时,机械感就会显得很重。举个例子:


        
          
user:听说这里的风景不错,最近来旅游的人也变多了,所以我也来凑凑热闹  
character:(轻声一笑,眼中闪过一丝不屑)旅游旺季?(他站起身,缓缓踱步到你面前)真是拙劣的谎言,你的真实目的是什么?  
user:我来找你  
character:(挑眉,眼中闪过一丝兴趣)找我?(他微微歪头,露出一个似笑非笑的表情)令人意外的回答。  

      

这个例子展示了没有有效去除bias的结果。似乎看起来 character 表达出了正确的意思,但「眼中闪过一丝」的重复出现,容易让用户出戏。

所以,无论数据来自何种渠道,都必须仔细校验,以提高数据质量。特别是待训练的 character 数据,最好确保连每一个标点符号都是对的。

模型微调

  • 数据配比

对于角色扮演模型,通用数据集的配比通常可以在0%~50%。在某些情况下,完全不使用通用数据也是可行的。比如当训练的是单角色且 prompt 变化不大时,可以只用专有数据进行训练。然而,这样做会导致强烈的过拟合,会损害模型的通用能力。但从效果上来看,这种单角色的过拟合在特定的产品场景下可能表现得不错,这块就见仁见智了。我个人一般是采用 30% 比例的通用数据集,这个效果在业务上还可以。另外,角色扮演数据集最好能涵盖多种渠道,以保证多样性。同时要清楚的了解每个渠道的数据特点(比如哪个 os 多,哪个口语化,哪个逻辑好),结合基座模型的特性和最终效果,对数据配比进行适当调整。

  • 模型选择

中文选择 Qwen 系列,英文选择 llama 系列,模型大小根据算力大小进行调整。

  • Lora vs 全参SFT

在基础模型上进行全参数调整是性能的上限,尤其是在角色扮演领域。因为角色扮演不仅要求模型表达正确,还需要用词「高级」。 我们需要意识到,基础模型中的语料庞杂,综合来看,一些简单的高频词往往反复出现。这些高频词经过预训练后,在回答中出现的概率更高。当用户看到简单重复的词时,往往会感到机械,沉浸感会随之减弱。

虽然 Lora 是一种很好的选择,可以在算力不足时节省显存。但低秩近似可能带来信息损失,特别是如果底层不微调或者微调的效果差,尽管模型在角色扮演中可以说出正确的对话,甚至可以主动推进剧情,但简单重复的高频词还是很容易出现。而全参微调一般可以解决这个问题。全参微调可以让模型注意到,一些长尾的词也能出现,与通用的高频词不同,这些长尾的词在角色扮演领域可能具备比较高的条件概率。

  • 参数的注意事项

这部分涉及到模型训练的「炼丹」过程,每个人都有自己的心得。每次训练前需要注意的一些基本要素包括:

  • per_device_train_batch_size
  • gradient_accumulation_steps
  • learning_rate
  • num_train_epochs
  • warmup_ratio
  • bf16

per_device_train_batch_size/gradient_accumulation_steps/以及使用的显卡数量决定了每步的 batch_size,根据你的样本量可以计算出总的 step 数,不要过少,结合 learning_rate 的调整,尽量让 loss 曲线平滑。其他的就不解释了。

另外,建议了解配置文件里所有参数的含义,即使在一个成熟的流程下,可能不需要改变它们,但需要知道它们的影响。

其他

关于 continue pre-train:一般来说是给模型灌大量知识用的,但资源消耗大,可能会长时间占用计算资源。如果在完成 CPT 后发现对模型的通用能力影响较大,还要重新调配比,真的挺悲伤的。如果有故事续写的需求,或者你觉得 SFT 效果已经到瓶颈了,可以进行尝试。

关于 DPO:在解决明显可定义的 bad case 上很有效,比如输出过短。也可以对模型自推理的结果采样后进行训练,效果很好,但造数据的速度很慢。最好有线上产品,这样方便构建 chosen 和 reject。

关于 评估:前前后后尝试了很多指标,不敢说有一个或几个指标就能完全评估角色扮演模型的好坏。对于算法工程师来说,不仅要看这些指标和一些开源的角色扮演评估集,更重要的是有一个自己熟悉的 case 评估集,200个左右就可以,熟悉到可以背下来。这样每次迭代完去跑一下,心里能有个底。对于产运来说,关心的则是上线前的 gsb 和上线后的人均对话轮数,非常实际。

写到这里就差不多了,欢迎大家交流与指正~

‍PS:看到这里,如果觉得不错,可以来个点赞在看关注 。给公众号添加【星标⭐️】不迷路!您的支持是我坚持的最大动力!

欢迎多多关注公众号「NLP工作站」,加入交流群,交个朋友吧,一起学习,一起进步!‍

0
0
0
0
评论
未登录
看完啦,登录分享一下感受吧~
暂无评论