---
title: GASG_LLMマルチエージェントシステム_補助資料_追記
tags:  #ai #generative ai #machine learning #deep learning #artificial intelligence  
author: [Kunihiro Sugiyama](https://convert.docswell.com/user/KunihiroSugiyama)
site: [Docswell](https://www.docswell.com/)
thumbnail: https://bcdn.docswell.com/page/4JMVPDRNJW.jpg?width=480
description: Generative AI Study Group 11回Theme資料
published: November 18, 23
canonical: https://convert.docswell.com/s/KunihiroSugiyama/5VVYPE-2023-11-18-113210
---
# Page. 1

![Page Image](https://bcdn.docswell.com/page/4JMVPDRNJW.jpg)

Index
• AutoGenの例
• ChatDevの例
• OpenAI Assistantについて
• OpenAI Assistantとマルチエージェント


# Page. 2

![Page Image](https://bcdn.docswell.com/page/PJR214R4E9.jpg)

AutoGenの例
AssistantAgent
UserProxyAgent
Assistantとユーザー（UserProxyAgent）との一対一の会話
import autogen
config_list = autogen.config_list_from_json(
&quot;OAI_CONFIG_LIST&quot;,
file_location=&quot;.&quot;,
filter_dict={
&quot;model&quot;: [&quot;gpt-4&quot;],
},
)
llm_config={
&quot;request_timeout&quot;: 600,
&quot;seed&quot;: 42,
&quot;config_list&quot;: config_list,
&quot;temperature&quot;: 0,
}
# AssistantAgentを作成
assistant = autogen.AssistantAgent(
name=&quot;assistant&quot;,
llm_config=llm_config,
)
# UserProxyAgentを作成
user_proxy = autogen.UserProxyAgent(
name=&quot;user_proxy&quot;,
human_input_mode=&quot;TERMINATE&quot;,
max_consecutive_auto_reply=10,
is_termination_msg =
lambda x: x.get(&quot;content&quot;, &quot;&quot;).rstrip().endswith(&quot;TERMINATE&quot;),
code_execution_config={&quot;work_dir&quot;: &quot;web&quot;},
llm_config=llm_config,
system_message=&quot;&quot;&quot; そ の タ ス ク が 完 全 に 満 足 の い く 形 で 解 決 さ れ た 場 合 は 、
TERMINATEと答える。
そうでなければ、CONTINUEか、タスクがまだ解決していない理由を答えなさい。&quot;&quot;&quot;
)
# Assistantとの会話を開始
user_proxy.initiate_chat(
assistant,
message=&quot;&quot;&quot;
冷蔵庫にある材料で夕飯を作りたいです。
冷蔵庫には、卵、トマト、玉ねぎ、にんじん、じゃがいも、豚肉があります。
&quot;&quot;&quot;,
)


# Page. 3

![Page Image](https://bcdn.docswell.com/page/PEXDY2RZ7X.jpg)

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 &#039;exit&#039; 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


# Page. 4

![Page Image](https://bcdn.docswell.com/page/3EKX3MRV7D.jpg)

AutoGenの例
AssistantAgent
UserProxyAgent
AssistantAgent
複数のAssistantが自動的に会話するシステム
（マルチエージェント）
AutoGenのサンプルコードにある例：
プランナーが計画を立てて、
エンジニアとサイエンティストが実現する
ただし、批評家（critic）が会話内容の不備を指摘する
用意するAssistant
- &quot;Planner&quot;
- &quot;Engineer&quot;
- &quot;Scientist&quot;
- &quot;Critic&quot;
・エンジニアやサイエンティストという役割分担により
個々のAssistantは自分の専門作業に専念できる
・異なる立場のAsistantからアドバイスを受けられる
・批評家の存在により、議論が深掘りされる
プロンプトエンジニアリングにも存在するテクニック
Assistant同士の会話を何度も回すことで、より複雑なタスクにも対応
参考：https://github.com/microsoft/autogen/blob/main/notebook/agentchat_groupchat_research.ipynb


# Page. 5

![Page Image](https://bcdn.docswell.com/page/L735GYGQE5.jpg)

ChatDevの例
以下の仕様を満たすPythonアプリケーションを開発
したいのですが、その指示を出すためのスクリプト
を作成してください。
仕様：
・デスクトップに指定したキャラクターの画像を表
示する
・キャラクターと一緒に時計が表示される
・タイマー機能を持つ
英語に翻訳
ChatDevのコマンドライン引数に渡す
最高経営責任者
最高製品責任者
最高技術責任者
プログラマー
20分待つ
レビュアー
テスター
アートデザイナー
アプリケーション完成！！
ChatGPT-3.5 turbo
API費用：0.046ドル（約7円）


# Page. 6

![Page Image](https://bcdn.docswell.com/page/87DD151W7G.jpg)

ChatDevの例
以下の仕様を満たすPythonアプリケーションを開発したい
のですが、その指示を出すためのスクリプトを作成してく
ださい。
仕様：
・ソフトウェアはWebアプリケーションである
・Web画面には美少女のキャラクターの画像を表示する
・キャラクターと会話するための入力フィールドと送信ボ
タンを持つ
・キャラクターの応答を表示することができる
・キャラクターの応答はPythonの関数でカスタマイズでき
る
・デフォルトでは、キャラクターは挨拶や天気の話などの
ランダムな応答を返す
GPT-4
0.88ドル（約132円）
・応答部は、指示通り関数化されているので、差し替え可能
・デフォルトでは、挨拶か天気の話題か判断してランダムに応答
・ちょっとバグってた部分（2箇所）は手動で修正
・画像は生成されなかったが、差し替えればOK
LLM単体だとハルシネーションが起こるような
複雑なアプリケーションでも生成可能


# Page. 7

![Page Image](https://bcdn.docswell.com/page/VJPXQGQX78.jpg)

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に遷移しないと、次のアクションを受け付けない
スレッドセーフな設計


# Page. 8

![Page Image](https://bcdn.docswell.com/page/2EVL5653JQ.jpg)

OpenAI Assistant
これまでのChatGPTの自然な拡張は・・・
User
Threadがあると、こういうことができる？
User
Engineer
Scientist
Planner


# Page. 9

![Page Image](https://bcdn.docswell.com/page/57GX6N6YEL.jpg)

OpenAI Assistant
Assistantでマルチエージェントをやってみた。


# Page. 10

![Page Image](https://bcdn.docswell.com/page/4EQ84Q46JP.jpg)

OpenAI Assistant
# gradioのインターフェースを作成
import gradio as gr
from openai import OpenAI
import time
client = OpenAI()
assistant_bot_id = &quot;asst_jvYxlRwGV1U9oidrh7fCwEVz&quot;
assistant_id = &quot;asst_XNlvlhwQ3vDlHfE4Oojl4YCU&quot;
thread = client.beta.threads.create()
thread_id = thread.id
custom_css = &quot;&quot;&quot;
#component-2 {
resize: both;
overflow: auto;
}
&quot;&quot;&quot;
OpenAIのWebUIで作成
or
client.beta.assistants.create関数で作成
def wait_run(run):
while run.status != &quot;completed&quot;:
if run.status == &quot;failed&quot;:
print(&quot;failed&quot;)
exit(1)
time.sleep(1)
print(&quot;waiting...&quot;)
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, &quot;:&quot;, 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=&quot;asc&quot;)]
print_message(messages)
def inquiry_datamix(message, history):
client.beta.threads.messages.create(
thread_id=thread_id,
role=&quot;user&quot;,
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=&quot;asc&quot;)]
response1, response2 = messages[-2].content[0].text.value, messages[-1].content[0].text.value
# 2つの応答を水平線で区切って結合
combined_response = f&quot;ChatGPT：{response1}&lt;BR&gt;&lt;BR&gt;&lt;HR&gt;&lt;BR&gt;嘘つきボット：{response2}&quot;
return combined_response
# ChatInterface での使用
demo = gr.ChatInterface(fn=inquiry_datamix, css=custom_css)
demo.launch()


# Page. 11

![Page Image](https://bcdn.docswell.com/page/KJ42QNQME1.jpg)

OpenAI Assistant
４つのAssistantでTRPGさせてみた
GM
PC3
PC1
PC2
GM -&gt; PC1 -&gt; PC2 -&gt; PC3 -&gt; GM -&gt; ...
と無限ループで発言させていく


# Page. 12

![Page Image](https://bcdn.docswell.com/page/LE1MP5PY7G.jpg)

OpenAI Assistant
それぞれ異なるAssistant


# Page. 13

![Page Image](https://bcdn.docswell.com/page/GEW32521E2.jpg)

将来の応用例（妄想）
日程調整Thread
打ち合わせ、いつにしま
しょうか？
杉山Assistant
【スケジュールを確認】
空いている日は……
では、X日のXX時からで
お願いします。
【スケジュールに登録】
了解です
【スケジュールに登録】
注：実験したところ、現時点では
他人のAssistantは呼べませんでした
武藤Assistant


# Page. 14

![Page Image](https://bcdn.docswell.com/page/47ZVDNDXE3.jpg)

将来の応用例（妄想）
ミーティングThread
武藤Assistant
今日の議題は……
杉山Assistant
その件については……
賛成です
反対です。なぜなら……
本日のミーティングの要
約を保存しました


