データベースクエリツールの活用

エージェントが学習データに含まれていない最新の情報や組織内の構造化データにアクセスするための手法の1つがデータベースクエリツールの実装である。モデルに直接 SQL を書かせたり、クエリをハードコーディングしたりするのではなく、データベースへの接続ロジックをツール(関数)としてカプセル化することで、安全かつ動的なデータ操作が可能になる。以下の例では、ライブラリの利用状況を管理する簡易的なデータベースを想定し、エージェントがユーザーの貸出状況を検索する仕組みを構築する。

1. データ構造と入力モデルの定義

Pydantic を使用して、ツールが受け取る引数の型を定義する。これにより、エージェントが自然言語から正確なパラメータを抽出できるようになる。

from agents import Agent, Runner, function_tool
from pydantic import BaseModel
from typing import List

# 模擬データベース
USER_RECORDS = {
    "alice@example.com": [
        {"item": "プログラミング基礎", "due_date": "2026-01-15", "status": "貸出中"},
        {"item": "AIエージェントの設計", "due_date": "2025-12-20", "status": "返却済"}
    ],
    "bob@example.com": [
        {"item": "法学入門", "due_date": "2026-02-01", "status": "貸出中"}
    ]
}

class UserSearchQuery(BaseModel):
    email: str

2. ツールの作成

データベースから情報を取得し、テキスト形式で返す関数を定義する。@function_tool デコレータを付与することで、Agent SDK が認識可能なツールとなる。

@function_tool
def fetch_user_loan_history(query: UserSearchQuery) -> str:
    """ユーザーのメールアドレスに基づいて貸出履歴を取得する"""
    records = USER_RECORDS.get(query.email.lower())
    if not records:
        return f"{query.email} の記録は見つからなかった。"
    
    details = "\n".join(
        [f"項目: {r['item']}, 期限: {r['due_date']}, 状態: {r['status']}" for r in records]
    )
    return f"{query.email} の貸出履歴:\n{details}"

3. エージェントの構築と実行

定義したツールをエージェントに持たせ、ユーザーの自然言語による問いかけを処理させる。

# エージェントの設定
library_agent = Agent(
    name="LibraryAssistant",
    instructions="あなたは図書館の貸出状況を管理するアシスタントだ。ユーザーのメールアドレスから履歴を検索し、回答せよ。",
    tools=[fetch_user_loan_history]
)

# 実行
response = Runner.run_sync(library_agent, "alice@example.com の貸出状況を教えて。")
print(response.final_output)

4.ツールの仕組みとメリット

このパターンを導入することで、エージェントは以下のプロセスを自動的に実行する。

  • 情報の抽出: ユーザーの入力(自然言語)から、必要なパラメータ(メールアドレスなど)を特定する。
  • 型チェック: Pydantic モデルに基づき、抽出したデータが正しい形式か検証する。
  • 外部アクセス: カプセル化されたロジックを通じて、API やデータベースなどの外部ソースから動的なデータを取得する。
  • 回答の生成: ツールから返された構造化データを、再び自然言語に変換してユーザーに提示する。

5.応用可能性

この手法は顧客情報の参照だけでなく、判例データベース検索といった弁護士業務への応用が可能である。