Smolagentsで構築する信頼性の高いAIエージェント:コード中心のロジックへの転換

AI tutorial - IT technology blog
AI tutorial - IT technology blog

従来のAIチャットボットにおけるロジックの欠如

標準的なLLMの実装は、高度な計算やリアルタイムデータに直面すると、しばしばつまずくことがあります。$1.1^{10}$ がおよそ2.0であると自信満々に主張するモデルを見たことがあるかもしれません(実際には2.59に近いです)。こうしたエラーが発生するのは、ほとんどのチャットボットが本質的に高度なオートコンプリート(自動補完)エンジンだからです。能動的な計算を行うのではなく、静的な学習データ内のパターンに基づいて次のトークンを予測しているに過ぎません。

LangChainやCrewAIのようなフレームワークは、通常JSONを介した「ツール呼び出し(Tool Calling)」によってこの問題を解決します。しかし、このプロセスは非常に壊れやすいことで知られています。LLMは完全にフォーマットされたJSON文字列を生成する必要があり、バックエンドがそれを解析して実行します。閉じ括弧が1つ欠けていたり、余計なカンマがあったりするだけで、ワークフロー全体がクラッシュしてしまいます。このオーバーヘッドのせいで、自律型エージェントの構築が、実際の知能のエンジニアリングというよりは、正規表現パターンのデバッグのように感じられることも少なくありません。

なぜSmolagentsが優れた代替案なのか

Hugging Faceは先日、エージェントのワークフローを簡素化するライブラリ「smolagents」をリリースしました。LLMに構造化されたJSONを出力させる代わりに、モデルが生のPythonコードを記述して実行できるようにします。これは「Code-as-Actions(アクションとしてのコード)」として知られています。

このアプローチは、プロダクション環境向けのAIにおける標準になりつつあります。ロジックの負担をLLMの確率的な推測から、Pythonインタープリタの決定論的な精度へと移すことができます。エージェントが素数の15乗根を求めたり、動的なウェブサイトをスクレイピングしたりする必要がある場合、単にそれを実行するためのスクリプトを記述すればよいのです。私のテストでは、この手法は従来のJSONプロンプトと比較してハルシネーション(幻覚)を大幅に削減し、タスクの成功率を30%近く向上させました。

主要なアクションとしてのコード実行

多くのフレームワークは「Reasoning and Acting(ReAct)」ループに依存しています。smolagentsでは、CodeAgent クラスがPythonスニペットを生成することで、モデルにアクションを実行する力を与えます。ライブラリはこのコードを安全で制限された環境内で実行します。この構成により、標準的なツール呼び出しでは正しく処理できないことが多い、ネストされたループや条件分岐などの複雑なロジックを扱うことが可能になります。

開発環境のセットアップ

始めるには、クリーンなPython 3.10以降の環境が必要です。グローバルパッケージを整理しておくために、仮想環境の使用をお勧めします。また、Hugging FaceまたはOpenAIのAPIキーも必要です。

# 仮想環境を作成して有効化する
python -m venv venv
source venv/bin/activate  # Windowsの場合: venv\Scripts\activate

# smolagentsと検索用の依存関係をインストールする
pip install smolagents duckduckgo-search

ここでは、認証なしでエージェントにインターネットアクセスを提供できるシンプルな方法として duckduckgo-search を使用します。smolagents ライブラリ自体は、わずか数千行のコードで構成された非常に軽量なものですが、モデルとの通信には巨大な transformers エコシステムを活用しています。

初めてのコード中心型エージェントの構築

ウェブを検索し、見つけたデータに対して計算を実行できるエージェントの構築を、Claude SDKで作る自律型Pythonエージェントのように進めていきましょう。これは単なる要約をはるかに超える機能です。

ステップ1:言語モデルの設定

<a href="https://itnotes.dev/ja/litellm%e3%81%a7%e3%83%ad%e3%83%bc%e3%82%ab%e3%83%abai%e3%82%b2%e3%83%bc%e3%83%88%e3%82%a6%e3%82%a7%e3%83%96%e3%82%a4%e3%82%92%e6%a7%8b%e7%af%89%ef%bc%9aopenai%e3%80%81anthropic%e3%80%81ollama%e3%82%92/">litellm</a> または Hugging Face Inference API でサポートされている任意のモデルを使用できます。このガイドでは、Hugging Face Hubを使用します。

from smolagents import HfApiModel, CodeAgent, DuckDuckGoSearchTool

# モデルの初期化
# hf.co/settings/tokens でトークンを取得してください
model = HfApiModel(model_id="Qwen/Qwen2.5-Coder-32B-Instruct")

私は Qwen2.5-Coder-32B を選びました。なぜなら、現在Pythonコーディングのベンチマークにおいて、はるかに大規模なモデルに匹敵する性能を持っているからです。コード中心型エージェントを動かすエンジンとして最適です。

ステップ2:ツールとエージェントの定義

次に、ツールを定義します。smolagents にはいくつかの組み込みユーティリティが含まれています。ここでは、エージェントにリアルタイムのウェブアクセスを許可するために DuckDuckGoSearchTool を使用します。

# 検索ツールを初期化する
search_tool = DuckDuckGoSearchTool()

# エージェントを作成する
agent = CodeAgent(
    tools=[search_tool],
    model=model,
    add_base_tools=True # フォーマットや基本的なユーティリティツールを含める
)

ステップ3:複雑なクエリの実行

外部データと数学の両方を必要とするタスクでエージェントをテストしてみましょう。「BitcoinとEthereumの現在の価格を見つけ、その比率を計算してください。」

response = agent.run(
    "BitcoinとEthereumの現在の市場価格(USD)を見つけてください。"
    "次に、1 Bitcoinで購入できるEthereumトークンの数を計算してください。"
)

print(response)

実行中、ターミナルにはエージェントの思考プロセスが表示されます。古い学習データに基づいて価格を推測することはありません。代わりに、検索ツールを呼び出し、結果から数値を抽出し、割り算を実行するPythonスクリプトを記述します。この透明性は、プロダクションレベルのタスクをデバッグする上で不可欠です。

実践的な実装:カスタムツールのユースケース

プロフェッショナルな環境では、社内APIからデータを取得する必要がよくあります。シンプルなデコレータを使用して、任意のPython関数をツールとしてラップできます。以下は、特定の株価データを取得する例です。

import requests
from smolagents import tool

@tool
def get_internal_valuation(ticker: str) -> str:
    """
    指定されたティッカーの社内企業評価額を取得します。
    引数:
        ticker: 株式のティッカーシンボル (例: 'AAPL')
    """
    # 実際のデータベースやAPI呼び出しのプレースホルダー
    return f"{ticker} の社内評価額は $150.25 です。"

# エージェントを更新する
agent = CodeAgent(tools=[get_internal_valuation, search_tool], model=model)

agent.run("AAPLの社内価格と最新の市場ニュースを比較してください。")

@tool 関数内のドックストリングは非常に重要です。Smolagents はこのテキストを解析して、ツールの目的をLLMに説明します。明確で簡潔な説明が、信頼性の高いエージェントを作る秘訣です。説明が曖昧だと、LLMは躊躇したり、ツールを誤って使用したりする可能性が高くなります。

セキュリティとコード実行

AIが生成したコードを実行することには、固有のリスクが伴います。エージェントに「ディレクトリをクリーンアップして」と頼むと、誤ってデータが失われる可能性があります。Smolagents は、制限されたローカル環境でコードを実行することでこれを軽減します。しかし、エンタープライズアプリケーションの場合は、さらなる隔離レイヤーを追加することをお勧めします。DockerコンテナやE2Bのような専用のサンドボックスを使用することで、AIのアクションがホストマシンに影響を与えないようにできます。

最後に

コード中心型エージェントへの移行により、AIシステムはより予測可能で有能なものになります。smolagents を使用することで、推論し、自らロジックを書き、信頼性の高いPythonの橋渡しを通じて世界と対話できるシステムを構築できます。

規模を拡大する際は、このライブラリを <a href="https://itnotes.dev/ja/%e3%83%ad%e3%82%ab%e3%83%abai%e3%81%a8%e3%81%ae6%e3%83%b6%e6%9c%88%ef%bc%9awhisper%e3%81%a8ollama%e3%81%a7%e8%ad%b0%e4%ba%8b%e9%8c%b2%e4%bd%9c%e6%88%90%e3%82%92%e8%87%aa%e5%8b%95%e5%8c%96/">Ollama</a> のようなローカル推論エンジンと組み合わせることを検討してください。これにより、自律的な機能を維持しながら、機密データをローカルで処理できるようになります。このフレームワークは、基本的なRAGを超えて、実用的で高度なロジックを持つAIアシスタントの世界に踏み出そうとしている開発者にとって、優れた選択肢となるでしょう。

Share: