トークンプロファイルと予算内パッキング

パッキングは、フレームを1回のモデル呼び出しで利用可能かつ予算内に収まる項目へ変換します。判断内容を説明するPackManifestも生成します。

v0.1系列の処理順序

  1. 有効期限、隔離状態、境界規則、カスタムポリシーを評価します。

  2. optional(任意)/preferred(優先)の違反項目を除外し、required(必須)の違反ではPolicyViolationを送出します。

  3. 任意/優先のBinaryコンテンツを除外し、必須のBinaryコンテンツではUnsupportedContentを送出します。

  4. 選択したTokenProfileを使い、対象項目のコストを計算します。

  5. すべての必須項目を確保します。

  6. 必須コンテンツが予算を超える場合は、明示的に選択された超過時の方針を適用します。

  7. ランクスコア、優先度、コストあたりのスコア、IDの順に評価し、優先項目、続いて任意項目を検討します。

  8. 選択した項目を元の入力順で返します。

トークンプロファイルの基本コストを1回だけ計上します。その後、各項目のコンテンツコストと設定済みのエンベロープコストを予算から消費します。

保持要件は契約

  • required(必須):必ず選択されます。選択できない場合、パッキングは失敗します。

  • preferred(優先):すべての任意項目より先に検討されますが、ポリシーまたは予算を理由に除外される場合があります。

  • optional(任意):残りの容量から選択されます。

優先度が高くてもrequired(必須)項目には優先できず、優先度の高い任意項目が優先項目より先に選ばれることもありません。

既定値

pack = frame.pack(budget=8_000)

は、次を選択することと同じです。

pack = frame.pack(
    budget=8_000,
    token_profile=cx.profiles.approximate(),
    boundary=cx.Boundary.internal("application"),
    overflow=cx.Overflow.error(),
)

モデルプロバイダー向けにデータをレンダリングする前に、外部境界を明示してください。

トークンプロファイル

プロファイル

v0.1系列の動作

マニフェスト

profiles.approximate()

UTF-8バイト数から概算し、各項目を最低1トークンとして計上

estimated=True

profiles.openai("o200k_base")

バイナリwheelではコンテンツをRustネイティブで計数し、基本コストと項目ごとのエンベロープは保守的に概算

estimated=True

profiles.openai("cl100k_base")

cl100k_baseでも同じ動作

estimated=True

profiles.huggingface(tokenizer_json)

tokenizer JSON定義を使い、Rustのtokenizersで計数

設定したプロファイルではestimated=False

profiles.huggingface(python_tokenizer)

バッチ対応のPython代替実装。初回使用時にPerformanceWarningを通知

呼び出し側が定義したプロファイル

estimated=Falseは、設定されたプロファイルに基づいて正確に計数したことを意味します。プロバイダー固有のリクエストフィールドをすべて含むことを証明するものではありません。組み込みのHugging Faceプロファイルでは、既定でプロバイダーのエンベロープコストを加算しません。

profiles.openai()では、コンテンツを正確にトークン化できる場合も、プロバイダーのリクエストエンベロープ規則が変わり得るため、意図的に概算扱いとしています。概算予算をプロバイダーが強制する厳密な上限とみなさず、運用上の余裕を確保し、プロバイダーからのエラーを処理してください。

v0.1系列のネイティブコアでは、o200k_basecl100k_base以外のencodingはサポートされません。

結果を確認する

manifest = pack.manifest.to_dict()
print(manifest["budget"])
print(manifest["total_tokens"])
print(manifest["token_profile_id"])
print(manifest["estimated"])
print(manifest["selected"])
print(manifest["excluded"])

翻訳された例外文字列や整形済みログ行を条件分岐に使用しないでください。マニフェストのフィールド、診断コード、構造化された例外属性を使用します。

必須項目による予算超過

安全な既定動作では、必須コンテンツを削除しません。完全な復旧例は予算超過からの復旧を参照してください。古い会話ターンが必須でなくなった場合、アプリケーションはパッキング前にdemote()を使用できますが、Cognoxiumがこの承認判断を自動で行うことはありません。