0Pricing
AI Prompt Engineering · レッスン

ツール/関数のスキーマ

関数呼び出し用のスキーマを学びます。

「ツール/関数のスキーマ」はCoddyKit上の無料AI Prompt Engineeringレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはAI Prompt Engineering学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 AI Prompt Engineeringコースには全4レッスンが含まれています。

ツールはスキーマと意図を組み合わせたもの

関数呼び出しを使うと、モデルからコードにアクションの実行を要求できます。各ツールは、名前、説明(いつ使うか)、パラメーター用のJSON Schemaを指定して宣言します。

モデルがコードを実行することはありません。モデルは構造化された呼び出しリクエストを出力し、ランタイムがそれをディスパッチします。引数をパース可能にするのがスキーマです。

ツール定義の構成

ツール定義は、スキーマでラップされた機能の宣言です。

{
  'type': 'function',
  'function': {
    'name': 'get_weather',
    'description': 'Get current weather for a city. Use when the user asks about weather.',
    'parameters': {
      'type': 'object',
      'properties': {
        'city': {'type': 'string'},
        'units': {'type': 'string', 'enum': ['celsius', 'fahrenheit']}
      },
      'required': ['city', 'units'],
      'additionalProperties': False
    }
  }
}

選択を左右するのは説明

利用可能なツールが多数ある場合、モデルは主に説明に基づいて選択します。説明は判断ルールとして記述してください。

  • 使う場合と使わない場合を明示します。
  • 似たツールとの違いを明確にします。
  • 必要な前提条件を記載します。

不適切なツールが選択される原因は、不適切なスキーマによって引数エラーが起きる場合よりも、説明が不十分である場合のほうが多くなります。

呼び出し・実行・返却のループ

関数呼び出しは複数ターンにわたります。モデルが呼び出しを出力し、こちらが実行し、その結果を追加すると、モデルが処理を続けます。

resp = client.chat.completions.create(model='gpt-4o', messages=msgs, tools=tools)
call = resp.choices[0].message.tool_calls[0]
args = json.loads(call.function.arguments)
result = dispatch(call.function.name, args)
msgs.append(resp.choices[0].message)
msgs.append({'role': 'tool', 'tool_call_id': call.id,
             'content': json.dumps(result)})
# call the model again to continue with the tool result

並列ツール呼び出し

最新のモデルは、アクションが独立している場合、1ターンで複数のツール呼び出しを要求できます。ランタイムでは、すべてのtool_callsを反復処理して実行し(可能であれば並行して実行します)、各tool_call_idに対して1つのツールメッセージを返す必要があります。

呼び出しが1つだけだと決めつけず、必ずループ処理してください。

for call in resp.choices[0].message.tool_calls:
    args = json.loads(call.function.arguments)
    result = dispatch(call.function.name, args)
    msgs.append({'role': 'tool', 'tool_call_id': call.id,
                 'content': json.dumps(result)})

ツール使用の強制と制限

tool_choiceで選択を制御します。

  • auto — モデルが決定します。
  • required — いずれかのツールを必ず呼び出します。
  • {name: ...} — 特定のツールを強制します。
  • none — このターンではツールを無効にします。

特定のツールを強制すると、関数呼び出しを純粋な構造化抽出として使えます。

client.chat.completions.create(
    model='gpt-4o', messages=msgs, tools=tools,
    tool_choice={'type': 'function', 'function': {'name': 'get_weather'}}
)

実行前に引数を検証する

厳格なスキーマを使っていても、ツールの引数は信頼できない入力として扱います。実際のシステム(データベース、決済、ファイル削除)に触れる前に、スキーマに対して再検証し、ビジネスルールを適用してください。

def dispatch(name, args):
    schema = TOOLS[name]['function']['parameters']
    jsonschema.validate(args, schema)   # defense in depth
    if name == 'refund' and args['amount'] > MAX_AUTO_REFUND:
        return {'error': 'requires human approval'}
    return HANDLERS[name](**args)

ツールエラーもプロトコルの一部

ツールが失敗した場合は、例外を投げるのではなく、ツールの結果として構造化されたエラーを返します。そうすればモデルは謝罪したり、引数を修正して再試行したり、別のツールを選択したりできます。

エラーは対応可能な内容にします。理由と、安全な場合は復旧のヒントを含めてください。

{'status': 'error',
 'code': 'CITY_NOT_FOUND',
 'message': 'No city named Xyz. Ask the user to clarify the city.'}

ツールの種類を絞る

ツールが数十個あると、選択の正確性が低下し、トークンコストも増加します(すべてのスキーマが毎ターンのコンテキストに含まれるためです)。対策は次のとおりです。

  • 関連するアクションを、action enumを持つ1つのツールの背後にまとめます。
  • 現在の状態に関係するツールだけを動的に公開します。
  • 名前空間を使い、似たツール同士の混同を減らします。

副作用に備えたスキーマの強化

破壊的な操作では、スキーマ自体に安全対策を組み込みます。明示的な確認フィールドを必須にし、範囲を制約し、自由記述の識別子ではなく列挙型または検証済みパターンを使用します。

{
  'name': 'delete_records',
  'parameters': {
    'type': 'object',
    'properties': {
      'table': {'type': 'string', 'enum': ['logs', 'temp_cache']},
      'confirm': {'type': 'boolean'},
      'max_rows': {'type': 'integer', 'minimum': 1, 'maximum': 1000}
    },
    'required': ['table', 'confirm', 'max_rows'],
    'additionalProperties': False
  }
}

ツール定義のテスト

ツールの選択を測定可能な動作として扱います。プロンプトを期待するツールと args に対応付けた評価用データセットを作成し、モデルが正しく選択することをアサートします。説明文を書き換えたり新しいツールを追加したりした際には、リグレッションを追跡します。

cases = [
  {'prompt': 'Whats it like in Paris?', 'expect_tool': 'get_weather'},
  {'prompt': 'Convert 10 USD to EUR', 'expect_tool': 'fx_convert'}
]
for c in cases:
    assert run(c['prompt']).tool_name == c['expect_tool']

クイックチェック

モデルが1回のアシスタントターンで、独立した2つの tool_calls を生成しました。ランタイムは何をしなければなりませんか。

まとめ

実践におけるツール/関数スキーマ:

  • 説明文が選択を促し、スキーマが解析可能な引数を定義します。
  • すべての tool_calls をループ処理し、並列実行に対応します。
  • tool_choice で動作を制御し、純粋な抽出ではツールを強制します。
  • 引数を再検証し、構造化されたエラーを返します。
  • ツールの種類を絞り、破壊的な操作を堅牢化します。

次は、出力がまだ正しくない場合に備えた修正と検証のループです。

よくある質問

「ツール/関数のスキーマ」レッスンは無料ですか?

はい。「ツール/関数のスキーマ」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、AI Prompt Engineeringコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 AI Prompt Engineeringコースには全4レッスンが含まれています。

「ツール/関数のスキーマ」で何を学びますか?

関数呼び出し用のスキーマを学びます。 ブラウザで直接実行するハンズオンコードでAI Prompt Engineeringを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

AI Prompt Engineeringを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのAI Prompt Engineeringは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。

「ツール/関数のスキーマ」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このAI Prompt Engineeringレッスンでコードを書いて実行できますか?

はい。すべてのAI Prompt Engineeringレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. 構造化出力が重要な理由
  2. プロンプト内のJSON Schema
  3. ツール/関数のスキーマ
  4. 修復と検証のループ
← AI Prompt Engineeringに戻る