アプリにAIを組み込むとき、本当に欲しいのは「読み物としての文章」ではなく、そのままプログラムが処理できるデータです。`{"name":"…","amount":1200}` のような決まった形で返ってくれば、画面に表示したり、DBに保存したり、次の処理へ渡したりできます。これを実現するのが構造化出力(Structured Output)とFunction / Tool Calling。本稿では、2026年時点の仕組みと、実務で壊れない設計の勘所を整理します。
FIG.1 スキーマ(型の設計図)を渡すと、出力の「形」を固定できる
01「自由文」と「構造化出力」は別物
チャット画面で人間が読む答えは、文章として自然であれば十分です。ところがアプリの中でAIを使うときは、答えの一部を確実に取り出せることが必要になります。たとえば領収書の写真から「店名」「金額」「日付」を抜き出して経費精算フォームに入れる場面では、AIが「だいたい1,200円くらいでした」と書いてくれても困ります。プログラムが読むのは "amount": 1200 のような決まった形です。
そこで使うのが、出力の型(スキーマ)をあらかじめ定義し、その形で返させる仕組みです。何を必須にするか、各項目は文字列か数値か、選べる値は何か——これを設計図として渡します。
022つの代表的な手段
構造化を実現する道具は、大きく次の2つに整理できます。役割が違うので、目的で選びます。
| JSON 構造化出力 | Function / Tool Calling |
|---|---|
| 欲しいのは「整ったデータ」 | 欲しいのは「どの操作を・どんな引数で呼ぶか」の意図 |
| 抽出・分類・要約をJSONで受け取る | 外部API・DB・社内関数を呼ぶ前段に使う |
| 例:領収書→{店名, 金額, 日付} | 例:天気を聞かれたら get_weather(city="東京") を提案 |
| 返ってくるのはデータそのもの | 返ってくるのは「呼び出しの提案」。実行は自前のコード |
大事なのは、Function Calling はAIが関数を実行するわけではないという点です。モデルは「この関数を、この引数で呼ぶとよさそう」という意図を返すだけ。実際に呼ぶかどうか、その引数が安全かは、受け取ったあなたのコードが判断します。