For the complete documentation index, see llms.txt. Markdown versions of documentation pages are available by appending .md to the page URL.
メインナビゲーション
Theme

予測出力

応答内容の大部分が事前にわかっている場合に、モデルの応答時間を短縮できます。

予測出力を使うと、出力トークンの多くが事前にわかっている場合に、Chat Completions の API 応答時間を短縮できます。典型的な例は、テキストファイルやコードファイルに小さな変更を加えて再生成する場合です。予測テキストは Chat Completions の prediction リクエストパラメーターで指定できます。

現在、予測出力は gpt-4o、gpt-4o-mini、gpt-4.1、gpt-4.1-mini、gpt-4.1-nano の各モデルの最新版で利用できます。ここでは、予測出力を使ってアプリケーションの応答時間を短縮する方法を説明します。

コードのリファクタリング例

予測出力は、テキスト文書やコードファイルに小さな変更を加えて再生成するときに特に役立ちます。たとえば、GPT-4o モデルに JavaScript コードのリファクタリングを依頼し、username(User クラスのプロパティ)の名前を email に変更するとします。

class User {
  firstName = "";
  lastName = "";
  username = "";
}

export default User;

変更するのは上のコードの 4 行目だけで、ファイルのほかの部分はそのままです。変更前のコードファイルの内容を予測テキストとして渡すと、ファイル全体をより短い時間で再生成できます。ファイルが大きいほど、短縮できる時間も長くなります。

次の例では、モデルの最終出力が元のコードファイルとほぼ同じになると見込んで、SDK の prediction パラメーターに元のコードを予測テキストとして渡しています。

予測出力を使った JavaScript クラスのリファクタリング
import OpenAI from "openai";

const code = `
class User {
  firstName = "";
  lastName = "";
  username = "";
}

export default User;
`.trim();

const openai = new OpenAI();

const refactorPrompt = `
Replace the "username" property with an "email" property. Respond only
with code, and with no markdown formatting.
`;

const completion = await openai.chat.completions.create({
  model: "gpt-4.1",
  messages: [
    {
      role: "user",
      content: refactorPrompt,
    },
    {
      role: "user",
      content: code,
    },
  ],
  store: true,
  prediction: {
    type: "content",
    content: code,
  },
});

// Inspect returned data
console.log(completion);
console.log(completion.choices[0].message.content);

モデルの応答には、リファクタリング後のコードに加えて、トークンの使用状況も含まれます。choices フィールドを省略すると、応答は次のようになります。

{
  "id": "chatcmpl-xxx",
  "object": "chat.completion",
  "created": 1786652188,
  "model": "gpt-4.1-2025-04-14",
  "usage": {
    "prompt_tokens": 59,
    "completion_tokens": 24,
    "total_tokens": 83,
    "prompt_tokens_details": { "cached_tokens": 0, "audio_tokens": 0 },
    "completion_tokens_details": {
      "reasoning_tokens": 0,
      "audio_tokens": 0,
      "accepted_prediction_tokens": 14,
      "rejected_prediction_tokens": 2
    }
  },
  "system_fingerprint": "fp_6ddb4f7408"
}

accepted_prediction_tokens と rejected_prediction_tokens は、どちらも usage オブジェクトに含まれています。この例では、予測テキストのうち 14 トークンが採用されて応答時間の短縮に役立ち、2 トークンが却下されました。

却下されたトークンにも、API が生成するほかの出力トークンと同じ料金がかかります。そのため、予測出力を使うとリクエストの料金が高くなることがあります。

ストリーミングの例

API 応答をストリーミングすると、予測出力による応答時間の短縮効果がさらに大きくなります。次の例では、先ほどと同じコードのリファクタリングを、OpenAI SDK のストリーミングを使って行います。

ストリーミングでの予測出力
import OpenAI from "openai";

const code = `
class User {
  firstName = "";
  lastName = "";
  username = "";
}

export default User;
`.trim();

const openai = new OpenAI();

const refactorPrompt = `
Replace the "username" property with an "email" property. Respond only
with code, and with no markdown formatting.
`;

const completion = await openai.chat.completions.create({
  model: "gpt-4.1",
  messages: [
    {
      role: "user",
      content: refactorPrompt,
    },
    {
      role: "user",
      content: code,
    },
  ],
  store: true,
  prediction: {
    type: "content",
    content: code,
  },
  stream: true,
});

// Inspect returned data
for await (const chunk of completion) {
  process.stdout.write(chunk.choices[0]?.delta?.content || "");
}

応答内での予測テキストの位置

予測テキストが生成された応答のどこに現れても、応答時間の短縮に役立ちます。たとえば、次のシンプルな Hono サーバーのコードを予測テキストとして渡すとします。

import { serve } from "@hono/node-server";
import { serveStatic } from "@hono/node-server/serve-static";
import { Hono } from "hono";

const app = new Hono();

app.get("/api", (c) => {
  return c.text("Hello Hono!");
});

// You will need to build the client code first: `pnpm run ui:build`.
app.use(
  "/*",
  serveStatic({
    rewriteRequestPath: (path) => `./dist${path}`,
  })
);

const port = 3000;
console.log(`Server is running on port ${port}`);

serve({
  fetch: app.fetch,
  port,
});

次のようなプロンプトで、モデルにファイルの再生成を依頼できます。

このアプリケーションに、テキスト「hello world」を返す GET ルートを追加してください。
このルートを追加したアプリケーションファイル全体を再生成してください。
出力には Markdown の書式を加えないでください。

このプロンプトに対する応答の例を示します。

import { serve } from "@hono/node-server";
import { serveStatic } from "@hono/node-server/serve-static";
import { Hono } from "hono";

const app = new Hono();

app.get("/api", (c) => {
  return c.text("Hello Hono!");
});

app.get("/hello", (c) => {
  return c.text("hello world");
});

// You will need to build the client code first: `pnpm run ui:build`.
app.use(
  "/*",
  serveStatic({
    rewriteRequestPath: (path) => `./dist${path}`,
  })
);

const port = 3000;
console.log(`Server is running on port ${port}`);

serve({
  fetch: app.fetch,
  port,
});

予測テキストは新しく追加されたコードの前後に分かれて現れています。choices フィールドを省略したモデルの応答を見ると、この場合も予測トークンが採用されたことがわかります。

{
  "id": "chatcmpl-xxx",
  "object": "chat.completion",
  "created": 1731014771,
  "model": "gpt-4o-2024-08-06",
  "usage": {
    "prompt_tokens": 203,
    "completion_tokens": 159,
    "total_tokens": 362,
    "prompt_tokens_details": { "cached_tokens": 0, "audio_tokens": 0 },
    "completion_tokens_details": {
      "reasoning_tokens": 0,
      "audio_tokens": 0,
      "accepted_prediction_tokens": 60,
      "rejected_prediction_tokens": 0
    }
  },
  "system_fingerprint": "fp_9ee9e968ea"
}

今回は、予測テキストとして渡したファイルの内容がすべて最終応答に使われたため、却下された予測トークンはありませんでした。うまくいきました!🔥

制限事項

予測出力を使う際は、次の点に注意してください。

  • 予測出力に対応しているのは、GPT-4o、GPT-4o-mini、GPT-4.1、GPT-4.1-mini、GPT-4.1-nano シリーズのモデルのみです。
  • 予測テキストとして渡したトークンのうち、最終出力に含まれなかったトークンにも、出力トークンと同じ単価が適用されます。最終応答に使われなかったトークン数は、rejected_prediction_tokens プロパティ(usage オブジェクト内)で確認できます。
  • 予測出力を使う場合、次の API パラメーターには制限があります。
    • n:1 を超える値は指定不可
    • logprobs:非対応
    • presence_penalty:0 を超える値は指定不可
    • frequency_penalty:0 を超える値は指定不可
    • audio:予測出力は音声の入出力に非対応
    • modalities:text モダリティのみ対応
    • max_completion_tokens:非対応
    • tools:予測出力は現在 Function Calling に非対応