powered by TechFeed
表示モード
ハウツー

LangChainを使わずAIエージェントの「中身」をゼロから作る — モックLLMでプロバイダー抽象化・MCP実装の仕組みをGoogle Colabで理解する

6月26日、MarkTechPostが「Build a Nanobot-Style AI Agent in Google Colab with Tool Calling, Session Memory, Skills, and MCP Servers」と題した記事を公開した。LangChainやAutoGenを「使う」のではなく、それらが内部でやっていることをゼロから自前で組み直すことで、AIエージェントの構造そのものを理解しようという実装チュートリアルだ。特筆すべきは、決定論的なモックLLMを用意することで、実LLMのAPIキーなしにエージェントループ全体を動かせる設計になっている点で、プロバイダー抽象化の意味を体感できる教材としても機能する。

6月26日、MarkTechPostが「Build a Nanobot-Style AI Agent in Google Colab with Tool Calling, Session Memory, Skills, and MCP Servers」と題した記事を公開した。LangChainやAutoGenを「使う」のではなく、それらが内部でやっていることをゼロから自前で組み直すことで、AIエージェントの構造そのものを理解しようという実装チュートリアルだ。特筆すべきは、決定論的なモックLLMを用意することで、実LLMのAPIキーなしにエージェントループ全体を動かせる設計になっている点で、プロバイダー抽象化の意味を体感できる教材としても機能する。


「ブラックボックスを開ける」ことがこのチュートリアルの主眼

LangChainAutoGenといった既存フレームワークを使えばAIエージェントは数行で作れる。しかし「なぜツール呼び出しが複数ターンに分かれるのか」「メモリはどのタイミングでトリミングされるのか」「MCPサーバーとエージェントはどのプロトコルで会話するのか」といった内部動作は、フレームワーク越しには見えにくい。

このチュートリアルはそのブラックボックスを開けて見せることに徹している。nanobotのコアアーキテクチャを参考にしつつ、プロバイダー抽象化・ツール登録・セッションメモリ・ライフサイクルフック・スキル・MCPスタイルサーバーという構成要素を一から組み直す。「使い方」ではなく「仕組み」を理解することが主眼に置かれている。

すべてのコードはGoogle Colabで動作し、環境構築なしに手元で動かせる。


モックLLMがプロバイダー抽象化の「証明」になっている

このチュートリアルで最も巧みな設計が、決定論的なモックLLM(MockProviderの存在だ。

Provider基底クラスがcomplete(messages, tools) -> LLMResponseというインターフェースを定義する。OpenAICompatibleProviderはOpenAI、OpenRouter、DeepSeek、Ollama等の/v1互換エンドポイントを透過的に扱える実装だ。そしてMockProviderは、正規表現ベースのルールで動作し、数式・時刻・Python実行・メモリ操作といった典型的なユーザー発話を検出してツール呼び出しを生成する。レスポンスの形式はLLMResponseToolCallに正規化されており、後続のエージェントループはバックエンドを意識しない。

つまりMockProviderOpenAICompatibleProviderは完全に交換可能であり、エージェントループ側のコードは一切変更しなくてよい。これは抽象化が「実際に機能している」ことをコードで示すデモになっている。

なお、モックLLMはAPIキーなしで動作するが、ネットワーク接続が不要かどうかは元記事に明示的な記載がなく、実行環境によって異なる可能性がある点には留意されたい。


構成要素を順番に積み上げる設計

ツールレジストリとデコレータベースのスキーマ生成

@toolデコレータを関数に付けるだけで、型ヒントとdocstringからOpenAI形式のJSONスキーマが自動生成される。

@tool
def calculator(expression: str) -> str:
    '''Evaluate a math expression and return the result.
    expression: a math expression like "2 + 2 * 3" or "sqrt(16)"'''
    ...

ToolRegistryクラスがツールの登録・参照・スペック一覧の出力を担う。エージェントにツールを追加する際に手作業でJSONスキーマを書く必要がない点は実用的だ。

トークン予算付きセッションメモリ

会話履歴をそのままLLMに渡し続けるとコンテキスト長の上限に当たる。このチュートリアルではトークン予算(token budget)の概念を導入し、古いメッセージを自動的に切り捨てる仕組みを実装している。モックプロバイダーはユーザーターンから「My name is ◯◯」「I love ◯◯」といった情報を読み返す処理も持ち、セッションメモリが実際にモデルに渡されていることを確認できる。

ライフサイクルフックとスキル

エージェントのターン前後にフックを挟める仕組みを実装し、ロギングや前処理を差し込める。スキルは複数のツールをまとめた再利用可能な単位として定義される。

MCPスタイルのツールサーバーをゼロから実装する

MCP(Model Context Protocol)はAnthropicが提唱したAIエージェントとツール間の通信プロトコルだ。LangChainAutoGenなど主要フレームワークが対応を進めており、エージェント設計の標準的な関心事になりつつある。このチュートリアルではそのMCPスタイルのサーバーを自前で実装し、外部ツールサーバーとエージェントがどのように連携するかを構造的に示している。既製フレームワークのMCP統合を読み解く際の足がかりとしても有効だ。


実装できるツールの例

チュートリアルで登録されるツールの例として、以下が挙げられている。

  • calculator:数式を評価して結果を返す
  • get_current_time:タイムゾーンを指定して現在時刻を返す
  • remember_fact / recall_fact:キーバリュー形式でセッション内にファクトを保存・取得する
  • run_python:Pythonコードを動的に実行して結果を返す
  • web_search:クエリを受け取り検索結果を返す(モックでは固定レスポンス)

このチュートリアルが刺さる読者

既存フレームワークの内部実装に興味があるエンジニア、自社サービスにエージェント機能を組み込む前に設計の選択肢を把握しておきたい開発者、あるいはMCPの仕様を実装レベルで理解したい人に向いている。Google Colabで完結するため、環境構築なしに手元で動かせる点も敷居を下げている。「ゼロ実装で仕組みを理解する」というアプローチは、フレームワークを使い続けながらでも得られる示唆がある。

詳細はBuild a Nanobot-Style AI Agent in Google Colab with Tool Calling, Session Memory, Skills, and MCP Serversを参照していただきたい。