Closed11

マルチエージェント用フレームワーク「AgentScope」を試す

kun432kun432

論文

https://arxiv.org/pdf/2402.14034

要約 by Claude-3.5-Sonnet

1. どんなもの?

AgentScopeは、大規模言語モデル(LLM)を活用したマルチエージェントアプリケーション開発のための柔軟かつ堅牢なプラットフォームです。以下の特徴を持ちます:

  • メッセージ交換を中核とするコミュニケーションメカニズム
  • 豊富な構文ツール、ビルトインエージェント、サービス機能
  • アプリケーションデモンストレーションとユーティリティモニタ用のユーザーフレンドリーなインターフェース
  • ゼロコードプログラミングワークステーション
  • 自動プロンプトチューニングメカニズム
  • ビルトインおよびカスタマイズ可能なフォールトトレランスメカニズム
  • マルチモーダルデータ、ツール、外部知識の管理と利用のためのシステムレベルサポート
  • アクターベースの分散フレームワーク

これらの機能により、開発者はインテリジェントエージェントの潜在能力を最大限に引き出すアプリケーションを構築できます。

2. 先行研究と比べてどこがすごい?

AgentScopeは、以下の点で先行研究や既存のフレームワークを凌駕しています:

  1. 使いやすさ:プロシージャ指向のメッセージ交換メカニズムと豊富な構文機能により、開発者の学習曲線を緩やかにしています。
  2. 堅牢性:ビルトインおよびカスタマイズ可能なフォールトトレランスメカニズムにより、LLMの不安定な性能に対処します。
  3. 柔軟性:マルチモーダルデータ、ツール、外部知識の統合をシステムレベルでサポートし、多様なアプリケーション開発を可能にします。
  4. 効率性:アクターベースの分散フレームワークにより、ローカルと分散デプロイメント間の簡単な変換と自動並列最適化を実現します。
  5. 包括性:ゼロコードプログラミングワークステーションやプロンプトチューニングメカニズムなど、幅広い開発者ニーズに対応しています。

これらの特徴により、AgentScopeは開発者の生産性を向上させ、より複雑で高度なマルチエージェントLLMアプリケーションの開発を促進します。

3. 技術や手法の肝はどこ?

AgentScopeの核となる技術や手法は以下の通りです:

  1. メッセージ交換メカニズム:エージェント間のコミュニケーションを標準化し、複雑な相互作用を管理します。
  2. フォールトトレランスデザイン:LLMの不安定な応答や予期せぬエラーに対処するための多層的なエラーハンドリングシステムを実装しています。
  3. マルチモーダルサポート:URL基盤の属性を使用してメッセージ内でマルチモーダルデータを効率的に処理します。
  4. ツール使用モジュール:ReActアルゴリズムに基づき、LLMによるサービス機能の呼び出しを可能にします。
  5. 検索拡張生成(RAG):外部知識を効率的に利用するためのエンドツーエンドの高度に設定可能な知識処理モジュールを提供します。
  6. アクターベースの分散フレームワーク:プレースホルダーメッセージを導入し、分散環境での効率的な並列処理を実現します。

これらの技術により、AgentScopeは柔軟で堅牢、かつ効率的なマルチエージェントLLMアプリケーションの開発を可能にしています。

4. どうやって有効だと検証した?

論文では、AgentScopeの有効性を以下のような多様なアプリケーション例を通じて実証しています:

  1. 基本的な対話:単一エージェントとユーザーの対話を実装し、プラットフォームの基本機能を検証しました。
  2. グループ会話:複数のエージェントが参加する対話を実装し、メッセージハブの機能を示しました。
  3. 人狼ゲーム:複雑なマルチエージェントシステムを100行程度のコードで実装し、プラットフォームの柔軟性を実証しました。
  4. 分散デプロイメント:単一マシンマルチプロセスモードと複数マシンマルチプロセスモードの両方を実装し、分散フレームワークの有効性を示しました。
  5. AgentScopeコパイロット:RAGエージェントを使用して、カスタマイズされた知識ドメインを持つマルチエージェントシステムを構築しました。
  6. ウェブ検索と情報取得:インターネットリソースを利用するエージェントを実装し、外部情報の統合能力を示しました。
  7. 自然言語からSQLクエリへの変換:ReActエージェントを使用して複雑なタスクを実行し、ツール使用モジュールの有効性を実証しました。

これらの多様なユースケースを通じて、AgentScopeの柔軟性、堅牢性、効率性が実証されています。

5. 議論はある?

論文では直接的な議論セクションは設けられていませんが、以下のような点が暗に議論されていると考えられます:

  1. スケーラビリティ:分散フレームワークの導入により、大規模なマルチエージェントシステムの構築が可能になりますが、その限界や最適なスケーリング方法については更なる研究が必要かもしれません。
  2. セキュリティとプライバシー:外部知識やウェブリソースの利用に関して、セキュリティやプライバシーの懸念が生じる可能性があります。これらの課題にどう対処するかは今後の重要な議題となるでしょう。
  3. エージェント間の協調:複雑なタスクにおいて、エージェント間でより高度な協調を実現するための方法論について、さらなる研究が必要かもしれません。
  4. 倫理的考慮:LLMを用いたマルチエージェントシステムの倫理的影響や、潜在的な悪用を防ぐための方策について、継続的な議論が必要です。
  5. 評価メトリクス:マルチエージェントLLMシステムの性能を評価するための標準化されたメトリクスの開発が今後の課題となる可能性があります。

これらの点について、今後のAgentScopeの開発や関連研究において深掘りされることが期待されます。

6. 次に読むべき論文は?

AgentScopeの概念や技術をさらに深く理解し、関連する研究分野を探索するために、以下の論文を読むことをお勧めします:

  1. "The rise and potential of large language model based agents: A survey" by Xi et al. (2023) - LLMベースのエージェントの概要と可能性について理解を深められます。
  2. "AutoGen: Enabling next-gen LLM applications via multi-agent conversation framework" by Wu et al. (2023) - マルチエージェント会話フレームワークについて学べます。
  3. "MetaGPT: Meta Programming for Multi-Agent Collaborative Framework" by Hong et al. (2023) - マルチエージェント協調フレームワークの別のアプローチを理解できます。
  4. "Retrieval-Augmented Generation for Large Language Models: A Survey" by Gao et al. (2023) - RAGの最新動向について学べます。
  5. "Communicative Agents for Software Development" by Qian et al. (2023) - ソフトウェア開発におけるマルチエージェントシステムの応用例を学べます。

これらの論文を読むことで、マルチエージェントLLMシステムの最新トレンドや、AgentScopeが解決しようとしている課題についてより深い洞察が得られるでしょう。

kun432kun432

レポジトリ

https://github.com/modelscope/agentscope

AgentScope

LLMを搭載したマルチエージェントアプリケーションをより簡単に構築しましょう。

AgentScopeとは何ですか?

AgentScopeは、開発者が大規模なモデルを使用したマルチエージェントアプリケーションを構築できるように設計された革新的なマルチエージェントプラットフォームです。AgentScopeには、次の3つの高度な機能があります。

  • 🤝 使いやすさ:開発者向けに設計されており、有益なコンポーネント、包括的なドキュメント、幅広い互換性を備えています。また、AgentScope Workstationは、ドラッグ・アンド・ドロップのプログラミングプラットフォームと、AgentScopeの初心者向けの副操縦士を提供します!
  • ✅ 高い堅牢性:カスタマイズされたフォールトトレランス制御と再試行メカニズムをサポートし、アプリケーションの安定性を向上させます。
  • 🚀 アクターベースの分散:集中型のプログラミング方式で分散マルチエージェントアプリケーションを構築し、開発を合理化します。

ざっと見た感じ、ドキュメントやチュートリアル、サンプルが非常に揃っているように思える。

kun432kun432

チュートリアルのドキュメントがあるのでこちらに従って進める

https://doc.agentscope.io/en/index.html

チュートリアルのドキュメントがあるのでこちらに従って進める

https://doc.agentscope.io/en/index.html

AgentScopeについて

このチュートリアルでは、AgentScopeとは何か、AgentScopeは何を提供できるのか、なぜAgentScopeを選ぶ必要があるのかなど、いくつかの質問に答えながら、AgentScopeの概要を説明します。 それでは始めましょう!

AgentScopeとは?

AgentScopeは開発者中心のマルチエージェントプラットフォームであり、開発者は少ない労力でLLMを利用したマルチエージェントアプリケーションを構築することができます。

大規模な言語モデルの進歩により、開発者は多様なアプリケーションを構築することができます。 LLMをデータやサービスに接続し、複雑なタスクを解決するために、AgentScopeは開発を容易にする一連の開発ツールとコンポーネントを提供します。 その特徴は以下のとおりです。

  • 使いやすさ
  • 堅牢性
  • マルチモーダルデータのサポート
  • 分散配置

キーコンセプト

メッセージ

メッセージは、情報(指示、マルチモーダルデータ、対話など)のキャリアです。 AgentScopeでは、メッセージはnamecontentを必要なフィールドとするPython dictサブクラスです、 そして、url を追加リソースを参照するオプションフィールドとします。

エージェント

エージェントは、環境やエージェントと相互作用し、環境を変更するためのアクションを取ることができる自律的なエンティティです。 エージェントスコープでは、エージェントは入力としてメッセージを受け取り、対応する応答メッセージを生成します。

サービス

サービスは、エージェントが特定のタスクを実行できるようにする機能APIを指します。 AgentScope では、サービスは、LLM を使用するチャネルであるモデル API サービスと、さまざまなツール機能を提供する一般 API サービスに分類されます。

ワークフロー

ワークフローは、エージェント実行の順序付けられたシーケンスとエージェント間のメッセージ交換を表し、TensorFlowの計算グラフに似ていますが、非DAG構造に対応する柔軟性を持っています。

なぜAgentScopeなのか?

開発者のための卓越したユーザビリティ AgentScope は、柔軟な構文シュガー、すぐに使えるコンポーネント、および構築済みのサンプルにより、開発者に高いユーザビリティを提供します。

多様なモデルおよびAPIに対する堅牢なフォールトトレランス。 AgentScopeは、多様なモデル、APIに対する堅牢なフォールトトレランスを保証し、開発者がカスタマイズされたフォールトトレランス戦略を構築できるようにします。

マルチモーダルアプリケーションのための幅広い互換性。 AgentScopeは、ダイアログ提示、メッセージ送信、およびデータ保存の両方で、マルチモーダルデータ(ファイル、画像、音声、ビデオなど)をサポートします。

分散マルチエージェント操作の最適化された効率。 AgentScopeは、複雑な分散ワークフローの集中プログラミングと自動並列最適化を可能にするアクターベースの分散メカニズムを導入しています。

AgentScopeはどのように設計されていますか?

AgentScopeのアーキテクチャは、3つの階層から構成されています。 これらの層は、単一のエージェントの初歩的かつ高度な機能(ユーティリティ層)、リソースおよびランタイム管理(マネージャおよびラッパー層)、およびエージェントレベルからワークフローレベルのプログラミングインターフェース(エージェント層)を含む、異なるレベルからのマルチエージェントアプリケーションのサポートを提供します。 AgentScopeは、各レイヤーに固有の多様な機能を満たし、マルチエージェントシステムを構築する際の複雑なレイヤー間の依存関係を簡素化するために設計された直感的な抽象化を導入しています。 さらに、異なるレイヤー内の障害に対するマルチエージェントシステムの耐障害性を強化するためのプログラミングインターフェースとデフォルトメカニズムを提供します。

AgentScopeコード構造

AgentScope
├── src
│   ├── agentscope
│  │  ├── agents               # エージェントに関連するコアコンポーネントおよび実装
│  │  ├── memory               # エージェントのメモリ用の構造体
│  │  ├── models               # さまざまなモデルAPIを統合するためのインターフェース
│  │  ├── pipelines            # パイプラインを実行するための基本コンポーネントおよび実装
│  │  ├── rpc                  # エージェントの分散配置用のRPCモジュール
│  │  ├── service              # メモリや状態に依存しない機能を提供するサービス
│  │  ├── web                  # ダイアログ表示に使用される WebUI
│  │  ├── utils                # 補助ユーティリティおよびヘルパー関数
│  │  ├── message.py           # エージェント間のメッセージングの定義および実装
│  │ ├── prompt.py             # モデル入力用のプロンプトエンジニアリングモジュール
│  │ ├── ...
│  │ ├── ...
├── scripts                    # ローカルモデルAPIの起動用スクリプト
├── examples                   # さまざまなアプリケーションの事前構築済みサンプル
├── docs                       # APIリファレンスのドキュメントツール
├── tests                      # 継続的インテグレーション用のユニットテストモジュール
├── LICENSE                    # AgentScope の使用に関する公式のライセンス契約書です。
└── setup.py                   # インストール用のセットアップスクリプトです。
├── ... ..
└── ... ..
kun432kun432

インストール

https://doc.agentscope.io/en/tutorial/102-installation.html

まずは、Colaboratoryで。

パッケージも用意されているようだが、ソースからのインストールが推奨されているようなので、そちらで。ただしColaboratory環境では、一部OS側パッケージとコンフリクトするようなので、事前に削除しておく必要がある。

!apt remove -y python3-blinker
!git clone https://github.com/modelscope/agentscope
%cd agentscope
!pip install -e .

一旦ここでランタイムを再起動(削除はしない)しておく(じゃないとagentscopeをimportしても読み出せない)

kun432kun432

Quick Start

2つのエージェント(ユーザーエージェントとアシスタントエージェント)間の会話を実装するチュートリアル。以下の3つのステップでエージェントを構築する。

  1. モデルの準備
  2. エージェントの作成
  3. エージェントの会話

1. モデルの準備

最初にモデルの準備というか設定を行う。冒頭に以下とある。

AgentScopeは、マルチエージェントアプリケーションをより良く構築するために、モデルのデプロイと呼び出しを切り離します。

ここの意味がピンとこなかったのだけど、自分の認識では、

  • モデルは「設定」としてデプロイする
  • モデルを呼び出す際は、それに応じた設定を紐づける

ということだと思う。具体的にやってみる。

まず、モデルの設定。今回はOpenAIを使う。OpenAIのAPIキーはColaboratoryのシークレットに設定してあるものとする。

from google.colab import userdata

model_config_1= {
    "config_name": "openai-lite",
    "model_type": "openai_chat",
    "model_name": "gpt-4o-mini",
    "api_key": userdata.get('OPENAI_API_KEY'),
    "generate_args": {
        "temperature": 0.7
    },
}
model_config_2 = {
    "config_name": "openai-heavy",
    "model_type": "openai_chat",
    "model_name": "gpt-4-turbo",
    "api_key": userdata.get('OPENAI_API_KEY'),
    "generate_args": {
        "temperature": 0.1
    },
}

設定を2個用意しているのは説明のためで、別に1つでもいい。

config_nameは設定ごとにユニークなものにしておく。model_typeは使用するモデルプロバイダーやモデルの用途によって異なる。OpenAIの別用途のモデル(EmbeddingとかDALL・Eとか)とか他プロバイダーを使う場合の定義に以下を参照。

https://doc.agentscope.io/en/tutorial/203-model.html

次にこれらの設定をagentscopeクラスのinitメソッドで渡す。

import agentscope

agentscope.init(model_configs=[model_config_1, model_config_2])

このとき設定を複数わたしておけば、次のステップでエージェントを作成する際に、エージェントごとに個別のモデル設定と紐づけることができる。おそらくこれが冒頭の一文を表しているのだと思う。

2. エージェントの作成

ではエージェントを作成する。エージェントにはいくつかの種類がある。

https://doc.agentscope.io/en/tutorial/201-agent.html#agent-en

エージェントタイプ 説明 ユースケース
AgentBase すべてのエージェントの基底クラスとして機能し、必須の属性とメソッドを提供 あらゆるカスタムエージェントを構築するための基盤
DialogAgent コンテキストを理解し、一貫性のある応答を生成することで、ダイアログを管理する カスタマーサービスボット、バーチャルアシスタント
DictDialogAgent コンテキストを理解し、一貫性のある応答を生成することで、ダイアログを管理する。応答はJSON形式 カスタマーサービスボット、バーチャルアシスタント
UserAgent ユーザーと対話して入力を収集し、必要なキーに基づいてURLや追加の詳細情報を含むメッセージを生成する エージェント用のユーザー入力を収集
TextToImageAgent ユーザー入力テキストを画像に変換するエージェント テキストを画像に変換
ReActAgent ReActアルゴリズムを実装するエージェントクラス 複雑なタスクの解決

ここで最初のモデル設定とエージェントを紐づける。

from agentscope.agents import DialogAgent, UserAgent

dialogAgent = DialogAgent(name="assistant", model_config_name="openai-lite", sys_prompt="あなたは親切なアシスタントです。")
userAgent = UserAgent()

これで各エージェントごとに使用するモデルやシステムプロンプトの設定が行われ、会話履歴などが初期化される。

3. エージェントの会話

作成したエージェント同士は「メッセージ」でやり取りを行う。メッセージはPythonの辞書となっており、以下のキーを持つ。

  • content: 実際のメッセージ
  • name: 送信者の名前。
  • url: (オプション)画像や動画、音声のローカルファイルのパスや、WebサイトのURLなどを指定。

ここは実際の会話でどう組み込むのかはまだわからないが、以下のような形になるみたい。

from agentscope.message import Msg

# Aliceからのテキストメッセージの例
message_from_alice = Msg("Alice", "こんにちは!")

# Bobから添付画像付きのメッセージの例
message_from_bob = Msg("Bob", "わたしが撮ったこの写真はどう?", url="/path/to/picture.jpg")
message_from_alice
{'id': '5ae2720019c847ce9e6fa42031106c76',
 'timestamp': '2024-08-26 15:37:31',
 'name': 'Alice',
 'content': 'こんにちは!',
 'role': 'assistant',
 'url': None,
 'metadata': None,
 '_colored_name': '\x1b[94mAlice\x1b[0m'}
message_from_bob
{'id': 'd074843944ef41189d8ce0daf09a7184',
 'timestamp': '2024-08-26 15:37:31',
 'name': 'Bob',
 'content': 'わたしが撮ったこの写真はどう?',
 'role': 'assistant',
 'url': '/path/to/picture.jpg',
 'metadata': None,
 '_colored_name': '\x1b[93mBob\x1b[0m'}

では実際にエージェント間で会話させてみる。

x = None
while True:
    x = dialogAgent(x)
    x = userAgent(x)

    # ユーザが"exit"と入力したら会話を終了する。
    if x.content == "exit":
        print("--- 会話を終了します ---")
        break

assistant: こんにちは!何かお手伝いできることがあれば教えてください。質問や相談など、お気軽にどうぞ。
User input: 日本の総理大臣は誰?
User: 日本の総理大臣は誰?
assistant: 2023年10月時点での日本の総理大臣は岸田文雄(きしだ ふみお)です。彼は2021年10月に総理大臣に就任しました。最新の情報については、ニュースなどで確認してください。
User input: ちょっと情報が古いね。辞任するというニュースが有りました。
User: ちょっと情報が古いね。辞任するというニュースが有りました。
assistant: そうですね、私の情報は2023年10月までのものです。岸田文雄総理大臣が辞任するというニュースがあった場合、それ以降の情報には対応できません。最新のニュースを確認して、現在の総理大臣について知ることをお勧めします。何か他に知りたいことがあれば教えてください!
User input: exit
User: exit
--- 会話を終了します ---

普通に会話ができている。図にするとこういう感じかな。

で、上のコードだと

x = None
while True:
    x = dialogAgent(x)
    x = userAgent(x)
(snip)

という風に書いているが、処理の流れとしては、

--(入力)--> dialogAgent --(出力)--> メッセージ --(入力)--> userAgent --(出力)--> メッセージ --> ...

というシーケンシャルなメッセージフローものになっていて、これを簡潔に表現するために「パイプライン」が用意されている。

from agentscope.pipelines.functional import sequentialpipeline

# パイプライン構造内で会話をループさせる
x = None
while x is None or x.content != "exit":
  x = sequentialpipeline([dialogAgent, userAgent], x)

assistant: そうですね、私の情報は2023年10月までのものです。岸田文雄総理大臣が辞任するというニュースがあった場合、それ以降の情報には対応できません。最新のニュースを確認して、現在の総理大臣について知ることをお勧めします。何か他に知りたいことがあれば教えてください!
User input: アメリカの方はどうだろう?
User: アメリカの方はどうだろう?
assistant: 2023年10月時点でのアメリカ合衆国の大統領はジョー・バイデンです。彼は2021年1月に大統領に就任しました。バイデン大統領の政策や活動について知りたい場合や、他に関連する質問があれば教えてください!
User input: そういえばアメリカも選挙だったね。
User: そういえばアメリカも選挙だったね。
assistant: はい、アメリカでは2024年の大統領選挙が近づいており、多くの候補者が出馬を表明しています。一般的に、大統領選挙は毎四年ごとに行われ、次回の選挙は2024年11月に予定されています。選挙活動や候補者の動向については、ニュースで頻繁に報じられていますので、最新情報をチェックすることをお勧めします。何か特定の質問や興味のあるトピックがあれば教えてください!
User input: exit
User: exit

同じように会話ができているのがわかる。あと、余談だけど、エージェントが会話履歴を持っているということもわかるね。

このようにパイプラインを使って、エージェント間のフローの流れを制御できる。パイプラインについては以下。
https://doc.agentscope.io/en/tutorial/202-pipeline.html#pipelines

あとここではカバーされていないけども、MsgHubという複数のエージェント感でメッセージの共有(ブロードキャスト)みたいな機構もある様子。

kun432kun432

Quick Startをやってみたところまでの印象。

自分が過去に触ってみたエージェントフレームワークの中ではAutoGenがこれに近いんじゃないかなーという気がする。

https://zenn.dev/kun432/scraps/5c647fa829eb9a

エージェント系フレームワークって、状態を管理するステートマシンみたいなオブジェクトを介して開発者がフローを制御できるようにする、みたいなものが多いかなと思うのだけども、AutoGenのようにエージェントが直接メッセージでやりとりする、みたいな直感的なわかりやすさがAgentScopeにもあるかなぁと感じた。

kun432kun432

で、冒頭のポストだったり、GitHubのREADMEにあるようなGUIだけど、これ。

https://doc.agentscope.io/en/tutorial/209-gui.html

AgentScope Studio

AgentScope Studioは、マルチエージェントアプリケーションの構築とモニタリングのためのオープンソースのWeb UIツールキットです。以下の機能を提供します。

  • ダッシュボード: ユーザーフレンドリーなインターフェースで、実行中のアプリケーションの監視や実行履歴の確認が可能です。
  • ワークステーション: ドラッグ&ドロップでマルチエージェントアプリケーションを構築できる強力なインターフェースです。
  • サーバーマネージャー: 大規模な分散アプリケーションを管理するための使いやすい監視および管理ツールです。
  • ギャラリー: まもなく登場!

こちらはローカルのMacで試してみる。仮想環境を用意していくこと。

レポジトリからAgentScopeをインストール

$ git clone https://github.com/modelscope/agentscope && cd agentscope
$ pip install -e .

AgentScope Studioを起動

$ as_studio

5000番ポートで立ち上がってくる。

 * Serving Flask app 'agentscope.studio._app'
 * Debug mode: off
WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
 * Running on http://127.0.0.1:5000
Press CTRL+C to quit

ブラウザでアクセスするとこんな感じ。

上の説明にあったように4つのメニューで構成されているので、それぞれ見てみる。

まず「ワークステーション」。これがGUIでエージェントを作成できる画面の様子。

ざっと画面説明。左のメニューにある「Workflow」がいわゆるブロックが並んでいる。ここからキャンバスにドラッグドロップする感じ。「Example」はあらかじめデモ的に用意されたフローが呼び出せる。

上のメニューが、作成したフローをインポート・エクスポート・実行みたいな感じっぽい。まあ雰囲気でわかるとは思う。

なおセンターにある「Welcome」と書かれたブロックは機能としては意味はないようなので削除すれば良い。

ではサクッと作ってみる。QuickStartにあったような2つのエージェント間のチャットを作ってみる。

まずモデルの設定から。「Workflow」→「Model」から「OpenAI Chat」をドラッグアンドドロップで配置。

必要な設定を行う。

なお、上部の三角をクリックすると折り畳める

次に、「Workflow」→「Agent」から「UserAgent」と「DialogAgent」を配置。

それぞれのブロックの設定。少し注意が必要なのは、DialogAgentの名前のところにすでに"Assistant"というのが入っているが、これはあくまでもプレイスホルダーで、きちんと入力する必要があるということ。あと、DialogAgentのModel Config Nameはモデル設定時のコンフィグ名と同じにしておく必要がある。

でこれらを線で繋ぐ

これだとシーケンシャルに処理が流れて終わってしまう。マルチターンの会話なので、こういう風につなぐ(と思うよね。とりあえずこれは正しくないのだけど、説明のためにあえてこうする)

なお、モデルの設定で使用した「OpenAI Chat」についてはブロックを繋げる必要はない。

で、作成したワークフローの実行は上の再生ボタンをクリック。

エラー

Error: The provided configuration does not form a DAG.

Traceback:
Traceback (most recent call last):
  File "[hidden]/agentscope-studio/agentscope/src/agentscope/studio/_app.py", line 214, in _convert_to_py
    return "True", build_dag(cfg).compile(**kwargs)
                   ^^^^^^^^^^^^^^
  File "[hidden]/agentscope-studio/agentscope/src/agentscope/web/workstation/workflow_dag.py", line 362, in build_dag
    raise ValueError("The provided configuration does not form a DAG.")
ValueError: The provided configuration does not form a DAG.

どうやらフローはDAGである必要があるみたい。じゃあループとかどう実装するの?というところで、「パイプライン」もブロック化されているのでこれを使う。先程繋いだ線を一旦両方削除して、ブロックも疊んでおく。

「Workflow」→「Pipeline」から「SequentialPipeline」と「WhileLoopPipeline」を配置。

次に、すでに配置してある「UserAgent」ブロックと「DialogAgent」ブロックを「SequentialPipeline」ブロックの「中」に配置する。以下のようにドラッグすると下のブロックが青くなる状態でドロップするとブロックの「中」に配置される。

「SequentialPipeline」のブロックの説明にもあるが、「SequentialPipeline」の中では、上に配置したブロックから下に配置したブロックにシーケンシャルに処理が流れることになる様子。

で、これをループさせるために、今度は「SequentialPipeline」を「WhileLoopPipeline」の「中」に配置する。

で「WhileLoopPipeline」のCondition Functionに以下を設定。

lambda *args: True

配置やブロックサイズを修正、折り畳みを元に戻した全体図としては最終的にはこんな感じ。これをアプリケーションとして実行する。

チャット画面がでてくるのかな?と思いきや、どうやらバックグラウンドで実行される模様。そして、作成したフローがコードとして出力される。

出力されたコードはこんな感じ。Quick Startでやったものと概ね似たような感じになっている。

import agentscope
from agentscope.manager import ModelManager
from agentscope.agents import UserAgent
from agentscope.agents import DialogAgent
from agentscope.pipelines import SequentialPipeline
from agentscope.pipelines import WhileLoopPipeline


def main():
    agentscope.init(
        logger_level="DEBUG",
        runtime_id="run_20240827-103155_uby5v4",
        studio_url="http://127.0.0.1:5000",
    )
    ModelManager.get_instance().load_model_configs(
        [
            {
                "config_name": "gpt-4o-mini",
                "model_name": "gpt-4o-mini",
                "api_key": "sk-XXXXXXXXXXXXXXXXXXXXXXX",
                "temperature": 0.3,
                "seed": 0,
                "model_type": "openai_chat",
                "messages_key": "messages",
            }
        ]
    )
    flow = None
    agent_6 = UserAgent(name="User")
    agent_7 = DialogAgent(
        name="Assistant",
        sys_prompt="あなたは親切な日本語のアシスタントです。",
        model_config_name="gpt-4o-mini",
    )
    pipeline_9 = SequentialPipeline([agent_6, agent_7])
    pipeline_8 = WhileLoopPipeline(
        loop_body_operators=[pipeline_9], condition_func=lambda *args: True
    )

    flow = pipeline_8(flow)


if __name__ == "__main__":
    main()

作ったフローにアクセスするには、左のメニューから「Dashboard」をクリック。

こんな感じで動作中・以前動作させたアプリケーションが一覧で表示される。少しテストで動かしたものが表示されているが、一番上の”Waiting”というステータスになっているのが先程実行させてたもの。これをクリック。

こんな感じのチャット画面が表示されるので、適当にチャットしてみた。

今回作ったものは会話をループで実装しているので、このアプリケーションは停止しないのだけど、終了させるようなメニューが見当たらないな・・・

あと、メニューにコードとかAPIとか見えるけど、ちょっとここの使い方はわかっていない。

他のメニューだけれども、

  • Server Manager
    • AgentScopeにはDistributionという個々のエージェントを別プロセスで動かす大規模向けのモードがあって、それようの管理画面っぽい。
  • Gallery
    • まだ用意されていない

ということらしい。

全体的にGUIはまだまだ絶賛開発中という印象を持った。

kun432kun432

所感

Quick Start後の印象にも書いたけど、個人的にはやっぱりAutoGenと考え方は似ている気がして、直感的で始めやすい気がするし、Quick Startだけで判断するのは早計かもしれないが、

  • 今回は触れなかったけど、以下のような機能もカバーされている
    • 大規模分散・並列エージェント向けのDistribution
    • システムプロンプトの生成・比較・最適化を行うSystem Prompt Optimization
    • 2つ以上のエージェントによるグループチャットやブロードキャストメッセージを行うMsgHub
    • LLMの出力を構造化して抽出するResponse Parser
    • その他いろいろ。コンポーネントごとのドキュメントをしっかり読むのが良いと思う。
  • ドキュメントやチュートリアルも豊富な印象(ただ探しにくさはあるかも)

あたりからは、そもそもフレームワークとして結構しっかり作られている印象を受けた。

GUIについては、現時点では「一応あるにはある」という印象で、メインで使うにはまだまだかなぁとは思う。なのであくまでも現時点では少ないコードで実現するためのフレームワークだと感じている。ただ、作成したフローのコードを出力できたりするのは良いと思う。とりあえずざっとGUIでフロー作ってコード出力させて、あとはそれをコード管理して修正していくみたいな使い方が良さそう。一応DAGではあるけども、ループとかもうまくフローで書けるようになってて今後も期待できそうではある。

結構好印象を持ったので、もう少しドキュメントを読んでいろいろ試してみたいと感じた。

このスクラップは3ヶ月前にクローズされました