Blenderbotを日英翻訳してtwitter botに渡してみた
英語だとBlenderBot(https://huggingface.co/transformers/master/model_doc/blenderbot.html)みたいな感じで対話ボットのフレームワークがあって日本語にもあればいいのにと思っていたんですが、よく考えれば入出力を日英翻訳すればいいことに気づいたので、組んでみました。
まずBlender Botの使い方ですが、https://note.com/npaka/n/n658afd9a69d0 をほぼそのまま使いました。日英翻訳はgoogletrans(4.0.0-rc1)を使いましたが、どうも力技で翻訳を送ってるようなのでいつ止められてもおかしくないことに注意してください。
Google Colabなら次のコードで動きます。pipは単独のセルでないと実行できないと思います。
# BlenderBotの為に入れる
!pip install transformers
# 翻訳の為に入れる
!pip install googletrans=4.0.0-rc1
from googletrans import Translator
translator = Translator()
from transformers import BlenderbotTokenizer, BlenderbotForConditionalGeneration
# モデルとトークナイザーの準備
mname = 'facebook/blenderbot-400M-distill'
model = BlenderbotForConditionalGeneration.from_pretrained(mname)
tokenizer = BlenderbotTokenizer.from_pretrained(mname)
def ja2en(text):
trans_en = translator.translate(text)
print(trans_en.text)
return trans_en.text
def en2ja(text):
trans_ja = translator.translate(text, dest='ja', src='en')
# print("ja:", trans_ja.text)
return trans_ja.text
def chat(text_ja):
text_en = ja2en(text_ja)
inputs = tokenizer([text_en], return_tensors='pt')
reply_ids = model.generate(**inputs)
text = tokenizer.batch_decode(reply_ids)
text_ans = text[0].replace("<s>", "").replace("</s>", "")
print("ans:", text_ans)
text_ans_ja = en2ja(text_ans)
print("回答:", text_ans_ja )
実行例
> chat("恋がしたい")
I want to love
ans: That's a great goal to have. What is it that you want to do to love?
回答: それは持っているのは素晴らしい目標です。あなたが愛するためにやりたいことは何ですか?
あとはこれのやり取りをREST APIで行う為にFastAPIを設置し、既存のbotマシンからRESTで入力文を受け取って、応答文を返すようにしました。ここの設計は雑すぎるので省略します。
既存のbotプログラムは@ユーザ名で来た時にhttp requestを送り、受け取った文の語尾を変換しています。語尾の変換はキャラクタの特徴をつけるのにとても大事です。応答文の精度上げるより語尾を統一に力を注いだほうがいいです。
実行結果
ところで日英翻訳も今だとBERTみたいの使っていて、ニューラルネットの三度手間なことをしているようにも見えますね。転移学習?みたいのを使って日本語でもモデルを作れると賢い気もします。
またBlenderBotは恐らく一文章に対しての応答精度を上げる問題設定になっているように見えますが、実際の対話はいくつかの文章のやり取りになるので、学習の際にもう一次元くらい入力を増やす必要がある気がします。ここはSeq2Seqとか詳しくないので適当なこと言っています。
更に今回は推論の為にGeforce RTX 3060 TiとかいうGPUを使っていますが、botサーバのCPUで計算できないかは今度確認します。
Discussion