李云龍、謝耳朵專業(yè)陪聊!角色扮演系統(tǒng)ChatHaruhi爆火:支持32個(gè)中外角色,開(kāi)源5.4萬(wàn)條對(duì)話數(shù)據(jù)
「角色扮演」是大型語(yǔ)言模型眾多應(yīng)用場(chǎng)景中比較有意思的,LLM可以用指定角色的口吻跟用戶對(duì)話,還可以實(shí)現(xiàn)諸如「喬布斯與蘇格拉底」的超時(shí)空交流。
很多公司也發(fā)布了基于語(yǔ)言模型的角色扮演產(chǎn)品,如Glow, Character.AI等,用戶可以輕松打造出一個(gè)「賽博老婆」,在游戲、創(chuàng)意產(chǎn)業(yè)等領(lǐng)域都有許多潛在的應(yīng)用場(chǎng)景。
最近,GitHub上開(kāi)源一個(gè)好玩的角色扮演聊天系統(tǒng)「Chat涼宮春日」,基于中文語(yǔ)言模型「駱駝」(Luotuo),可以模仿32位中外角色的對(duì)話風(fēng)格,同時(shí)提供超過(guò)5.4萬(wàn)個(gè)對(duì)話數(shù)據(jù)集。

項(xiàng)目鏈接:https://github.com/LC1332/ChatHaruhi-Suzumiya
論文鏈接:https://arxiv.org/abs/2306.09479
目前該項(xiàng)目仍在持續(xù)推進(jìn)中,并且提供了豐富的demo試玩方法。

demo鏈接:https://huggingface.co/spaces/chenxiYan/ChatHaruhi-OpenAI
用戶可以給自己隨意起一個(gè)名字(最好貼近原著),然后輸入問(wèn)題即可開(kāi)始交流,比如扮演「秀芹」與李云龍對(duì)話時(shí),可以看到模型的多輪回答效果非常不錯(cuò),并且模擬的對(duì)話風(fēng)格也很貼切。



基本思路
在開(kāi)源角色扮演實(shí)現(xiàn)中,用戶通常會(huì)在提示中輸入:
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}.
我希望你表現(xiàn)得像[電視劇]中的[角色]。我希望你像[角色]一樣,使用[角色]會(huì)使用的語(yǔ)氣、方式和詞匯來(lái)回應(yīng)和回答。不要寫(xiě)任何解釋。只需要像[角色]一樣回答。你必須了解關(guān)于[角色]的所有知識(shí)。我的第一句話是「你好,[角色]」。
通過(guò)這種簡(jiǎn)單的方式,語(yǔ)言模型可以展現(xiàn)出部分角色扮演能力,但這種方式很大程度上依賴于語(yǔ)言模型本身已有的知識(shí),無(wú)法扮演記憶模糊或語(yǔ)料之外的角色。
并且提示中「了解角色的所有知識(shí)」的定義很模糊,模型仍然會(huì)產(chǎn)生幻覺(jué)。
即使提示內(nèi)容已經(jīng)足夠清晰,在文本生成的過(guò)程中仍然會(huì)受到底層語(yǔ)言模型的影響,繼續(xù)調(diào)整提示詞可能會(huì)緩解這種情況,但在角色數(shù)量過(guò)多時(shí)可能工作量會(huì)非常大。
把模型在角色的對(duì)話數(shù)據(jù)上進(jìn)行微調(diào)也是一個(gè)思路,但研究人員發(fā)現(xiàn)微調(diào)過(guò)的聊天機(jī)器人會(huì)產(chǎn)生更多幻覺(jué)問(wèn)題;并且對(duì)于想要模仿的次要角色,也很難收集足夠量的數(shù)據(jù)來(lái)微調(diào)。
ChatHaruhi項(xiàng)目的目標(biāo)是讓語(yǔ)言模型能夠模擬動(dòng)漫、電視劇、小說(shuō)等各種體裁下的角色風(fēng)格,開(kāi)發(fā)者認(rèn)為,一個(gè)虛擬的角色主要由三個(gè)組件構(gòu)成:
1. 知識(shí)和背景(Knowledge and background)
每個(gè)虛擬角色都存在于自己的設(shè)定背景中,例如《哈利·波特》中的人物存在于魔法世界中、涼宮春日在日本的一所高中等。
在構(gòu)建聊天機(jī)器人時(shí),我們希望它能夠理解相應(yīng)故事的設(shè)定,也是對(duì)語(yǔ)言模型記憶的主要考驗(yàn),通常需要一個(gè)外部知識(shí)庫(kù)。
2. 個(gè)性(Personality)
角色的性格也是文藝作品中非常重要的一部分,必須在整部作品中保持連貫或一致,有些作者甚至?xí)趧?dòng)筆之前先定義角色個(gè)性。
3. 語(yǔ)言習(xí)慣(Linguistic habits)
語(yǔ)言習(xí)慣是最容易模仿的,只要在上下文中給出合適的樣例即可。
該項(xiàng)目的關(guān)鍵思路是盡可能多地抽取出原始腳本,為目標(biāo)角色形成一個(gè)記憶數(shù)據(jù)庫(kù)。
當(dāng)用戶提出新問(wèn)題時(shí),系統(tǒng)會(huì)搜索相關(guān)的經(jīng)典情節(jié),結(jié)合角色設(shè)定的提示詞,通過(guò)控制語(yǔ)言模型來(lái)更好地模仿角色。
研究人員還設(shè)計(jì)了一個(gè)系統(tǒng)來(lái)自動(dòng)生成適合角色個(gè)性的對(duì)話,即使是原創(chuàng)對(duì)話較少的角色,也可以生成足夠的數(shù)據(jù)來(lái)微調(diào)。
ChatBot設(shè)計(jì)
給定一個(gè)特定角色R和一個(gè)查詢問(wèn)題q,聊天任務(wù)可以建模為:在知識(shí)背景、個(gè)性和語(yǔ)言習(xí)慣Θ的條件下生成回復(fù)的概率:

角色R可以由一段提示文本(I want you to act like character from series...)指定。
類似上下文學(xué)習(xí)(in-context learning),可以把角色之前的對(duì)話序列作為概率的條件:


對(duì)于世界觀更大的角色,需要先從記憶庫(kù)中檢索出最相關(guān)的對(duì)話序列。

系統(tǒng)提示(System Prompt)
在之前提到的可用于ChatGPT的通用角色扮演提示中,還有兩方面需要改進(jìn):
1. 不重復(fù)行文(won't repeat line)
像ChatGPT和LLaMA2等模型在基于人類反饋的強(qiáng)化學(xué)習(xí)(RLHF)訓(xùn)練時(shí),面對(duì)諸如「給我m個(gè)不同的選項(xiàng)」、「生成m個(gè)標(biāo)題」等任務(wù)時(shí),更傾向于不重復(fù)上下文中的內(nèi)容。
而在模仿角色時(shí),需要在提示中強(qiáng)調(diào)可以重用小說(shuō)或電影中的經(jīng)典臺(tái)詞。
2. 角色個(gè)性不夠突出
由于RLHF機(jī)制,每個(gè)語(yǔ)言模型都有自己特定的語(yǔ)言偏好,會(huì)影響模仿的效果,在提示詞結(jié)尾加入角色的個(gè)性描述可以改善。
改進(jìn)后的提示詞如下:
I want you to act like {character} from {series}. You are now cosplay {character} If others’ questions are related with the novel, please try to reuse the original lines from the novel. I want you to respond and answer like {character} using the tone, manner and vocabulary {character} would use. You must know all of the knowledge of {character}. {Supplementary explanation of the character’s personality}
我希望你表現(xiàn)得像[電視劇]中的[角色]。你現(xiàn)在是cosplay [角色]。如果別人的問(wèn)題與小說(shuō)有關(guān),請(qǐng)盡量重用小說(shuō)中的原臺(tái)詞。我希望你像[角色]一樣,使用[角色]會(huì)使用的語(yǔ)氣、方式和詞匯來(lái)回應(yīng)和回答。你必須知道[角色]的所有知識(shí)。{關(guān)于角色個(gè)性的補(bǔ)充說(shuō)明}
角色對(duì)話
為了更好地再現(xiàn)小說(shuō)、電視劇、電影中人物的行為,研究人員收集了大量經(jīng)典劇本的節(jié)選,不過(guò)除了少數(shù)人物(如相聲演員于謙),并不是所有對(duì)話都是問(wèn)答的形式,可以把歷史記錄組織成故事的形式。

原始對(duì)話搜索
在輸入查詢后,從對(duì)話庫(kù)D中根據(jù)嵌入相似度選擇出最相似的M個(gè)采樣,具體M的數(shù)量取決于語(yǔ)言模型的token限制。
在構(gòu)建對(duì)話記憶庫(kù)時(shí),研究人員建議每個(gè)故事的長(zhǎng)度不要太長(zhǎng),以免在搜索過(guò)程中占用其他故事的空間。
聊天記憶
對(duì)于某個(gè)記憶,需要記錄每個(gè)用戶查詢和聊天機(jī)器人的回復(fù),然后將所有對(duì)話序列輸入到語(yǔ)言模型中,以確保對(duì)話的連貫性。
在實(shí)際實(shí)現(xiàn)中,從該記憶開(kāi)始,向前計(jì)算token總數(shù),并將語(yǔ)言模型的對(duì)話歷史輸入限制在1200個(gè)token以內(nèi),大約可以容納6-10輪對(duì)話。
對(duì)話合成
目前ChatHaruhi還只能利用ChatGPT或Claude API來(lái)完成角色扮演,如果用戶希望把這種能力遷移到本地模型,仍然需要構(gòu)造出一個(gè)合適的數(shù)據(jù)集。
從問(wèn)題中生成對(duì)話
由于收集到的數(shù)據(jù)并不是嚴(yán)格的問(wèn)答形式,所以研究人員選擇在收集的故事中,把目標(biāo)角色第一句話之前的所有對(duì)話當(dāng)作問(wèn)題,輸入到語(yǔ)言模型中生成后續(xù)對(duì)話。

問(wèn)題生成
需要注意的是,有些角色的數(shù)據(jù)非常有限,不足以微調(diào)語(yǔ)言模型。
為了從現(xiàn)有數(shù)據(jù)中對(duì)角色問(wèn)題進(jìn)行數(shù)據(jù)增強(qiáng),研究人員使用Alpaca等模型,先提供一個(gè)清晰的問(wèn)答對(duì),然后生成約10個(gè)啟發(fā)式輸出;再利用預(yù)定義的prompts重新生成該角色的訓(xùn)練數(shù)據(jù)。

研究人員總共收集了22752個(gè)原始對(duì)話數(shù)據(jù),以及31974個(gè)模擬問(wèn)題,共同組成了ChatHaruhi-v1數(shù)據(jù)集。

實(shí)驗(yàn)結(jié)果
目前定量的實(shí)驗(yàn)結(jié)果和用戶研究仍在進(jìn)行中,文中只是先簡(jiǎn)單定性地對(duì)比了一下各個(gè)模型:
1. GPT Turbo 3.5,只使用系統(tǒng)提示
2. Turbo 3.5,輸入完成的提示、對(duì)話歷史、問(wèn)題等
3. ChatGLM2,只輸入系統(tǒng)提示
4. ChatGLM2,給出完整提示
5. ChatGLM2,在ChatHaruhi數(shù)據(jù)上微調(diào),輸入完整提示






























