引言
最近笔者集中阅读了3篇角色扮演的论文:RoleLLM[1]、Character-LLM[2]以及ChatHaruhi[3]。
本篇博文是对这三篇论文的归纳,主要介绍其技术实现方式、dialogue数据合成方法以及评测方法。
角色扮演的技术实现
Zero-Shot Prompting
进行System Prompting是最简单的方式。
一个常见的Prompt如下(源自ChatHaruhi):
I want you to act like {character} from {series}.
I want you to respond and answer like {character} using the tone, manner and vocabulary {character} would use.
Do not write any explanations.
Only answer like {character}.
You must know all of the knowledge of {character}.
My first sentence is "Hi {character}."
ChatHaruhi对其进行了额外的2点优化:
- 允许LLM复用few-shot examples 。即允许LLM在相似场景下,直接使用角色的对话内容;
- 在结尾额外加上一段
人物性格描述
,以强化生成效果。
一段针对白展堂
的System Prompt如下。
Few-Shot Prompting / In-Context Learning
加入few-shot examples(从该角色的历史dialogue数据中检索而来),有助于LLM获取相关知识、模仿角色的风格。
RoleLLM指出有两种Few-Shot方法:
- single-turn prompt 。在单轮对话中一次性引入examples,示例如下;
2. multi-turn prompt 。RoleLLM称之为dialogue engineering
,即将对话过程以user
和assistant
角色交替写入。
在RoleLLM的实验当中, 第二种方法的效果要更好 。
RoleLLM论文中,这类方法被称为 RoleGPT ,是一个比较强的baseline;这个方法也是ChatHaruhi的主要方法(其完整的Prompt示例见下图)。
此处使用的历史dialogue数据,通常来自于对剧本、电视剧、小说的抽取,ChatHaruhi的git项目[4]上包含许多此部分的内容,感兴趣的读者可以参考。
Fine-Tuning
In-Context Learning vs Fine-Tuning
是一个常被讨论的议题。
Fine-Tuning的迷人之处在于: 适当的数据 + 开源LLM + Fine-Tuning 有可能超过 闭源LLM + In-Context Learning 。
在本文介绍的3篇论文中,Character-LLM是纯基于Fine-Tuning的,并且每一个role训练一个LLM;在RoleLLM和ChatHaruhi中则是作为一种实现方案,与in-context learning方案进行对比。
RoleLLM的实验结果表明:
- 在英文上,RoleLLaMa(fine-tuned模型,7B)还是逊于RoleGPT ;
- 在中文上,RoleGLM(fine-tuned模型,ChatGLM2-6B)则可与RoleGPT一战 。
Character-LLM的实验结果表明:
- fine-tuned后的LLaMa 7B模型,在4个指标上都强于Alpaca、Vicuna,并与Chatgpt可以一战 ;
- 在values(价值观)维度上,fine-tuned模型效果略差,作者解释这可能与模型倾向于生成更短的文本有关。
评估指标和评测方法,请参见后文内容。
Dialogue数据的合成方法
细心读者可以注意到,RoleLLM的对比实验中,有些模型带有-script
的标记,这类模型是直接在script剧本数据(已处理为多轮对话形式)上进行Fine-Tuning后得到的模型,其效果明显较差,这说明 Fine-Tuning数据的准备是需要研究的。 天然的dialogue数据效果不一定好,那么可能要转而求助 数据合成 。
同时,对于一些对话数据较少的角色,要想进行Fine-Tuning,也需要先进行 dialogue数据合成 。接下来,笔者将介绍3篇工作各自的数据合成方法。
RoleLLM
RoleLLM的数据合成有以下两个思路:
- general domain 。收集开源的general instructions(如英文领域的Super-NaturalInstruct、中文领域的COIG等),然后给到RoleGPT,让其在通用问题上,生成模仿某个角色的对话 ;
- role-specific 。即论文所谓的
Context-Instruct
,其核心思路是根据Role Profile来生成Question、Answer,这样生成的dialogue数据更加与role本身相关,因此有role-specific的特点 。Role Profile分为两部分:一个是role description、catchphrases,这部分由GPT生成;另一个是结构化好的历史dialogue,也是从剧本数据中提取而来。在生成Question、Answer时,将两部分profile分别给到LLM,让其生成question、对应的answer、以及confidence score(置信度),最终仅保留 高置信度的非重复数据 。
RoleLLM的数据合成方法比较 体系化 ,这样能够增加合成数据的 多样性 ,这是值得学习的一点。
不过其原生方法所生成的数据都是 单轮 的,这是硬伤(Character-LLM和ChatHaruhi则没有这个问题)。但论文作者也指出,可以借助Baize[5]和CAMEL[6]的技术来生成多轮数据。
Character-LLM
在Character-LLM中,作者称其合成的数据为experience
。
一个experience
由以下两部分内容组成:
- scene 。包括地点、背景、人物等信息;
- dialogue 。在某个scene下,目标role和其他role的对话数据,其中还额外包括目标role的思考(thinking)过程。
experience
的获取流程如下:
- 将目标role在wiki上的信息,作为
profile
; - 使用LLM,根据profile来生成
scene
,其prompt示例如下;
3. 基于scene + profile,让LLM生成dialogue
数据。其prompt示例如下,用此种方法生成的数据可以是多轮的。
一条用于训练的experimence
如下:
需要额外提到的是,Character-LLM论文提到了角色幻觉(
Character Hallucination
)的概念,其举的场景是:问一个古罗马的角色关于python的问题。Character-LLM认为这种情况下,角色不应该做出回答,因此额外构建了一些protective experience
,引导LLM拒绝回答那些超出角色设定的问题。论文作者还提到,角色幻觉问题的重要性在于,攻击者有可能利用这种幻觉来解锁模型的全部能力,从而带来潜在的危害;但角色幻觉也有一些益处,可以让古代角色与现代知识有更多的交融。
ChatHaruhi
ChatHaruhi主要采用的方法是generate dialogue from question
。
其思路是:将目标role发言前的内容作为 question ,给到LLM,让其 继续完成这个dialogue 。同时为了优化生成效果,论文也采取了few-shot prompting的策略。在实验中,有50%的概率会生成多轮对话。
可以发现,这一合成方法 基于已有的dialogue数据进行再次合成 ,但对于一些本身数据较少的角色不太友好,因为其本身能用作question
的数据不够。
什么不够就生成什么,论文因此又提出了question generation
方法。
其思路是: 给LLM一些question-answer示例,让其模仿生成更多的question 。其prompt如下。
通过question generation
流程,可以得到更多的question
,随后将其送往generation dialogue from question
流程,便能够生成更多的dialogue数据。
通过使用这两种方法,ChatHaruhi将原本22K的dialogue数据,扩增到了 54K 。
效果评测
基于ground truth
第一类评测方法基于ground truth,大致思路是: 把同一个context给到LLM,判断ground truth text 与 generated text之间的相似度/重合度 。
RoleLLM采取的衡量指标是Rouge-L
,ChatHaruhi采取的衡量指标是两者embedding之间的cosine相似度。
LLM作为打分者
让人类直接参与打分的难点在于: 打分者需要对目标角色有深入了解,标注成本比较高 。因此RoleLLM和Character-LLM均引入了LLM打分的方法。
Character-LLM的思路是: 定义5个评分维度,让LLM进行打分 。
其定义的5个维度如下:
- Memorization ,角色的记忆;
- Values ,价值观;
- Personality ,思考、表达的个性;
- Hallucination ,幻觉(即前文提到的角色幻觉问题);
- Stability ,稳定性,包括多轮稳定性、对不同输入的稳定性。
为使打分结果更可信,Character-LLM采取了manual Chain-of-Thought的思想,让LLM进行step-by-step judging
。
RoleLLM的思路是: 直接对比两类方法的效果,让LLM决定谁更好,用win rate大小表明效果的好坏 。
ChatHaruhi的评测维度为:角色吻合度、对话质量;但其arxiv文章中并没有包含评测结果。
总结
本文对3篇角色扮演的工作进行了归纳整理,介绍了其技术实现方法、dialogue数据合成方法以及评测方法,希望对相关研究者和从业者有所帮助。
可以发现的是,这几篇工作的核心都围绕在 如何构建dialogue数据 ,这与其背后所采取的技术方案(retrieval augmentation
、in-context learning
、fine-tuning
)息息相关。但笔者感觉在角色扮演任务下, dialogue的形式可能不够 ,因为角色的记忆/知识、风格、思想/价值观等内容,在dialogue形式下被杂糅在了一起,因此大部分的复杂度都落在了 如何构建数据 上,未来或许可以考虑将不同的要素分别建模,Agent化
是一个可能的优化方向。
关注笔者
欢迎关注笔者,了解更多有趣、有用的NLP知识,一同探索技术的价值和边界~
参考资料
[1] RoleLLM: Benchmarking, Eliciting, and Enhancing Role-Playing Abilities of Large Language Models: https://arxiv.org/abs/2310.00746
[2] Character-LLM: A Trainable Agent for Role-Playing: https://arxiv.org/abs/2310.10158
[3] ChatHaruhi: Reviving Anime Character in Reality via Large Language Model: https://arxiv.org/abs/2308.09597
[4] ChatHaruhi Github: https://github.com/LC1332/Chat-Haruhi-Suzumiya/tree/main
[5] Baize: An Open-Source Chat Model with Parameter-Efficient Tuning on Self-Chat Data: https://arxiv.org/abs/2304.01196
[6] CAMEL: Communicative Agents for Mind Exploration of Large Language Model Society: https://arxiv.org/abs/2303.17760