乐趣区

关于人工智能:想聊天自己搭建个聊天机器人吧

课程简介
“手把手带你学 NLP”是基于飞桨 PaddleNLP 的系列实战我的项目。本系列由百度多位资深工程师精心打造,提供了从词向量、预训练语言模型,到信息抽取、情感剖析、文本问答、结构化数据问答、文本翻译、机器同传、对话零碎等实际我的项目的全流程解说,旨在帮忙开发者更全面清晰地把握百度飞桨框架在 NLP 畛域的用法,并可能触类旁通、灵便应用飞桨框架和 PaddleNLP 进行 NLP 深度学习实际。

6 月,百度飞桨 & 自然语言解决部携手推出了 12 节 NLP 视频课,课程中具体解说了本实际我的项目。
观看课程回放请戳:
https://aistudio.baidu.com/ai…
欢送来课程 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/mawenjie87…

是不是很乏味。如果你还不满足于此,欢送前来报名 PaddlePaddle 联结开源聊天机器人框架 Wechaty 和设计师社区 MixLab 带来的创意赛。PaddleNLP 为各位参赛选手提供了丰盛的深度学习预训练模型,Wechaty 也为大家提供了便捷的 ChatBot 搭建 SDK,大家可参照已有 demo 应用 PaddleNLP 实现主动写诗、彩虹屁,起名、主动对联等好玩的性能。
较量报名链接:
https://aistudio.baidu.com/ai…
明天咱们要带大家应用飞桨 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 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 的用法也是十分的简便。

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/PaddlePadd…
入手试一试
是不是感觉很乏味呀。小编强烈建议初学者参考下面的代码亲手敲一遍,因为只有这样,能力加深你对代码的了解呦。
本次我的项目对应的代码:
https://aistudio.baidu.com/ai…
更多 PaddleNLP 信息,欢送拜访 GitHub 点 star 珍藏后体验:
https://github.com/PaddlePadd…

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

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

退出移动版