見出し画像

唐突な思い付きで会話できる AI を作った話 (続編)

 こんにちはこんばんは、teftef です。今回は3週間ほど前に書いた GPT-3 モデルを使用したチャットbot の実装の続編です。先日 Chat-GPT をについて記事を書いたのですが、その記事の続編です。ある程度の Python の知識がある方なら簡単に作れてしまうと思います。また今回は実装というより、promptエンジニアリングに沿った内容が多めです。
 私もまだ初学者であり、説明が間違っていたり勘違いがある可能性が 0 ではないということをご了承ください。ぜひコメントなどをいただけたら幸いです。
それでは行きます。

GPT モデルとは

 GPTモデルは、膨大な量のテキストデータを用いてトレーニングされた後、テキスト生成、文章分類、文書要約などのNLPタスクを解決することができます。最近のGPTモデルでは、OpenAIが開発したGPT-3は、トレーニングに使用されたデータセットの規模が非常に大きく、13億個以上のパラメータを持つことで、非常に高度なNLPタスクを実行することができます。使用することができるのですが、この ChatGPTは中に本当に人間がいるのではないかという高性能で、とても自然で高品質な会話をすることができます。

GPT-3-turbo API

 3月1日に OpenAI からビッグニュースが出ました。ChatGPTを API で使用できるようになりました。 ChatGPTは多分この記事を読んでくださっている方ならご存じだと思いますが、OpenAIが開発する大規模自然言語モデル (LLM) を使ったサービスです。恐らく2023年3月現在、最も高性能な大規模自然言語モデル (LLM) となっています。これまで、 OpenAI は davinch-3 という GPT-3 ベースのモデル使うことができましたが、3月1日をもってこの ChatGPT のモデルを使用できるようになりました。

ChatGPTでできること

 それでは ChatGPT を用いてどのような会話ができるのかというとこんな感じです。

ChatGPT API を使用した Chatbot 

 では前回の記事で作った Chatbot を改造します。もう一度やりたいことのフローチャートを書きます。(雑でごめんね)

この赤字の部分が前回と違うところです。ここを ChatGPT に置き換えます。今回使用したコードを記しておきます。
このコード、この記事の丸パクリなので、こちらの方が参考になるかもです。

import openai
import tkinter as tk
import re
from pydub import AudioSegment, playback

class AIChat:
    def __init__(self):
        # APIキーを設定
        openai.api_key = ""

    def response(self,new_message_text:str, settings_text:str = '', past_messages:list = []):

        if len(past_messages) == 0 and len(settings_text) != 0:
            system = {"role": "system", "content": settings_text}
            past_messages.append(system)
        new_message = {"role": "user", "content": new_message_text}
        past_messages.append(new_message)

        result = openai.ChatCompletion.create(
            model="gpt-3.5-turbo",
            messages=past_messages
        )
        response_message = {"role": "assistant", "content": result.choices[0].message.content}
        past_messages.append(response_message)
        response_message_text = result.choices[0].message.content

        return response_message_text, past_messages

 やっていることは past_messages に格納された "記憶" 兼 Prompt であり、これを ChatGPT に渡して、その ChatGPT の返答をこれが response_message_text として返され、また記憶として次回の past_messages に格納されます。この部分が今回の ChatAIの心臓部となっています。

記憶

chatGPT に記憶を持たせるためには、今のところ大きく分けて2つの方法があります。
・ファインチューニング
・会話 Log の保存

ファインチューニング

 これはGPT-3 モデルに限ったことなのですが、ファインチューニングをすることができます。例えば会話の log を
{"input" : "こんにちは~" , "出力" : "こんにちは、私は ChatAI です。"}
のように json 形式ですべて保存しそれを使ってファインチューニングします。この方法の問題点として、リアルタイムで学習することができないため、リアルタイムの記憶蓄積はできません。

会話 Log の保存

 今回はこちらの方法を用いています。これは ChatGPT でも可能で、 GPT-3.5 モデルに入力する Prompt として、 会話 Log を渡します。そうするとこれまでの流れを読んでくれ、記憶してくれるようになります。しかしこの方法の問題点として 会話 Log を全て渡す必要があるので、Token 数が増えていき、会話が進むにつれ、だんだん料金が高くなってしまいます。

Prompt 設計

 ChatAI がどのようにふるまうかを設定することが重要になってきます。今回の ChatAI を作るにあたって参考に下記事を載せます。

感情パラメーター

 今回の ChatAI には感情パラメーターを与えました。喜怒哀楽妬の5つの感情を使って会話をしました。以下にこの Prompt を書いておきます。この Prompt によって"感情のパラメーターと会話文"という形式で返答するように指定していて、すべての会話において感情のパラメーターと会話文を返してくれるようになります。 GPT-3 だとこの形式が守られないことが多いですが、 ChatGPT ではかなり安定します。会話を10セットつなげたのですが、この形式は守られていました。

あなたは、喜しい、怒り、哀しい、楽しい、妬ましいの5つの感情パラメーターを定義し、これらで自分の感情を表現してください。あなたは私に話しかけられた言葉を元に感情を調整してください。
以後の会話ではまず現在の感情パラメータを出力し、その後に会話を出力してください。

出力形式は以下のフォーマットとします。

以下に例を示します。

【現在の感情パラメーター】
喜 : 0.5 
怒 : 0.4 
哀 : 0.0 
楽 : 0.1 
妬 : 0.0 

【会話部分】
入力 : こんにちは。
ChatAI : こんにちは、よろしくお願いします。
入力 : 今日は何を食べましたか?
ChatAI : こんにちは、よろしくお願いします。

のように返答してください。それでは私が入力をしたら始めてください。

入力 : こんにちは

動く様子

 ではこれを使って実際に動く様子を見てみます。今回はキーボードの "T" キーを押している間のみ音声を検出できるシステムとして設定しています。
これはそのうちアレクサみたいに呼びかけると話を聞いているようにしたいですね。

次回予告と宣伝

 今後の開発の開発目標としては、まず 3D モデルを作成し、GateBox 内で動くようにすることと、 GUI を整えることです。今回、縁あって、GateBoxを頂くことができたので、これを目標としていきたいです!
 今回は少し内容が少ないですが、会話 AI を実装するにあたっての工夫と参考にした記事についてまとめました。コードは近日公開です。

最後に

 最後まで読んでいただきありがとうございました。最後に少し宣伝です。主のteftefが運営を行っているdiscordサーバーを載せます。このサーバーではMidjourneyやStble Diffusionのプロンプトを共有したり、研究したりしています。ぜひ参加して、お絵描きAIを探ってみてはいかがでしょう。(teftef)

 ↓↓もしよろしければこの記事と開発の支援お願いいたします!


この記事が参加している募集

AIとやってみた

この記事が気に入ったらサポートをしてみませんか?