地元のLL.M.良い。
しかし、最初の数回のチャットの後は、「これで他に何ができるだろうか?」と疑問に思うかもしれません。
では、いくつかのツールを使用してローカル LLM をエージェント化してはどうでしょうか?
この投稿では、ローカル LLM をツールを使用するエージェントに変える方法を検討します。具体的には、
- ジェマ4モデル (年齢に優しいバリアント) ローカル LLM として
- オラマ ローカル LLM を提供するには
- OpenAI エージェント SDK エージェントランタイム用
- タウィリ 周辺ツールの一例としてのWeb Search MCP
Web を検索し、証拠を収集し、ユーザーの質問に続く引用を含む回答を合成できる、ミニディープリサーチエージェントを作成します。
この記事を最後まで読むと、機能するローカル ディープ リサーチ エージェントと、ローカル モデルをローカル AI エージェントに変換するための再利用可能な実装パターンが完成します。

ローカル コーディング エージェントのセットアップに興味がある場合は、以前に Gemma 4 + OpenCode について説明しました。この投稿では、ローカル モデルをエージェント ランタイムおよび外部ツールに接続する、より一般的なパターンに焦点を当てます。
1. ローカル エージェント スタックのインストール
コードを記述する前に、Olma、Gemma 4 (具体的には Gemma 4 E4B モデル)、OpenAI Agent SDK、Tavili MCP の 4 つの部分を準備する必要があります。
まずはOlamaをインストールしましょう。
Windows では、Olama の公式 Web サイトからインストーラーをダウンロードできます。
https://ollama.com/download
または使用します winget Powershell の場合:
winget install Ollama.Ollama
Linux では、Olama は次のようにインストールできます。
"curl -fsSL https://ollama.com/install.sh | sh"
インストール後、以下を確認してください。
ollama --version
Windows では、必ず[スタート]メニューから Olama を起動してください。実行すると、ローカル API エンドポイントが使用可能になります。
次にローカルモデルを描画します。ここでは、Gemma 4 E4B バリアントを使用します。
ollama pull gemma4:e4b
Gemma 4 にはいくつかのバリエーションがあります。E4B モデルは、エッジ/ローカル エージェント ワークフローを念頭に置いて設計されているため、私たちの目的に適しています。私のマシンには、約 8GB の VRAM を備えた NVIDIA RTX 2000 Ada ラップトップ GPU が搭載されています。マシンの機能がさらに制限されている場合は、より軽量な E2B バージョンを試すことができます。
ollama pull gemma4:e2b
次に、エージェント ランタイム ライブラリが必要です。そのために、OpenAI Agent SDK を使用します。
pip install openai-agents
OpenAI 互換クライアントも必要です。
pip install openai
ここで注意すべき点: 後で、クライアントを Olama のローカル エンドポイントにポイントするため、これはモデル呼び出しを OpenAI に送信するという意味ではありません。
最後に、Tavili MCP エンドポイントが必要です。これまでに使用したことがない場合は、Tavili は LLM アプリケーション用に設計された検索 API です。この投稿では、MCP サーバーを使用して、エージェントが Web を検索できるようにします。
まず、Tavili アカウントを作成し、API キーを取得する必要があります。 Tavili プラットフォームでは、次のサイズの MCP リンクを直接生成できます。
https://mcp.tavily.com/mcp/?tavilyApiKey=
これで準備は完了です。
ここでのタウィリの使用はスポンサー付きのオプションではありません。ここでは便利な MCP として使用されます ツールと同様に、同じパターンが他の MCP 互換ツールでも機能します。
実際、ここでの選択肢はスタック全体だけではありません。 llama を使用する代わりに、LM Studio または llama.cpp を使用してローカル モデルをレンダリングできます。 Gemma 4 モデルの代わりに、Quen ファミリなどの他のモデルを試すこともできます。エージェントフレームワーク用、 Google または Anthropic からのオプションもあります。 Tavily の代わりにさまざまな MCP ツールを接続することもできます。私がこの組み合わせを使用しているのは、そのスタックに精通しているためです。しかし、このケーススタディでの重要な発見は、一般的な局所的なエージェントのパターンです。
2. ローカルリサーチエージェントを設定する
OpenAI Agents SDK を使用すると、究極の Agent 作る必要があるアイテム:
from agents import Agent
agent = Agent(
name="Local Research Agent",
instructions=RESEARCH_AGENT_INSTRUCTIONS,
model=model,
mcp_servers=[tavily_server],
mcp_config={"include_server_in_tool_names": True},
)
各パーツを開梱してみましょう。
2.1 モデル
まずはモデル。
from openai import AsyncOpenAI
from agents import OpenAIChatCompletionsModel
MODEL_NAME = "gemma4:e4b"
OLLAMA_BASE_URL = "http://localhost:11434/v1"
client = AsyncOpenAI(
api_key="ollama",
base_url=OLLAMA_BASE_URL,
)
model = OpenAIChatCompletionsModel(
model=MODEL_NAME,
openai_client=client,
)
まず、Olama のローカルの OpenAI 準拠エンドポイントを指すクライアントを作成します。
次に、使用します OpenAIChatCompletionsModel Gemma モデルをモデル オブジェクトにラップします。これにより、エージェント SDK がエージェント ループ内でそのモデルを使用できるようになります。
ご了承ください api_key="ollama" 値は単なるプレースホルダーです。 Olama は実際には、本物の OpenAI API キーを必要としません。クライアントがこのフィールドを期待しているため、これを使用します。
2.2 指示
次に、望ましい調査動作を伴うエージェントへの指示を定義します。
from datetime import datetime
CURRENT_DATE = datetime.now().strftime("%B %d, %Y")
# Note that this instruction is iterated with AI
RESEARCH_AGENT_INSTRUCTIONS = f"""
[Role]
You are a concise research assistant.
[Task]
Answer the user's question by turning it into a small web research task.
Use the current date when interpreting time-sensitive questions: {CURRENT_DATE}.
[Research behavior]
Start with one targeted search query.
For recommendation or comparison questions, complete this research loop before answering:
first identify the main options, then search for comparison context, then synthesize a recommendation.
Use follow-up searches when the first results are insufficient, conflicting, or only cover part of the question.
Prefer relevant and credible sources, and track which source supports each important claim.
Before answering, check whether the gathered evidence is enough to support the conclusion.
[Expected output]
Give a direct answer first, then briefly explain the evidence behind it.
Include source links for key factual claims.
[Rules]
Do not rely on memory for facts that may have changed.
Do not invent missing details.
Keep the answer concise.
""".strip()
2.3 設備
ここで、エージェントに Web 検索ツールを装備します。この場合、MCP を通じて Tavili 検索エンジンを使用します。
from agents import Agent, Runner
from agents.mcp import MCPServerStreamableHttp
TAVILY_MCP_URL = "YOUR_TAVILY_MCP_URL"
async with MCPServerStreamableHttp(
name="tavily",
params={"url": TAVILY_MCP_URL},
) as tavily_server:
tools = await tavily_server.list_tools()
print("Available Tavily tools:")
for tool in tools:
description = (tool.description or "").replace("\n", " ")
print(f"- {tool.name}: {description[:120]}")
agent = Agent(
name="Local Research Agent",
instructions=RESEARCH_AGENT_INSTRUCTIONS,
model=model,
mcp_servers=[tavily_server],
mcp_config={"include_server_in_tool_names": True},
)
result = await Runner.run(agent, RESEARCH_QUESTION, max_turns=MAX_TURNS)
このコード ブロックは次の 3 つのことを行います。
- これにより、Tavily の MCP サーバーへの接続が開きます。
async with MCPServerStreamableHttp(...) as tavily_server:接続すると、Tavili は利用可能なツールを Agent SDK に表示します。 - MCP コンテキスト内に Agent オブジェクトを作成します。注意してください。
mcp_servers=[tavily_server]これにより、Tavili の MCP ツールがエージェントに接続されます。 - いよいよエージェントと一緒に行きます
result = await Runner.run(agent, RESEARCH_QUESTION, max_turns=MAX_TURNS)。 MCP 接続はその内部でのみアクティブになるため、ここではコンテキスト マネージャーが重要になります。async withブロック。
mcp_config={"include_server_in_tool_names": True}主にトレースでの読みやすさのため。これがないと、ツール名は次のように表示されるだけです。tavily_search。これにより、ツール名が次のように表示されますmcp_tavily__tavily_search。これにより、ツール呼び出しが Tavili MCP サーバー経由で行われたことが明確になります。
3. リサーチ質問を実行する
エージェントが構成されたので、具体的なクエリを使用してテストしてみましょう。
「2026 年 6 月 23 日 グループステージで最も大きな賭け金がかかったワールドカップの試合はどれですか?そしてその理由は?」
何が起こったのかを調べるために、コンパクトなトレースを出力します。
def compact(value: object, limit: int = 220) -> str:
text = str(value).replace("\n", " ")
return text if len(text) <= limit else text[:limit] + "..."
for step, item in enumerate(result.new_items, start=1):
raw_item = getattr(item, "raw_item", None)
raw_type = getattr(raw_item, "type", "")
raw_name = getattr(raw_item, "name", "")
raw_output = getattr(raw_item, "output", "")
print(
f"{step:02d} | {type(item).__name__} | "
f"{raw_type or raw_name} | {compact(raw_output or raw_item)}"
)
私の実行では、トレースは次のようになりました。
01 | ToolCallItem | function_call | ResponseFunctionToolCall(arguments='{"query":"World Cup 2026 group stage matches June 23, 2026 stakes"}', name='mcp_tavily__tavily_search', ...)
02 | ToolCallOutputItem | | {'call_id': ..., 'output': ...}
03 | MessageOutputItem | message | ResponseOutputMessage(... final answer ...)
これにより、エージェントの動作を直接観察できるようになります。この実行では、ローカルの Gemma モデルが Tavili 検索ツールを呼び出すことを決定し、エージェント SDK がそのツール呼び出しを実行し、結果をモデルに返します。次に、モデルは最終的な答えを生成しました。
最終的な応答を確認するには、次のように出力します。
print(result.final_output)
エージェントが作成したものは次のとおりです。
The match with the biggest group-stage stakes on June 23, 2026, was Colombia vs. DR Congo.
Why:
According to FIFA reporting, this specific match was highlighted as a critical moment where Colombia advanced into the knockout phase of the tournament.
The article notes that Daniel Munoz scored the first goal for Colombia during this Group K fixture, which directly contributed to their progression in the competition.
Evidence
- FIFA: An article titled "Colombia v Congo DR Group K FIFA World Cup 2026" specifically reports on a key moment from this match, stating that Munoz's goal helped fire Colombia into the knockout phase.
Source: https://digitalhub.fifa.com/transform/450614d3-72d7-4c1f-85ff-ea0fbee6f28d/Colombia-v-Congo-DR-Group-K-FIFA-World-Cup-2026?focuspoint=0.51
- Yahoo Sports: Confirms the fixture and result for that date: Colombia defeated DR Congo.
Source: https://sports.yahoo.com/soccer/article/2026-world-cup-results-standings-and-schedule-live-scores-group-stage-updates-and-how-to-watch-050724193.html
検索結果には、モデルが答えを提供するのに十分な証拠がすでにあったため、エージェントはこの実行で 1 回の検索ラウンドのみを実行したことに注意してください。より複雑な質問の場合は、複数回の検索と推論が必要になりますが、現在のフレームワークはこれを自然にサポートしています。
4. まとめ
ローカル LLM をチャット モデルとして残す必要はありません。
この投稿では、Olama を通じて Gemma 4 E4B モデルをローカルにデプロイし、次にそのモデルを OpenAI Agents SDK によって提供されるエージェント ランタイム内に配置し、エージェントに Web 検索ツールを提供して、ユーザーの質問に答えるためのオンライン情報を検索できるようにしました。
ここから、より強力な調査指示でこのパターンを簡単に拡張したり、さらに深い調査に向けて作業を続けたい場合はより明示的な計画反映ワークフローを構築したり、他の多くのユースケースのためにエージェントをより多くの MCP ツールに接続したりできます。
縁起の良い建物!
参照
オラマ: https://ollama.com/
Gemma モデル ファミリー: https://ai.google.dev/gemma
OpenAI エージェント SDK: https://openai.github.io/openai-agents-python/
エージェント SDK MCP ドキュメント: https://openai.github.io/openai-agents-python/mcp/
Tavily MCP ドキュメント: https://docs.tavily.com/documentation/mcp









Leave a Reply