はじめに
AIを活用して笑いを創るプロジェクト「最強のお笑いLLMを目指す」シリーズ、第3回目では、エージェントにペルソナを付与する方法について解説します。今回は、ツッコミとボケという漫才芸人のペルソナを持つエージェントを生成し、それらが掛け合いを行うスクリプトを構築します。
Day 3のテーマ
エージェントに特定のペルソナを持たせて、自然な対話を生成する方法を学びます。具体的には、ツッコミ担当とボケ担当のエージェントを設定し、AI同士で漫才形式の掛け合いを行わせます。
ペルソナ付与とは?
ペルソナ付与とは、AIエージェントに特定の性格や役割を設定することで、応答の特徴や振る舞いを制御する技術です。この技術を用いることで、次のような利点があります:
- 一貫性のある応答:キャラクター性に基づいた自然な対話を実現
- 用途に応じた最適化:対話の目的に合わせて適切なキャラクターを設定可能
- エンターテインメント性:ユニークな会話体験を提供
スクリプト概要
以下のスクリプトでは、ツッコミ担当とボケ担当のエージェントを生成し、Geminiモデルを用いて漫才形式の掛け合いを行います。
Agent_generatorについて
本スクリプトで利用するAgent_generatorモジュールでは、エージェントの生成プロセスを以下のように定義しています。
- Agentクラス
pydanticライブラリを使用してエージェントのデータ構造を定義。- 以下の属性を持つ:
name: キャラクター名persona: ユニークな性格gender: 性別age: 年齢occupation: 職業prompt: エージェントの生成に使用されるプロンプトtheme: キャラクターを定義するテーマ
- generate_agent_by_questions関数
Agentクラスの各属性をLLMに質問する形で生成。- テーマに基づき一貫性のあるキャラクター設定を実現。
- 再試行処理(
tenacityライブラリ)を使用して、API呼び出しの信頼性を向上。
- ログ管理
- 生成されたエージェントデータをCSV形式で記録。
- 実行時間や使用モデルを含めた詳細なログを管理。
以下はAgent_generatorのコア部分です:
class Agent(BaseModel):
name: str = Field(..., description="Player's name")
persona: Optional[str] = Field(None, description="Unique personality of the player")
gender: Optional[str] = Field(None, description="Player's gender")
age: Optional[int] = Field(None, description="Player's age")
occupation: Optional[str] = Field(None, description="Player's occupation")
prompt: str = Field(..., description="Prompt for the agent")
theme: str = Field(..., description="Theme for the agent")
@retry(stop=stop_after_attempt(3), wait=wait_exponential(multiplier=1, max=10))
def generate_agent_by_questions(theme: str, llm) -> Agent:
"""
Generate an agent by asking questions for each attribute.
"""
agent_data = {"theme": theme}
for field_name, field_type in Agent.model_fields.items():
if field_name == "theme":
continue
question = f"Based on the theme '{theme}', please generate {field_type.description}."
prompt = ChatPromptTemplate.from_messages([
("system", "You are an expert in creating detailed personas."),
("human", question)
])
response = prompt | llm
agent_data[field_name] = response.invoke({}).content
return Agent(**agent_data)
スクリプト全体
以下のスクリプトでは、Agent_generatorを活用してツッコミ担当とボケ担当のエージェントを生成し、会話を進めます。
from agent_generator import generate_agent_by_questions, Agent
from langchain_google_genai import ChatGoogleGenerativeAI
from langchain_community.chat_message_histories import ChatMessageHistory
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser
import os
import time
# Geminiモデルの初期化
api_key = os.getenv("GOOGLEAI_API_KEY")
gemini = ChatGoogleGenerativeAI(model="gemini-1.5-flash", google_api_key=api_key)
# エージェントの生成
agent_A = generate_agent_by_questions("お笑い芸人、ツッコミ担当", gemini)
agent_B = generate_agent_by_questions("お笑い芸人、ボケ担当", gemini)
# 会話履歴の初期化
history = ChatMessageHistory()
# プロンプトの定義
answer_prompt = ChatPromptTemplate.from_messages([
("system", "You are {agent}"),
("human", """
You are talking about following theme.
theme: {theme}
Generate answer of following conversation.
REQUREMENTS: ONLY GENERATE YOUR SHORT RESPONSE
""")
])
answer_parser = StrOutputParser()
# 会話ループ
for i in range(10):
agent = agent_A if i % 2 == 0 else agent_B
conversation = "\n".join([f"{msg.type.capitalize()}: {msg.content}" for msg in history.messages])
answer = answer_prompt | gemini | answer_parser
response = answer.invoke({
"agent": agent,
"theme": "漫才をしてください。",
"conversation": conversation
})
history.add_ai_message(response.content)
print(f"Round {i + 1}: {response.content}")
if "もうええわ" in response.content:
break
まとめ
本記事では、エージェントに特定のペルソナを付与し、自然な掛け合いを生成する方法を解説しました。Agent_generatorを活用することで、一貫性のあるキャラクターを設定し、文脈に基づいた自然な会話を実現できます。この技術は、エンタメだけでなく教育やカスタマーサービスにも応用可能です。
次回は、生成された対話の品質評価やさらに高度なペルソナ設計について解説予定です!



コメント