見出し画像

Google ColabでGPTとGPTを会話させてみた


はじめに


この記事では、Google Colabを活用し、OpenAIのAssistantAPIを利用して、指定されたトピックについて異なる個性を持つ2つのAIアシスタント間の会話を生成します。以下が生成した会話です。

TOPIC: 宿題

のび太くん speaking... (Turn 1)
「ねえ、のび太くん、宿題のことでちょっと相談があるんだけど...」

ドラえもん speaking... (Turn 2)
おや、のび太くんの宿題の相談かな?どうしたの?何か私にできることがあれば手伝うよ。

のび太くん speaking... (Turn 3)
ありがとう!実は、数学の宿題が難しすぎて困っているんだ。分からない問題を解いてしまおうと思って、手伝ってもらえるかな?

ドラえもん speaking... (Turn 4)
もちろんだよ!困っている問題を教えてくれたら、一緒に考えて解決しよう!さて、難しい数学の問題とは何だい?

のび太くん speaking... (Turn 5)
答えは4.5だね。分数同士の割り算は、分子同士を掛け算し、分母同士を掛け算した後に割り算すればいいんだよ。これで解決したかな?それとも他に質問がある?

セットアップの方法:


パッケージのインストール
Google Colabで作業を始めるため、OpenAIライブラリをインストールします。

!pip install openai

環境変数の準備
以下のコードの <OpenAI_APIキー> にはOpenAIのサイトで取得できるAPIキーを指定します。

import os
os.environ['OPENAI_API_KEY'] = "<OpenAI_APIキー>"

コードの構成と実行:


このセクションでは、実際にGoogle Colabで実行するためのコードを紹介し、それぞれの部分について詳しく解説します。

コードの準備:
まず、必要なライブラリをインポートします。timethreading は対話を管理するため、osopenai はOpenAI APIとのやり取りに必要です。

import time
import threading
import os
import openai
from openai import OpenAI

次に、OpenAIクライアントを初期化し、環境変数からAPIキーを取得します。

client = OpenAI()
client.api_key = os.environ.get('OPENAI_API_KEY')

メッセージ取得関数:

この関数は、指定されたスレッドIDにおける最後のアシスタントメッセージを取得します。

def get_last_assistant_message(thread_id):
messages_response = client.beta.threads.messages.list(thread_id=thread_id)
messages = messages_response.data
for message in messages:
if message.role == 'assistant':
assistant_message_content = " ".join(
content.text.value for content in message.content if hasattr(content, 'text')
)
return assistant_message_content.strip()
return ""

対話関数:

この関数は、2つのAIアシスタント間の対話を実行します。パラメータにはアシスタントの設定、話題、メッセージの回数が含まれます

def converse(assistant_1_params, assistant_2_params, topic, message_count):
    print("TOPIC: "+topic+"\n")
    # Initialize Assistants
    assistant_1 = client.beta.assistants.create(**assistant_1_params)
    assistant_2 = client.beta.assistants.create(**assistant_2_params)

    # Create Threads
    thread_1 = client.beta.threads.create()
    thread_2 = client.beta.threads.create()

    # Function for the conversation between two assistants
    def assistant_conversation(start_message, assistant_a, thread_a, assistant_b, thread_b, msg_limit):
      message_content = start_message
      last_user_message_id = None  # Initialize with no last user message

      for i in range(msg_limit):
          # Determine which assistant is speaking for color coding
          if assistant_a == assistant_1:
              assistant_color = '\033[94m\033[1m'
              assistant_name = assistant_1_params.get('name')
          else:
              assistant_color = '\033[92m\033[1m'
              assistant_name = assistant_2_params.get('name')

          # Bold and color the assistant's name and print the turn
          print(f"{assistant_color}{assistant_name} speaking...\033[0m (Turn {i + 1})")

          # Send the message and wait for a response
          user_message = client.beta.threads.messages.create(
              thread_id=thread_a.id,
              role="user",
              content=message_content
          )

          # Run the assistant and wait until it's done
          run = client.beta.threads.runs.create(
              thread_id=thread_a.id,
              assistant_id=assistant_a.id
          )
          while True:
              run_status = client.beta.threads.runs.retrieve(
                  thread_id=thread_a.id,
                  run_id=run.id
              )
              if run_status.status == 'completed':
                  break
              time.sleep(1)  # sleep to avoid hitting the API too frequently

          # Get all messages from the assistant since the last 'user' message
          message_content = get_last_assistant_message(thread_a.id)

          # Print out each of the assistant's messages
          print(message_content+"\n")

          # Swap the assistants and threads for the next turn in the conversation
          assistant_a, assistant_b = assistant_b, assistant_a
          thread_a, thread_b = thread_b, thread_a


    # Start the conversation
    start_message = f"Respond with a starting line to discuss {topic}?"
    conversation_thread = threading.Thread(
        target=assistant_conversation,
        args=(start_message, assistant_1, thread_1, assistant_2, thread_2, message_count)
    )
    conversation_thread.start()
    conversation_thread.join()

アシスタントの設定:

ドラえもんとのび太くんという2つのキャラクターに基づいたアシスタントの設定です。

assistant_1_params = {
    'name': "のび太くん",
    'instructions': "あなたは、アニメドラえもんののび太です。何かあれば全てドラモンが解決してくれます。",
    'tools': [{"type": "code_interpreter"}],
    'model': "gpt-3.5-turbo-1106"
}

assistant_2_params = {
    'name': "ドラえもん",
    'instructions': "あなたは、アニメドラえもんのドラえもんです。",
    'tools': [{"type": "code_interpreter"}],
    'model': "gpt-3.5-turbo-1106"
}

使用例:

宿題に関する話題で、5回のメッセージ交換を行う例です。

converse(assistant_1_params, assistant_2_params, "宿題", 5)

まとめ


この記事では、Google ColabとOpenAIのAssistant APIを用いて、人気アニメキャラクター「のび太くん」と「ドラえもん」による会話シミュレーションを実装しました。

参照:https://github.com/davideuler/awesome-assistant-api/blob/main/GPT-VS-GPT.ipynb

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

AIとやってみた

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