OllamaとAutoGenを連携させる方法|会話駆動型マルチエージェントをローカルLLMでLinuxサーバーに構築する手順

宮崎智広 この記事の監修:宮崎智広(Linux実務・教育歴20年以上・受講者3,100名超)
HOMELinux技術 リナックスマスター.JP(Linuxマスター.JP)ローカルLLM > OllamaとAutoGenを連携させる方法|会話駆動型マルチエージェントをローカルLLMでLinuxサーバーに構築する手順
「ローカルLLMでAIエージェントを動かしたいが、どのフレームワークを選べばいいか分からない」
「CrewAIは試したが、もっと柔軟な会話型マルチエージェントをOllamaで構築したい」

そんな悩みを持つLinuxエンジニアやサーバー管理者は多い。この記事では、MicrosoftのマルチエージェントフレームワークAutoGenをOllamaと接続し、Ubuntu Server上でローカルLLMを使った会話駆動型マルチエージェントを構築する手順を解説する。
AssistantAgentとUserProxyAgentの基本構成から、GroupChatによる複数エージェントの役割分担、コード実行エージェントの安全な設定、本番運用に欠かせないタイムアウト制御まで、実際に動く形でまとめた。

この記事のポイント

・AutoGenはOllamaのOpenAI互換API(localhost:11434/v1)に接続するだけでローカル推論が使える
・config_listに`"price": [0, 0]`を必ず追加してコスト計算エラーを回避する
・GroupChatはmax_roundとmax_consecutive_auto_replyで無限ループを防ぐ
・コード実行は`use_docker: False`でDockerなし環境でも安全に動作させられる


OllamaとAutoGenを連携させる方法|会話駆動型マルチエージェントをローカルLLMでLinuxサーバーに構築する手順

「このままじゃマズい」と感じていませんか?
参考書を開く気力もない、同年代に取り残される不安——
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
図解60P/登録10秒/解除も3秒 / 詳細はこちら

AutoGenとCrewAIの違い—会話駆動型を選ぶ理由

マルチエージェントフレームワークといえばCrewAIが有名だが、AutoGenは設計思想がまったく異なる。
CrewAIはロールベースで、エージェントにあらかじめ役割(Researcher・Writer・Reviewerなど)と責任タスクを定義し、そのタスクを順番に実行していく。一方、AutoGenは複数のエージェントが会話のやり取りを通じて問題を解決する「会話駆動型」だ。

たとえば「障害ログを調査してレポートを作れ」という指示を与えると、AutoGenではassistantがコードを提案し、user_proxyがそのコードを実行し、実行結果を受け取ったassistantがさらに分析を深める—というフィードバックループが自律的に生まれる。
問題の性質が事前に定義しにくい探索的なタスク、コード生成と実行を繰り返すインタラクティブな処理に特に強みを発揮する。現場でよく聞くのは「CrewAIは定型ワークフローに強く、AutoGenは問題解決プロセス自体が不明確なタスクに向く」という使い分けだ。
本記事のAutoGenはpyautogenパッケージ(v0.2系)のAPIを使用する。v0.4系は設計が大幅に変わっているため、パッケージ名と対応するAPIに注意してほしい。

前提条件の確認とPython仮想環境の準備

AutoGenを動かすにはOllamaが起動済みであること、Python 3.10以上が使えることが前提になる。
OllamaのインストールやUbuntu Serverへのローカル環境構築がまだの場合は、先にUbuntu ServerでローカルLLMを構築する方法|Ollamaで機密データを外に出さず業務AIを動かす完全ガイドを参照してほしい。
AutoGenは依存ライブラリが多く、システムのPython環境に直接インストールするとバージョン競合が起きやすい。専用の仮想環境を作ることを強く推奨する。

1. Ollamaの起動と疎通確認

まずOllamaが正常に動いているか確認する。

# Ollamaサービスの状態確認 $ systemctl status ollama * ollama.service - Ollama Service Loaded: loaded (/etc/systemd/system/ollama.service; enabled; ...) Active: active (running) since 2026-07-23 09:00:12 JST; 2h ago # OpenAI互換エンドポイントの疎通テスト $ curl -s http://localhost:11434/v1/models | python3 -m json.tool | head -20 { "object": "list", "data": [ { "id": "llama3.3:70b-instruct-q4_K_M", "object": "model", "created": 1753225212, "owned_by": "library" } ] }

`Active: active (running)` が確認できればOllamaは正常に動いている。
`/v1/models` へのGETレスポンスにモデルIDが返ってこれば、OpenAI互換エンドポイントが有効な状態だ。

2. Python仮想環境の作成

# Pythonバージョン確認(3.10以上が必要) $ python3 --version Python 3.12.3 # 仮想環境を作成 $ python3 -m venv /opt/autogen-venv # 仮想環境を有効化 $ source /opt/autogen-venv/bin/activate # pipを最新化 (autogen-venv) $ pip install --upgrade pip Successfully installed pip-24.3.1

仮想環境を有効化するとプロンプトの先頭に `(autogen-venv)` が付く。以降の操作はすべてこの仮想環境内で実施する。

AutoGenのインストールとOllama接続設定

AutoGenはバージョンによってパッケージ名が異なる。本記事では `pyautogen`(v0.2系)を使用する。v0.2系はAssistantAgentやGroupChatなど実績のあるAPIが揃っており、Ollamaとの連携事例も豊富だ。
v0.4系(autogen-agentchatパッケージ)はAPIが大幅に変わっているため、本記事のコードは動かない点に注意してほしい。

1. pyautogenのインストール

# pyautogen(v0.2系)をインストール (autogen-venv) $ pip install pyautogen # インストール確認 (autogen-venv) $ python3 -c "import autogen; print(autogen.__version__)" 0.2.40

2. OllamaのOpenAI互換エンドポイントへの接続設定

AutoGenはOpenAI SDKを内部で使用するため、Ollamaの `/v1` エンドポイントをそのまま利用できる。設定はPythonの辞書(config_list)で渡す。

# /opt/autogen-venv/scripts/ollama_config.py config_list = [ { "model": "llama3.3:70b-instruct-q4_K_M", "base_url": "http://localhost:11434/v1", "api_key": "ollama", # Ollamaはキー不要だが空文字はエラーになるため設定 "price": [0, 0], # トークンコスト計算を無効化(未設定だとエラー) } ] llm_config = { "config_list": config_list, "cache_seed": None, # キャッシュ無効(毎回フレッシュな推論) "timeout": 180, # 推論タイムアウト(秒) }

`"price": [0, 0]` は入力・出力のトークン単価を設定するフィールドで、省略するとAutoGenが「モデルの価格情報が不明」としてエラーを返す。Ollamaのローカルモデルにはコストが発生しないため、必ず `[0, 0]` を指定する。
モデル選定に迷う場合は、ローカルLLMのモデルを比較する方法|Llama3.3・Mistral・Gemma・Phi-4をUbuntuで使い分けるポイントを参考にしてほしい。

AssistantAgentとUserProxyAgentで基本エージェントを構築する

AutoGenの最小構成は2つのエージェントで成り立つ。AssistantAgentがLLMを使って応答・コードを生成し、UserProxyAgentが人間の代理として応答を受け取り(必要に応じてコードを実行し)会話を進める。
この2エージェント構成だけで、「タスクを渡す → LLMが解法を考える → コードを生成・実行 → 結果を分析」というサイクルが自律的に動く。

1. 基本エージェントのコード

# /opt/autogen-venv/scripts/basic_agent.py from autogen import AssistantAgent, UserProxyAgent config_list = [ { "model": "llama3.3:70b-instruct-q4_K_M", "base_url": "http://localhost:11434/v1", "api_key": "ollama", "price": [0, 0], } ] llm_config = { "config_list": config_list, "cache_seed": None, "timeout": 180, } # AssistantAgent: LLMが応答・コード生成を担当 assistant = AssistantAgent( name="assistant", llm_config=llm_config, system_message=( "あなたはLinuxサーバー管理の専門家です。" "シェルスクリプトやPythonコードで問題を解決してください。" "解決が完了したら最後のメッセージに TERMINATE と入力してください。" ), ) # UserProxyAgent: 人間の代理。コード実行も担当 user_proxy = UserProxyAgent( name="user_proxy", human_input_mode="NEVER", # 人間の入力を要求しない(完全自動) max_consecutive_auto_reply=5, # 最大5回の自動返信で停止 code_execution_config={ "work_dir": "/tmp/autogen_workspace", "use_docker": False, # Dockerなしでローカル実行 }, is_termination_msg=lambda msg: "TERMINATE" in msg.get("content", ""), ) # タスクを開始 user_proxy.initiate_chat( assistant, message="ディスク使用量の上位5ディレクトリを調べるシェルスクリプトを作成し、実行してください。", )

2. スクリプトの実行と出力確認

(autogen-venv) $ mkdir -p /tmp/autogen_workspace (autogen-venv) $ python3 /opt/autogen-venv/scripts/basic_agent.py user_proxy (to assistant): ディスク使用量の上位5ディレクトリを調べるシェルスクリプトを作成し、実行してください。 -------------------------------------------------------------------------------- assistant (to user_proxy): 以下のスクリプトを実行します。 ```bash du -sh /* 2>/dev/null | sort -rh | head -5 ``` (user_proxyがコードを実行し、結果をassistantへ返す) assistant (to user_proxy): 結果を確認しました。上位5ディレクトリは ... (分析と説明が続く) ... TERMINATE

`human_input_mode="NEVER"` を設定すると人間が介入せず完全自動でエージェントが会話を進める。
`is_termination_msg` にTERMINATEキーワードを設定しておくと、assistantが解決済みと判断してTERMINATEを含む返信を送った時点で会話が終了する。これがない場合は `max_consecutive_auto_reply` の回数に達した時点で停止する。

GroupChatで複数エージェントに役割分担させる

2エージェント構成の次のステップはGroupChatだ。3つ以上のエージェントが同一の会話スレッドに参加し、GroupChatManagerが発言権を動的に割り当てる。
たとえば「Planner(計画立案)」「Coder(コード生成)」「Reviewer(コードレビュー)」の3エージェントを使うと、計画→実装→レビューの流れが自律的に回る。GroupChatManagerはLLMを使って「次は誰が話すべきか」を判断するため、コンテキストに応じた自然な発言順序が生まれる。

1. GroupChat構成のコード

# /opt/autogen-venv/scripts/groupchat_agent.py from autogen import AssistantAgent, UserProxyAgent, GroupChat, GroupChatManager config_list = [ { "model": "llama3.3:70b-instruct-q4_K_M", "base_url": "http://localhost:11434/v1", "api_key": "ollama", "price": [0, 0], } ] llm_config = {"config_list": config_list, "cache_seed": None, "timeout": 180} # 役割を持つAssistantAgentを3体定義 planner = AssistantAgent( name="planner", llm_config=llm_config, system_message=( "あなたはタスク計画の専門家です。目標を達成するための詳細なステップを計画してください。" "実装はcoderに任せ、計画のみを提示してください。" ), ) coder = AssistantAgent( name="coder", llm_config=llm_config, system_message=( "あなたはPythonとシェルスクリプトの専門家です。" "plannerの計画に従って、実際に動作するコードを書いてください。" ), ) reviewer = AssistantAgent( name="reviewer", llm_config=llm_config, system_message=( "あなたはコードレビューの専門家です。coderが書いたコードのセキュリティ・効率性・" "可読性をレビューし、改善点を指摘してください。" "問題がなければ LGTM と回答し、その後 TERMINATE と入力してください。" ), ) user_proxy = UserProxyAgent( name="user_proxy", human_input_mode="NEVER", max_consecutive_auto_reply=10, code_execution_config={ "work_dir": "/tmp/autogen_workspace", "use_docker": False, }, is_termination_msg=lambda msg: "TERMINATE" in msg.get("content", ""), ) # GroupChatを作成(最大15ラウンド) groupchat = GroupChat( agents=[user_proxy, planner, coder, reviewer], messages=[], max_round=15, ) manager = GroupChatManager( groupchat=groupchat, llm_config=llm_config, ) # タスク開始 user_proxy.initiate_chat( manager, message="Nginxのアクセスログから直近1時間のエラー率を集計するPythonスクリプトを作成してください。", )

2. GroupChatの実行と発言順序の確認

(autogen-venv) $ python3 /opt/autogen-venv/scripts/groupchat_agent.py user_proxy (to chat_manager): Nginxのアクセスログから直近1時間のエラー率を集計するPythonスクリプトを作成してください。 planner (to chat_manager): 以下のステップで実装します: 1. /var/log/nginx/access.log を読み込む 2. タイムスタンプをパースして直近1時間のエントリを抽出する 3. ステータスコード 4xx・5xx をカウントする 4. エラー率(エラー数/総リクエスト数)を計算して出力する coder (to chat_manager): plannerの計画に従ったPythonスクリプトを作成します。 ... (コードブロックが続く) reviewer (to chat_manager): コードのレビュー結果: セキュリティ上の問題なし。効率性も問題なし。LGTM TERMINATE

GroupChatManagerはLLMを使って次の発言者を動的に選ぶ。plannerが計画を提示したらcoderへ、coderがコードを書いたらreviewerへと、コンテキストに応じて自然に発言権が移る。
`max_round=15` を設定することで、会話が延々と続くことを防いでいる。この値が小さすぎると未完了のまま終わるため、タスクの複雑さに応じて調整してほしい。

コード実行エージェントの安全な設定(use_docker: False)

AutoGenのUserProxyAgentはデフォルトでDockerを使ってコードを実行しようとする。Dockerがインストールされていない環境や、セキュリティポリシー上Dockerを使えない環境では `use_docker: False` を指定してホスト上で直接実行させる。
ただし、ホスト上での直接実行はLLMが生成したコードをそのまま動かすことを意味する。信頼できるモデルを使い、作業ディレクトリのアクセス権を制限しておくことが最低限の安全策だ。

1. 作業ディレクトリのアクセス権設定

# 専用の作業ディレクトリを作成(/tmp ではなく固定パスを推奨) $ sudo mkdir -p /opt/autogen_workspace $ sudo chown $USER:$USER /opt/autogen_workspace $ chmod 750 /opt/autogen_workspace # ディレクトリのパーミッション確認 $ ls -ld /opt/autogen_workspace drwxr-x--- 2 ubuntu ubuntu 4096 Jul 23 09:15 /opt/autogen_workspace

2. human_input_modeの選択指針

本番環境では `human_input_mode` の選択が重要になる。
・`NEVER`: 完全自動(バッチ自動化向け。コードを確認せずそのまま実行する)
・`ALWAYS`: 毎回確認(開発・デバッグ向け。安全だが対話操作が必要)
・`TERMINATE`: 会話終了時のみ確認(中間的な選択肢)

cronで定期実行するような自動バッチでは `NEVER` が使いやすいが、生成されたコードが危険な操作(`rm -rf` や `dd` など)を含む可能性を念頭に置いて、作業ディレクトリのアクセス権は必ず絞っておく。

本番運用での注意点(タイムアウト・ループ対策・ログ管理)

ローカルLLMはクラウドAPIに比べて推論速度が遅い。また、AutoGenのエージェントが無限ループに入ったり、タイムアウトで途中終了したりするケースが実運用では発生する。
知人のインフラエンジニアがOllama+AutoGenを社内サーバーに導入した際も、最初はタイムアウト設定の誤りでスクリプトが途中で止まり続けたと言っていた。ここでは実運用で押さえておくべきポイントをまとめる。

1. タイムアウト設定の目安

Llama3.3の70Bモデルをq4_K_Mで動かす場合、CPU推論では1応答に数分かかることがある。`timeout` の設定が短すぎると推論途中で切断される。
・GPU(VRAM 24GB以上)環境: `timeout: 120` が目安
・CPU専用環境(物理コア16以上): `timeout: 600` 以上を推奨
・Phi-4やMistralなど7Bクラスのモデルを使う場合: `timeout: 60` で十分なことが多い

2. 無限ループの防止設定

GroupChatとUserProxyAgentの両方にループ制限を設定するのが鉄則だ。片方だけでは片側がカウントに達しても相手が返信を続けるケースがある。

# GroupChatとUserProxyAgent、両方にループ制限を設定する groupchat = GroupChat( agents=[...], messages=[], max_round=15, # 全エージェント合計の最大発言回数 ) user_proxy = UserProxyAgent( name="user_proxy", human_input_mode="NEVER", max_consecutive_auto_reply=5, # user_proxyの連続自動返信上限 is_termination_msg=lambda msg: ( "TERMINATE" in msg.get("content", "") or "完了しました" in msg.get("content", "") # 日本語終了キーワードも追加 ), code_execution_config={ "work_dir": "/opt/autogen_workspace", "use_docker": False, }, )

3. 会話ログの保存

AutoGenの会話履歴はメモリ上にのみ存在する。障害解析や処理の再確認のため、ログをファイルに保存しておく。

# ログ保存ディレクトリを事前に作成 $ sudo mkdir -p /var/log/autogen $ sudo chown $USER:$USER /var/log/autogen # Pythonスクリプト内でinitiate_chat後に会話履歴を保存する import json from datetime import datetime timestamp = datetime.now().strftime("%Y%m%d_%H%M%S") log_path = f"/var/log/autogen/chat_{timestamp}.json" with open(log_path, "w", encoding="utf-8") as f: json.dump(user_proxy.chat_messages, f, ensure_ascii=False, indent=2) print(f"会話ログを保存しました: {log_path}")

よくあるエラーと対処法

ローカルLLM環境でAutoGenを動かすと、クラウドAPIでは見られない特有のエラーが発生することがある。情シス部門でローカルLLMの社内導入を検討している方は、社内でChatGPTが使えないときの代替手段|機密データを守るローカルLLMという選択肢も合わせて参照してほしい。以下に報告が多いトラブルをまとめた。

1. 「Invalid model price」エラー

症状: `ValueError: Invalid model price` または `KeyError: 'price'` が発生する
原因: config_listの各エントリに `"price": [0, 0]` が未設定
対処: config_listのすべてのエントリに `"price": [0, 0]` を追加する。Ollamaのローカルモデルにはコストが発生しないため、両方ゼロで問題ない。

2. ConnectionRefusedError(接続拒否)

症状: `httpx.ConnectError: [Errno 111] Connection refused` が発生する
原因: Ollamaが起動していない、またはOLLAMA_HOSTの設定が異なる
対処: `systemctl status ollama` でサービス状態を確認し、`curl http://localhost:11434/` で疎通テストを実施する。ポートをデフォルト以外に変更している場合は `base_url` を合わせる。

3. タイムアウトによる会話中断

症状: 推論の途中でTimeoutErrorが発生し会話が途切れる
原因: llm_configの `timeout` 値が推論にかかる時間より短い
対処: `"timeout": 300` ~ `"timeout": 600` に延長する。CPUのみの環境では `900` 以上が必要なケースもある。

4. コード修正ループが終わらない

症状: エージェントがコード修正を繰り返し `max_round` に達してしまう
原因: system_messageの指示が曖昧で、LLMが「完了」を判断できない
対処: assistantのsystem_messageに「解決したら最後のメッセージにTERMINATEと入力してください」と明記する。また `is_termination_msg` に複数の終了キーワードを追加する。

本記事のまとめ

OllamaのOpenAI互換APIを使えば、AutoGenとのローカル連携は設定ファイルの変更だけで実現できる。最初の山は `"price": [0, 0]` の設定と `timeout` の適切な値を決めることだ。
GroupChatを使えば複数エージェントが会話しながら計画→実装→レビューを自律的に回すことができる。`max_round` と `max_consecutive_auto_reply` を必ず両方設定してループを制御し、会話ログも保存しておくと本番での予期しない動作に対処しやすくなる。
やりたいこと 設定・コマンド
Ollama接続設定 config_list = [{"base_url": "http://localhost:11434/v1", "api_key": "ollama", "price": [0, 0], ...}]
推論タイムアウト設定 llm_config = {"config_list": config_list, "timeout": 300, "cache_seed": None}
基本2エージェント会話 user_proxy.initiate_chat(assistant, message="タスク")
複数エージェント会話 GroupChat(agents=[user_proxy, planner, coder, reviewer], max_round=15)
コード実行をDockerなしで code_execution_config={"use_docker": False, "work_dir": "/opt/autogen_workspace"}
ループ制限 UserProxyAgent(max_consecutive_auto_reply=5, ...)
終了条件の指定 is_termination_msg=lambda msg: "TERMINATE" in msg.get("content", "")
会話ログの保存 json.dump(user_proxy.chat_messages, f, ensure_ascii=False, indent=2)

AutoGenとOllamaを使った会話型エージェントを2日間のハンズオンで体験する

ローカルLLMのエージェント構築は、理論を読むより手を動かして体験する方が定着が早い。GroupChatによる複数エージェントの設計や、コード実行エージェントの高度な設定を実機GPU環境で手を動かしながら習得したい方向けに、「ローカルAIマスターセミナー」を開催しています。
少人数(最大8名)ZOOMハンズオン形式で実施しています。

>> ローカルAIマスターセミナーの詳細を確認する
ローカルLLMの構築・運用に関する関連記事もあわせて参考にしてください。

Ubuntu ServerでローカルLLMを構築する方法|Ollamaで機密データを外に出さず業務AIを動かす完全ガイド
社内でChatGPTが使えないときの代替手段|機密データを守るローカルLLMという選択肢
ローカルLLMのモデルを比較する方法|Llama3.3・Mistral・Gemma・Phi-4をUbuntuで使い分けるポイント

無料メルマガで学習を続ける

Linuxの実践スキルをメールで毎週お届け。
登録は1分、解除もいつでも可。

登録無料・いつでも解除できます

暗記不要・1時間後にはサーバーが動く

3,100名以上が実践した「型」を無料で公開中

プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。

登録10秒/合わなければ解除3秒 / 詳細はこちら

Linux無料マニュアル(図解60P) 名前とメールで30秒登録
宮崎 智広

この記事を書いた人

宮崎 智広(みやざき ともひろ)

株式会社イーネットマーキュリー代表。現役のLinuxサーバー管理者として20年以上の実務経験を持ち、これまでに累計3,100名以上のエンジニアを指導してきたLinux教育のプロフェッショナル。「現場で本当に使える技術」を体系的に伝えることをモットーに、実践型のLinuxセミナーの開催や無料マニュアルの配布を通じてLinux人材の育成に取り組んでいる。

趣味は、キャンプにカメラ、トラウト釣り。好きな食べ物は、ラーメンにお酒。休肝日が作れない、酒量を減らせないのが悩み。最近、ドラマ「フライトエンジェル」を観て涙腺が崩壊しました。