ローコードでマルチエージェントが作れる「Tribe」を試してみた
Tribe AI
✨マルチエージェント・チームを迅速に構築・調整するためのローコード・ツール✨
Tribeとは?
「2つの頭は1つより良い」ということわざ[1]を聞いたことがあるだろうか?それはエージェントにも当てはまる。Tribeはlanggraphフレームワークを活用し、エージェントのチームを簡単にカスタマイズし、調整することができる。困難なタスクをそれぞれ得意なエージェントに分担させることで、各エージェントは自分の得意なことに集中できる。これにより、問題解決がより速く、より良くなる。
どのようなユースケース?
チームを組むことで、エージェントはより複雑な仕事を引き受けることができる。以下は、彼らが一緒にできることのいくつかの例である:
- ⚽️サッカー分析: あるエージェントがプレミアリーグの最新ニュースをウェブで探し回り、別のエージェントがそのデータを分析して、新シーズンの各チームのパフォーマンスについて洞察に満ちたレポートを書くというエージェントチームを想像してみてほしい。
- 🏝️旅行計画: 次の休暇を計画するために、あるエージェントは地元の最高のレストランを推薦し、別のエージェントはあなたのためにトップクラスのホテルを見つけることができる。このチームは、あなたの旅行のあらゆる部分をカバーしてくれる。
- 👩💻カスタマーサービス: あるエージェントがIT問題を、別のエージェントが苦情を管理し、3人目が商品に関する問い合わせを担当するカスタマーサービスチーム。各エージェントが異なる分野に特化することで、より迅速で効率的なサービスを実現している。
その他多数!
Tribeのメリット
- 迅速なチームデザイン: ドラッグ&ドロップの直感的なインターフェースで、エージェントチームを素早く構築。コーディングの経験は不要!
- 多彩なモデルサポート*: Tribeは、OpenAIやAnthropicのような複数の商用AIモデルとシームレスに動作し、現在ローカルモデルのサポートを強化している。
- 包括的なモニタリング: LangSmithを使用して、エージェントを継続的に監視、テストし、最高のパフォーマンスを保証する。
- ツールの使用: ウェブ検索機能でエージェントを強化し、PythonとLangChainを使ってカスタムスキルを簡単に作成できる。
- マルチユーザ対応: Tribeはマルチユーザーインスタンスを提供し、異なるチーム間でのコラボレーションや監視を可能にする。
- 簡単な導入: Dockerを使ってTribeを簡単にシステムに導入し、様々な環境へのセットアッププロセスを合理化する。
LangGraphで書かれたGUIマルチエージェントツールって感じっぽい。
-
原文では"Two minds are better than one"とある。そういう表現自体はあるようだが、"Two heads are better than one"とかのほうが多い。また聖書には"Two are better than one"という記載がある。日本語だと「三人寄らば文殊の知恵」あたりになりそう。 ↩︎
インストール
Dockerで動かせそうなのでやってみる。Macのローカルで。
レポジトリをクローン
$ git clone https://github.com/StreetLamb/tribe.git && cd tribe
.env
を作成
$ cp .env.example .env
中身は項目が結構たくさんあるけど、最低限以下あたりを各自に合わせて変更しておけばいいらしい。
-
USERNAME
/HASHED_PASSWORD
- Traefikというリバースプロキシ・ロードバランサの管理画面にログインするためのBASIC認証のユーザ名とハッシュ済パスワード
-
SECRET_KEY
- バックエンドで使用される。トークンの署名と可に使われるらしい。
-
FIRST_SUPERUSER_PASSWORD
- 管理者アカウントのパスワード。管理者はユーザの追加ができる。
- そしてこれはフロントエンド(エージェントのフローを作るGUI)へ管理者としてログインする際のパスワードとしても使用される。
- ここには書かれていなかったけども、その場合のメアドは
FIRST_SUPERUSER
に指定されたものになる。デフォルトはadmin@example.com
。
-
POSTGRES_PASSWORD
- データを保持しているPostgreSQLのパスワード。
-
OPENAI_API_KEY
- OpenAIのAPIキー
ご丁寧にパスワードの生成手順まで書いてある。
HASHED_PASSWORD
だけはハッシュ化後のパスワードである必要がある。以下のような感じで生成する。
$ export PASSWORD=changethis # パスワード文字列をここで設定
$ export HASHED_PASSWORD=$(openssl passwd -apr1 $PASSWORD)
$ echo $HASHED_PASSWORD
以下のような感じで出力されるのでこれを.envに貼り付ける。$
が含まれているので、.envに書く際はシングルクォートで囲った法が良いと思う。
$apr1$****************
SECRET_KEY
、FIRST_SUPERUSER_PASSWORD
、POSTGRES_PASSWORD
はランダムに生成したければ以下のような感じで。
$ python -c "import secrets; print(secrets.token_urlsafe(32))"
ということで変更した箇所だけを以下に記載。LangSmith向けの環境変数もあったので一応設定。以下以外はデフォルトのままにした。
USERNAME=kun432
HASHED_PASSWORD='******'
SECRET_KEY=XXXXX
FIRST_SUPERUSER=kun432@********.***
FIRST_SUPERUSER_PASSWORD=********
OPENAI_API_KEY=***************
LANGCHAIN_TRACING_V2=true
LANGCHAIN_API_KEY=***************
POSTGRES_PASSWORD=********
.envが作成できたら、Dockerで起動する。Dockerで起動すると以下のURLにアクセスできるようになる様子。
- フロントエンド:
http://localhost/
- バックエンドAPIベースURL:
http://localhost/api/
- バックエンドAPIドキュメント:
http://localhost/docs/
- Traefik UI:
http://traefik.localhost/
- Adminer:
http://adminer.localhost/
- AdminerというGUIのDB管理ツール。
Getting Startedにしたがうと以下のコマンドになるのだが・・・
$ docker compose -f docker-compose.yml -f docker-compose.local.yml up
これを実行してフロントエンドのURLにアクセスすると以下の画面になる。で、FIRST_SUPERUSER
とFIRST_SUPERUSER_PASSWORD
でログインすると待てど暮らせどログインできない状態になる。
色々見てみると、入力されたメアド・パスワードでバックエンドAPIにアクセスしてアクセストークンを発行しているのだが、このときのURLがhttps://
になっていて、ローカルで動かす場合はここがhttp://
である必要がある。
で色々調べてみて以下のようにすればこのURLがHTTPになることを確認した。おそらく"development"モードの設定が必要で、docker-compose.local.ymlだけだと足りないのだと推測する。
$ docker compose -f docker-compose.yml -f docker-compose.override.yml -f docker-compose.local.yml up
で起動したら以下のメッセージが表示されるまで待つ。少しだけ時間がかかるかもしれない。
tribe-backend-1 | INFO: Will watch for changes in these directories: ['/app']
tribe-backend-1 | INFO: Uvicorn running on http://0.0.0.0:80 (Press CTRL+C to quit)
tribe-backend-1 | INFO: Started reloader process [1] using WatchFiles
tribe-backend-1 | INFO: Started server process [22]
tribe-backend-1 | INFO: Waiting for application startup.
tribe-backend-1 | INFO: Application startup complete.
ブラウザでhttp://localhost/
にアクセスして、ログイン画面でFIRST_SUPERUSER
とFIRST_SUPERUSER_PASSWORD
でログイン。
ログインできた!
チームの作成
Tribeでマルチエージェントを構成する場合は以下のような流れになるっぽい。
- 大きなゴールを持ったチームを作成する。
- そこに異なるペルソナやスキルを持った複数のメンバーを追加する。
- チームに対してタスクを与えると、チームメンバーが強調して、タスクの解決を行う。
ではまずチームを作成する。左のメニューから"Teams"をクリック。
"Teams Management"画面で"+Add Team"をクリック
作成するチームの設定入力画面が表示される。
ここでは以下の情報を入力する。
-
Name
- チームの名前を入力する。なお、日本語は入力できず、
^[a-zA-Z0-9_-]{1,64}$
に沿った名称である必要がある。 - 今回は
TripPlanningTeam
として、旅行プランを建てるチームを作ることとする。
- チームの名前を入力する。なお、日本語は入力できず、
-
Description
- チームの説明を入力する。ここは日本語でも入力ができる様子。
- 今回は
ユーザの要求にあわせて、最適な旅行プランを建てるチーム
とした。
-
Workflow
- ここはおそらくチームの構成を設定するものだと思う。以下の2つから選択できる。
-
Hierarchical
(階層型) -
Sequential
(シーケンシャル型)
-
- おそらく
Hierarchical
はタスクを分散協調して解決、Sequential
は複数のステップで逐次的に解決、という感じだと推測する。 - 今回は
Hierarchical
を選択
- ここはおそらくチームの構成を設定するものだと思う。以下の2つから選択できる。
入力したら"Save"でチーム設定を保存する。
チームが作成された。
チームメンバーの追加
次にこのチームにチームメンバーを追加していく。
作成したチームをクリック。
TripPlanningTeam
の画面が表示される。タブを見ると、"Buld"、"Chat"、"Threads"の3つがあり、"Build"が表示されていることから、このタブではチームビルディングを行うものだと思われる。
中央に1つブロックが既に作成されている。メッセージを見ると"チームからインプットを集め、質問に答える。"とある。とりあえず鉛筆の形のアイコンをクリックしてみる。
先ほどの画面では表示が省略されていたが、これはチームメンバーの設定であり、「チームリーダー」がデフォルトで登録されている様子。そして、内容を見る限り、チームのリーダーとしてチーム内から情報を集めて回答する、代表のような立場として設定されているのがわかる。おそらくチーム作成時にHierarchical
を選択したためではないかと推測されるが、ここは後ほどSequential
な別のチームをつくて確認することとしたい。
では「チームリーダー」の設定を入力する。
-
Type
-
Team Leader
で変更不可
-
-
Name
- チームリーダーの名前。ここもチーム名と同じ文字列規則になっている。
- ちょっと文字数が長すぎて最初の画面でわかりにくいので
TeamLeader
に変更する。
-
Role
- チームメンバーとしての役割。
- ここは日本語に置き換える。
チーム内のメンバーから意見を集約して、質問に答える。
とした。
-
Backstory
- おそらくチームメンバーのペルソナ的な意味になるのだと思う。今回は以下とする。
お客様にベストの旅行プランを提供することを生きがいとして、普段から、最先端でユニークな旅行プランをずっと考えている。
- おそらくチームメンバーのペルソナ的な意味になるのだと思う。今回は以下とする。
-
Skills
- ここはおそらくTool/Function Callinといった「ツール」の設定になるのだと思うが、グレーアウトして選択も入力もできない。
- あとでもう少し調べてみる。
-
Provider
/Model
/Temperature
- 使用するLLMのプロバイダー、モデル、Temperatureの設定
- 選択できるプロパイダーとモデル
-
ChatOpenAI
- gpt-3.5-turbo
- gpt-4-turbo(デフォルト)
- gpt-4o
-
ChatAnthropic
Claude-3-haiku-20240307
Claude-3-sonnet-20240229
Claude-3-opus-20240229
-
- Temperatureはデフォルトだと
0.7
になっている
- 選択できるプロパイダーとモデル
- 今回はOpenAIのAPIキーのみ設定しているので、
gpt-4
を使う。Temperature
はデフォルトのままとした。
- 使用するLLMのプロバイダー、モデル、Temperatureの設定
設定したら"Save"で保存。
元の画面に戻ったら、チームリーダーのブロックの中央下部をドラッグ&ドロップ。すると新しいブロックが作成できる。先ほどと同じように鉛筆形のアイコンをクリックしてメンバー設定を行えばよい。
ということで、今回は以下のメンバーを用意する。
- 食通
- 食通の観点から、旅行地の名産物を紹介する
- 写真家
- 写真家の観点から、旅行地のフォトスポットを紹介する
食通の設定
パラメータ | 値 | 備考 |
---|---|---|
Type | Worker |
Worker /Leader から選択 |
Name | Foodie |
|
Role | その旅行地でしか味わえない食に関する特産物や名産物を提案する |
|
Backstory | 冒険心を持った食通で、珍しい地元の特産物・名産物にはチャレンジせずにはいられない! |
|
Skills | なし | グレーアウトで選択不可 |
Provider | ChatOpenAI |
|
Model | gpt-4o |
|
Provider | 0.7 |
写真家の設定
パラメータ | 値 | 備考 |
---|---|---|
Type | Worker |
Worker /Leader から選択 |
Name | Photographer |
|
Role | その旅行地ならではのフォトスポットを推薦する |
|
Backstory | 素晴らしい建築物や自然の写真を撮ることが大好き。 |
|
Skills | なし | グレーアウトで選択不可 |
Provider | ChatOpenAI |
|
Model | gpt-4o |
|
Provider | 0.7 |
全て入力するとチームの作成は完了。こういうチーム構成になった。
チームにタスクを与える
では実際にタスクを与えてみる。"Chat"タブをクリック。
チャット画面が表示されるので、ここで質問なりタスクなりを入力すると、こんな感じでチームリーダから各メンバーにプランの作成が依頼される。
チームメンバーが提示したプランに対して、チームリーダーが追加で指示を出したりしながら(少しうまく行ってないように思えるが)、最終的にはメンバーの回答を集約した案をチームリーダーが生成している様子。なるほど「階層的」である。
実際の会話のダイアログは以下。
全ダイアログ
You
夏休みに家族で神戸に旅行に行来たいなと思っているので、旅行プランをお願いします!TeamLeader -> Foodie
夏休みの家族向け神戸旅行プランを作成するFoodie
もちろんです!神戸は素晴らしい食文化があり、家族全員が楽しめる場所です。以下は、家族向けの神戸旅行プランを提案します。1日目 午前:
- 到着とチェックイン:朝早く神戸に到着し、宿泊先にチェックイン。
- 南京町(中華街):神戸の南京町は、異国情緒あふれる中華街です。ここで家族みんなで美味しい中華料理を楽しみましょう。特に「豚まん」や「小籠包」はおすすめ!
午後:
- メリケンパーク:港町の美しい景色を眺めながら散策。神戸港のシンボルであるポートタワーにも登って、神戸の全景を楽しむことができます。
- 神戸ハーバーランド:ショッピングやアミューズメントが楽しめるエリア。観覧車からの景色も絶景です。
夜:
- 神戸ビーフのディナー:夜は本場の神戸ビーフを堪能できるレストランでディナーを。口の中でとろけるような柔らかさの神戸ビーフは、一度は味わっておくべき逸品です。
2日目 午前:
- 六甲山牧場:自然豊かな牧場で動物たちと触れ合いましょう。特に小さなお子様にはぴったりの場所です。新鮮な乳製品も味わえます!
午後:
- 北野異人館街:異国情緒漂う洋館が立ち並ぶエリア。家族で写真をたくさん撮りましょう。カフェで一休みするのも良いですね。
- モザイクガーデン:家族で楽しめる遊園地やショッピングモールが集まるエリア。特にお子様に人気のスポットです。
夜:
- 地元の居酒屋で食事:神戸の地元料理を楽しめる居酒屋で、家族みんなで賑やかな夕食を。特に「明石焼き」や「ぼっかけ」がおすすめです。
3日目 午前:
- 須磨海浜水族園:家族全員で楽しめる水族館。様々な海の生き物たちと触れ合い、楽しい時間を過ごせます。
午後:
- 帰宅準備:最後に神戸の街を少し散策しながら、お土産を購入。特に「神戸プリン」や「神戸ワイン」などが人気です。
このプランで、神戸の魅力を存分に楽しんでくださいね!食の面でも充実しているので、家族みんなが満足できると思います。
TeamLeader -> Foodie
Provide a complete travel plan for a family trip to Kobe, focusing on unique dining experiences.Foodie
神戸旅行のプランについて、もう少し具体的な質問やリクエストがありましたら教えてください!例えば、特定の食べ物や観光スポットに関する情報が必要であれば、それに応じて詳細をお伝えします。TeamLeader -> Photographer
Provide detailed travel plan for a family vacation in Kobe during summer vacation.Photographer
申し訳ありません、誤解があったようです。私は「Photographer」ですので、神戸の旅行では特に写真を撮るのに最適なスポットをご紹介します!フォトスポットプラン 1日目 午前:
- ポートタワー
- おすすめポイント: 神戸港を一望できる絶好のポイント。特に朝焼けや夕焼けの時間帯がおすすめです。
午後:
- メリケンパーク
- おすすめポイント: 神戸海洋博物館とポートタワーのコントラストが美しい場所。夜にはライトアップも>楽しめます。
- 神戸ハーバーランド
- おすすめポイント: 観覧車や港の風景が美しい。夜景も素晴らしいので、夕方から夜にかけての撮影がベスト。
夜:
- 神戸ビーフディナー
- おすすめポイント: 美味しい食事の後、レストランからの夜景も楽しみましょう。特に高層階のレストランは絶景です。
2日目 午前:
- 六甲山牧場
- おすすめポイント: 自然豊かな風景と動物たちの写真が撮れます。特に朝の光が美しいです。
午後:
- 北野異人館街
- おすすめポイント: 異国情緒あふれる洋館と美しい庭園が撮影ポイント。建物のディテールや風景を楽しんでください。
- モザイクガーデン
- おすすめポイント: カラフルな建物やアトラクションが、ポップで楽しい写真を撮るのに最適です。
夜:
- 神戸の夜景
- おすすめポイント: 六甲山から見る神戸の夜景は「100万ドルの夜景」として有名です。高い位置からのパノラマビューを楽しんでください。
3日目 午前:
- 須磨海浜水族園
- おすすめポイント: 水中トンネルや大きな水槽内の魚たちが、幻想的な写真を撮るのに最適。
午後:
- お土産ショッピング
- おすすめポイント: 地元の市場や商店街で、地元の風景や人々の写真を撮ると良い思い出になります。
このプランで、神戸の魅力を写真に収めてくださいね!写真撮影の際は、天候や光の具合を考慮してベストなタイミングを狙うと、より素晴らしい写真が撮れますよ。
TeamLeader -> FINISH
Task completed.TeamLeader_answer:
夏休みに家族で神戸に旅行するためのプランをご提案いたします。食事と写真撮影の両方を楽しめる内容を組み合わせてみました。1日目 午前:
- 到着とチェックイン:朝早く神戸に到着し、宿泊先にチェックイン。
- 南京町(中華街):美味しい中華料理を楽しみながら、写真に残る異国情緒あふれる風景をお楽しみください。
午後:
- メリケンパーク:港の美しい景色とポートタワーのコントラストを楽しむことができます。写真撮影にも最適です。
- 神戸ハーバーランド:ショッピングやアミューズメントを楽しみつつ、観覧車や港の風景を写真に収めましょう。
夜:
- 神戸ビーフのディナー:神戸ビーフを堪能し、レストランからの夜景も楽しんでください。
2日目 午前:
- 六甲山牧場:自然豊かな牧場で動物たちと触れ合い、朝の光に映える美しい風景をカメラに収めましょう。
午後:
- 北野異人館街:異国情緒漂う洋館と美しい庭園が撮影ポイントです。
- モザイクガーデン:カラフルな建物やアトラクションが楽しい写真を撮るのに最適です。
夜:
- 地元の居酒屋で食事:神戸の地元料理を楽しみながら、夜の街の活気を感じてください。
3日目 午前:
- 須磨海浜水族園:水中の生き物たちを背景に、幻想的な写真を撮ることができます。
午後:
- 帰宅準備:お土産を購入しながら、最後の散策を楽しんでください。地元の市場や商店街での撮影もおすすめです。
このプランで神戸の魅力を存分に楽しんでいただけると思います。食事、観光、写真撮影と、家族全員が楽しめる内容を心がけました。どうぞ素敵な旅行になりますように!
タスクに指示していた「神戸」「家族旅行」という点を踏まえつつ、各チームメンバーの特性である「食事」「景色」という観点を含めたプランが生成されているのがわかる。
なお、"Threads"タブはそのチームで実施した過去のタスクが参照できるようになっている様子。
"Hierarchical"と"Sequential"
"Hierarchical"は上で試した通り、チームリーダーの下に複数のメンバーが構成される形。また、その名の通り、チームメンバーの下にさらにチームメンバーを作るというより深い階層構造も作成できる。
もう一つの"Sequential"はこうなる。
"Sequential"の場合はチームリーダーは存在せず、1人のメンバーには1人のメンバーしかつなげることが出来ず、上記のような数珠つなぎとなる。
また、メンバーの"Type"も"FreeRancer"という別のタイプになっている。一番最初のメンバーだけ"Root FreeRancer"となっていていわゆるエントリーポイント的な扱いになるのだと思う。
Toolの使用
ここは少し勘違いをしていたかもしれない。
メンバー設定でToolがグレーアウトしていると記載したが、どうやら"Hierarchical"なチームのチームリーダーのみ使用できないようで、普通のメンバーならばToolを使える様子。
見えているのは以下あたり。ただし実際には試していない。
- DuckDuckGo検索
- Wikipedia検索
- Yahoo!ファイナンス検索
一応、.envには以下のようなエントリもある。
# tools/skills api keys
SERP_API_KEY=
SERPAPI_API_KEY=
コードを見るとAPIキーが必要なものはコメントアウトされているっぽいので、現状でやるとするならば.envにAPIキーをセット、コメントアウトを外す、バックエンドを再ビルドって感じになりそう。
この部分はLangChainのツールを使っているようなので、これ以外のツールも理屈上は動かせそうではある。
余談だけどもSerpAPIっていう名前のサービスがいろいろあってどれのことを指しているのかめちゃめちゃわかりにくい。。。。
SERP_API_KEYもSERPAPI_API_KEYもたぶんこれかな?
その他のエンドポイント
フロントエンド以外のエンドポイントについてもサラッとだけ触れておく。
バックエンドAPIドキュメント
http://localhost/docs/
おなじみFastAPIのドキュメント。バックエンドAPIのスキーマ等が確認できる。
バックエンドAPIベースURL
http://localhost/api/
今回は試さないけども、上記のドキュメントを見る限り、作成したチームに対してAPI経由でタスクを投げてストリーミングで受ける、ということもどうやらできそうな雰囲気。
Traefik UI
http://traefik.localhost/
リバースプロキシ・ロードバランサーとしてのTraefikの管理画面。ネットワーク的なメトリクスなどが見れる模様。
Adminer UI
http://adminer.localhost/
GUIでDBを操作できるAdminerの管理画面。
まとめ
とりあえずGUIで簡単にマルチエージェントが作れるというのは簡単で良い。で、これ触りながら思ってたのはかなりcrewAI
に似ている。
逆にcrewAIにGUIのラッパーかぶせたものなのかな?と思うぐらい、チームの構成方法とか各メンバーのペルソナ設定とか、あたりはほとんど同じようなものになっている。
README.mdには
TribeはLangGraph`フレームワークを活用し、エージェントのチームを簡単にカスタマイズし、調整することができる。
とあるし、コードをざっと見た限りはLangChain/LangGraphで作られている。Redditで作者の方が自分で紹介しているスレがあるのだけど、ここでも「裏でcrewAIを動かしてるの?」みたいなことを聞かれてて、まあそういう風に思ってもおかしくはないかな。crewAI自体もLangChain使ってるので、ある程度似通う部分はあるかもしれないが、それにしてもコンセプトはかなり似ている。自分はcrewAI試したあとだったのですんなりできた。
そのあたりは一旦置いといて、やはり昔からある階層的組織に倣えるってのはマルチエージェントのデザインとして適用しやすいパターンのひとつなんだろうなと感じる。
とりあえずまだunder hevily developmentらしいし、ドキュメントも少ないし、ちょっとバギーなところもある。今回はなんとか動かせたけどもこれが正しいやり方なのかもわからないし、productionで使うにはまだ時間がかかりそう。
GUIだとできることの幅は減るというデメリットはある反面、マルチエージェントの作成がかなりお手軽に作れるというメリットもあるので、今後に期待。