1聊天機器人的“前世今生”(關注博主,定時分享學習干貨~)
在 1964 年至 1966 年間,麻省理工學院人工智能實驗室的德裔美國計算機科學家約瑟夫·維森鮑姆(Joseph )開發了歷史上第一個聊天機器人 —— Eliza。
Eliza 的名字源于愛爾蘭劇作家蕭伯納的戲劇作品《賣花女》中的角色,劇中出身貧寒的賣花女 Eliza 通過學習與上流社會溝通的方式,變成大使館舞會上人人艷羨的“匈牙利王家公主”。作為世界上第一個聊天機器人,Eliza 被其作者賦予了充滿戲劇性的內涵。
盡管在當時已經存在一些基本的數字語言生成器(可以輸出一些連貫文本的程序),但 Eliza 是第一個明確設計用于與人互動的程序。用戶可以使用打字機輸入人類的自然語言,獲得來自機器的響應。正如維森鮑姆解釋的那樣,Eliza 使“人與計算機之間的對話成為可能 ”。
隨著深度學習技術的不斷發展,聊天機器人變得越來越智能。我們可以通過機器人來完成一些機械性的問答工作,也可以在閑暇時和智能機器人進行對話,他們的出現讓生活變得更豐富多彩。如今通過飛槳與Wechaty的結合就可實現一個簡單的聊天機器人。
如下圖就是基于 + Wechaty 的微信閑聊機器人demo。通過Wechaty獲取微信接收的消息,然后使用的plato-mini模型根據對話的上下文生成新的對話文本,最終以微信消息的形式發送,實現閑聊的交互。
下圖是基于 + Wechaty 的微信情感識別機器人demo。通過Wechaty獲取微信接收的消息,然后使用的TextCNN模型對輸入的文本進行情感判斷,最終以微信消息的形式返回,實現對文本情感的識別。
感興趣的同學可參照此demo在自己微信上實現一個情感識別機器人哦~
Demo鏈接:
今天我們要帶大家使用飛槳實現詩歌的對答和一個簡單的閑聊機器人,一起來吧!
2快速實踐
針對生成式任務提供了()函數,內嵌于所有的生成式模型。支持Greedy Search、Beam Search和解碼策略,用戶只需指定解碼策略以及相應的參數即可完成預測解碼,得到生成的的token ids以及概率得分。
GPT模型使用生成API的小示例
1.加載 ..用于數據處理
文本數據在輸入預訓練模型之前,需要經過數據處理轉化為Feature。這一過程通常包括分詞,token to id,add special token等步驟。
對于各種預訓練模型已經內置了相應的,指定想要使用的模型名字即可加載對應的。
調用的方法即可將我們說的話轉為模型可接受的輸入。
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.使用一鍵加載預訓練模型
提供了GPT,等中文預訓練模型,可以通過預訓練模型名稱完成一鍵加載。
GPT以 Decoder的編碼器為網絡基本組件,采用單向注意力機制,適用于長文本生成任務。
目前提供多種中英文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的用法也是非常的簡便。
模型和生成式API完成閑聊對話
1.加載..kenizer用于數據處理
kenizer的調用方式與GPT相同,但數據處理的API略有不同。
調用kenizer的方法即可將我們說的話轉為模型可接受的輸入。
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.使用一鍵加載預訓練模型
與GPT相同,我們可以一鍵調用預訓練模型。
以的編碼器為網絡基本組件,采用靈活的注意力機制,并在模型輸入中加入了標識不同對話技能的special token,使得模型能同時支持閑聊對話、推薦對話和知識對話。
目前為提供了三個中文預訓練模型:
from paddlenlp.transformers import UnifiedTransformerLMHeadModel
model = UnifiedTransformerLMHeadModel.from_pretrained(model_name)
下一步我們將處理好的輸入傳入函數,并配置解碼策略。
這里我們使用的是TopK加的解碼策略。即從概率最大的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