#The introduction
会話を記録していくChatbotを作ります。個人的な使用ならば問題無いでしょうが会話内容がファイルに残るので一応プライバシー等に注意してください。
###今回やったこと
とりあえずdiscordのChatbotを何か作りたいと思い立って、会話の中で成長する比較的単純なbotを作りました。
###どうしてそれをするのか
https://medium.com/@kirkouimet/my-conversation-with-an-artificial-intelligence-about-coronavirus-covid-19-742c0dd9abbe
この記事に感銘を受けて、私も最終的にこれに似たものを作りたいと思いました。今回これを作ったのには二つの目的があります。一つにはChatbotのAIを作るための第一歩、チャットでランダムに振る舞うbotを作ること、もう一つには自動的に人間が作った文章を記録しデータセットとして残すこと。実際にAIの学習に使うデータセットを作るためにはこのbotで集めたデータに目的に応じた教師ラベルをつけることや適宜データを加工するなどの工程を踏む必要がありますが、単純に人間が作った文章のデータを蓄積させることもデータセット作りの第一歩として、やってみなければ方向性もつかめないと思います。
###背後にある意味
訓練された人間のように振る舞うChatbotができれば、現在人間がしている特定の仕事はコンピュータが代わりにしてくれるようになります。この事実を見て、人が仕事を奪われると考えるのか、人が仕事から解放されもっと高尚なことに時間を使うことができるようになると考えるのかはそれぞれですが、ちょうど資本主義のように全体としての利益を考えるならば、仕事を一時的に失うことは非常につらく悲しいことではありますが、最終的に全てを自動化しその利益から捻出されるUniversal Basic incomeで人類全員が自分のしたくない労働をせずに暮らす社会が理想形でしょう。AIを搭載したChatbotを開発することは、潜在的には人の仕事を奪うことであり、同時に、人類の最終的な発展に少なくとも寄与する行為であることを念頭に責任と倫理観を持って開発しましょう。
###ここから将来的に何が可能か
今回、会話の中で覚えた文章を記録し、何か発言を見ると、覚えた文章の中からランダムで文章を出力しDiscordで送るというbotを作りました。ここからこれをAIに発展させるために何ができるでしょうか。
1. Chatbotの返信の質を人間が評価し、AIに学習させる。
人間が打った文章がChatbotの返信のトリガーになっているわけですが、このトリガーとなった人間の文章とAIが繰り出す文章をAIに理解させるために数値化し、この数値(に変換された文章)にこの数値(文章)を返してみたけれど人間の評価はどうか、という風に教え込みます。
2. 人間同士の会話を学習させる。
人間が実際に行ったチャットでの会話を記録させ、後で学習させます。ただし人間の実際の会話はAならばB, CならばDというような完全なif 文で行われているとは思えません。従って時系列データとして処理する必要性が示唆されています。
#方法
###使ったライブラリ
import discord #Discord APIのwrapper
import pickle #蓄積データを外部に保存
import random
import os
###実装した機能の説明
- メッセージが来たら、それをリストに保存 (データ蓄積機能)
- そのメッセージをトリガーとしてリストの中の文章からランダムに発言(人間を楽しませてデータ収集を円滑にする機能)
###コード
import discord
import random
import pickle
import os
TOKEN = "YOURTOKENHERE"
path = "Your project path here"
client = discord.Client()
@client.event
async def on_ready():
print("Botchan Ready to serve")
text_path = os.path.join(path,"text.sav")
try:
file = open(text_path,"rb")
texten = pickle.load(file)
file.close
except:
texten = []
texten.append("Hello")
@client.event
async def on_message(message):
if message.author == client.user:
return
randomizer = random.randint(0,len(texten)-1)
random2 = random.randint(1,1) #返信を行う頻度を変更可能 ex) ...randint(1,100) 1%の確立で返信
if random2 == 1:
await message.channel.send(texten[randomizer])
if message.content.startswith("Save"): #誰かがSaveと発言すると蓄積したデータが実際にファイルに保存される。
file =open(text_path, "wb")
pickle.dump(texten,file)
file.close()
print("textfile Saved!")
else:
texten.append(message.content)
client.run(TOKEN)
#終わりに
今回は初歩的なものになりましたが、最終的にはKerasや機械学習を使ってBotに知能を持たせたいと思います。
ありがとうございました。