想聊天?自己搭建个聊天机器人吧!
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 該模型使用了十億級別的中文閑聊對話數據進行預訓練。
下一步我們將處理好的輸入傳入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
總結
以上是生活随笔為你收集整理的想聊天?自己搭建个聊天机器人吧!的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 百度AI原生云实践: 基于容器云打造 A
- 下一篇: 零基础也可以实现“机器同传翻译”!