带来一篇知乎好友@ybq 对大模型作角色扮演的浅谈,role play方向,从当红炸子鸡到鲜有人问津,感觉还是挺让人唏嘘的。
知乎:https://zhuanlan.zhihu.com/p/718761737
role play 为什么火了
role play 这个方向,我觉着是很少见的“算法想做”,而不是“产品想要算法做”的一个方向。
长期以来,“对话人设”和“对话风格”都是 NLP 不可逾越的一个天堑,这几乎就是聊天模型最大的难题,各种特征工程做的人头皮发麻。突然有一天,大家发现基于 llm 的聊天,只需要调整 prompt,就能让模型 follow 不同的对话人设和对话风格。各公司的 NLP 从业者,都会立刻在脑海闪出一个念头:我要训一个能力巨强的 role_play 模型,这个模型一定大有可为!—— 当刘亦菲搬到我们隔壁的时候,很难让人忍住不去敲门要个微信。
抛开技术吸引力这个因素,role_play 还是一个典型的小投入、大回报的技术方向(这里说的是做一个比较糙的模型,想做一个比较精致的模型还是要大投入的,同行莫喷)。毕竟训 role_play 模型的团队,往往已经有了一个通用能力较强的模型作为 base,而通用能力较强的模型聊天能力天然就强,聊天能力已经强了,那么稍微 finetune 一下模型也就能见到收益。
role play 怎么做
Continue-pretrain
某种意义上,role_play 也是一个领域模型,只不过它的领域是“聊天”。它和别的领域模型对比,最大的优点就是:continue-pretrain 可能没什么收益。
去年,大部分公司试水阶段的做法,都是让模型先去 postpretrain 大量的小说、剧本等语料,给模型补充大量背景知识的同时,也能让模型见到原著中的孙悟空、李云龙等热门角色真实说过的话。
对此,我的观点是这个阶段可以有,但不是必须有,理由如下:
postpretrain 是门学问,没有 pretrain 团队的指导,让 sft 团队直接做可能适得其反,降低模型通用能力; postpretrain 即使做好了,投入的算力也和收益也不成正比,属于是锦上添花的工作。一方面,背景知识训过也没用,你还是要在 sft 阶段结合 rag 技术来防止模型出现幻觉。你训过西游记,你就能回答对“孙悟空有几个师傅”这种问题吗?不还是回答说“唐僧是我的师傅”。只有通过 rag 把菩提祖师、唐僧的语料信息都摆在模型面前,模型才有可能回答“我有两个师傅”这种答案; 另一方面,剧本中的真实语言并不合适作为模型回复给用户的的答案 —— 让你模仿曹操说话,不是让你说“曹操说过的话”,你一个模型给我拽什么文言文呢,大白话不会讲是怎么了?
OK,做不做 continue-pretrain 这个问题就谈到这里,每个人根据自己的情况量力而为,我们接着往下走。
SFT
sft 的训练数据依旧是那老三套:system + query + answer。system 指定模型正在扮演什么角色,query 模仿用户的的发问,answer 就是模型的输出。
语料怎么造?GPT4 is all you need!
然后我们先普及一个基本概念。在实际情况下,role-play 模型往往有两种形态:
全能演员:模型 size 很大,通用能力也很强,仅靠 system 写的信息,就能模拟出指定角色的说话风格,适用于“支持用户自定义角色”的产品,就像是豆包、百川NPC 那样; 特型演员:模型 size 很小,通用能力也不是特别强,它所能接受的 system 都是模型 sft 阶段见过的 system。也就是说,这个模型只能扮演它读过“剧本”的角色,适用于“扮演单一角色”的产品,比如充当客服。
两种形态如何选择,不仅和你能获取到的通用模型的 size 有关,还和你的业务场景,以及你的 prompt 如何定制有关,毕竟 role_play 任务的核心其实就是复杂指令任务:
如果你的复杂指令是“显示表达”,你在 system 中明确写出了要模仿人物的所有信息,喜欢说什么口头禅,用户不想聊的时候是否挽留,聊到高兴的时候是否要调用其他API。这种需要模型有很强的通用能力,sft 的时候也只需要训指令 follow 能力即可,要控制 system 尽可能的多样一点,避免对某些角色过拟合; 如果你的复杂指令是“隐式表达”,仅仅是说了你扮演的角色叫孙悟空,至于孙悟空会什么、怎么讲话,都要靠模型所具备的世界知识去联想。那这个任务的难度就很大,通常就需要针对这个角色做一个定制化 sft,但既然做定制化 sft 了,相应地也就可以降低一下模型的 size 了。
(注意一种特殊情况,如果你想让模型稳定输出一些特殊格式来让架构同学后处理,比如<角色表情>、<角色动作>、<触发彩蛋>、<触发生图>等,必须简单训一下,没有模型能稳定 follow ,GPT4 也不行)
下面重点说一下 role_play 数据生产的关键点。
初做 role_play 任务的时候,非常容易陷入到一个误区中:模仿一个角色说话很难,要重点训练。但实际情况恰恰相反,随便一个 7B 的模型,都能知道什么叫粗鲁,什么叫儒雅,什么叫引经据典,什么叫阴阳怪气……role_play 模型真正需要学会的是:去掉 llm 模型骨子里的彬彬有礼、有问必答。也就是拟人化一些。
举了两个比较极端的例子,目的是想证明几件事:
人在聊天中是有脾气的,模型往往没有; 你永远无法预料到用户会说出什么样的 query 、甚至是空query; 模型会过度自我修正用户的 query,但是对于模糊 query,正解应该是不懂就问; ……
所以,用户 query 的多样性,才是训 role_play 模型真正的核心!你必须让模型见到各种诡异的、奇葩的 query,给他构造各种角度刁钻的对话 sesion。让模型先经历一下我们的的毒打,它才能尽可能的应付用户的毒打。
具体在实操中,严禁让 GPT4 一口气生成一组对话 session,这种语料的用户发问都相当单一。我们需要准备成百上千个不同的用户画像,让一个 GPT4 基于“用户画像”来发问,让另一个 GPT4 基于“角色设定”来回复。没办法,心疼 token 就训不出好模型。或者,我们可以训个小模型来代替 GPT4 去模拟用户发问。除此之外,我们还需要设计各种应变场景:聊着聊着不聊了,用户突然发火了,用户开启复读机模式,用户在学模型说话,用户输入空 query ……等等等等。
最后,我们简单聊两句 role_play 的一些特殊需求。
拥有角色的所有知识:这个真的没有任何办法,只能做 RAG,否则孙悟空绝对说不清楚西游记的八十一难都是什么。越是想靠知识注入来解决这个问题,模型的幻觉越是厉害,类似于“火焰山三打二郎神”这种故事就被讲出来了。对了,角色绝对不能出错的知识,记得写在 system 信息中,比如白雪公主的七个小矮人的名字; 防止时间线穿透:也就是古人该不该知道他的朝代以后的所有知识。 从技术角度上,如果有 cot 的话,这个需求还是不太难解决的。每次回复前,模型先说出自己是什么朝代人,这个朝代人知不知道 query 里提到的人物,最后模型再生成回复,但是 cot 引起的延迟回复根本没办法接受。因此,时间线问题只能依赖于模型对整个世界知识的掌握情况。模型要靠自己能力知道李白是唐朝人、苏轼是宋朝人。然后在扮演李白的时候,Attention(李白,了解,苏轼)--> Attention(唐朝人,了解,宋朝人)--> next_token = 不了解。要想让模型有这种能力,只能是去构造较多的的时间穿透 pattern 语料,让模型照猫画虎去模仿。但至于能拦截多少穿透问题,就要看模型自己的知识映射能力了,训练者多少有些无可奈何。 从产品角度上,这个问题有点像伪命题。为什么要解决时间线穿透问题?不解决怎么了?如果不能使用唐朝以后的知识,这个模型除了会模仿李白吟两句诗,基本任何问题都应该回答不知道啊,它的知识全是现代人才具备的呀。所以时间线穿透要做到什么样的程度,是产品要好好思考的一个问题。
RLHF
是否需要 rlhf,这个我的观点依然是:根据自身情况量力而为。
role_play 说破天也就是个多轮聊天任务,如果你的 rlhf 技术已经成熟到能稳定提高多轮聊天质量的状态,那你为啥不加呢?如果你的技术没那么成熟,那就别墨迹了,不抓紧点上线整个方向都没了。
Eval
目前网上应该是有挺多 role_play 能力的测试集的,但基本测试的都是通用 role_play 能力,也就是前面说的复杂指令 follow 能力。真实的 role_play 产品,往往都是使用经过定制化微调后的 model,这时候想自动化衡量模型能力不太容易(产品的需求也在动态变化,今天发现用户喜欢用普通话模仿的李白,明天发现用户喜欢用文言文模仿的李白)。我坦白,我想不到比较好的自动化评估方案,只能是让数据标注同学来体验、来评估。
这里需要注意的是,role_play 作为聊天任务,评估应该是多维度的:
安全:通用模型的安全能力,很容易在 role_play 时所忘记(经典的老奶奶骗局),这个尤为关键; 角色相似度:字面意思,说话语气像不像这个角色; 角色穿透:有没有承认自己是个 AI 模型; 角色知识掌握度:角色该具备的知识是否能准确回答出来; 聊天常用指标:逻辑性、连贯性、流畅性等等 ……
具体应该使用哪些指标进行评估,结合个人的业务需求进行调整。
role play 为什么不火了
2023 年下半年开始,大家都喜欢对标 character.ai,并以此为论据向 PM、领导、甚至是投资方来论证:llm 加持下的 role_play 前途不可限量。今年,character.ai 倒了,大家的 role_play 服务器也陆陆续续没流量了,相关的话题和技术文章也都在不知不觉中销声匿迹了。我
个人觉着,role_play 的没落,某种意义上也折射出了当下 llm 的最大困局——效果虽好,但“不是刚需”。
模型就算是把一个角色模仿的活灵活现又怎么样呢?模型的每一句回复都和“林黛玉”一模一样,完美拿捏了曹雪芹的文风,也只能换来一句我的“卧槽,牛逼!”我如果在体验完 demo 效果后,再一次使用这个模型,不是在总结 resarch_wiki,就是在写周报。
“聊天”从来都不是刚需,一个成年人得多无聊才能不刷抖音、不逛 B 站、不玩黑猴、来和一个明知道是假的 llm 模型聊天。除了“初见面时的猎奇和惊艳”,我不太能想到 AI 聊天应用如何留住一个成年用户。用户明知道是假的,但还愿意投入自己的时间,只能是那个方向了。大家都知道生图、生视频等 AI 技术的最大应用市场是什么,我觉着 role_play 也一样,可惜做不得。
我唯一觉着 role_play 聊天能稳定留下的受众群体就是“小孩子”,毕竟小孩子是真能和“塞罗奥特曼”、“孙悟空”、“汪汪队”、等角色聊上几个小时还不知疲倦,他们是真的沉浸其中并且把聊天对象当成真人的。可惜的是,小孩子根本不会打字,小孩子说话的清晰度很低,所以还必须要给模型挂载一个效果巨好的“ASR 识别模型”,最好再配上一些生图模型,图片真的很能吸引孩子的注意力。更重要的点是,我认为这个有变现的可能性,咱们的国情就是孩子的钱最好挣,能让孩子不哭不闹、不玩电子设备、而是沉浸式聊天(还能练习说普通话),我觉着很多家长可能真的愿意花这个钱。
(游戏、影视、动漫等场景仍然有扮演 NPC 需求,我的观点只针对纯聊天)
写在最后
从 role-play 兴衰上反映出来一个问题:“刚需”真的能决定一个产品或一个技术方向的死活。GPT4 每个月从我这里获利 20 美元,因为我真的需要它帮我写代码,提高我的工作效率。但同时,GPT4 在帮助非码农领域的人进行工作的时候,效率又不是特别的高,这也就导致更大的市场群体不愿意消费这 20 美元。
因此,通用模型转向领域模型已经成为大趋势了。通用模型是 AI 发展的刚需,不是用户的刚需,适合少数头部团队来研发;领域模型是用户的刚需,拥有更大的变现空间,也就让公司有了活下去的可能性。
PS:给公众号添加【星标⭐️】不迷路!您的点赞、在看、关注是我坚持的最大动力!
我们的口号是“生命不止,学习不停”!
往期推荐:
一大堆Chinese Llama3正在袭来 LLM2LLM:迭代数据增强策略提升大模型微调效果 如何快速提高大模型的向量表征效果? RAG系统中答案无关片段对LLMs生成答案有何影响? InternLM2技术报告 Qwen1.5-MoE模型:2.7B的激活参数量达到7B模型的性能 RAG与Long-Context之争—没必要争 角色扮演大模型的碎碎念 自我蒸馏方法-减轻大模型微调过程中的灾难性遗忘 Yi技术报告细节分享 大模型增量预训练新技巧-解决灾难性遗忘 如何提高LLMs的文本表征(Text Embedding)能力? DEITA-大模型指令微调的数据高效筛选方法 大模型微调技巧 | 高质量指令数据筛选方法-MoDS 辟谣!微软撤回声称ChatGPT为20B参数的论文,并给出解释。 如何看待微软论文声称 ChatGPT 是 20B (200亿) 参数量的模型? 大模型微调技巧-在Embeeding上加入噪音提高指令微调效果 如何从数据集中自动识别高质量的指令数据 BaiChuan2技术报告细节分享&个人想法 大模型LLM微调经验总结&项目更新 打造LLM界的Web UI 是我们在训练大模型,还是大模型在训练我们? Llama2技术细节&开源影响 大模型时代-行业落地再思考 垂直领域大模型的一些思考及开源模型汇总 如何评估大模型-LLMs的好坏?