生成AI

最終更新日:2025/04/15
昨今のAI開発において、複雑なタスクを解決する「LLMマルチエージェントフレームワーク」が注目されています。
Microsoftが開発を行っている「AutoGen(オートジェン)」は、複数のAIエージェントが協力して問題解決に取り組む新しいフレームワークとして登場しました。単一のエージェントでは難しいタスクにも取り組むことが可能です。
この記事では、AutoGenの概要から実装方法、活用例について解説します。
AutoGen(オートジェン)とは、Microsoftが開発した「LLMマルチエージェントフレームワーク」です。
複数のAIエージェントが協調し、問題解決やタスクに取り組む環境を簡単に構築できます。単一のエージェントでは処理が難しかった複雑なタスクも、役割の異なるエージェント同士の協力によって解決できる点が強みです。
例えば、GitHub Copilotがコード補完や提案に特化しているのに対し、AutoGenはより複雑なワークフローの自動化に焦点を当てています。
高度にカスタマイズ可能で、GPT-4などのLLMモデルと連携して動作し、自然言語によるタスク指示だけで複雑な処理ができます。
まずは、AutoGenができることについて解説します。主な機能は、次の3点です。
コード生成・補完機能に関しては、複数のエージェントが協力してコードを生成・改良するため、「あるエージェントがコードを提案し、別のエージェントが検証する」といった流れで効率化できます。
AutoGenには自然言語で指示を出せます。日本語でプロンプトを入力するだけで、必要なコード生成から実行、デバッグまで自動で行えます。
エージェント同士の対話と連携により、例えば「AssistantAgent」が解法を考え、「UserProxyAgent」が検証を行うといった役割分担が可能です。
AutoGenのマルチエージェントアーキテクチャは、「ConversableAgent」という基本クラスを核としています。
各エージェントはこのクラスを継承して作られ、sendメソッドでメッセージを送信し、receiveメソッドで受信するという単純なインターフェースで通信します。
タスク分担と協調の方法も、巧みに設計されています。
「AssistantAgent」はLLMを活用して問題解決やコード生成を担当し、「UserProxyAgent」はコードを実行して結果を評価します。「GroupChatManager」は複数のエージェント間の会話を調整し、次の発言者を選定します。
エージェントの階層構造も設計可能で、「単純な2つのエージェントによる対話」から「設計、コーディング、テストなど役割が分かれた複雑な多層構造」までタスクの性質に応じて構成を選べます。
Microsoftが開発したオープンソースツールとしての特徴やメリットに関して、以下3点が挙げられます。
AutoGenはMITライセンスの下で提供されており、商用利用を含むさまざまな用途に無料で活用できます。オープンな開発体制により、世界中の開発者が利用可能です。
コミュニティサポートはGitHub(スター数5,500以上)を中心に活発で、質問やディスカッション、新機能提案やバグ修正が行われています。
AutoGenv2.0を導入するには、環境要件を満たし、正しい設定手順で進めることが重要です。
なお、一般的なトラブルとしては、依存ライブラリのバージョン競合や環境変数の設定ミスがありますが、これらは公式ドキュメントの確認やコミュニティでの質問などで解決できる場合があります。
まず始めに、Pythonバージョン3.8以上の環境を準備してください。次に、AutoGenのインストールを行います。基本的なインストールにはpipコマンドでpyautogenパッケージをインストールします。
!pip install pyautogen
インストール後には、簡単なPythonスクリプトを実行して正常に作動しているか確認することを推奨します。
AutoGenを使用するには、OpenAI APIキーの設定が必要です。APIキーはOpenAIの公式サイトでアカウントを作成後、ダッシュボードから取得できます。
キーの設定は主に環境変数として行います。コマンドラインで直接設定するか、.envファイルに記述して読み込む方法があります。特に本番環境では、OSの環境変数として安全に管理することをおすすめします。
セキュリティ面では、APIキーをソースコードに直接記述せず、GitHubなどの公開リポジトリにアップロードしないよう注意してください。また、使用量の上限設定で思わぬ課金を防ぐことも大切です。
AutoGenv2.0では、さまざまなパラメータでエージェントの動作をカスタマイズできます。
必須パラメータは「name」(エージェント名)と「llm_config」(言語モデル設定)で、初期化時に必ず指定します。
任意パラメータの例は、以下の通りです。
各パラメータは使用目的に応じて調整してください。例えば、正確な回答が必要なら「temperature」を低く設定し、創造的な応答を求めるなら高く設定します。コード実行を行う場合は「code_execution_config」で実行環境を指定できます。
データ分析では適切なワークディレクトリ設定、マルチエージェント対話では発言順序の制御など、ユースケースに合わせたパラメータ調整をすると良いでしょう。
AutoGenの主要なエージェントは「AssistantAgent」「UserProxyAgent」の2つです。また、エージェント間の対話を管理するための「GroupChatManager」というクラスも提供されています。
以下では、それぞれの機能と実装方法について解説します。
AssistantAgentは、AutoGenの中核となるエージェントで、AIアシスタントの役割を担います。
その基本機能は、自然言語での対話、問題解決、コード生成などです。デフォルトではコードの作成や修正に特化していますが、設定によってはコードの実行も可能です。
基本的な実装は、AutoGenモジュールをインポートし、APIキーやモデル名などを含む設定を作成した上で、AssistantAgentクラスをインスタンス化するだけです。system_messageパラメータでエージェントの役割を指定し、llm_configで使用するLLMの設定を行います。
AssistantAgentはカスタマイズ可能で、system_messageを変更することでエージェントの専門分野や回答スタイルを調整できるほか、temperatureパラメータでバランスを調整できます。また、max_consecutive_auto_replyパラメータで連続返信の回数を制限することも重要です。
具体的な活用例としては、プログラミングアシスタント、数学問題ソルバー、データ分析アドバイザーなどが考えられます。例えば、Pythonのコード生成に特化したエージェントを作成するには、system_messageにPythonの専門家としての役割を指定します。
UserProxyAgentは、人間ユーザーとシステムの間を取り持つ役割を果たします。主な機能は、コードの実行、人間からの入力の処理、そしてAssistantAgentへのフィードバック提供です。
ユーザーとの対話方法は、human_input_modeパラメータで制御できます。
「ALWAYS」モードでは常に人間の入力を求め、「NEVER」モードでは自動応答のみで進行します。「AUTO」モードでは、エージェントが自動的に人間の入力を求めるかどうかを判断します。開発初期は「ALWAYS」を使用してプロセスを監視し、システムが安定したら「NEVER」や「AUTO」に切り替えるアプローチが一般的です。
エラー処理とフィードバックについては、max_consecutive_auto_replyパラメータで無限ループを防止したり、受け取ったエラーメッセージを解析して次のアクションを決定する機能があります。
実際の活用シーンとしては、データ分析の自動化、コードのテストと検証、対話型のチュートリアルなどが挙げられます。例えば、データ分析ワークフローでは、UserProxyAgentがPythonスクリプトを実行し、結果をAssistantAgentに返すことで、分析の反復プロセスを効率化できます。
標準エージェントでは対応できない特殊なニーズがある場合、ConversableAgentクラスを継承してカスタムエージェントを作成できます。
基本的なクラス構造では、ConversableAgentを継承したクラスを定義し、__init__メソッドでスーパークラスの初期化を行います。この際、nameパラメータは必須ではなく、その他のパラメータはkwargsで受け取り、スーパークラスに渡しましょう。必要に応じて、カスタムプロパティも初期化します。
エラー処理も欠かせません。try-exceptブロックを使って例外を捕捉し、適切に対応するコードを実装します。また、ログ機能を活用して、エラー情報を記録することもおすすめです。
具体的な実装例としては、特定のAPIと連携するエージェントや、特定のドメイン知識を持つ専門家エージェントなどが考えられます。ベストプラクティスとしては、単一責任の原則に従いエージェントの役割を明確にすること、適切なエラー処理とログ記録を実装すること、そして必要に応じてテストケースを作成することが挙げられます。
ここでは、実際のユースケースに基づいた実装例を通じて、AutoGenの活用方法を解説します。
AssistantAgentとUserProxyAgentを組み合わせることで、基本的な対話システムを構築できます。
エージェント設定では、名前、システムメッセージ、LLM設定を指定。AssistantAgentはLLMによる応答生成を担当し、UserProxyAgentはユーザー入力や処理実行を管理します。
対話フローはinitiate_chat()で開始し、終了条件によって制御します。最大応答回数や特定のキーワードで会話終了を設定でき、人間の介入度も調整可能です。
AssistantAgentの応答はLLMにより生成され、UserProxyAgentで処理されます。必要に応じてコード実行やツール呼び出しを行い、結果を次の対話に反映させます。
【サンプルコード】
import os
import autogen
from dotenv import load_dotenv
# .envファイルから環境変数を読み込む
load_dotenv()
# 環境変数からAPIキーを安全に取得
api_key = os.getenv("OPENAI_API_KEY")
# LLM設定
llm_config = {
"config_list": [{"model": "gpt-4", "api_key": api_key}]
}
# アシスタントエージェントの設定
assistant = autogen.AssistantAgent(
name="assistant",
llm_config=llm_config,
system_message="あなたは親切で役立つアシスタントです。"
)
# ユーザープロキシエージェントの設定
user_proxy = autogen.UserProxyAgent(
name="user",
human_input_mode="AUTO", # AUTO: 必要に応じて人間の入力を求める
max_consecutive_auto_reply=5,
code_execution_config={"work_dir": "coding"}
)
# 対話の開始
user_proxy.initiate_chat(
assistant,
message="AutoGenについて教えてください。特徴と利点を3つ挙げてください。"
)
エージェント間の通信は、send()/receive()メソッドによる直接通信や、GroupChatManagerによる会話調整で実現できます。終了条件を定義することで、タスク完了を自動判断することが可能です。
各エージェントには明確な役割をシステムメッセージで定義し、専門性に応じたタスク分担を行います。一般的には、AssistantAgentが思考・コード生成を担当し、UserProxyAgentがコード実行を担当します。
エージェント間の対話を通じて情報を集約し、共有作業ディレクトリを活用することで成果物を統合します。必要に応じて特定のエージェントが結果を収集・整理する役割を担います。
【サンプルコード】
import os
import autogen
from dotenv import load_dotenv
from langchain.embeddings import OpenAIEmbeddings
from langchain.vectorstores import Chroma
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.document_loaders import DirectoryLoader
# 環境変数の読み込み
load_dotenv()
api_key = os.getenv("OPENAI_API_KEY")
# LLM設定
llm_config = {
"config_list": [{"model": "gpt-4", "api_key": api_key}]
}
# RAGシステムの設定
# ドキュメントの読み込みと前処理
loader = DirectoryLoader("./documents", glob="**/*.pdf")
documents = loader.load()
text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=100)
texts = text_splitter.split_documents(documents)
# ベクトルストアの作成
embeddings = OpenAIEmbeddings(openai_api_key=api_key)
db = Chroma.from_documents(texts, embeddings)
# エージェント設定
assistant = autogen.AssistantAgent(
name="assistant",
llm_config=llm_config
)
user_proxy = autogen.UserProxyAgent(
name="user",
human_input_mode="TERMINATE",
code_execution_config={"work_dir": "rag_workspace"}
)
# 検索関数の定義
def search_documents(query: str, top_k: int = 3) -> str:
"""関連文書を検索して結果を返す"""
docs = db.similarity_search(query, k=top_k)
results = "\n\n".join([f"Document {i+1}:\n{doc.page_content}" for i, doc in enumerate(docs)])
return results
# AutoGen v2.0での関数登録方法
# 注: バージョンによって構文が異なる場合があります
assistant.register_function(
function_map={"search_documents": search_documents},
name="search_documents",
description="検索機能: 与えられたクエリに関連する情報を文書から検索します"
)
# 対話開始
user_proxy.initiate_chat(
assistant,
message="当社の最新の製品仕様について教えてください"
)
AutoGenはRAGシステムと統合することで、外部知識を活用した対話が実現できます。エージェントが必要に応じて関連情報を検索し、回答の質を向上させます。
RAGシステムでは、ドキュメントのインデックス作成と検索機能を設定します。一般的に、LangChainやChromaDBなどのライブラリを使用し、ベクトル検索を実装します。文書はベクトル化され、意味的類似性に基づいて検索されます。
AutoGenとRAGを連携するには、ツール関数として検索機能を実装し、エージェントに登録します。関数デコレータを使って検索機能をLLMから呼び出せるようにします。エージェントは自律的に検索タイミングを判断します。
検索結果はJSON形式や構造化テキストとしてエージェントに返され、コンテキスト情報として利用されます。必要に応じて結果をフィルタリングし、トークン制限内に収めることが重要です。
【サンプルコード】
import os
import autogen
from dotenv import load_dotenv
from langchain.embeddings import OpenAIEmbeddings
from langchain.vectorstores import Chroma
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.document_loaders import DirectoryLoader
# 環境変数の読み込み
load_dotenv()
api_key = os.getenv("OPENAI_API_KEY")
# LLM設定
llm_config = {
"config_list": [{"model": "gpt-4", "api_key": api_key}]
}
# RAGシステムの設定
# ドキュメントの読み込みと前処理
loader = DirectoryLoader("./documents", glob="**/*.pdf")
documents = loader.load()
text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=100)
texts = text_splitter.split_documents(documents)
# ベクトルストアの作成
embeddings = OpenAIEmbeddings(openai_api_key=api_key)
db = Chroma.from_documents(texts, embeddings)
# エージェント設定
assistant = autogen.AssistantAgent(
name="assistant",
llm_config=llm_config
)
user_proxy = autogen.UserProxyAgent(
name="user",
human_input_mode="TERMINATE",
code_execution_config={"work_dir": "rag_workspace"}
)
# 検索関数の定義
def search_documents(query: str, top_k: int = 3) -> str:
"""関連文書を検索して結果を返す"""
docs = db.similarity_search(query, k=top_k)
results = "\n\n".join([f"Document {i+1}:\n{doc.page_content}" for i, doc in enumerate(docs)])
return results
# AutoGen v2.0での関数登録方法
# 注: バージョンによって構文が異なる場合があります
assistant.register_function(
function_map={"search_documents": search_documents},
name="search_documents",
description="検索機能: 与えられたクエリに関連する情報を文書から検索します"
)
# 対話開始
user_proxy.initiate_chat(
assistant,
message="当社の最新の製品仕様について教えてください"
)
AutoGenは、Microsoftが開発したマルチエージェントフレームワークとして、AIに新たな可能性をもたらしています。
AssistantAgentとUserProxyAgentを基本とした構造ながら、カスタマイズ可能なアーキテクチャにより、プログラミング支援からデータ分析、RAGシステムとの連携まで幅広い用途に対応できるところが魅力です。
オープンソースとして提供されているため、誰でも自由に活用でき、活発なコミュニティによる改善も期待できます。
業務の課題解決に繋がる最新DX・情報をお届けいたします。
メールマガジンの配信をご希望の方は、下記フォームよりご登録ください。登録無料です。
AI製品・ソリューションの掲載を
希望される企業様はこちら