最適化、テスト、セキュリティ

トークン最適化:コスト、コンテキストウィンドウ、圧縮

LLM プロンプトのトークン最適化。トークンとコンテキストウィンドウの仕組み、正しい数え方、意味を損なわずにプロンプトを圧縮する方法。

英語の原文からの翻訳です。コード、プロンプト、モデルの出力は英語のまま掲載しています。

言語モデルはトークンを読み、トークンを書き、その両方に対して課金されます。トークン最適化とは、回答を良くする場所にだけトークンを使うことです。うまくやれば、コストと遅延が下がり、焦点の絞られたプロンプトは従いやすいので、品質も上がることが多いです。

トークンとは

トークンは、モデルの語彙に含まれるテキストの断片です。単語、単語の一部、句読点、あるいはスペースと単語の組み合わせなどです。英語の文章では、おおまかに 1 トークンあたり 4 文字、つまり単語の 4 分の 3 というのが目安です。この目安は、よく外れます。

  • コード、JSON、珍しい識別子は、文章よりトークンを多く使います。
  • 英語以外の言語は、単語あたりのトークン数が多くなりがちです。
  • プロバイダーごとに独自のトークナイザーがあるため、同じテキストでもモデルごとにトークン数が異なります。

本物のトークナイザーで数える

見積もりは最初の目安としては十分でも、予算には不向きです。OpenAI はトークナイザーを公開しているので、オフラインで正確に数えられます。Anthropic と Google はトークン数を数えるエンドポイントを提供しており、それがなければ数値は近似になります。

PromptFlowEngine はこの区別に従っています。OpenAI のモデルはそのトークナイザーで計算して「正確」と表示し、他のプロバイダーは「近似」と表示します。プロンプトはワークスペースまたは HTTP API で確認できます。

curl -s https://promptflowengine.com/api/v1/tokens \
  -H 'content-type: application/json' \
  -d '{"prompt":"Summarize the notes below in 5 bullets.","model":"gpt-4.1"}'

コストの出どころ

1 回の呼び出しのコストは、入力トークン × 入力単価 + 出力トークン × 出力単価です。あらゆる最適化を左右する事実が 3 つあります。

  1. 出力トークンは通常、入力トークンの数倍のコストがかかります。 回答の長さを制限するほうが、プロンプトを削るより節約になることがよくあります。
  2. プロンプトの固定部分は、呼び出しのたびに支払います。 100 万回実行されるシステムプロンプトで 50 トークンを無駄にすると、5,000 万トークンになります。
  3. 会話やエージェントのループでは、履歴が毎ターン再送されます。 コストはターン数より速く増えます。

プロンプト圧縮:何を削るか

最も安全な削減から、最もリスクのあるものへ順に進めます。

つなぎ言葉と丁寧表現。 「こんにちは」「お願いします」「〜していただきたいのですが」「〜ということに注意してください」。これらは指示を含みません。

Before: Hello! I would like you to please summarize the notes below.
        Please make sure to keep it brief.
After:  Summarize the notes below in 3 sentences.

繰り返し。 同じ指示が 2 回書かれていることがあります。何か月も編集を重ねて、別のセクションに現れていることも多いです。

回りくどい表現。 「〜するために」は短く、「〜という事実のために」は「〜ので」にします。

使われていない文脈。 どのテストケースも依存していない背景情報。削除して、テストをやり直します。

過剰な例。 8 個ではなく 3 個の例を試し、測定します。

冗長な形式。 長いキーでインデントした JSON は、短いキーのコンパクトな JSON よりコストがかかります。プロンプトに挿入するデータには、コンパクトな形式が呼び出しごとにトークンを節約します。

最初の 3 つは機械的に行えます。PromptFlowEngine のプロンプトオプティマイザーはそれらを適用し、元の文、要件、コードブロック、変数がすべて残っていることを検証します。ここは手作業で確認すると手間のかかる部分です。

削ってはいけないもの

  • 要件と制約。 ルールが抜けた短いプロンプトは、別のプロンプトです。
  • 出力形式。 削っても 10 トークンの節約にしかならず、パーサーを失います。
  • 入力を囲む区切り。 安価で、インジェクションを防ぎます。
  • 構造。 セクションの見出しは数トークンのコストで、遵守率を高めることがあります。冠詞や接続語を削ぎ落とした過度に圧縮されたテキストは、モデルには曖昧になり、次に編集する人には読めなくなります。

コンテキストウィンドウの最適化

コンテキストウィンドウは、モデルが一度に考慮できるトークンの最大数で、入力と出力の合計です。ウィンドウは非常に大きくなり、問題は「収まるか」から「そこにあるべきか」に変わりました。

文脈を増やすのは無料ではありません。 コストと遅延のほかに、入力が増えると品質が下がることがあります。数千の無関係なトークンに囲まれた関連する一節は、モデルにとって使いにくくなります。タスクに必要なものを送りましょう。

すべてを含めるのではなく、検索する。 質問に関連する一節を検索し、それだけを挿入します。RAG のプロンプティングを参照してください。

長いプロンプトでは順序が重要です。 多くのモデルは、長い入力の冒頭と末尾に最もよく注意を向けます。長いドキュメントを先に、質問や指示をその後に置くか、重要な指示を末尾で繰り返します。

会話履歴を管理する。 古いターンを要約し、不要になったツールの結果を捨て、話題が変わったら新しい会話を始めます。

回答用の余地を残す。 入力がウィンドウを埋めると、出力が途中で切れます。想定する最長の回答の分を空けておきます。

作業を分割する。 プロンプトチェーンなら、各ステップに必要な文脈だけを渡せます。

キャッシュを使う

主要なプロバイダーはプロンプトキャッシュを提供しています。プロンプトの先頭が最近のリクエストと一致すると、繰り返し部分は割引料金で課金され、処理も速くなります。恩恵を受けるには、次のようにします。

  • 変わらない内容を先頭に置く:システムプロンプト、ツール定義、例、参照ドキュメント。
  • 変動する内容を最後に置く:ユーザーの質問と、リクエストごとのデータ。
  • 呼び出しの間で、タイムスタンプのように変わるものを固定部分に入れない。

キャッシュは、長くて固定のプロンプトをずっと安くします。ただし、無関係な文脈による品質面のコストはなくなりません。

出力の長さを制御する

  • 数を指定する:「100 語以内」「ちょうど 5 項目」。
  • 必要なものだけを頼む:説明付きのラベルではなく、ラベルだけ。
  • API の最大出力トークン数を、強制的な停止として設定する。
  • 推論モデルでは、単純なタスクで推論の労力を下げる。

予算を決めて、強制する

本番の各プロンプトが使えるトークン数を決め、自動でチェックします。プロンプトテストゲートは、プロンプトファイルがトークン上限を超えるとビルドを失敗させます。

{ "include": ["prompts/**/*.md"], "model": "gpt-4.1", "maxTokens": 1500 }

これで、トークンの増加は請求書で気づくものから、プルリクエストでレビューするものに変わります。測定によってプロンプトを改善する、より広いプロセスについては、プロンプトの最適化を参照してください。

実践してみる

プロンプトオプティマイザーで試す

すべての要件が残っていることを証明しながら、トークンを削り、構造を加えます。 無料・決定論的で、アカウントは不要です。

関連する PromptFlowEngine ツール

最適化、テスト、セキュリティのその他のガイド

プロンプトエンジニアリングガイドをすべて見る