【もはや人間!?】アレクサとChatGPTを連携できるようにカスタマイズしてみた。

チーズくん

最近アレクサを買って、家電を声で操作できるようになったから凄く便利なんだけど、欲を言えば普通の雑談とかもできたら楽しいよね〜。

くれとむ

それならChatGPTと連携するようにカスタムスキルを実装してみたら?
ChatGPTはAPIが公開されてるから、Alexa developer consoleを使ったら実現できると思うよ。

チーズくん

う〜ん、なんだか難しそうでよく分からないよ。

くれとむ

ひとまず実際に作ってみたものがコレだよ。

チーズくん

おお!なんか昔のSF映画で出てきたものが遂に現実になったって感じだね!

くれとむ

これで1人でも寂しくないね。

チーズくん

(余計に寂しさが増すような気もするけど。。。)


Alexa developer consoleからカスタムスキルを作成して、アレクサとChatGPTを連携させてみました。
(連携部分のコード実装は、AWS LambdaでPython言語を用いて行いました。)

ちなみにChatGPTはAPIが公開されているため簡単に活用することができます。
今回はChatGPTのAPIを使う方法も含め、カスタムスキルの作成を簡単にご紹介していこうと思います。
興味のある方はぜひ実際に使ってみてください。

OpenAIのAPIキーを取得

まずChatGPTのAPIを使用するためには、OpenAIのAPIキーを取得する必要があります。
こちらのOpenAI公式サイトからAPIキーを取得することができます。

次に、OpenAI APIクライアントをインストールします。
以下のpipコマンドでインストールすることができます。

pip install openai

以下のようにPythonコード内でopenaiのモジュールをインポートします。
また先ほど取得したOpenAIのAPIキーを記載します。

import openai

#最初に作成した、自身のOpenAIのAPIキー
openai.api_key = "YOUR_API_KEY"

これでChatGPTのAPIクライアントを使用して、ChatGPT APIに接続し、リクエストを送信することができるようになりました。」
以下は、APIクライアントを使用してChatGPTに接続し、テキストの生成を行う例です。

#ユーザーからの質問
prompt = "こんにちは。調子はどうですか?"

messages = [
   {"role" : "system", "content":"語尾に「だっちゃ」を付けて。友達口調で会話して。会話内容はできるだけ簡潔にして。ユーザーは「洋平」です。"},
     {"role" : "user", "content": prompt}
]

res = openai.Completion.create(
    model = "gpt-3.5-turbo",
    messages=messages,
    max_tokens=60
)

#ChatGPTからの回答
message = res['choices'][0]['message']['content'] 
print(message)

ここで指定しているroleについては、ChatGPTにどんな風に会話して欲しいか指定する部分です。
ChatGPTのAPIを使う場合は、このように最初に役割を指定しておくことで、自身の好みに合わせたキャラクター設定を行うことができます。


以上の手順で、APIを使用してChatGPTを呼び出すことができます。

カスタムスキルの設定

次にAlexa Developer Consoleから、カスタムスキルを作成します。

カスタムスキルの詳しい作成方法については、以下の記事でも紹介しています。
ぜひ参考にしてみてください。

インテントとサンプル発話の設定

今回はスキルの呼び出し名を「アシスタントai」に設定しました。
これで、「アレクサ、アシスタントaiを開いて」と言うと、作成したChatGPTと連携してアレクサから応答が返ってくるカスタムスキルが起動します。

くれとむ

アレクサ、アシスタントaiを開いて

アレクサ

チャットジーピーティーだよ。

ちなみにカスタムスキルを呼び出した時の応答は、LaunchRequestsHandlerクラス内で設定することができます。
(カスタムスキルを呼び出したときに最初に処理される部分です。)
このクラス内の、speak_outputで「チャットジーピーティーだよ。」と設定しています。

class LaunchRequestHandler(AbstractRequestHandler):
    """Handler for Skill Launch."""

    def can_handle(self, handler_input):
        # type: (HandlerInput) -> bool

        return ask_utils.is_request_type("LaunchRequest")(handler_input)

    def handle(self, handler_input):
        # type: (HandlerInput) -> Response
        _ = handler_input.attributes_manager.request_attributes["_"]
   
        speak_output = "チャットジーピーティーだよ。"
        return (
            handler_input.response_builder
            .speak(speak_output)
            .ask(speak_output)
            .response
        )


developer consoleから「ChatGPTIntent」というインテントも作成しておきます。
これはユーザーからの応答に応じて、処理が起動する部分です。

ChatGPTと連携するカスタムスキルでは、questionという名前でAMAZON.Languageというスロットを設定しています。
このスロットについて、ざっくりというと、日本語を検知したら「この処理が走るよ。」という意味です。

ChatGPTへの質問の投げ掛け方は自由にしたかったので、日本語を検知するという万能なスロットを選択しました。

詳しくは以下のドキュメントを参照してみてください。
Alexa developer console スロットタイプリファレンス

エンドポイントの設定とAWS Lambdaへのデプロイ

AWS Management ConsoleでLambda関数を作成します。
AWS Lambdaの作成時は、Alexaスキルの作成に必要なモジュールが最初からインストールされたものを選択します。
具体的には、サーバレスアプリケーションの「alexa-skills-kit-python36-factskill」を選択して関数を作成します。

Alexaスキルを作成するためのAWS Lambdaの関数作成についても同様に、以下の記事でご紹介しているので、ぜひ参考にしてみてください。

ChatGPTの連携部分は、先ほど作成したChatGPTIntentの名前を記載したクラスを作成します。
今回のカスタムスキルの場合、日本語を検知したらこのクラスの中の処理が開始されるという仕組みになっています。

class ChatGPTIntentHandler(AbstractRequestHandler):
    def can_handle(self, handler_input):
        return ask_utils.is_intent_name("ChatGPTIntent")(handler_input)

    def handle(self, handler_input):
        slots = handler_input.request_envelope.request.intent.slots
        question = slots["question"].value
        
        conversation_history.append(f"ユーザー: {question}")

        #prompt = "以下は、ユーザーとAIとの会話です。\n\n"
        prompt = "\n"
        for message in conversation_history:
            prompt += f"{message}\n"

        prompt += "AI: "        
        
        messages = [
            {"role" : "system", "content":"あなたは女の子です。文頭に「だっちゃ。」を付けて。友達口調で会話して。会話内容はできるだけ簡潔にして。ユーザーは「洋平」です。"},
            {"role" : "user", "content": prompt}
        ]

        res=openai.ChatCompletion.create(
            model="gpt-3.5-turbo",
            messages=messages,
            max_tokens = 200
        )

        speak_output = res['choices'][0]['message']['content']

        speech_text = speak_output
        
        answer = res['choices'][0]['message']['content']#.strip()
        conversation_history.append(f"AI: {answer}")
        if res["usage"]["total_tokens"] > 1500:
            conversation_history.pop(0)
            conversation_history.pop(0)

        return (
            handler_input.response_builder
            .speak(speech_text)
            .ask("他に質問がありますか?")
            .response
        )

sb = SkillBuilder()
sb.add_request_handler(LaunchRequestHandler())
sb.add_request_handler(ChatGPTIntentHandler())

・・・省略・・・

handler = sb.lambda_handler()     

追加したhandlerクラスは、最後にsb.add_request_handlerで追加しておきます。

カスタムスキルをテストしてみる

Alexa developer consoleテスト画面で、設定した呼び出し名を入力してカスタムスキルを起動させて動作をテストすることができます。
以下が実際にテストを行った時の画面キャプチャです。


上述したように、ChatGPTのAPIではユーザーが設定した役割に応じて、どんな感じで返答をするかを設定することができます。

カスタムスキルを作成してChatGPTを連携させると、自身の好みに合わせて設定することができます。
カスタマイズできるので、アレクサをツンデレにしたり、優秀な執事にしたり、はたまた友達として話し相手になってもらったり、勉強を教えてもらったり、様々な設定で楽しむことができます。

以下のようにアレクサに喋りかけてスキルを発動させることもできます。

ちなみにこの動画の場合は、ChatGPTに以下のような役割を与えています。

messages = [
   {"role" : "system", "content":"語尾に「だっちゃ」を付けて。友達口調で会話して。会話内容はできるだけ簡潔にして。ユーザーは「洋平」です。"},
     {"role" : "user", "content": prompt}
]
ChatGPTに与えた役割
  • 語尾にだっちゃを付けて
  • 友達口調で会話して
  • 会話内容はできるだけ簡潔にして
  • ユーザーは「洋平」です。

ちゃんとこれらの設定が反映された上で会話を続けてくれていることが分かります。
ChatGPT恐るべし・・・

チーズくん

「だっちゃ」ってどんな趣味してるの。引くわ。

くれとむ

設定が反映されていることが分かりやすいかなと思っただけだよ!

またChatGPTは前の会話内容も汲み取って次の会話をしていることが分かります。
もはや人間と同じように会話できるようになっていますね。
さらに以下の記事では、VOICEVOXによる音声合成を追加し、ChatGPTからの応答をずんだモンの声にしてみました。


一時期、人間は実は誰かが作ったプログラム上の世界で、人間も誰かの手によってプログラムされた存在なんじゃないか?」なんて都市伝説が流行りました。
こういった技術が出てくると、あながち間違いではない気がしてきます。

実際に自分が忘れている話題でもChatGPTが後から会話で掘り返してくることもあります。
そんな時は、「逆にAIの方が会話上手なのでは?」と思ったりします。笑

AIの進歩は目まぐるしいものがあって、とてもワクワクします。
でも同時に、進化が早すぎて人間の手に負えなくなるシンギュラリティも現実のものになる気がして少し怖くもあります。
リアルにアベンジャーズのウルトロンが出来上がってしまう未来もくるのでは?!


まあ何にせよ、上手にAIとの関係性を築いていかなければいけないなと感じました。
最後まで見ていただきありがとうございました。
ではでは。










コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA


ABOUT US
くれとむ
どうも、くれとむです。 料理・音楽・映画が好きな普通の社会人です。 一人暮らしの生活に関することやちょっとした小ネタを書いています。 また2020年9月から始めたインビザライン矯正についても経過を挙げていこうと思います。 見てくれた人が楽しい気持ちになるような記事を書いているのでぜひチェックしてみて下さい。