5.6K Views
November 18, 23
スライド概要
Generative AI Study Group
11回Theme資料
Generative Ai Study Group Master
Index • AutoGenの例 • ChatDevの例 • OpenAI Assistantについて • OpenAI Assistantとマルチエージェント
AutoGenの例
AssistantAgent
UserProxyAgent
Assistantとユーザー(UserProxyAgent)との一対一の会話
import autogen
config_list = autogen.config_list_from_json(
"OAI_CONFIG_LIST",
file_location=".",
filter_dict={
"model": ["gpt-4"],
},
)
llm_config={
"request_timeout": 600,
"seed": 42,
"config_list": config_list,
"temperature": 0,
}
# AssistantAgentを作成
assistant = autogen.AssistantAgent(
name="assistant",
llm_config=llm_config,
)
# UserProxyAgentを作成
user_proxy = autogen.UserProxyAgent(
name="user_proxy",
human_input_mode="TERMINATE",
max_consecutive_auto_reply=10,
is_termination_msg =
lambda x: x.get("content", "").rstrip().endswith("TERMINATE"),
code_execution_config={"work_dir": "web"},
llm_config=llm_config,
system_message=""" そ の タ ス ク が 完 全 に 満 足 の い く 形 で 解 決 さ れ た 場 合 は 、
TERMINATEと答える。
そうでなければ、CONTINUEか、タスクがまだ解決していない理由を答えなさい。"""
)
# Assistantとの会話を開始
user_proxy.initiate_chat(
assistant,
message="""
冷蔵庫にある材料で夕飯を作りたいです。
冷蔵庫には、卵、トマト、玉ねぎ、にんじん、じゃがいも、豚肉があります。
""",
)
AutoGenの例 user_proxy (to assistant): 冷蔵庫にある材料で夕飯を作りたいです。 冷蔵庫には、卵、トマト、玉ねぎ、にんじん、じゃがいも、豚肉があります。 -------------------------------------------------------------------------------assistant (to user_proxy): あなたの冷蔵庫にある材料から、豚肉と野菜の炒め物を作ることを提案します。以下にレシピを提供します。 **豚肉と野菜の炒め物** **必要な材料:** - 豚肉: 200g - じゃがいも: 1個 - にんじん: 1本 - 玉ねぎ: 1個 - トマト: 1個 - 卵: 1個 - 塩、胡椒: 適量 - サラダ油: 大さじ1 **作り方:** 1. じゃがいもとにんじんは皮をむき、一口大に切る。玉ねぎは薄切りにする。トマトは8等分に切る。 2. フライパンにサラダ油を熱し、豚肉を炒める。豚肉が白くなったら、じゃがいも、にんじん、玉ねぎを加え て炒め続ける。 3. 野菜が柔らかくなったら、トマトを加えてさらに炒める。 4. 最後に、溶き卵を全体に回し入れ、卵が固まったら火から下ろす。塩、胡椒で味を調える。 これで、美味しい豚肉と野菜の炒め物が完成です 。お楽しみください。 TERMINATE -------------------------------------------------------------------------------Please give feedback to assistant. Press enter or type 'exit' to stop the conversation: 煮物を食べたいです。 user_proxy (to assistant): 煮物を食べたいです。 -------------------------------------------------------------------------------assistant (to user_proxy): あなたの冷蔵庫にある材料から、豚肉と野菜の煮物を作ることを提案します 。以下にレシピを提供します。 **豚肉と野菜の煮物** **必要な材料:** - 豚肉: 200g - じゃがいも: 1個 - にんじん: 1本 - 玉ねぎ: 1個 - トマト: 1個 - 卵: 1個 - 塩、胡椒: 適量 - 水: 500ml - 醤油: 大さじ2 - 砂糖: 大さじ1 - みりん: 大さじ1 **作り方:** 1. じゃがいもとにんじんは皮をむき、一口大に切る。玉ねぎは薄切りにする。トマトは8等分に切る。 2. 鍋に水、醤油、砂糖、みりんを入れて火にかけ、煮立ったら豚肉を加えて中火で5分煮る。 3. じゃがいも、にんじん、玉ねぎを加えて蓋をし、弱火で15分煮る。 4. トマトと卵を加えてさらに5分煮る。塩、胡椒で味を調える。 これで、美味しい豚肉と野菜の煮物が完成です。お楽しみください。 TERMINATE
AutoGenの例 AssistantAgent UserProxyAgent AssistantAgent 複数のAssistantが自動的に会話するシステム (マルチエージェント) AutoGenのサンプルコードにある例: プランナーが計画を立てて、 エンジニアとサイエンティストが実現する ただし、批評家(critic)が会話内容の不備を指摘する 用意するAssistant - "Planner" - "Engineer" - "Scientist" - "Critic" ・エンジニアやサイエンティストという役割分担により 個々のAssistantは自分の専門作業に専念できる ・異なる立場のAsistantからアドバイスを受けられる ・批評家の存在により、議論が深掘りされる プロンプトエンジニアリングにも存在するテクニック Assistant同士の会話を何度も回すことで、より複雑なタスクにも対応 参考:https://github.com/microsoft/autogen/blob/main/notebook/agentchat_groupchat_research.ipynb
ChatDevの例 以下の仕様を満たすPythonアプリケーションを開発 したいのですが、その指示を出すためのスクリプト を作成してください。 仕様: ・デスクトップに指定したキャラクターの画像を表 示する ・キャラクターと一緒に時計が表示される ・タイマー機能を持つ 英語に翻訳 ChatDevのコマンドライン引数に渡す 最高経営責任者 最高製品責任者 最高技術責任者 プログラマー 20分待つ レビュアー テスター アートデザイナー アプリケーション完成!! ChatGPT-3.5 turbo API費用:0.046ドル(約7円)
ChatDevの例 以下の仕様を満たすPythonアプリケーションを開発したい のですが、その指示を出すためのスクリプトを作成してく ださい。 仕様: ・ソフトウェアはWebアプリケーションである ・Web画面には美少女のキャラクターの画像を表示する ・キャラクターと会話するための入力フィールドと送信ボ タンを持つ ・キャラクターの応答を表示することができる ・キャラクターの応答はPythonの関数でカスタマイズでき る ・デフォルトでは、キャラクターは挨拶や天気の話などの ランダムな応答を返す GPT-4 0.88ドル(約132円) ・応答部は、指示通り関数化されているので、差し替え可能 ・デフォルトでは、挨拶か天気の話題か判断してランダムに応答 ・ちょっとバグってた部分(2箇所)は手動で修正 ・画像は生成されなかったが、差し替えればOK LLM単体だとハルシネーションが起こるような 複雑なアプリケーションでも生成可能
OpenAI Assistant https://platform.openai.com/docs/assistants/how-it-works Threadの状態遷移図 https://platform.openai.com/docs/assistants/how-it-works/runs-and-run-steps completedに遷移しないと、次のアクションを受け付けない スレッドセーフな設計
OpenAI Assistant これまでのChatGPTの自然な拡張は・・・ User Threadがあると、こういうことができる? User Engineer Scientist Planner
OpenAI Assistant Assistantでマルチエージェントをやってみた。
OpenAI Assistant
# gradioのインターフェースを作成
import gradio as gr
from openai import OpenAI
import time
client = OpenAI()
assistant_bot_id = "asst_jvYxlRwGV1U9oidrh7fCwEVz"
assistant_id = "asst_XNlvlhwQ3vDlHfE4Oojl4YCU"
thread = client.beta.threads.create()
thread_id = thread.id
custom_css = """
#component-2 {
resize: both;
overflow: auto;
}
"""
OpenAIのWebUIで作成
or
client.beta.assistants.create関数で作成
def wait_run(run):
while run.status != "completed":
if run.status == "failed":
print("failed")
exit(1)
time.sleep(1)
print("waiting...")
run = client.beta.threads.runs.retrieve(
thread_id=thread_id,
run_id=run.id
)
def run_and_wait(thread_id, assistant_id):
run = client.beta.threads.runs.create(
thread_id=thread_id,
assistant_id=assistant_id
)
wait_run(run)
def print_message(messages):
print(messages[-1].role, ":", messages[-1].content[0].text.value)
def print_message_from_thread(thread_id):
messages = [message for message in client.beta.threads.messages.list(thread_id=thread_id,
order="asc")]
print_message(messages)
def inquiry_datamix(message, history):
client.beta.threads.messages.create(
thread_id=thread_id,
role="user",
content=message
)
run_and_wait(thread_id, assistant_id)
run_and_wait(thread_id, assistant_bot_id)
messages = [message for message in client.beta.threads.messages.list(thread_id=thread_id,
order="asc")]
response1, response2 = messages[-2].content[0].text.value, messages[-1].content[0].text.value
# 2つの応答を水平線で区切って結合
combined_response = f"ChatGPT:{response1}<BR><BR><HR><BR>嘘つきボット:{response2}"
return combined_response
# ChatInterface での使用
demo = gr.ChatInterface(fn=inquiry_datamix, css=custom_css)
demo.launch()
OpenAI Assistant 4つのAssistantでTRPGさせてみた GM PC3 PC1 PC2 GM -> PC1 -> PC2 -> PC3 -> GM -> ... と無限ループで発言させていく
OpenAI Assistant それぞれ異なるAssistant
将来の応用例(妄想) 日程調整Thread 打ち合わせ、いつにしま しょうか? 杉山Assistant 【スケジュールを確認】 空いている日は…… では、X日のXX時からで お願いします。 【スケジュールに登録】 了解です 【スケジュールに登録】 注:実験したところ、現時点では 他人のAssistantは呼べませんでした 武藤Assistant
将来の応用例(妄想) ミーティングThread 武藤Assistant 今日の議題は…… 杉山Assistant その件については…… 賛成です 反対です。なぜなら…… 本日のミーティングの要 約を保存しました