Google ColabでAIキャラクター同士を会話させてみた!
はじめに
この記事では、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で実行するためのコードを紹介し、それぞれの部分について詳しく解説します。
コードの準備:
まず、必要なライブラリをインポートします。time と threading は対話を管理するため、os と openai は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を使用して、アニメキャラクター「のび太くん」と「ドラえもん」による会話シミュレーションを実装する手法を解説しました。この技術を応用することで、AIキャラクター間の会話を簡単に生成できることが確認できました。これにより、エンターテイメントや教育、カスタマーサポート、マーケティングなど、さまざまな分野での活用が可能です。
提供できるサービス
私は、以下のようなシステム開発とコンテンツ作成を幅広くサポートしています。OpenAI APIをはじめとするさまざまな技術を活用し、お客様のニーズに合わせたソリューションを提供します。
自動化システムの構築:AIを利用したカスタマーサポート、FAQシステム、チャットボットなど、業務効率化を図るためのシステムを構築します。ニーズに応じて最適なツールや技術を組み合わせて対応します。
GPTs/Dify開発:OpenAIの技術を活用し、カスタムGPTモデルやDifyを使用したシステム開発をサポートします。
コンテンツ作成:AIを活用したコンテンツ作成を支援します。ブログ記事、マーケティング資料、教育コンテンツなど、さまざまな分野でのコンテンツを作成します。
案件のご相談はこちらから
これらの技術やサービスに興味がある方、または具体的なプロジェクトのご相談がある方は、ぜひお気軽にご連絡ください。お客様のニーズに合った最適なソリューションを提供いたします。
TwitterのDMでもお問い合わせいただけます。Twitterでの問い合わせはこちら