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