ローカルAIを使えば、外部API費用をかけずにマルチエージェント型の記事作成システムを構築できます。
本記事では、Ollama上のGemma 4を使い、Planner・Writer・Reviewerの3つの役割を持つAIエージェントを実装します。
第1回では、Windows 11+WSL環境で、キーワード入力からHTML記事保存までを行う最小構成を作成します。
ローカルAIでマルチエージェントを作る
AIエージェントという言葉を聞くと、クラウドAPIや複雑な自動化システムを想像するかもしれません。
しかし、最小構成であれば、ローカルPC上でも マルチエージェント型のAIシステム を作ることができます。
今回作成するのは、次のような仕組みです。
キーワードを入力
↓
Planner AI が記事設計
↓
Writer AI が本文作成
↓
Reviewer AI が品質確認
↓
Writer AI が修正
↓
HTMLファイルとして保存
このように、1つのAIにすべてを任せるのではなく、複数の役割に分けて処理するのが、今回のマルチエージェント構成です。
このシリーズで作るもの
このシリーズでは、最終的に ローカルAIを使ったマルチエージェント記事作成システム を段階的に作っていきます。
シリーズ構成の例は以下です。
第1回:Gemma 4・Ollama・WSLで最小実装
第2回:Planner / Writer / Reviewer の役割を整理する
第3回:途中結果を保存して品質を安定させる
第4回:MCP風ツールを正式なMCP構成へ近づける
save_article / read_article / save_log を整理
第5回:Researcher AIとWeb検索MCPで最新情報に対応する
第6回:イベント駆動型マルチエージェントへ発展させる
本記事はその第1回として、まず 動く最小構成 を作ることを目的にします。
今回作るシステム
今回の作るシステムでは、ローカルLLMのGemma 4を使い、3つのAIエージェントが連携して記事を作成します。
Planner AI:記事設計担当
Writer AI:記事作成担当
Reviewer AI:品質確認担当
このシステムは、Gemma 4を3つ起動せずに、1つのGemma 4を役割別プロンプトで複数回呼び出す 構成をとります。
なぜマルチエージェント構成にするのか
記事作成AIは、1つのAIだけでも作れます。
しかし、すべてを1回のプロンプトで処理させると、次のような問題が起きやすくなります。
・記事の構成が曖昧になる
・本文が長くなると一貫性が崩れる
・レビューや修正が弱くなる
・どの工程で問題が起きたか分かりにくい
そこで、今回は処理を3つのAI役割に分けます。
Planner:最初に記事の設計を作る
Writer:設計に沿って本文を書く
Reviewer:記事を確認して修正点を出す
このように役割を分けることで、AIによる記事作成の流れが整理され、後から改善しやすくなります。
今回の開発環境
今回の開発環境は以下です。
OS:Windows 11
開発環境:WSL Ubuntu
エディタ:VS Code Remote WSL
LLM実行:Windows側 Ollama
使用モデル:gemma4:e4b
Python実行:WSL側
構成イメージは次の通りです。
Windows 11
├ Ollama
│ └ gemma4:e4b
│
└ WSL Ubuntu
└ Pythonプログラム
├ Planner AI
├ Writer AI
├ Reviewer AI
└ HTML保存処理
ポイントは、OllamaはWindows側で動かし、PythonプログラムはWSL側で動かす ことです。
WSLとVS CodeでUbuntu環境に接続する
今回のPythonプログラムは、Windows側ではなく WSL Ubuntu側 で作成・実行します。
そのため、VS CodeからWSL Ubuntuに接続して作業できるようにしておくと便利です。
WSLとは
WSLは、Windows上でLinux環境を使うための仕組みです。
Windows 11の中でUbuntuを動かせるため、Linux向けのPython開発やコマンド操作を行いやすくなります。
今回の構成では、次のように使います。
Windows 11
├ Ollama
│ └ Gemma 4
│
└ WSL Ubuntu
└ Pythonプログラムを作成・実行
VS CodeのWSL拡張機能とは
VS Codeには、WSL環境に接続して作業するための拡張機能があります。
これを使うと、Windows側のVS Codeから、WSL Ubuntu内のファイルを直接開いて編集できます。
インストールする拡張機能は、Visual Studio Code WSLです。
識別子:ms-vscode-remote.remote-wsl
VS Codeの拡張機能画面で WSL と検索し、Microsoft提供の拡張機能をインストールします。
WSL拡張機能のインストールが完了したら、VS Code左下の青色のアイコンをクリックすることでUbuntu環境に接続できます。

最小実装で作る範囲
第1回では、動く最小構成を目指すため、機能をあえて絞ります。
今回作る機能
・キーワード入力
・Planner AIによる記事設計
・Writer AIによる本文作成
・Reviewer AIによる品質チェック
・Writer AIによる修正
・HTMLファイル保存
今回は扱わない機能
・Web検索
・画像生成
・外部CMSへの投稿
・イベント駆動化
・正式なMCPサーバー化
ファイル構成
今回のファイル構成は以下です。
article-agent/ #作業フォルダ
├ main.py
├ llm_client.py
├ agents/
│ ├ planner.py
│ ├ writer.py
│ └ reviewer.py
├ mcp_client.py
├ mcp_server.py
└ output/
└ final_article.html
それぞれの役割は以下です。
| ファイル | 役割 |
|---|---|
main.py | 全体の実行管理 |
llm_client.py | Ollama上のGemma 4を呼び出す共通処理 |
planner.py | Planner AIの処理 |
writer.py | Writer AIの処理 |
reviewer.py | Reviewer AIの処理 |
mcp_client.py | 保存処理の呼び出し口 |
mcp_server.py | HTML保存処理 |
output/ | 生成記事の保存先 |
次から、手を動かしながら、ローカルAIを利用したマルチエージェント記事作成システムを実装していきます。
WSL側で作業フォルダを作る
まず、WSL Ubuntuで作業フォルダを作成します。
mkdir -p ~/article-agent
cd ~/article-agent次に、Python仮想環境を作成します。
python3 -m venv .venv
source .venv/bin/activatePython仮想環境に、OllamaをPythonから呼び出すため、Pythonライブラリをインストールします。
pip install -U ollamaPython仮想環境とは
Python仮想環境は、プロジェクトごとにPythonライブラリを分けて管理するための仕組みです。
今回のように ollama ライブラリを使う場合、Windows全体やWSL全体に直接インストールするのではなく、作業フォルダ内に専用の環境を作ります。
article-agent/
└ .venv/
こうしておくと、他のPythonプロジェクトとライブラリが混ざりにくくなります。
Windows側OllamaにGemma 4を用意する
Windows側のPowerShellで、Gemma 4を取得します。
ollama pull gemma4:e4bモデル一覧を確認します。
ollama list以下のように gemma4:e4b が表示されれば準備完了です。
NAME ID SIZE
gemma4:e4b xxxxxxxxxxxx 9.6 GBWSLからOllamaに接続できない問題
最初に python main.py を実行しWSLからOllamaに接続しようとした際に、次のエラーが出る場合があります。
ConnectionError: Failed to connect to Ollama.
これは、WSL2が独立した仮想ネットワーク(別のIPアドレス)で動いているためです。
WSLのPythonからWindowsのOllamaへの接続は、別のパソコンに接続するのと同じ扱いになります。
Windows側では以下が成功しても、
curl http://localhost:11434/api/tagsWSL側では以下が失敗することがあります。
curl http://localhost:11434/api/tagsこれは、Windows側の localhost とWSL側の localhost が同じではないためです。
localhostの違い
Windows側の localhost は、Windows自身を指します。
Windows側 localhost
↓
Windows上のOllama
一方、WSL側の localhost は、WSL自身を指します。
WSL側 localhost
↓
WSLの中
そのため、OllamaをWindows側で動かしている場合、WSLからはWindows側のIPアドレスを指定する必要があります。
OLLAMA_HOSTを設定する
WSLからWindows側Ollamaへ接続できるようにするため、Windowsのユーザー環境変数に以下を設定します。
変数名:OLLAMA_HOST
変数値:0.0.0.0:11434
この設定は、OllamaをWindows内の localhost だけでなく、外部IPからも接続できるように待ち受けさせるためのものです。
通常、Ollamaは127.0.0.1:11434で待ち受けいます。
これは、Windows自身からだけ接続できる状態です。
一方で、0.0.0.0:11434のように設定すると、PC上のすべてのアドレスから接続できるようになります。
環境変数を確認する
PCを再起動したあと、PowerShellで以下を確認します。
echo $env:OLLAMA_HOST0.0.0.0:11434のように表示されれば設定されていればOKです。
次に、Ollamaの待ち受け状態を確認します。
Get-NetTCPConnection -LocalPort 11434以下のように表示されれば、外部接続も受け付ける状態です。
LocalAddress LocalPort State
:: 11434 Listen
0.0.0.0 11434 ListenWSLからOllamaに接続確認する
WSLから接続するため、PowerShellでipconfigコマンドを使ってWindows側のIPv4アドレスを表示します。
表示されたIPv4アドレスが、192.168.x.xの場合は、WSL側で以下を実行します。
curl http://192.168.x.x:11434/api/tags接続に成功すると、"name":"gemma4:e4b","model":"gemma4:e4b"を含むJSON形式のレスポンスが返ります。
以上が確認できれば、WSLからWindows側Ollamaに接続できる状態といえます。
補足:OllamaをWSL側で動かして接続する
OllamaはWindows側だけでなく、WSL Ubuntu側にインストールして使うこともできます。
その場合、PythonプログラムとOllamaが同じWSL内で動くため、接続先は localhost:11434 にできます。
一方で、WSL側にOllamaを入れてGemma 4(9.6 GB)を使う場合、WSLの仮想ディスク容量を圧迫したりGPU設定で問題が生じる可能性がありました。
そこで今回は、AIエージェント入門|ローカルLLMで学ぶチャットとJSON出力【第1週】からの作業で使用実績のある動作環境をそのまま利用しています。
llm_client.pyを作成する
WSLからOllamaに接続できたら、Python側の共通クライアントを作ります。
llm_client.py
import ollama
MODEL_NAME = "gemma4:e4b"
# Windows側のIPv4アドレスに置き換える
OLLAMA_HOST = "http://192.168.x.x:11434"
client = ollama.Client(host=OLLAMA_HOST)
def call_gemma4(system_prompt: str, user_prompt: str) -> str:
response = client.chat(
model=MODEL_NAME,
messages=[
{"role": "system", "content": system_prompt},
{"role": "user", "content": user_prompt},
],
)
return response["message"]["content"]ここでの 192.168.x.x は、ipconfigコマンドで確認した実際のWindows側IPv4アドレスに置き換えて使用します。
Planner AIを作成する
Planner AIは、記事設計を担当します。
agents/planner.py
from llm_client import call_gemma4
def run_planner(keyword: str) -> str:
system_prompt = """
あなたは記事設計を担当するPlanner AIです。
入力されたキーワードをもとに、SEO記事の設計を行ってください。
出力は日本語で、整理された形式にしてください。
"""
user_prompt = f"""
以下のキーワードで記事設計を作成してください。
キーワード:
{keyword}
必ず含める項目:
1. 想定読者
2. 検索意図
3. 記事目的
4. SEOタイトル案
5. h2/h3構成
6. 執筆時の注意点
"""
return call_gemma4(system_prompt, user_prompt)Writer AIを作成する
Writer AIは、記事本文の作成と修正を担当します。
agents/writer.py
from llm_client import call_gemma4
def run_writer(keyword: str, plan: str, review: str | None = None, previous_draft: str | None = None) -> str:
system_prompt = """
あなたはSEO記事を作成するWriter AIです。
Planner AIの設計に沿って、読みやすく分かりやすい日本語記事をHTML形式で作成してください。
誇張表現を避け、初心者にも理解しやすい文章にしてください。
"""
if review and previous_draft:
user_prompt = f"""
以下の記事を、Reviewer AIの指摘に従って修正してください。
キーワード:
{keyword}
記事設計:
{plan}
修正前の記事:
{previous_draft}
Reviewer AIの指摘:
{review}
出力条件:
・HTML形式
・SEOタイトル
・メタディスクリプション
・AI要約ブロック
・本文
・FAQ
・まとめ
"""
else:
user_prompt = f"""
以下の記事設計をもとに、SEO記事をHTML形式で作成してください。
キーワード:
{keyword}
記事設計:
{plan}
出力条件:
・HTML形式
・SEOタイトル
・メタディスクリプション
・AI要約ブロック
・h2/h3構成に沿った本文
・FAQ
・まとめ
"""
return call_gemma4(system_prompt, user_prompt)Reviewer AIを作成する
Reviewer AIは、記事の品質確認を担当します。
agents/reviewer.py
from llm_client import call_gemma4
def run_reviewer(keyword: str, draft: str) -> str:
system_prompt = """
あなたは記事品質を確認するReviewer AIです。
記事を読み、SEO・読みやすさ・誤字脱字・過剰表現・構成の観点で確認してください。
出力は修正指示として分かりやすくまとめてください。
"""
user_prompt = f"""
以下の記事をレビューしてください。
キーワード:
{keyword}
記事:
{draft}
確認項目:
1. 検索意図に合っているか
2. 見出しと本文が一致しているか
3. 誤字脱字がないか
4. 過剰な断定表現がないか
5. AI要約ブロックが分かりやすいか
6. FAQが本文と矛盾していないか
最後に以下の形式で判定してください。
判定:
OK または 修正必要
"""
return call_gemma4(system_prompt, user_prompt)MCP風の保存処理を作成する
今回は正式なMCPサーバーではなく、まずは MCP風の保存ツール として関数で実装します。
mcp_server.py
from pathlib import Path
def save_article(filename: str, content: str) -> dict:
output_dir = Path("output")
output_dir.mkdir(exist_ok=True)
path = output_dir / filename
path.write_text(content, encoding="utf-8")
return {
"status": "ok",
"path": str(path),
}mcp_client.py
from mcp_server import save_article as tool_save_article
def save_article(filename: str, content: str) -> dict:
return tool_save_article(filename, content)この段階では正式なMCPではありませんが、将来MCPツール化しやすいように、save_article という形で処理を分けています。
main.pyで全体をつなぐ
main.py
from agents.planner import run_planner
from agents.writer import run_writer
from agents.reviewer import run_reviewer
from mcp_client import save_article
def main():
print("Gemma 4ローカル・マルチエージェント記事作成システム")
print("-" * 50)
keyword = input("記事キーワードを入力してください: ").strip()
if not keyword:
print("キーワードが入力されていません。終了します。")
return
print("\n[1/5] Planner AI が記事設計を作成中...")
plan = run_planner(keyword)
print("\n[2/5] Writer AI が記事本文を作成中...")
draft = run_writer(keyword=keyword, plan=plan)
print("\n[3/5] Reviewer AI が記事をレビュー中...")
review = run_reviewer(keyword=keyword, draft=draft)
print("\n[4/5] Writer AI がレビュー指摘に従って修正中...")
final_article = run_writer(
keyword=keyword,
plan=plan,
review=review,
previous_draft=draft,
)
print("\n[5/5] MCP経由でHTMLを保存中...")
result = save_article("final_article.html", final_article)
print("\n完了しました。")
print(f"保存先: {result['path']}")
if __name__ == "__main__":
main()実行する
WSL側で実行します。
cd ~/article-agent
source .venv/bin/activate
python main.pyキーワード入力待ちの状態になるので、作成する記事のキーワードを入力します。
Gemma 4ローカル・マルチエージェント記事作成システム
--------------------------------------------------
記事キーワードを入力してください:
キーワードを入力すると記事作成処理が始まり、以下の様に処理が進みます。
(キーワード:ブロックチェーン)の場合
Gemma 4ローカル・マルチエージェント記事作成システム
--------------------------------------------------
記事キーワードを入力してください: ブロックチェーン
[1/5] Planner AI が記事設計を作成中...
[2/5] Writer AI が記事本文を作成中...
[3/5] Reviewer AI が記事をレビュー中...
[4/5] Writer AI がレビュー指摘に従って修正中...
[5/5] MCP経由でHTMLを保存中...
完了しました。
保存先: output/final_article.html記事の作成が成功すると、article-agent/output/フォルダに、HTML記事(final_article.html)が保存されます。
キーワードがブロックチェーンで作成された記事を以下に添付します。
実行時の注意点
ローカルAIで長文記事を作成すると、プロンプトが長くなりすぎる場合があります。
Ollamaのログに次のような警告が出ることがあります。
truncating input promptこれは、入力プロンプトがコンテキスト上限に近づき、一部が切り詰められたことを意味します。
今回の最小実装では、以下の情報をまとめて渡しています。
・記事設計
・下書き
・レビュー指摘
そのため、記事が長くなると入力が大きくなります。
今後の改善点としては、次の方法があります。
・見出しごとに本文を生成する
・レビュー対象を分割する
・途中結果をファイル保存する
・長文を一度に再生成しない
今回完成したAIマルチエージェントの最小構成
今回完成した最小構成は以下です。
キーワード入力
↓
Planner AI
↓
Writer AI
↓
Reviewer AI
↓
Writer AIで修正
↓
HTML保存
これは、完全自律型のAIエージェントではなく、固定フロー型のマルチエージェント構成です。
ただし、Reviewer AIの指摘をもとにWriter AIが修正するため、後から半自律型やイベント駆動型に発展させやすい構成になっています。
まとめ
今回は、Windows 11+WSL環境で、Ollama上のGemma 4を使った ローカルAIマルチエージェント記事作成システム を最小構成で実装しました。
重要なポイントは以下です。
・AIマルチエージェント構成では、役割を分けて処理する
・Gemma 4をPlanner / Writer / Reviewer の3役で使う
・OllamaはWindows側、PythonはWSL側で動かす
・WSLからOllamaへ接続するにはWindows側IPv4アドレスを使う
・実際の記事ではIPv4アドレスは 192.168.x.x のように表記する
・OLLAMA_HOST=0.0.0.0:11434 の設定が重要
・第1回ではHTML保存までの最小構成に絞るこの最小実装により、ローカルAIだけで、キーワード入力から記事設計・本文作成・レビュー・修正・HTML保存までを実行できるようになりました。
次回以降は、各AIエージェントの役割をさらに整理し、マルチエージェントとしての完成度を高めます。

