ツール/関数のスキーマ
関数呼び出し用のスキーマを学びます。
「ツール/関数のスキーマ」は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.'}ツールの種類を絞る
ツールが数十個あると、選択の正確性が低下し、トークンコストも増加します(すべてのスキーマが毎ターンのコンテキストに含まれるためです)。対策は次のとおりです。
- 関連するアクションを、
actionenumを持つ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フィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- 構造化出力が重要な理由
- プロンプト内のJSON Schema
- ツール/関数のスキーマ
- 修復と検証のループ