写点什么

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

用户头像
百度大脑
关注
发布于: 4 小时前

 课程简介 “手把手带你学 NLP”是基于飞桨 PaddleNLP 的系列实战项目。本系列由百度多位资深工程师精心打造,提供了从词向量、预训练语言模型,到信息抽取、情感分析、文本问答、结构化数据问答、文本翻译、机器同传、对话系统等实践项目的全流程讲解,旨在帮助开发者更全面清晰地掌握百度飞桨框架在 NLP 领域的用法,并能够举一反三、灵活使用飞桨框架和 PaddleNLP 进行 NLP 深度学习实践。


6 月,百度飞桨 & 自然语言处理部携手推出了 12 节 NLP 视频课,课程中详细讲解了本实践项目。观看课程回放请戳:https://aistudio.baidu.com/aistudio/course/introduce/24177欢迎来课程 QQ 群(群号:758287592)交流吧~~  聊天机器人的“前世今生” 

在 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


是不是很有趣。如果你还不满足于此,欢迎前来报名 PaddlePaddle 联合开源聊天机器人框架 Wechaty 和设计师社区 MixLab 带来的创意赛。PaddleNLP 为各位参赛选手提供了丰富的深度学习预训练模型,Wechaty 也为大家提供了便捷的 ChatBot 搭建 SDK,大家可参照已有 demo 使用 PaddleNLP 实现自动写诗、彩虹屁,起名、自动对联等好玩的功能。

比赛报名链接:

https://aistudio.baidu.com/aistudio/competition/detail/98

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

 快速实践 

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


2.1 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 paddleuser_input = "花间一壶酒,独酌无相亲。举杯邀明月,"# 将文本转为idsinput_ids = tokenizer(user_input)['input_ids']print(input_ids)# 将转换好的id转为tensorinput_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 的用法也是非常的简便。


2.2 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

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

本次项目对应的代码:

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

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

https://github.com/PaddlePaddle/PaddleNLP


百度 AI 开发者社区https://ai.baidu.com/forum ,为全国各地开发者提供一个交流、分享、答疑解惑的平台,让开发者在研发路上不再“孤军奋战”,通过不断地交流与探讨找出更好的技术解决方案。如果你想尝试各种人工智能技术、开拓应用场景,赶快加入百度 AI 社区,你对 AI 的所有畅想,在这里都可以实现!


扫描下方二维码,添加小助手微信「京东卡、小度定制周边、神秘礼盒、行李箱」等更多福利你来拿~


发布于: 4 小时前阅读数: 5
用户头像

百度大脑

关注

用科技让复杂的世界更简单 2020.07.15 加入

百度大脑是百度技术多年积累和业务实践的集大成,包括视觉、语音、自然语言处理、知识图谱、深度学习等 AI 核心技术和 AI 开放平台。 即刻获取百度AI相关技术,可访问 ai.baidu.com了解更多!

评论

发布
暂无评论
想聊天?自己搭建个聊天机器人吧!