大模型——角色扮演大模型篇
来源:AiGC面试宝典 日期:2024年03月31日
一、什么是角色扮演大模型?
对于用户来说,他们更需要的是一个可定制的、高度拟人化的、有情感、有温度的聊天机器人,这就是角色扮演模型。
📝通俗解释:想象你在玩一个沉浸式的角色扮演游戏(比如《恋与制作人》或者《原神》),里面的角色不是机械地回答问题,而是像真人一样有自己的性格、语气和情绪。角色扮演大模型就是让AI能够扮演这样的"虚拟人物",而不是一个冷冰冰的答题机器。
二、为什么需要角色扮演大模型?
在回答该问题之前,需要思考两个问题:
- 目前大模型有自己的"自我意识"吗?
- 为什么大模型生成的答案可以一眼分辨出来?
目前,尽管各类大模型技术取得了显著进步,它们仍未能赋予模型以内生的独立意识。所谓大模型所展现出的"拟人化"特质,实际上是对人类期待行为模式的高度模拟与顺应,旨在精准地扮演一个符合人类偏好的 Assistant。换句话说,此类模型借助强化学习(RLHF)与基于人类反馈的微调(SFT)等策略,系统性地校准自身行为,使之与人类价值观、偏好及交互习惯紧密契合。
但是,以 ChatGPT 为代表,当前市场上的诸多通用大模型在生成答案时,普遍存在一种鲜明的"Assistant"式语调。具体表现在其语言风格偏向正式、书面化,且时常带有明显的教导色彩,诸如频繁使用"总之......"、"记住......"等表达。这种现象背后,固然与 OpenAI 所设定的标注规范有关,但在此不作深入探讨。当大模型作为一项"效率提升工具"发挥作用时,上述回答风格无疑是适宜且可接受的。
然而,对于广大的非专业程序员用户而言,大模型的"效率提升"特性并非其使用体验中的核心诉求;相反,"娱乐属性"被视为决定一款产品用户粘性和活跃度的关键维度。当大模型被期待作为娱乐工具使用时,过于官方的措辞和浓厚的说教气息无疑会极大地破坏用户体验的和谐性。
📝通俗解释:这就好像一个老师在和你说话 vs 一个朋友在和你聊天。通用大模型就像一个随时准备给你上课的老师,说话总是很正式、喜欢总结重点;而角色扮演大模型更像是一个朋友,可以陪你闲聊、开玩笑、撒娇。想象一下,你问朋友"今天吃什么",朋友如果说"根据营养学建议,应该摄入均衡的膳食",你是不是会觉得怪怪的?这就是为什么需要专门的角色扮演大模型。
三、角色扮演大模型 相比于 通用大模型 具有哪些区别?
从概念角度思考
通用大模型:由于训练语料的原因,大模型本质上是扮演一个 assistant 助手。直接使用通用大模型进行角色扮演任务,类似于「让一个大模型扮演的 assistant 助手去扮演某个特定角色」。大模型"意识"中的「我」仍然是一个 assistant 助手,「角色扮演」相当于是人类分配给这个助手的一个任务,相当于我们绕了一圈来达到角色扮演目的,效果必然打了一个折扣。
角色扮演大模型:可以直接让这个 AI 去扮演某个角色,如虚拟女友、历史人物等。此时大模型"意识"中的「我」就是某个特定的人物,它一切出发点和"自我意识"都是从某个人物的角度出发和考虑。
📝通俗解释:这就好像让一个专业的"演员"去演戏 vs 让一个"主持人"去演戏。通用大模型就像一个主持人,他习惯了用正式、客观的方式回答问题,你让他去扮演"林黛玉",他可能还是会用主持人的语气说话;而角色扮演大模型就像一个专业演员,他能够真正"变成"那个角色,用角色的思维方式说话。
从表现角度思考
对于通用大模型和角色扮演模型,在说话的风格和语气上有明显的不同:
语气风格差异:对于角色扮演模型来说,不会具有明显的官方语气和说教口吻,除非你明确要求角色扮演模型去扮演一个类似的角色;相反会表现出符合角色的特定性格特点和说话风格,比如在扮演"张飞"时性格莽撞不拘小节,说话豪爽大气。
情绪能力:角色扮演模型可能会具有一定的情绪能力。例如我们可以问通用大模型 100 遍 "1+1 等于几",但对于角色扮演模型来说,问到第 2 遍就可能会表现出差异或不耐烦的情绪来;例如在扮演虚拟女友时会表现出撒娇、吃醋等属于人类的情绪。
画面感和沉浸感:角色扮演模型的输出更具画面感和沉浸感。当我们与通用模型交互时,体感上更像是阅读一本「工具书」,是机械的、没有情感的;而角色扮演模型更像是一个真实的人在隔着屏幕与用户聊天,用户可以想象出对方的动作、想法和情绪等。
交互性:角色扮演模型具备更强的交互性。传统的通用模型本质上是一个问答机器人,用户与 AI 采取一问一答的形式;而角色扮演模型可以给用户主动预设一个场景或情节背景,用户和 AI 一起交流来演绎并推动剧情的发展。在这当中,角色扮演模型不会简单回答用户问题,更具有主动提问、主动推动剧情发展的能力。
📝通俗解释:
- 情绪能力:就像你问一个客服机器人"1+1等于几",它会一直耐心回答;但你问你的女朋友同样的问题问到第3遍,她可能会翻白眼说"你是不是傻"。
- 画面感:通用模型说"我很高兴"只是文字;而角色扮演模型可能会说"我眼睛一亮,嘴角不自觉上扬,开心地跳了起来",让你能"看到"她的反应。
- 交互性:通用模型是你问一句答一句;而角色扮演模型可能会主动说"今天我们出去走走吧",然后带着你一起发展剧情。
假如说通用问答大模型如 GPT 等是一个 assistant 助手,那角色扮演大模型的定位就是一个「演员」。 通用模型更偏向是「工具」,而角色扮演模型更偏向「产品」属性。角色扮演模型比通用模型更贴近「图灵测试」的目标,即具备「以假乱真」的能力。当用户与角色扮演模型进行交互时,会激发出更多交流欲望。
四、能否通俗易懂的介绍【角色扮演大模型】?
关于"角色扮演"大模型的理解,我们可以把它比喻成一位演员。评判演员演技好坏,关键看 ta 能否把角色演得"像"。
对于演员来说,要理解角色就得读剧本;而对于大模型,它得读懂角色卡片(System Prompt),里面包括角色背景、性格、说话方式等信息。大模型演得像,就得充分消化这些信息。
有的大模型就像专门演特定类型角色的演员,如只针对某个角色微调的模型。作者不太赞同这种做法,因为它浪费资源,限制了大模型的广泛适应能力,而且效果未必比用多种角色训练后泛化出来的结果好。这类模型容易因数据量有限和过度拟合导致模型遗忘原有能力,性能下滑。
📝通俗解释:这就好像一个演员只演"皇帝"这个角色,演了一辈子。虽然他演皇帝演得很像,但你让他去演"平民百姓",他就演不来了。好的角色扮演大模型应该像梁家辉——演什么像什么,而不是只能演某一个特定角色。
以"ChatHaruhi"项目为例,它们起初用小说、剧本中角色对话(如韦小宝、,令狐冲)来训练。虽然模型对已知角色能演得很到位,但遇到新角色,由于对角色卡片敏感度下降,泛化能力会打折,就像让擅长韦小宝、,令狐冲的演员突然去演甄嬛,难免生硬。
作者主张的方法是制作大量角色卡片,每个角色只附带少量对话样本,让模型学会"读剧本",即理解并遵循指令(System Prompt)。 优秀的角色大模型不仅要有生动的动作描写,还要在语言风格上介于严肃文学与真人对话之间,既要接地气又不失正式,通过文字补充现实中能直观感知的信息。
角色扮演大模型更像是在与用户共同构建虚拟剧情,输出既是角色对话,又是旁白,强调描述性文本。直接用小说对话训练往往效果不佳,因为对话简短,缺乏心理活动等旁白信息。
不成熟演员或模型扮演角色时会有违和感,比如机械地回答问题,缺乏立场、个性及情感。解决办法之一是设立黑名单词表,剔除那些不符合角色口吻的词汇。检验模型输出是否自然,可以尝试将其中的"我"替换为角色名,如果句子仍成立,则表明模型未真正融入角色,只是形式上模仿角色说话。
📝通俗解释:怎么检验模型是不是"假演戏"?比如模型说"我今天很开心",你把它改成"张飞今天很开心",如果读起来还是通顺的,那就说明模型只是在说"我开心",而不是在扮演"张飞开心"。真正的角色扮演,角色的名字和性格是不可替换的。
五、有哪些策略可以提升【角色扮演大模型】能力?
1. 关于继续预训练(Continue Pre-train)
「演员」在电影学院会学习大量的表演理论课,大模型角色扮演同样可能需要用一些小说、剧本类数据当作「课本」来学习一些潜在的能力。一个常见的做法是在这类数据上做 continue pretrain,例如 BaichuanNPC 用了大概 3T 量级的 tokens 重新做了预训练。但基于海量数据的 continue pretrain 必然会消耗大量的计算资源。
然而,很多时候,这种方式处理起来并不简单:
- 数据获取难度大:大部分人能收集几 B 或者几十 B 就已经很难了,真的很难搞到那么多的数据;
- 继续预训练效果难以保证:无论是基于尝试结果还是【Continual Pre-Training of Large Language Models: How to (re)warm your model?】这篇论文的实验结论,使用少量数据进行 continue pretrain 不仅会发生灾难性遗忘导致底座模型原有能力损失,亦有相当高的风险和概率在新数据集上表现出 loss 难收敛的情况;
- 用户只关注一些热门小说:大部分小说都是杜撰的,其中大部分信息根本都是没用的,大模型根本不需要学习某个点击量只有几百条的网络小说某个扑街配角的人物生平信息,用户也根本不会问;用户可能会问一些热门小说比如「斗罗大陆」「斗破苍穹」,但这些知识 pretrain 模型本来就有啊,干嘛还要再做一次 continue pretrain 呢?
因此对于角色扮演任务,我们更希望模型通过小说的描写手法和表述方式来学会如何将信息更好地表达和输出,这反而和 SFT 微调任务目标更接近。
所以对于大多数开发者,如果没有能力制作一个很好的预训练数据集和高超的炼丹技术,不太建议走继续预训练这条路。但是可以尝试添加一些小说续写类数据,一方面增强模型的场景描写能力,另一方面写作能力和角色扮演能力确实强相关,也就是说:有角色扮演需求的用户大概率也会有小说创作的需求。
📝通俗解释:这就好像你要培养一个演员,与其让他去专门上一堆表演理论课(continue pre-train),不如直接让他去演戏实践(sft微调)。因为理论课需要大量数据(读很多剧本),而且很容易"学傻"了反而忘记之前会的东西。对于普通开发者来说,直接用角色对话数据微调可能更实际。
2. 关于通用对话数据
大多数情况下,观众们真的不关心一个演员的数学好不好、会不会写代码。但很遗憾,如果我们把角色扮演模型类比成一个「演员」,那他首先是一个「人类」,对于一个人类来说,基本的知识能力和逻辑能力是必要的;可是要想让大模型具有一定的逻辑性和知识表达能力,不得不添加一些包括少量数学、代码任务在内的通用 SFT 问答数据。
有一些角色扮演模型会直接从 pretrain 模型启动,仅使用少量角色扮演对话数据进行训练。从作者个人的复现结果来看,模型的表现更像是一个「努力假装自己是 xxx 角色的白痴」,下面是一条真实的推理结果:
好的,我叫张飞,出身于涿郡,出生的时候父母不在身边,被母亲过继给关羽。后来曹操杀了他的母亲,与关羽失散,投奔刘备。在战场上,我率领部下多次打败敌军,得到了刘备的信任。
是不是笑麻了?大模型明明具有相关知识,但就是因为缺乏 SFT 的激发,导致相关知识表达不出来,出现以上无比离谱的幻觉。
所以综合前面 continue pretrain 的相关认知,作者推荐添加少量通用 SFT 问答数据直接从一个训练好的 pretrain 模型启动,大概率就能得到一个还不错的 baseline 效果了。
📝通俗解释:这就好像让一个没受过教育的人去演历史剧,他明明知道张飞是谁,但就是说不清楚。一个好的演员需要有一定的文化素养,才能把角色演活。所以角色扮演大模型也需要"通识教育",就是那些数学、逻辑、常识类的通用数据。
那么是否可以直接从 SFT 模型启动,不添加通用问答数据呢?
答:可以,这取决于个人细节的任务目标、数据量、数据组织形式等等因素。直接从 SFT 模型启动,可以认为此时模型本身已经具有很好的通用能力了,甚至我们都不需要再添加额外的、重复的通用问答数据也能产生不错的效果。此时要考虑的问题反而变成了「如何在基础能力不退化的情况下迁移模型对话风格」。因为前面我们提到,通用问答模型具有很强的 assistant 语气,这必然会导致角色扮演任务的违和感。那太小的学习率,会导致模型更难以学到新知识;太大的学习率又容易灾难性遗忘。如何找到平衡点是一个很玄学的问题。如果你想采用一个更高的学习率,那这里可以参考 Qwen 技术报告,适当增大 warmup ratio(但一定要保证数据量足够多),个人实验结果还不错。
那么使用多大比例的通用问答数据?
答:角色扮演任务和我们常谈到的一些垂域问答(如医疗金融法律等)还有一些区别:垂域问答可能需要的数据量更小,任务目标重点考察模型在专业领域的事实性知识能力,一些常见的数据比例可能是垂域数据占总数据量的 10% 到 20%;但角色扮演任务不能单纯当作一个简单的垂域来看,作者认为它不是底座大模型的子任务或某项能力,相反,基础的问答能力应该是角色扮演大模型的一项附属能力。因此我们推荐在全量数据当中,角色扮演数据占比更大,通用问答数据占比应该不超过全量数据的 50%。作者个人大概使用了 1/4 到 1/3 量级的通用问答数据,其中数学代码逻辑相关的数据用得很少,只是通过一些简单的 CoT 数据来激发模型的逻辑能力或思考能力而已。
📝通俗解释:这就好像一个演员的培养,80%的时间在学习怎么演戏(角色扮演数据),20%的时间在学习文化课(通用问答数据)。文化课不用太好,够用就行,毕竟观众是来看你演戏的,不是来考你数学题的。
3. 一些零散的技巧
进度条问题:一些游戏类角色扮演可能需要大模型实时输出一些角色状态信息,这本质上是一个复杂指令跟随能力,通常需要使用更大参数的模型去解决,13B 以下规模的模型去做类似的事情肯定会更吃力一点。目前作者个人的训练数据中没有特意构建这类数据,所以表现相对一般。
小说抽取对话:实验结论是这类数据会对最终结果有负面影响,具体现象是模型 output 变短,更容易给出只有一两字的 output,这也就是之前我们提到的「信息缺失」的问题。作者不太推荐大量使用这种数据的,或者可能需要做更严格的清洗或改写。
过于配合用户:也就是大模型不会拒绝用户提出的需求或问题,或很少表现出不耐烦等负面情绪。这个问题其实比较容易解决,只要在对话数据里包含这样类似的数据即可(最好是多轮),实在不行可以考虑使用 DPO 或 RLHF 来解决。
生成数据多样性:使用 GPT 等生成对话数据肯定会有多样性问题,这里建议一定要对高频 pattern 做降采样,否则会导致模型过拟合。
关于 DPO:很多人也提到过,建议对模型本身的 infer 结果做自采样,尝试下来的体验是:效果出奇的好。
安全问题:大模型角色扮演从提出来开始,就和越狱等内容相关,这里做对齐必然会导致效果损失,但没办法。
📝通俗解释:
- 进度条问题:就像游戏里的血条、能量条,需要模型实时更新状态,这对小模型来说太难了,就像让一个小学生做高中的数学题。
- 过于配合用户:好的角色扮演应该像真人一样,有自己的脾气和底线。比如你让扮演"女友"的AI帮你写论文,她应该会说"我很想帮你,但我不会写论文"或者"你自己写嘛",而不是无条件答应。
- DPO:就像让AI自己当自己的老师,自己批改自己的作业,效果往往比请"家教"(人工标注)更好。
整理自:AiGC面试宝典 | 知识星球