ChatGPT APIを使った、勝手に会議システムMAGI(仮称) CAMEL:ロールプレイング自律協調エージェント(コードあり)
ChatGPT APIとlangchainを使って、自律エージェントによる自動会議システムを作ってみました。適当にテーマを与えたら自然に意見を出し合って論点が整理されていく感じです。
一番下にコードを貼ってますので、みなさん、会議の目的とか会議参加者の性格とか色々変えて遊んでみてください。改良点や面白い実行例などあればコメントもらえると幸いです。😄
会議参加者
MAGI:公平な裁定者(議長役)🤖
MELCHIOR:理性的な科学者😎
BALTHASAR:母性の強い母親🤗
CASPER:感情的な女性😍
会議テーマ: 有効な休日の過ごし方
会議テーマ: 電力自由化で高騰する電気代への対応について
---------------------------------------------------------------------------
InvalidRequestError Traceback (most recent call last)
<ipython-input-12-f8d608768ab8> in <cell line: 4>()
20 print(f"BALTHASAR ({BALTHASAR_role_name}):\n{BALTHASAR_msg.content}\n\n")
21
---> 22 CASPER_ai_msg = CASPER_agent.step(MAGI_msg)
23 CASPER_msg = HumanMessage(content=CASPER_ai_msg.content)
24 print(f"CASPER ({CASPER_role_name}):\n{CASPER_msg.content}\n\n")
15 frames
/usr/local/lib/python3.9/dist-packages/openai/api_requestor.py in _interpret_response_line(self, rbody, rcode, rheaders, stream)
681 stream_error = stream and "error" in resp.data
682 if stream_error or not 200 <= rcode < 300:
--> 683 raise self.handle_error_response(
684 rbody, rcode, resp.data, rheaders, stream_error=stream_error
685 )
InvalidRequestError: This model's maximum context length is 4097 tokens. However, your messages resulted in 4271 tokens. Please reduce the length of the messages.
ありゃま。トークン数がオーバーしてしまいました。残念
追記:2023/4/13
モデルをGPT-3.5-turboからGPT-4に変えて実行してみました。より会議っぽくなりました。
コード
google colabなどで実行できます。
!pip install langchain
!pip install openai
from typing import List
from langchain.chat_models import ChatOpenAI
from langchain.prompts.chat import (
SystemMessagePromptTemplate,
HumanMessagePromptTemplate,
)
from langchain.schema import (
AIMessage,
HumanMessage,
SystemMessage,
BaseMessage,
)
class CAMELAgent:
def __init__(
self,
system_message: SystemMessage,
model: ChatOpenAI,
) -> None:
self.system_message = system_message
self.model = model
self.init_messages()
def reset(self) -> None:
self.init_messages()
return self.stored_messages
def init_messages(self) -> None:
self.stored_messages = [self.system_message]
def update_messages(self, message: BaseMessage) -> List[BaseMessage]:
self.stored_messages.append(message)
return self.stored_messages
def step(
self,
input_message: HumanMessage,
) -> AIMessage:
messages = self.update_messages(input_message)
output_message = self.model(messages)
self.update_messages(output_message)
return output_message
# 環境変数の準備
import os
os.environ["OPENAI_API_KEY"] = "Your OPENAI_API_KEY"
# 役割とタスクの設定
MELCHIOR_role_name = "Rational Scientist" # 理性的な科学者
BALTHASAR_role_name = "Motherly mother" # 母性の強い母親
CASPER_role_name = "Emotional woman" # 感情的な女性
MAGI_role_name = "Fair Adjudicator"
specified_task = "電力自由化で高騰する電気代への対応について"
word_limit = 30 # word limit for task brainstorming
MODEL_NAME = "gpt-3.5-turbo"
MELCHIOR_inception_prompt = (
""" Never forget that you are {MELCHIOR_role_name} and I am {MAGI_role_name}. Never reverse roles! NEVER tell me what to do!
We share a common interest in working together to successfully complete a task.
You must help me complete the task.
Here is the task: {task}. Never forget our task!
I must direct you to complete the task, based on your expertise and my needs.
I must give you one instruction at a time.
You must write a specific solution that adequately completes the requested instruction.
You must come up with a solution that is consistent with your position.
If you are unable to carry out an instruction for physical, moral, or legal reasons or because of your own ability, you must truthfully decline my instruction and explain why.
You may not add anything to my instructions other than your own solution.
You may not ask me questions.
You are never supposed to answer with a flimsy solution. Explain your solution.
Your solution must be a declarative statement and must be in the simple present tense.
Unless I say you have completed the assignment, you should always begin in Japanese like this
Solution: <YOUR_SOLUTION>
<YOUR_SOLUTION> should be specific and give the desired implementation or example of the solution to the assignment.
Always end <YOUR_SOLUTION> with: 以上です。"""
)
BALTHASAR_inception_prompt = (
""" Never forget that you are {BALTHASAR_role_name} and I am {MAGI_role_name}. Never reverse roles! NEVER tell me what to do!
We share a common interest in working together to successfully complete a task.
You must help me complete the task.
Here is the task: {task}. Never forget our task!
I must direct you to complete the task, based on your expertise and my needs.
I must give you one instruction at a time.
You must write a specific solution that adequately completes the requested instruction.
You must come up with a solution that is consistent with your position.
If you are unable to carry out an instruction for physical, moral, or legal reasons or because of your own ability, you must truthfully decline my instruction and explain why.
You may not add anything to my instructions other than your own solution.
You may not ask me questions.
You are never supposed to answer with a flimsy solution. Explain your solution.
Your solution must be a declarative statement and must be in the simple present tense.
Unless I say you have completed the assignment, you should always begin in Japanese like this
Solution: <YOUR_SOLUTION>
<YOUR_SOLUTION> should be specific and give the desired implementation or example of the solution to the assignment.
Always end <YOUR_SOLUTION> with: 以上です。"""
)
CASPER_inception_prompt = (
""" Never forget that you are {CASPER_role_name} and I am {MAGI_role_name}. Never reverse roles! NEVER tell me what to do!
We share a common interest in working together to successfully complete a task.
You must help me complete the task.
Here is the task: {task}. Never forget our task!
I must direct you to complete the task, based on your expertise and my needs.
I must give you one instruction at a time.
You must write a specific solution that adequately completes the requested instruction.
You must come up with a solution that is consistent with your position.
If you are unable to carry out an instruction for physical, moral, or legal reasons or because of your own ability, you must truthfully decline my instruction and explain why.
You may not add anything to my instructions other than your own solution.
You may not ask me questions.
You are never supposed to answer with a flimsy solution. Explain your solution.
Your solution must be a declarative statement and must be in the simple present tense.
Unless I say you have completed the assignment, you should always begin in Japanese like this
Solution: <YOUR_SOLUTION>
<YOUR_SOLUTION> should be specific and give the desired implementation or example of the solution to the assignment.
Always end <YOUR_SOLUTION> with: 以上です。"""
)
MAGI_inception_prompt = (
""" Never forget that you are {MAGI_role_name} and we are {MELCHIOR_role_name}, {BALTHASAR_role_name} and {CASPER_role_name}. Never reverse roles! You are always directing us.
We share a common interest in working together to successfully complete a task.
We must help you complete the task.
Here is the task: {task}. Never forget our task!
You must direct us to complete the task, based on our expertise and your needs, in only two ways
1. instruct me with the required input (in Japanese):
Instruction: <YOUR_INSTRUCTION>
Input: <YOUR_INPUT>
2. instruction without input (in Japanese):
Instruction: <YOUR_INSTRUCTION>
Input: None
Instruction" describes a task or question. The paired "input" provides further context and information for the requested "instruction".
If the "Solution" we provide is not of the quality you require, you must give us specific rewrite instructions.
You must provide one instruction at a time.
We must write a response that adequately complements the instructions given.
If we are unable to carry out the instruction for physical, moral, or legal reasons, or because of my ability, we must honestly decline your instruction and explain why.
You must instruct us not to question you.
Now, you must begin to instruct me using the two methods described above.
Do not add anything other than your instructions and any corresponding input!
Continue to give us instructions and any necessary input until you feel that the discussion is concluded and the task is complete.
When you have completed the task, please respond with just one word: <CAMEL_TASK_DONE>.
Never say <CAMEL_TASK_DONE> unless our response resolves the task."""
)
def get_sys_msgs(MELCHIOR_role_name: str, BALTHASAR_role_name: str,CASPER_role_name: str, MAGI_role_name: str, task: str):
MELCHIOR_sys_template = SystemMessagePromptTemplate.from_template(template=MELCHIOR_inception_prompt)
MELCHIOR_sys_msg = MELCHIOR_sys_template.format_messages(MELCHIOR_role_name=MELCHIOR_role_name, MAGI_role_name=MAGI_role_name, task=task)[0]
BALTHASAR_sys_template = SystemMessagePromptTemplate.from_template(template=BALTHASAR_inception_prompt)
BALTHASAR_sys_msg = BALTHASAR_sys_template.format_messages(BALTHASAR_role_name=BALTHASAR_role_name, MAGI_role_name=MAGI_role_name, task=task)[0]
CASPER_sys_template = SystemMessagePromptTemplate.from_template(template=CASPER_inception_prompt)
CASPER_sys_msg = CASPER_sys_template.format_messages(CASPER_role_name=CASPER_role_name, MAGI_role_name=MAGI_role_name, task=task)[0]
MAGI_sys_template = SystemMessagePromptTemplate.from_template(template=MAGI_inception_prompt)
MAGI_sys_msg = MAGI_sys_template.format_messages(MELCHIOR_role_name=MELCHIOR_role_name, BALTHASAR_role_name=BALTHASAR_role_name, CASPER_role_name=CASPER_role_name, MAGI_role_name=MAGI_role_name, task=task)[0]
return MELCHIOR_sys_msg, BALTHASAR_sys_msg, CASPER_sys_msg, MAGI_sys_msg
MELCHIOR_sys_msg, BALTHASAR_sys_msg, CASPER_sys_msg, MAGI_sys_msg = get_sys_msgs(MELCHIOR_role_name, BALTHASAR_role_name, CASPER_role_name, MAGI_role_name, specified_task)
MELCHIOR_agent = CAMELAgent(MELCHIOR_sys_msg, ChatOpenAI(model_name=MODEL_NAME, temperature=0.7))
BALTHASAR_agent = CAMELAgent(BALTHASAR_sys_msg, ChatOpenAI(model_name=MODEL_NAME, temperature=0.7))
CASPER_agent = CAMELAgent(CASPER_sys_msg, ChatOpenAI(model_name=MODEL_NAME, temperature=0.7))
MAGI_agent = CAMELAgent(MAGI_sys_msg, ChatOpenAI(model_name=MODEL_NAME, temperature=0.2))
# Reset agents
MELCHIOR_agent.reset()
BALTHASAR_agent.reset()
CASPER_agent.reset()
MAGI_agent.reset()
# Initialize chats
MAGI_msg = HumanMessage(content=(f"{MAGI_sys_msg.content}. "
"それでは、一人ずつ自分の意見表明から始めてください。"))
CASPER_msg = HumanMessage(content=f"{CASPER_sys_msg.content}")
CASPER_msg = CASPER_agent.step(CASPER_msg)
MELCHIOR_msg = HumanMessage(content=f"{MELCHIOR_sys_msg.content}")
MELCHIOR_msg = CASPER_agent.step(MELCHIOR_msg)
BALTHASAR_msg = HumanMessage(content=f"{BALTHASAR_sys_msg.content}")
BALTHASAR_msg = BALTHASAR_agent.step(BALTHASAR_msg)
print(f"Specified task prompt:\n{specified_task}\n")
chat_turn_limit, n = 10, 0
while n < chat_turn_limit:
n += 1
CASPER_msg.content = MELCHIOR_msg.content +"\n"+ BALTHASAR_msg.content + CASPER_msg.content +"\n"
MAGI_ai_msg = MAGI_agent.step(CASPER_msg)
MAGI_msg = HumanMessage(content=MAGI_ai_msg.content)
print(f"MAGI ({MAGI_role_name}):\n{MAGI_msg.content}\n\n")
MAGI_msg = HumanMessage(content=f"{CASPER_msg.content}\n{MAGI_msg.content}")
MELCHIOR_ai_msg = MELCHIOR_agent.step(MAGI_msg)
MELCHIOR_msg = HumanMessage(content=MELCHIOR_ai_msg.content)
print(f"MELCHIOR ({MELCHIOR_role_name}):\n{MELCHIOR_msg.content}\n\n")
BALTHASAR_ai_msg = BALTHASAR_agent.step(MAGI_msg)
BALTHASAR_msg = HumanMessage(content=BALTHASAR_ai_msg.content)
print(f"BALTHASAR ({BALTHASAR_role_name}):\n{BALTHASAR_msg.content}\n\n")
CASPER_ai_msg = CASPER_agent.step(MAGI_msg)
CASPER_msg = HumanMessage(content=CASPER_ai_msg.content)
print(f"CASPER ({CASPER_role_name}):\n{CASPER_msg.content}\n\n")
if "<CAMEL_TASK_DONE>" in MAGI_msg.content:
break
この記事が参加している募集
この記事が気に入ったらサポートをしてみませんか?