李云龍、謝耳朵專業(yè)陪聊!角色扮演系統(tǒng)ChatHaruhi爆火:支持32個中外角色,開源5.4萬條對話數(shù)據(jù)
「角色扮演」是大型語言模型眾多應(yīng)用場景中比較有意思的,LLM可以用指定角色的口吻跟用戶對話,還可以實現(xiàn)諸如「喬布斯與蘇格拉底」的超時空交流。
很多公司也發(fā)布了基于語言模型的角色扮演產(chǎn)品,如Glow, Character.AI等,用戶可以輕松打造出一個「賽博老婆」,在游戲、創(chuàng)意產(chǎn)業(yè)等領(lǐng)域都有許多潛在的應(yīng)用場景。
最近,GitHub上開源一個好玩的角色扮演聊天系統(tǒng)「Chat涼宮春日」,基于中文語言模型「駱駝」(Luotuo),可以模仿32位中外角色的對話風格,同時提供超過5.4萬個對話數(shù)據(jù)集。
項目鏈接:https://github.com/LC1332/ChatHaruhi-Suzumiya
論文鏈接:https://arxiv.org/abs/2306.09479
目前該項目仍在持續(xù)推進中,并且提供了豐富的demo試玩方法。
demo鏈接:https://huggingface.co/spaces/chenxiYan/ChatHaruhi-OpenAI
用戶可以給自己隨意起一個名字(最好貼近原著),然后輸入問題即可開始交流,比如扮演「秀芹」與李云龍對話時,可以看到模型的多輪回答效果非常不錯,并且模擬的對話風格也很貼切。
基本思路
在開源角色扮演實現(xiàn)中,用戶通常會在提示中輸入:
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)得像[電視劇]中的[角色]。我希望你像[角色]一樣,使用[角色]會使用的語氣、方式和詞匯來回應(yīng)和回答。不要寫任何解釋。只需要像[角色]一樣回答。你必須了解關(guān)于[角色]的所有知識。我的第一句話是「你好,[角色]」。
通過這種簡單的方式,語言模型可以展現(xiàn)出部分角色扮演能力,但這種方式很大程度上依賴于語言模型本身已有的知識,無法扮演記憶模糊或語料之外的角色。
并且提示中「了解角色的所有知識」的定義很模糊,模型仍然會產(chǎn)生幻覺。
即使提示內(nèi)容已經(jīng)足夠清晰,在文本生成的過程中仍然會受到底層語言模型的影響,繼續(xù)調(diào)整提示詞可能會緩解這種情況,但在角色數(shù)量過多時可能工作量會非常大。
把模型在角色的對話數(shù)據(jù)上進行微調(diào)也是一個思路,但研究人員發(fā)現(xiàn)微調(diào)過的聊天機器人會產(chǎn)生更多幻覺問題;并且對于想要模仿的次要角色,也很難收集足夠量的數(shù)據(jù)來微調(diào)。
ChatHaruhi項目的目標是讓語言模型能夠模擬動漫、電視劇、小說等各種體裁下的角色風格,開發(fā)者認為,一個虛擬的角色主要由三個組件構(gòu)成:
1. 知識和背景(Knowledge and background)
每個虛擬角色都存在于自己的設(shè)定背景中,例如《哈利·波特》中的人物存在于魔法世界中、涼宮春日在日本的一所高中等。
在構(gòu)建聊天機器人時,我們希望它能夠理解相應(yīng)故事的設(shè)定,也是對語言模型記憶的主要考驗,通常需要一個外部知識庫。
2. 個性(Personality)
角色的性格也是文藝作品中非常重要的一部分,必須在整部作品中保持連貫或一致,有些作者甚至會在動筆之前先定義角色個性。
3. 語言習慣(Linguistic habits)
語言習慣是最容易模仿的,只要在上下文中給出合適的樣例即可。
該項目的關(guān)鍵思路是盡可能多地抽取出原始腳本,為目標角色形成一個記憶數(shù)據(jù)庫。
當用戶提出新問題時,系統(tǒng)會搜索相關(guān)的經(jīng)典情節(jié),結(jié)合角色設(shè)定的提示詞,通過控制語言模型來更好地模仿角色。
研究人員還設(shè)計了一個系統(tǒng)來自動生成適合角色個性的對話,即使是原創(chuàng)對話較少的角色,也可以生成足夠的數(shù)據(jù)來微調(diào)。
ChatBot設(shè)計
給定一個特定角色R和一個查詢問題q,聊天任務(wù)可以建模為:在知識背景、個性和語言習慣Θ的條件下生成回復(fù)的概率:
角色R可以由一段提示文本(I want you to act like character from series...)指定。
類似上下文學習(in-context learning),可以把角色之前的對話序列作為概率的條件:
對于世界觀更大的角色,需要先從記憶庫中檢索出最相關(guān)的對話序列。
系統(tǒng)提示(System Prompt)
在之前提到的可用于ChatGPT的通用角色扮演提示中,還有兩方面需要改進:
1. 不重復(fù)行文(won't repeat line)
像ChatGPT和LLaMA2等模型在基于人類反饋的強化學習(RLHF)訓練時,面對諸如「給我m個不同的選項」、「生成m個標題」等任務(wù)時,更傾向于不重復(fù)上下文中的內(nèi)容。
而在模仿角色時,需要在提示中強調(diào)可以重用小說或電影中的經(jīng)典臺詞。
2. 角色個性不夠突出
由于RLHF機制,每個語言模型都有自己特定的語言偏好,會影響模仿的效果,在提示詞結(jié)尾加入角色的個性描述可以改善。
改進后的提示詞如下:
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 [角色]。如果別人的問題與小說有關(guān),請盡量重用小說中的原臺詞。我希望你像[角色]一樣,使用[角色]會使用的語氣、方式和詞匯來回應(yīng)和回答。你必須知道[角色]的所有知識。{關(guān)于角色個性的補充說明}
角色對話
為了更好地再現(xiàn)小說、電視劇、電影中人物的行為,研究人員收集了大量經(jīng)典劇本的節(jié)選,不過除了少數(shù)人物(如相聲演員于謙),并不是所有對話都是問答的形式,可以把歷史記錄組織成故事的形式。
原始對話搜索
在輸入查詢后,從對話庫D中根據(jù)嵌入相似度選擇出最相似的M個采樣,具體M的數(shù)量取決于語言模型的token限制。
在構(gòu)建對話記憶庫時,研究人員建議每個故事的長度不要太長,以免在搜索過程中占用其他故事的空間。
聊天記憶
對于某個記憶,需要記錄每個用戶查詢和聊天機器人的回復(fù),然后將所有對話序列輸入到語言模型中,以確保對話的連貫性。
在實際實現(xiàn)中,從該記憶開始,向前計算token總數(shù),并將語言模型的對話歷史輸入限制在1200個token以內(nèi),大約可以容納6-10輪對話。
對話合成
目前ChatHaruhi還只能利用ChatGPT或Claude API來完成角色扮演,如果用戶希望把這種能力遷移到本地模型,仍然需要構(gòu)造出一個合適的數(shù)據(jù)集。
從問題中生成對話
由于收集到的數(shù)據(jù)并不是嚴格的問答形式,所以研究人員選擇在收集的故事中,把目標角色第一句話之前的所有對話當作問題,輸入到語言模型中生成后續(xù)對話。
問題生成
需要注意的是,有些角色的數(shù)據(jù)非常有限,不足以微調(diào)語言模型。
為了從現(xiàn)有數(shù)據(jù)中對角色問題進行數(shù)據(jù)增強,研究人員使用Alpaca等模型,先提供一個清晰的問答對,然后生成約10個啟發(fā)式輸出;再利用預(yù)定義的prompts重新生成該角色的訓練數(shù)據(jù)。
研究人員總共收集了22752個原始對話數(shù)據(jù),以及31974個模擬問題,共同組成了ChatHaruhi-v1數(shù)據(jù)集。
實驗結(jié)果
目前定量的實驗結(jié)果和用戶研究仍在進行中,文中只是先簡單定性地對比了一下各個模型:
1. GPT Turbo 3.5,只使用系統(tǒng)提示
2. Turbo 3.5,輸入完成的提示、對話歷史、問題等
3. ChatGLM2,只輸入系統(tǒng)提示
4. ChatGLM2,給出完整提示
5. ChatGLM2,在ChatHaruhi數(shù)據(jù)上微調(diào),輸入完整提示