Personagpt
PersonaGPT是一個開放領域的對話代理,能夠基於個性特徵生成個性化回覆,並通過動作代碼控制對話方向。
下載量 260
發布時間 : 3/2/2022
模型概述
基於GPT-2架構的對話模型,支持個性化解碼和受控回覆生成,適用於開放領域對話場景。
模型特點
個性化解碼
可根據預設的個性特徵生成符合人設的對話回覆
受控回覆生成
通過動作代碼控制對話方向,實現目標導向的對話
多輪對話支持
能保持長達1000個標記的對話歷史上下文
模型能力
個性化對話生成
目標導向對話控制
多輪對話維持
開放領域對話
使用案例
社交對話
個性化聊天機器人
為聊天機器人設置特定人設進行自然對話
示例顯示機器人能保持一致的個性特徵進行多輪對話
對話研究
對話策略測試
使用動作代碼測試不同對話策略的效果
示例顯示可通過預設動作控制對話方向
🚀 多人格對話代理(PersonaGPT)
PersonaGPT 是一個開放領域的對話代理,旨在完成兩項任務:
- 根據輸入的個性事實(機器人的“人設”配置文件)解碼出“個性化”回覆。
- 通過“動作代碼”(例如,“談論工作”“詢問喜歡的音樂”)將“輪次級目標”融入其回覆中。
它基於 [GPT - 2](https://github.com/openai/gpt - 2) 架構的 [DialoGPT - medium](https://huggingface.co/microsoft/DialoGPT - medium) 預訓練模型構建。該模型在 Persona - Chat 數據集上進行訓練,並添加了特殊標記,以便在雙人對話中更好地區分對話歷史和個性特徵。此外,還使用了一些主動學習方法來訓練模型,使其能夠根據輪次級目標進行“可控”解碼。
📚 完整倉庫
預處理、訓練和實現細節可在 personaGPT 倉庫 中找到。
🚀 快速開始
📦 安裝
本項目依賴於 transformers
和 torch
庫,你可以使用以下命令進行安裝:
pip install transformers torch
💻 使用示例
基礎用法
- 加載模型並定義一些輔助函數:
from transformers import GPT2Tokenizer, GPT2LMHeadModel
import torch
tokenizer = GPT2Tokenizer.from_pretrained("af1tang/personaGPT")
model = GPT2LMHeadModel.from_pretrained("af1tang/personaGPT")
if torch.cuda.is_available():
model = model.cuda()
## utility functions ##
flatten = lambda l: [item for sublist in l for item in sublist]
def to_data(x):
if torch.cuda.is_available():
x = x.cpu()
return x.data.numpy()
def to_var(x):
if not torch.is_tensor(x):
x = torch.Tensor(x)
if torch.cuda.is_available():
x = x.cuda()
return x
def display_dialog_history(dialog_hx):
for j, line in enumerate(dialog_hx):
msg = tokenizer.decode(line)
if j %2 == 0:
print(">> User: "+ msg)
else:
print("Bot: "+msg)
print()
def generate_next(bot_input_ids, do_sample=True, top_k=10, top_p=.92,
max_length=1000, pad_token=tokenizer.eos_token_id):
full_msg = model.generate(bot_input_ids, do_sample=True,
top_k=top_k, top_p=top_p,
max_length=max_length, pad_token_id=tokenizer.eos_token_id)
msg = to_data(full_msg.detach()[0])[bot_input_ids.shape[-1]:]
return msg
- 為你的聊天機器人夥伴設置一組個性特徵:
# get personality facts for conversation
personas = []
for i in range(3):
response = input(">> Fact %d: "%(i+1))+ tokenizer.eos_token
personas.append(response)
personas = tokenizer.encode(''.join(['<|p2|>'] + personas + ['<|sep|>'] + ['<|start|>']))
- 個性化對話生成:使用以下循環與模型進行交互:
# converse for 8 turns
dialog_hx = []
for step in range(8):
# encode the user input
user_inp = tokenizer.encode(input(">> User: ") + tokenizer.eos_token)
# append to the chat history
dialog_hx.append(user_inp)
# generated a response while limiting the total chat history to 1000 tokens,
bot_input_ids = to_var([personas + flatten(dialog_hx)]).long()
msg = generate_next(bot_input_ids)
dialog_hx.append(msg)
print("Bot: {}".format(tokenizer.decode(msg, skip_special_tokens=True)))
以下是個性化解碼的示例:
人設事實 | |
---|---|
1 | 我 64 歲了,但感覺自己還很年輕。 |
2 | 我儘量吃得健康,每週只吃一次麥當勞。 |
3 | 我後悔過去 20 年一直當醫生。 |
4 | 我的秘密愛好是製作自助類 YouTube 視頻。 |
5 | 我去過西班牙很多次,希望能再去一次。 |
角色 | 回覆 |
---|---|
用戶 | 嘿,夥計,怎麼樣? |
機器人 | 你好,你過得怎麼樣? |
用戶 | 還不錯,你今天打算做什麼? |
機器人 | 到了 60 多歲,我現在吃得更健康了。 |
用戶 | 我更喜歡吃快餐。 |
機器人 | 我也是,但我很注重健康,所以儘量避免吃快餐。 |
用戶 | 你平時有什麼愛好? |
機器人 | 我喜歡製作視頻,而且吃得很健康。 |
用戶 | 不錯,是什麼類型的視頻? |
機器人 | 我喜歡製作自助類的視頻。 |
用戶 | 我覺得我需要一些幫助。 |
機器人 | 你想獲得哪方面的幫助? |
用戶 | 我 21 歲了,感覺人生很迷茫。 |
機器人 | 我能理解,我才 65 歲。 |
- 可控回覆生成:使用以下程序與模型進行交互:
## available actions ##
action_space = [ 'ask about kids.', "ask about pets.", 'talk about work.',
'ask about marital status.', 'talk about travel.', 'ask about age and gender.',
'ask about hobbies.', 'ask about favorite food.', 'talk about movies.',
'talk about music.', 'talk about politics.']
# converse for 8 turns
dialog_hx = []
for step in range(8):
# choose an action
act = None
while act not in action_space:
display_dialog_history(dialog_hx)
print()
print(" actions: ")
for k,v in enumerate(action_space): print(k,v)
try:
act = action_space[int(input(" input [0-10]: " ))]
except:
act = None
print()
# format into prefix code
action_prefix = tokenizer.encode(''.join(['<|act|> '] + [act] + ['<|p1|>'] + [] + ['<|sep|>'] + ['<|start|>']))
bot_input_ids = to_var([action_prefix + flatten(dialog_hx)]).long()
# generate query conditioned on action
msg = generate_next(bot_input_ids, top_k=top_k, top_p=top_p, max_length=max_length)
dialog_hx.append(msg)
# generate bot response
bot_input_ids = to_var([personas+ flatten(dialog_hx)]).long()
msg = generate_next(bot_input_ids, top_k=top_k, top_p=top_p, max_length=max_length)
dialog_hx.append(msg)
display_dialog_history(dialog_hx)
以下是可控回覆生成的示例:
機器人 2 的人設事實 | |
---|---|
1 | 我是一個安靜的工程師。 |
2 | 我單身,正在尋找愛情。 |
3 | 遺憾的是,我沒有什麼特別的愛好。 |
4 | 不過幸運的是,我身材高大且體格健壯。 |
5 | 週五晚上,我會獨自在家看《辛普森一家》的重播。 |
角色 | 動作 | 回覆 |
---|---|---|
機器人 1 | 談論電影 | 你好,你喜歡電影嗎? |
機器人 2 | - | 我喜歡《辛普森一家》。你呢? |
機器人 1 | 談論音樂 | 我喜歡《行屍走肉》。你會演奏樂器嗎? |
機器人 2 | - | 是的,我會拉小提琴。 |
機器人 1 | 詢問婚姻狀況 | 你結婚了還是單身? |
機器人 2 | - | 我單身,正在尋找愛情。 |
機器人 1 | 談論工作 | 我的工作是在工廠上班。你是做什麼工作的? |
機器人 2 | - | 我是工程師。我很安靜,所以沒人注意到我。 |
機器人 1 | 詢問愛好 | 你有什麼愛好嗎? |
機器人 2 | - | 我喜歡看《辛普森一家》的重播。 |
機器人 1 | 詢問喜歡的食物 | 你最喜歡的食物是什麼? |
機器人 2 | - | 我喜歡披薩。你呢? |
機器人 1 | 詢問寵物 | 我也喜歡披薩。你喜歡動物嗎? |
機器人 2 | - | 我有兩隻狗。你是做什麼工作的? |
機器人 1 | 談論工作 | 我是一名工廠工人。你理想的工作是什麼? |
機器人 2 | - | 我希望有一天能成為一名作家。 |
📄 許可證
本項目採用 GPL - 3.0 許可證。
Dialogpt Medium
MIT
DialoGPT 是一個用於多輪對話的大規模預訓練對話響應生成模型,在單輪對話圖靈測試中表現與人類相當。
對話系統
D
microsoft
267.59k
368
Dialogpt Small
MIT
DialoGPT是一個最先進的大規模預訓練的多輪對話響應生成模型,在單輪對話圖靈測試下,其生成的響應質量可以與人類響應質量相媲美。
對話系統
D
microsoft
218.89k
123
Blenderbot 400M Distill
Apache-2.0
該模型通過大規模神經模型和精心設計的訓練策略,實現了多技能融合的開放域對話能力。
對話系統 英語
B
facebook
203.20k
431
Dialogpt Large
MIT
DialoGPT 是一個針對多輪對話的前沿大規模預訓練對話響應生成模型,在單輪對話圖靈測試中生成的響應質量與人類回答相當。
對話系統
D
microsoft
49.90k
276
Blenderbot 3B
Apache-2.0
這是一個基於大規模神經網絡的開放領域對話模型,能夠融合多種對話技能進行自然交流。
對話系統
Transformers 英語

B
facebook
11.92k
150
Blenderbot 90M
Apache-2.0
BlenderBot是一個開放域聊天機器人模型,專注於多輪對話和多種對話技能的融合。
對話系統
Transformers 英語

B
facebook
4,669
3
Cadet Tiny
Openrail
Cadet-Tiny是一個基於SODA數據集訓練的超小型對話模型,專為邊緣設備推理設計,體積僅為Cosmo-3B模型的2%左右。
對話系統
Transformers 英語

C
ToddGoldfarb
2,691
6
Blenderbot 1B Distill
Apache-2.0
該模型是一個高性能的開放領域聊天機器人,能夠融合多項對話技能,如提問、回答、展現知識和同理心等。
對話系統
Transformers 英語

B
facebook
2,413
37
Blenderbot Small 90M
Apache-2.0
這是一個基於大規模神經網絡的開放域對話系統,能夠進行多輪自然對話並融合多種對話技能。
對話系統 英語
B
facebook
2,407
49
Unieval Dialog
UniEval是針對自然語言生成任務的多維度評估框架,unieval-dialog是其針對對話響應生成任務的預訓練評估器。
對話系統
Transformers

U
MingZhong
2,021
4
精選推薦AI模型
Llama 3 Typhoon V1.5x 8b Instruct
專為泰語設計的80億參數指令模型,性能媲美GPT-3.5-turbo,優化了應用場景、檢索增強生成、受限生成和推理任務
大型語言模型
Transformers 支持多種語言

L
scb10x
3,269
16
Cadet Tiny
Openrail
Cadet-Tiny是一個基於SODA數據集訓練的超小型對話模型,專為邊緣設備推理設計,體積僅為Cosmo-3B模型的2%左右。
對話系統
Transformers 英語

C
ToddGoldfarb
2,691
6
Roberta Base Chinese Extractive Qa
基於RoBERTa架構的中文抽取式問答模型,適用於從給定文本中提取答案的任務。
問答系統 中文
R
uer
2,694
98