🇯🇵 JP | 🌐 EN

第3章:エージェントとツール

LangChainでAIエージェントを構築

📖 読了時間: 20-25分 📊 難易度: 初級-中級 💻 コード例: 6 📝 演習: 2

学習目標

3.1 AIエージェントとは?

AIエージェントは、目標を達成するためにどのアクションを取るべきかを自律的に決定できるLLMです。固定パスに従う単純なチェーンとは異なり、エージェントは以下のことができます:

graph TB A[ユーザークエリ] --> B[エージェント] B --> C{アクションを決定} C -->|ツール使用| D[ツール実行] D --> E[結果を観察] E --> C C -->|完了| F[最終レスポンス] style B fill:#667eea,color:#fff style D fill:#11998e,color:#fff style F fill:#28a745,color:#fff

エージェントループ

以下のサイクル:(1)LLMが呼び出すツールを決定、(2)ツールが実行し結果を返す、(3)LLMが結果を観察し次のアクションを決定。これはLLMがタスクが完了したと判断するまで続きます。

3.2 create_agent API

LangChain v1.0では、create_agentがエージェントを構築する標準的な方法として導入されました:

コード例1:create_agentで基本エージェント
from langchain.agents import create_agent
from langchain_openai import ChatOpenAI

# シンプルなツールを定義
def get_weather(city: str) -> str:
    """都市の現在の天気を取得する。"""
    # 本番環境では実際の天気APIを呼び出す
    return f"{city}の天気は晴れ、22°Cです"

def calculate(expression: str) -> str:
    """数式を評価する。

    警告: この例では簡略化のためeval()を使用しています。
    本番環境では`numexpr`や`asteval`などの安全な数式パーサを使用してください。
    """
    try:
        # 警告: eval()は信頼できない入力に対して危険です!
        # 本番環境では: import numexpr; numexpr.evaluate(expression) を使用
        return str(eval(expression))
    except Exception as e:
        return f"エラー: {e}"

# エージェントを作成
agent = create_agent(
    model=ChatOpenAI(model="gpt-4"),
    tools=[get_weather, calculate],
    system_prompt="あなたは天気を確認し計算ができる親切なアシスタントです。"
)

# エージェントを実行
result = agent.invoke({
    "messages": [
        {"role": "user", "content": "東京の天気と、25 * 4は?"}
    ]
})

print(result["messages"][-1].content)

3.3 カスタムツールの定義

ツールはいくつかの方法で定義できます。最も簡単なのは@toolデコレータを使用することです:

コード例2:@toolデコレータでカスタムツール
from langchain_core.tools import tool

@tool
def search_database(query: str) -> str:
    """クエリに一致するアイテムを製品データベースで検索する。

    Args:
        query: データベースで検索する検索語。
    """
    # シミュレートされたデータベース検索
    products = {
        "laptop": "MacBook Pro - ¥299,800",
        "phone": "iPhone 15 - ¥149,800",
        "tablet": "iPad Pro - ¥119,800"
    }
    query_lower = query.lower()
    for key, value in products.items():
        if key in query_lower:
            return value
    return "製品が見つかりません"

@tool
def send_email(to: str, subject: str, body: str) -> str:
    """指定された受信者にメールを送信する。

    Args:
        to: 受信者のメールアドレス。
        subject: メールの件名。
        body: メールの本文。
    """
    # 本番環境では実際にメールを送信する
    return f"'{subject}'という件名で{to}にメールを送信しました"

# ツールを使用
print(search_database.name)  # "search_database"
print(search_database.description)  # docstringから
print(search_database.invoke("laptop"))  # "MacBook Pro - ¥299,800"

ツール定義のベストプラクティス

  • 明確で説明的な関数名を使用する
  • 詳細なdocstringを書く—LLMはこれらを使用してツールをいつ使用するかを決定する
  • すべてのパラメータに型ヒントを追加する
  • ツールは単一のタスクに集中させる

3.4 組み込みツール

LangChainはlangchain-communityを通じて多くの事前構築されたツールを提供しています:

コード例3:組み込みツールの使用
from langchain_community.tools import DuckDuckGoSearchRun
from langchain_community.tools import WikipediaQueryRun
from langchain_community.utilities import WikipediaAPIWrapper

# Web検索ツール
search = DuckDuckGoSearchRun()
result = search.invoke("AIに関する最新ニュース")
print(result)

# Wikipediaツール
wikipedia = WikipediaQueryRun(api_wrapper=WikipediaAPIWrapper())
result = wikipedia.invoke("機械学習")
print(result)

一般的な組み込みツール

ツール パッケージ 目的
DuckDuckGoSearchRun langchain-community Web検索
WikipediaQueryRun langchain-community Wikipedia検索
ArxivQueryRun langchain-community 学術論文検索
PythonREPLTool langchain-community Pythonコード実行
ShellTool langchain-community シェルコマンド実行

セキュリティ警告:高リスクツール

PythonREPLToolShellToolは完全なシステムアクセス権限で任意のコードを実行します。これらのツールはサンドボックス環境でのみ使用するか、厳格な入力検証を行ってください。本番環境では、許可リスト、コンテナ化(Docker)、または制限された実行環境の使用を検討してください。

演習

演習1:リサーチエージェントを構築

以下のツールを持つエージェントを作成してください:

  • Webを検索する(DuckDuckGoSearchRunを使用)
  • Wikipedia記事を調べる
  • テキストを要約する(LLMを使用するカスタムツール)

次のように質問してテストしてください:「ニューラルネットワークの歴史を調べて、主要なマイルストーンを要約してください。」

演習2:タスク自動化エージェント

以下のツールを持つ架空のタスク管理システム用エージェントを構築してください:

  • create_task(title, description, due_date)
  • list_tasks()
  • complete_task(task_id)

タスクをシンプルな辞書に保存し、エージェントがタスクを管理する能力をテストしてください。

まとめ

免責事項

本コンテンツは教育目的で提供されています。LangChainはLangChain Inc.によって開発・保守されています。