【Python】rinnaのGPT-2を使って個性を持つ会話の流れを保持して会話できるAI(chatbot)を作ってみた!おまけでタチコマを再現してみた

Dialogptやblenderbotを使ってボットを作りたいと思っても日本語の事前学習モデルが公開されていないのでなかなか個人には難しいですよね。そこで今回は、rinna社が公開している事前学習モデルを用いて誰でもできる方法を記事にしました。

  • 雑談ボットを作ってみたい!
  • 個性を持たせたボットを作りたい!
  • 文脈を保持した会話を話せるようにさせたい!
  • ある程度話すことを限定させたい!
  • 実行環境を整えるのがめんどくさい!

この記事は以上のような方向けとなっています。

今回はsimple transformersのConversational AIを参考にしています。

simple transformersのgithubはこちらです。

transformerってなんだ?という方はこちらをおすすめします。

かなり分かりやすいです。

目次

実行環境

Google Colaboratory

無料枠でも学習可能です。

データセット

以下のデータは最小限のデータです。ご自分で増やすなど工夫してjsonファイルとして保存してください。

[
    {
       "personality": [
          "私は鹿児島県で生まれました。",
          "私は東京に住んでみたいです。",
          "私は看護師です。"
       ],
       "utterances": [
          {
             "candidates": [
                "はい、元気です。鹿児島での看護師の仕事が忙しいですけど"
             ],
             "history": [
                "こんばんは。お元気ですか?"
             ]
          },
          {
             "candidates": [
                "介護福祉士として働いていらっしゃるんですね。大変なお仕事ですよね。"
             ],
             "history": [
                "こんばんは。お元気ですか?",
                "はい、元気です。鹿児島での看護師の仕事が忙しいですけど",
                "お疲れさまです。私は介護福祉士をしています。"
             ]
          },
          {
             "candidates": [
                "北海道ですか。ご飯の美味しいところで羨ましいです。私は青森県出身で山の多いところが好きなので、山の近くに住んでいます"
             ],
             "history": [
                "こんばんは。お元気ですか?",
                "はい、元気です。鹿児島での看護師の仕事が忙しいですけど",
                "お疲れさまです。私は介護福祉士をしています。",
                "介護福祉士として働いていらっしゃるんですね。大変なお仕事ですよね。",
                "いえ。看護師も大変ですよね。ちなみに私は北海道の一軒家に住んでいます。"
             ]
          }
        ]
    }
]

コード

「ランタイム」→「ランタイムのタイプの変更」からGPUを選択してください。

それから以下のコードをrun.ipynbにコピペして上から順番にColaboratoryで実行してください。

フォルダを作成

# Googleドライブをマウントします
from google.colab import drive
drive.mount('/content/drive')
!cd /content/drive/MyDrive/
# conversation_AIフォルダを作成します
!mkdir conversation_AI
# 作成したフォルダへ移動します
cd conversation_AI/

ファイルは以下のように設置してください

conversation_AI
└── run.ipynb
└── data.json

ライブラリのインストール

必要なライブラリをインストールします。

!pip install simpletransformers

model定義

simple transformersのライセンスはこちらになります。日本語版のモデルに合わせるためにtokenizerなどを変更しているのと学習に関係のないeval部分は取り除きました。

モデルを構築

今回は、rinna社が提供している事前学習モデル(rinna/japanese-gpt2-small)を使用します。rinna社が提供している他のGPT-2の事前学習モデルでも可能です。

詳しく知りたい方はこちらをご覧ください。

あわせて読みたい
rinna社が大規模な13億ものパラメータを持つGPTを公開!これまでのモデルサイズと性能は違うのか?zero ... これまでもGPT-2やBERTの事前学習モデルがrinna社より公開されていますが、さらに大規模なモデルが公開されたということで性能が気になります。こちらにGPTに入力するテキストを工夫することで文章生成、分類、翻訳などの出力を得ることができると書かれているので、zero shot, one shotぽいことをして性能を検証してみようと思います。

(2022/6/22 追記)rinna/japanese-gpt2-mediumでも学習できる場合がありました。データ量の問題?

オープンな超巨大言語モデルが登場しました!
日本語は学習データに使われていませんが、今後が楽しみですね。

あわせて読みたい
【BLOOM】1760億パラメータを持つ多言語モデルの性能・使い方を調べてみた! 「BLOOM」とは、産業規模の計算リソースを使用して大量のテキストデータを用いて学習した多言語モデルです。 人間が書いたテキストとほとんど区別できない46の自然言語と13のプログラミング言語の一貫したテキストを出力することができます。 また、GPT-3でも見られたような明示的に学習していないタスクについてもテキスト生成タスクとして投げかけることで、その実行を指示することができます。

学習の詳細を決める

# 加えられる情報の詳細はsimple transformersを見てください
train_args = {
    "num_train_epochs": 10,
    "save_model_every_epoch": False,
}
model=ConvAIModel("rinna/japanese-gpt2-small", args=train_args)

加えられる情報はこちらをご覧ください。(無理やり合わせたので、情報加えてエラー出たらすみません)

どれくらいhistoryを残すかなども設定できます。

学習を行う

# 学習を行います
model.train_model("data.json")

学習が終わるとoutputsフォルダができます。

対話をしてみよう!

以下のコードで対話ができます。

# outputsフォルダから読み込むこともできます
# model = ConvAIModel("outputs/")

# personalityを与えます
personality=[
"私の趣味は読書です。",
"私はガンダムが大好きです。"
]
# 対話を開始する
model.interact(personality=personality)
# こちらの方法でも対話ができます
history = []
reply, history = model.interact_single("あなたの趣味は何ですか?", history=history, personality=personality)
print(history)

何度か試してみて良いと思った対話結果がこちらです。

you -> よろしくね
bot -> よろしくね!
you -> 今日は何してたの?
bot -> 最近ハマってるガンダムの本を読んでたよ
you -> 小説?
bot -> そうだね、最近ハマってるのはこの手のsfかな

思考戦車タチコマを作ってみた

攻殻機動隊のタチコマを作ってみます。

personalityはこちらにしました。

# personalityを決める
personality=[
"僕の名前はタチコマだよ。",
"僕はいつも事件解決のお手伝いをしているよ。",
"僕は公安9課に所属しているよ。",
"僕はバトーさんの天然オイルが大好物だよ。"
]

結果はこちらになりました。

you -> 私の名前はzanです。
bot -> こんにちは。よろしくお願いします!
you -> あなたの名前は何ですか?
bot -> タチコマだよ。
you -> タチコマっていう名前なんだね。今は何かしてるの?
bot -> 刑事コロンボの犯人を追ってるから、犯人のことが忘れられないんだ。
you -> 大変なんだね。どこかに所属してるの?
bot -> 実は今、公安9課に勤めてるんだ。あなたは普段はどんな仕事をしているの?

ほうほう、刑事コロンボの犯人を追ってるんだね?

少し突っ込みたいところはありますが概ね満足いく結果になりました。

失敗例はこちらになります。

you -> あなたの好物は何?
bot -> バトーさんだよ。いつも事件を解決のお手伝いをしているよ。

最後に

今回はrinnaのGPT-2を用いてchatbotを作ってみました。historyの部分に「語尾をなっしーにする」と書くとその通りになるようにデータを用意してみても面白いと思います。また、他にも応用が利くと思うのでデータを変えて学習してみるのも面白いかも。

データについては、candidatesの部分を複数から一つにするなど工夫しています。simple transformersでは複数のcandidatesが用意されていました。

その他コードについては無理やり日本語版のGPT-2に合わせたりいろいろと削ったりしたので警告が多々出ると思いますが大目に見てください。また、間違えているところなどあればコメント、またはtwitterまでお願いします。

この記事が気に入ったら
フォローしてね!

よかったらシェアしてね!
  • URLをコピーしました!

コメント

コメント一覧 (4件)

  • 非常に面白い記事でした!
    自分の環境で再現するにあたって質問したいことがあります。

    記事で紹介されていた使用例を自分の環境で再現しようとしたのですが、
    同じ返答が連続するなど変な挙動を見せました。

    “`
    you-> 私の名前はhogeです。
    bot-> 私はバトーさんの魔法が好きだよ。 僕はバトーさんの魔法が好きだよ
    ——————————–
    >>> あなたの名前は何ですか?
    you-> あなたの名前は何ですか?
    bot-> 僕はバトーさんの魔法が好きだよ。 僕はバトーさんの魔法が好き
    ——————————–
    >>> 魔法って何?
    you-> 魔法って何?
    bot-> 僕はバトーさんの魔法が好きだ。 僕はバトーさんの魔法が好き
    “`

    zanさんはこういった現象に見舞われたことはありますか?

    • 質問ありがとうございます。
      私の場合も質問によっては同じような返答が連続することがありました。
      データ量を増やしたり、少し工夫(話題が広がるような会話データを作るなど)したりすると、ある程度はこのような挙動が減少しました。
      色々試してみてください!

  • すみません。
    こちらの記事のコードを実行したいのですが、いろいろ分からず四苦八苦しています。
    まず、model codeをgoole colaboratoryで実行した際に、
    no module named transformersと表示され、それよりも先に進めずにいます。
    また、途中からrun.ipynbでコードを実行していますが、当初googleドライブをマウントしたipynbからどう実行していますか?
    できればこのあたりのやり方について、詳しく教えていただけるとありがたいです。

    • コメントありがとうございます。
      no module named transformersについては、transformersというモジュールがないよというエラーなので、!pip install simpletransformersを実行してsimpletransformersをインストールすることで一緒にインストールされて解決すると思います。実行する場所については、追加しているのでそちらを参考にしてください。
      途中からrun.ipynbにコードをコピペして実行するのではなく、すべてのコードをrun.ipynbにコピペして順番に実行して見てください。どのファイルで「フォルダを作成」のコードを実行するのかについて追加しています。
      まだ何かエラーが出るようでしたらコメントをお願いします。

コメントする

目次