想聊天?自己搭建个聊天机器人吧!

1、聊天机器人的“前世今生”

在 1964 年至 1966 年间,麻省理工学院人工智能实验室的德裔美国计算机科学家约瑟夫·维森鲍姆(Joseph Weizenbaum)开发了历史上第一个聊天机器人 —— Eliza。

Eliza 的名字源于爱尔兰剧作家萧伯纳的戏剧作品《卖花女》中的角色,剧中出身贫寒的卖花女 Eliza 通过学习与上流社会沟通的方式,变成大使馆舞会上人人艳羡的“匈牙利王家公主”。作为世界上第一个聊天机器人,Eliza 被其作者赋予了充满戏剧性的内涵。

尽管在当时已经存在一些基本的数字语言生成器(可以输出一些连贯文本的程序),但 Eliza 是第一个明确设计用于与人互动的程序。用户可以使用打字机输入人类的自然语言,获得来自机器的响应。正如维森鲍姆解释的那样,Eliza 使“人与计算机之间的对话成为可能 ”。

随着深度学习技术的不断发展,聊天机器人变得越来越智能。我们可以通过机器人来完成一些机械性的问答工作,也可以在闲暇时和智能机器人进行对话,他们的出现让生活变得更丰富多彩。如今通过飞桨与Wechaty的结合就可实现一个简单的聊天机器人。

如下图就是基于 PaddleHub + Wechaty 的微信闲聊机器人demo。通过Wechaty获取微信接收的消息,然后使用PaddleHub的plato-mini模型根据对话的上下文生成新的对话文本,最终以微信消息的形式发送,实现闲聊的交互。
在这里插入图片描述

下图是基于 PaddleNLP + Wechaty 的微信情感识别机器人demo。通过Wechaty获取微信接收的消息,然后使用PaddleNLP的TextCNN模型对输入的文本进行情感判断,最终以微信消息的形式返回,实现对文本情感的识别。
在这里插入图片描述

感兴趣的同学可参照此demo在自己微信上实现一个情感识别机器人哦~

Demo链接:

https://github.com/mawenjie8731/paddlenlp-wechaty-demo

今天我们要带大家使用飞桨PaddleNLP实现诗歌的对答和一个简单的闲聊机器人,一起来吧!

2、快速实践

PaddleNLP针对生成式任务提供了generate()函数,内嵌于PaddleNLP所有的生成式模型。支持Greedy Search、Beam Search和Sampling解码策略,用户只需指定解码策略以及相应的参数即可完成预测解码,得到生成的sequence的token ids以及概率得分。

GPT模型使用生成API的小示例

1.加载 paddlenlp.transformers.GPTChineseTokenizer用于数据处理

文本数据在输入预训练模型之前,需要经过数据处理转化为Feature。这一过程通常包括分词,token to id,add special token等步骤。

PaddleNLP对于各种预训练模型已经内置了相应的tokenizer,指定想要使用的模型名字即可加载对应的tokenizer。

调用GPTChineseTokenizer的__call__方法即可将我们说的话转为模型可接受的输入。

from paddlenlp.transformers import GPTChineseTokenizer
# 设置想要使用模型的名称
model_name = 'gpt-cpm-small-cn-distill'
tokenizer = GPTChineseTokenizer.from_pretrained(model_name)
import paddle
user_input = "花间一壶酒,独酌无相亲。举杯邀明月,"
# 将文本转为ids
input_ids = tokenizer(user_input)['input_ids']
print(input_ids)
# 将转换好的id转为tensor
input_ids = paddle.to_tensor(input_ids, dtype='int64').unsqueeze(0)

2.使用PaddleNLP一键加载预训练模型

PaddleNLP提供了GPT,UnifiedTransformer等中文预训练模型,可以通过预训练模型名称完成一键加载。

GPT以Transformer Decoder的编码器为网络基本组件,采用单向注意力机制,适用于长文本生成任务。

PaddleNLP目前提供多种中英文GPT预训练模型,我们这次用的是一个小的中文GPT预训练模型。

from paddlenlp.transformers import GPTLMHeadModel
# 一键加载中文GPT模型
model = GPTLMHeadModel.from_pretrained(model_name)
# 调用生成API升成文本
ids, scores = model.generate(
                input_ids=input_ids,
                max_length=16,
                min_length=1,
                decode_strategy='greedy_search')
generated_ids = ids[0].numpy().tolist()
#使用tokenizer将生成的id转为文本
generated_text = tokenizer.convert_ids_to_string(generated_ids)
print(generated_text)

对影成三人。

可以看到生成的效果还不错,生成式API的用法也是非常的简便。

UnifiedTransformer 模型和生成式API完成闲聊对话

1.加载paddlenlp.transformers.UnifiedTransformerTokenizer用于数据处理

UnifiedTransformerTokenizer的调用方式与GPT相同,但数据处理的API略有不同。

调用UnifiedTransformerTokenizer的dialogue_encode方法即可将我们说的话转为模型可接受的输入。

from paddlenlp.transformers import UnifiedTransformerTokenizer
# 设置想要使用模型的名称
model_name = 'plato-mini'
tokenizer = UnifiedTransformerTokenizer.from_pretrained(model_name)
user_input = ['你好啊,你今年多大了']
# 调用dialogue_encode方法生成输入
encoded_input = tokenizer.dialogue_encode(
                    user_input,
                    add_start_token_as_response=True,
                    return_tensors=True,
                    is_split_into_words=False)

2.使用PaddleNLP一键加载预训练模型

与GPT相同,我们可以一键调用UnifiedTransformer预训练模型。

UnifiedTransformer以Transformer的编码器为网络基本组件,采用灵活的注意力机制,并在模型输入中加入了标识不同对话技能的special token,使得模型能同时支持闲聊对话、推荐对话和知识对话。

PaddleNLP目前为UnifiedTransformer提供了三个中文预训练模型:

  • unified_transformer-12L-cn 该预训练模型是在大规模中文会话数据集上训练得到的。
  • unified_transformer-12L-cn-luge 该预训练模型是unified_transformer-12L-cn在千言对话数据集上进行微调得到的。
  • plato-mini 该模型使用了十亿级别的中文闲聊对话数据进行预训练。
from paddlenlp.transformers import UnifiedTransformerLMHeadModel
model = UnifiedTransformerLMHeadModel.from_pretrained(model_name)

下一步我们将处理好的输入传入generate函数,并配置解码策略。

这里我们使用的是TopK加sampling的解码策略。即从概率最大的k个结果中按概率进行采样。

ids, scores = model.generate(
                input_ids=encoded_input['input_ids'],
                token_type_ids=encoded_input['token_type_ids'],
                position_ids=encoded_input['position_ids'],
                attention_mask=encoded_input['attention_mask'],
                max_length=64,
                min_length=1,
                decode_strategy='sampling',
                top_k=5,
                num_return_sequences=20)



from utils import select_response

简单根据概率选取最佳回复

result = select_response(ids, scores, tokenizer, keep_space=False, num_return_sequences=20)
print(result)
['你好啊,我今年23岁了']

PaddleNLP的example中提供了搭建完整对话系统的代码(人机交互),感兴趣可以去终端里尝试一下哦~

人机交互地址:

https://github.com/PaddlePaddle/PaddleNLP/tree/develop/examples/dialogue/unified_transformer#%E4%BA%BA%E6%9C%BA%E4%BA%A4%E4%BA%92

3、动手试一试

是不是觉得很有趣呀。小编强烈建议初学者参考上面的代码亲手敲一遍,因为只有这样,才能加深你对代码的理解呦。

本次项目对应的代码:

https://aistudio.baidu.com/aistudio/projectdetail/2017173

更多PaddleNLP信息,欢迎访问GitHub点star收藏后体验:

https://github.com/PaddlePaddle/PaddleNLP

原文链接:https://developer.baidu.com/article.html#/articleDetailPage?id=293487?from=020811

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值