関数呼び出し(function calling)は、ツール呼び出し(tool calling)とも呼ばれ、言語モデルが外部のシステムや、 学習データの外にあるデータとやり取りするための仕組みである。アプリケーションはモデルに、どのツールを 利用できるかを伝える——関数は、入力を JSON スキーマで定義する種類のツールである——。モデルは、プロンプトに 従うためにそのいずれかが必要だと判断すると、最終的な回答の代わりに、ツール名と引数を示すツール呼び出しで 応答する。アプリケーションはその呼び出しを実行し、その呼び出しを参照する形でツール呼び出しの出力を返し、 モデルはそれを受けて回答するか、さらに呼び出しを行う。OpenAI の API ガイドはこれを、アプリケーションとモデルの 間で行われる複数ステップの会話として、5 つのステップで説明している。ツールを添えたリクエスト、ツール呼び出しの 受信、アプリケーション側での実行、出力の返送、そして最終応答またはさらなるツール呼び出しの受信である。

用法

OpenAI の API では、関数定義は type、name、いつどのように使うかの説明、パラメータの JSON Schema、そして strict フラグを持つ。ガイドは JSON スキーマによる関数ツールのほかに、自由形式のテキストを受け取って返し、 その入力を文脈自由文法(Lark の一変種または正規表現)で制約できるカスタムツールや、Web 検索、コード実行、 Model Context Protocol サーバーへのアクセスといったプラットフォーム組み込みのツールも説明している。 関連するツールは名前空間にまとめることができ(ツールの名前空間化 を参照)、めったに使わないものは ツール検索 で遅延させて、モデルが必要とするときにだけ読み込ませることができる。

関数の定義についてのガイドの推奨は次のとおりである。明確な名前、パラメータの説明、指示を書き、関数を 使うべきでない場面も含めること。列挙型やオブジェクト構造を使って不正な状態を表現できないようにする、 人間のインターンが説明だけでその関数を使えるかを確かめる、といった通常のソフトウェアエンジニアリングの 実践を適用すること。アプリケーションがすでに知っている引数はモデルに任せず、常に連続して呼ばれる関数は 統合すること。そして、ターンの開始時に利用可能な関数の数を少なく保つこと——緩やかな目安として 20 個未満を 挙げている。ガイドは、関数定義はモデルのコンテキストに注入されるため、コンテキストの上限に算入され、 入力トークンとして課金されると注記している。

呼び出しの行われ方は、いくつかの制御によって決まる。tool_choice によって、アプリケーションは判断を モデルに委ねる、少なくとも 1 回の呼び出しを必須とする、特定の関数 1 つを強制する、呼び出しを許可された 部分集合に制限する、呼び出しを無効にする、のいずれかを選べる。並列呼び出しを無効にしない限り、モデルは 1 つのターンで複数の関数を呼び出すことがある。strict モードは構造化出力(structured outputs)を土台として、 呼び出しがスキーマに確実に適合するようにする。これには、すべてのオブジェクトで追加プロパティを禁止し、 すべてのフィールドを必須と指定する必要がある。OpenAI は常に有効にすることを推奨している。結果は通常、 アプリケーションが選んだ任意の形式の文字列として返され、戻り値のない関数であっても成功か失敗かは 報告すべきだとされる。

関連用語