コンテンツ ストリーミング

このガイドでは、Azure OpenAI コンテンツ ストリーミング エクスペリエンスとオプションについて説明します。 お客様は、検証されたコンテンツのチャンクがコンテンツ フィルターに合格するのを待つ代わりに、生成されたときに API からコンテンツを受け取ることができます。

非同期フィルター構成には、Foundry ポータルでコンテンツ フィルター ポリシーを変更するためのアクセス許可が必要です。

適切なストリーミング モードを選択する

次の場合は、既定のストリーミングを使用します。

  • 最大限の安全性とコンプライアンスが必要
  • コンテンツを表示する前に、すぐにフィルター処理する必要があります
  • あなたのアプリケーションでは、遡及的なコンテンツ削除を処理できません。
  • 例: 規制対象業界の顧客向けチャットボット

非同期フィルターは、次の場合に使用します。

  • 低遅延はユーザーエクスペリエンスにとって重要です。
  • クライアント側のコンテンツの編集を実装できます
  • アプリケーションに追加の安全制御がある
  • 遅延フィルタリング信号を処理する用意がある
  • 例: 内部開発ツール、クリエイティブ ライティング アシスタント

既定のフィルター処理の動作

コンテンツ ガードレール システムは統合され、すべての顧客に対して既定で有効になっています。 既定のストリーミング シナリオでは、完了コンテンツ バッファー、コンテンツ ガードレール システムはバッファーされたコンテンツで実行され、ガードレールの構成に応じて、コンテンツがガードレール ポリシー (Microsoft の既定またはカスタム ユーザー構成) に違反していない場合、またはすぐにブロックされ、代わりにガードレール エラーが返された場合に、コンテンツがユーザーに返されます。 このプロセスは、ストリームの最後まで繰り返されます。 コンテンツは、ユーザーに返される前に、ガードレール ポリシーに従って完全に審査されます。 この場合、コンテンツはトークンごとに返されませんが、それぞれのバッファー サイズの "コンテンツ チャンク" で返されます。

非同期フィルター処理

お客様は、追加オプションとして非同期フィルターを選び、新しいストリーミング エクスペリエンスを提供することができます。 この場合、コンテンツ フィルターは非同期的に実行され、完了コンテンツはスムーズなトークンごとのストリーミング エクスペリエンスですぐに返されます。 バッファーに含まれるコンテンツがないため、コンテンツ のフィルター処理に伴う待機時間がゼロの高速ストリーミング エクスペリエンスが可能になります。

お客様は、この機能により待機時間が短縮される一方、モデル出力の小さなセクションの安全性とリアルタイムの審査とのトレードオフになることに注意が必要があります。 コンテンツ フィルターは非同期で実行されるため、コンテンツ モデレーション メッセージとポリシー違反シグナルに遅延が生じます。つまり、通常はすぐにフィルター処理されるはずの有害なコンテンツの一部のセクションが、ユーザーに表示される可能性があります。

注釈: 注釈とコンテンツ モデレーション メッセージはストリーム中に継続的に返されます。 アプリで注釈を使用し、コンテンツの編集や他の安全情報のユーザーへの返しなど、他の AI ガイドラインと制御メカニズムを実装することを強くお勧めします。

コンテンツ フィルタリング シグナル: コンテンツ フィルタリング エラー シグナルに遅延が生じます。 ポリシー違反がある場合は、使用可能になるとすぐに返され、ストリームは停止します。 ポリシー違反が発生した場合、コンテンツ フィルタリング シグナルはポリシーに違反するコンテンツの最大 1,000 文字の範囲内で保証されます。

お客様の著作権コミットメント: 事後的に保護素材として指定されたコンテンツは、お客様の著作権コミットメントの対象外になる可能性があります。

コストに関する考慮事項

Important

ストリーミングでのコンテンツ フィルター処理の課金

ストリーミング中にコンテンツ フィルター処理がトリガーされると、プロンプト トークンと完了トークンの両方に料金が適用されます。

  • 状態 400 (プロンプトがフィルター処理済み): プロンプト評価に対して課金される
  • 状態 200 と finish_reason: "content_filter": フィルター処理前に生成されたプロンプト トークンと完了トークンの両方に対して課金されます

これは、既定のフィルター モードと非同期フィルター モードの両方に適用されます。 詳細については、「Azure OpenAI の価格」を参照してください。

Microsoft Foundry ポータル で非同期フィルターを有効にするには、Content フィルターの使い方ガイドに従って新しいコンテンツ フィルター構成を作成し、ストリーミング セクションで Asynchronous Filter を選択します。

非同期フィルターは、API バージョン 2024-02-01 以降で使用できます。 互換性のある API バージョンで OpenAI Python SDK v1.0 以降または Azure OpenAI SDK を使用します。

コンテンツ フィルタリング モードの比較

Compare [ストリーミング] - 既定値 ストリーミング - 非同期フィルター
ステータス GA GA
Eligibility すべての顧客 すべての顧客
有効にする方法 既定で有効になっており、アクションは必要ありません お客様は、Foundry ポータル で直接構成できます (展開レベルで適用されるコンテンツ フィルター構成の一部として)
モダリティと可用性 テキスト;すべての GPT モデル テキスト;すべての GPT モデル
ストリーミング エクスペリエンス コンテンツがバッファーされ、チャンク単位で返されます 待機時間ゼロ (バッファリングなし、フィルターは非同期的に実行)
コンテンツ フィルタリング シグナル 即時フィルタリング シグナル 遅延フィルタリング シグナル (最大 1,000 文字の増分)
コンテンツ フィルタリングの構成 既定値と任意のユーザー定義のフィルター設定をサポートします (オプションのモデルを含む) 既定値と任意のユーザー定義のフィルター設定をサポートします (オプションのモデルを含む)

注釈とサンプル応答

プロンプト注釈メッセージ

このメッセージは、既定の注釈と同じです。

data: { 
    "id": "", 
    "object": "", 
    "created": 0, 
    "model": "", 
    "prompt_filter_results": [ 
        { 
            "prompt_index": 0, 
            "content_filter_results": { ... } 
        } 
    ], 
    "choices": [], 
    "usage": null 
} 

コンプリートトークンメッセージ

入力候補メッセージは直ちに転送されます。 サービスは、最初はモデレーションを実行したり、注釈を提供したりしません。

data: { 
    "id": "chatcmpl-7rAJvsS1QQCDuZYDDdQuMJVMV3x3N", 
    "object": "chat.completion.chunk", 
    "created": 1692905411, 
    "model": "gpt-35-turbo", 
    "choices": [ 
        { 
            "index": 0, 
            "finish_reason": null, 
            "delta": { 
                "content": "Color" 
            } 
        } 
    ], 
    "usage": null 
} 

注釈メッセージ

テキスト フィールドは常に空の文字列であり、新しいトークンがないことを示します。 注釈は、既に送信されているトークンにのみ適用されます。 複数の注釈メッセージが同じトークンを参照できます。

"start_offset" および "end_offset" は、注釈が適用されるテキストをマークするテキスト (プロンプトの先頭に 0 を含む) の低粒度オフセットです。

"check_offset" は、完全にモデレートされているテキストの量を示します。 これは、今後の注釈の "end_offset" 値に対する排他的な下限です。 決して減少しません。

data: { 
    "id": "", 
    "object": "", 
    "created": 0, 
    "model": "", 
    "choices": [ 
        { 
            "index": 0, 
            "finish_reason": null, 
            "content_filter_results": { ... }, 
            "content_filter_raw": [ ... ], 
            "content_filter_offsets": { 
                "check_offset": 44, 
                "start_offset": 44, 
                "end_offset": 198 
            } 
        } 
    ], 
    "usage": null 
} 

主なフィールドについて説明します。

  • check_offset: コンテンツが完全にモデレートされたまでの文字位置 (減少しない)
  • start_offset: この注釈バッチが開始される開始文字位置
  • end_offset: この注釈バッチが終了する終了文字位置

すべてのオフセットは、元のプロンプト テキストの先頭にある 0 からカウントされます。

サンプル応答ストリーム (フィルターを通過)

次の例は、非同期フィルターを使用する実際のチャット完了応答を示しています。 プロンプト注釈は変更されず、完了トークンは注釈なしで送信され、新しい注釈メッセージはトークンなしで送信されます。 代わりに、これらの新しい注釈メッセージは、特定のコンテンツ フィルター オフセットにリンクされます。

{"temperature": 0, "frequency_penalty": 0, "presence_penalty": 1.0, "top_p": 1.0, "max_tokens": 800, "messages": [{"role": "user", "content": "What is color?"}], "stream": true}

data: {"id":"","object":"","created":0,"model":"","prompt_annotations":[{"prompt_index":0,"content_filter_results":{"hate":{"filtered":false,"severity":"safe"},"self_harm":{"filtered":false,"severity":"safe"},"sexual":{"filtered":false,"severity":"safe"},"violence":{"filtered":false,"severity":"safe"}}}],"choices":[],"usage":null} 

data: {"id":"chatcmpl-7rCNsVeZy0PGnX3H6jK8STps5nZUY","object":"chat.completion.chunk","created":1692913344,"model":"gpt-35-turbo","choices":[{"index":0,"finish_reason":null,"delta":{"role":"assistant"}}],"usage":null} 

data: {"id":"chatcmpl-7rCNsVeZy0PGnX3H6jK8STps5nZUY","object":"chat.completion.chunk","created":1692913344,"model":"gpt-35-turbo","choices":[{"index":0,"finish_reason":null,"delta":{"content":"Color"}}],"usage":null} 

data: {"id":"chatcmpl-7rCNsVeZy0PGnX3H6jK8STps5nZUY","object":"chat.completion.chunk","created":1692913344,"model":"gpt-35-turbo","choices":[{"index":0,"finish_reason":null,"delta":{"content":" is"}}],"usage":null} 

data: {"id":"chatcmpl-7rCNsVeZy0PGnX3H6jK8STps5nZUY","object":"chat.completion.chunk","created":1692913344,"model":"gpt-35-turbo","choices":[{"index":0,"finish_reason":null,"delta":{"content":" a"}}],"usage":null} 

... 

data: {"id":"","object":"","created":0,"model":"","choices":[{"index":0,"finish_reason":null,"content_filter_results":{"hate":{"filtered":false,"severity":"safe"},"self_harm":{"filtered":false,"severity":"safe"},"sexual":{"filtered":false,"severity":"safe"},"violence":{"filtered":false,"severity":"safe"}},"content_filter_offsets":{"check_offset":44,"start_offset":44,"end_offset":198}}],"usage":null} 

... 

data: {"id":"chatcmpl-7rCNsVeZy0PGnX3H6jK8STps5nZUY","object":"chat.completion.chunk","created":1692913344,"model":"gpt-35-turbo","choices":[{"index":0,"finish_reason":"stop","delta":{}}],"usage":null} 

data: {"id":"","object":"","created":0,"model":"","choices":[{"index":0,"finish_reason":null,"content_filter_results":{"hate":{"filtered":false,"severity":"safe"},"self_harm":{"filtered":false,"severity":"safe"},"sexual":{"filtered":false,"severity":"safe"},"violence":{"filtered":false,"severity":"safe"}},"content_filter_offsets":{"check_offset":506,"start_offset":44,"end_offset":571}}],"usage":null} 

data: [DONE] 

サンプル応答ストリーム (フィルターによってブロック)

{"temperature": 0, "frequency_penalty": 0, "presence_penalty": 1.0, "top_p": 1.0, "max_tokens": 800, "messages": [{"role": "user", "content": "Tell me the lyrics to \"Hey Jude\"."}], "stream": true}

data: {"id":"","object":"","created":0,"model":"","prompt_filter_results":[{"prompt_index":0,"content_filter_results":{"hate":{"filtered":false,"severity":"safe"},"self_harm":{"filtered":false,"severity":"safe"},"sexual":{"filtered":false,"severity":"safe"},"violence":{"filtered":false,"severity":"safe"}}}],"choices":[],"usage":null} 

data: {"id":"chatcmpl-8JCbt5d4luUIhYCI7YH4dQK7hnHx2","object":"chat.completion.chunk","created":1699587397,"model":"gpt-35-turbo","choices":[{"index":0,"finish_reason":null,"delta":{"role":"assistant"}}],"usage":null} 

data: {"id":"chatcmpl-8JCbt5d4luUIhYCI7YH4dQK7hnHx2","object":"chat.completion.chunk","created":1699587397,"model":"gpt-35-turbo","choices":[{"index":0,"finish_reason":null,"delta":{"content":"Hey"}}],"usage":null} 

data: {"id":"chatcmpl-8JCbt5d4luUIhYCI7YH4dQK7hnHx2","object":"chat.completion.chunk","created":1699587397,"model":"gpt-35-turbo","choices":[{"index":0,"finish_reason":null,"delta":{"content":" Jude"}}],"usage":null} 

data: {"id":"chatcmpl-8JCbt5d4luUIhYCI7YH4dQK7hnHx2","object":"chat.completion.chunk","created":1699587397,"model":"gpt-35-turbo","choices":[{"index":0,"finish_reason":null,"delta":{"content":","}}],"usage":null} 

... 

data: {"id":"chatcmpl-8JCbt5d4luUIhYCI7YH4dQK7hnHx2","object":"chat.completion.chunk","created":1699587397,"model":"gpt-35- 

turbo","choices":[{"index":0,"finish_reason":null,"delta":{"content":" better"}}],"usage":null} 

data: {"id":"","object":"","created":0,"model":"","choices":[{"index":0,"finish_reason":null,"content_filter_results":{"hate":{"filtered":false,"severity":"safe"},"self_harm":{"filtered":false,"severity":"safe"},"sexual":{"filtered":false,"severity":"safe"},"violence":{"filtered":false,"severity":"safe"}},"content_filter_offsets":{"check_offset":65,"start_offset":65,"end_offset":1056}}],"usage":null} 

data: {"id":"","object":"","created":0,"model":"","choices":[{"index":0,"finish_reason":"content_filter","content_filter_results":{"protected_material_text":{"detected":true,"filtered":true}},"content_filter_offsets":{"check_offset":65,"start_offset":65,"end_offset":1056}}],"usage":null} 

data: [DONE] 

トラブルシューティング

content_filter終了理由でストリームが停止する

現象: ストリームが予期せず終了し、finish_reason: "content_filter" が返されました。

原因: モデルによって生成されたコンテンツが、コンテンツ フィルター ポリシーに違反しました。 非同期フィルター モードでは、一部のコンテンツが既に表示された後に、このシグナルが到着する可能性があります。

解決方法:

  1. 最後のチャンクの content_filter_results を確認して、フィルター処理をトリガーしたカテゴリ (ヘイト、暴力、性的、self_harm、protected_material_text) を特定します。
  2. 非同期フィルターを使用する場合は、既に表示されているコンテンツを削除するコンテンツの編集をアプリケーションに実装します
  3. Foundry ポータルでコンテンツ フィルターの構成を確認し、必要に応じて重大度のしきい値を調整します
  4. フィルターのトリガーを回避するために、プロンプトの言い換えの検討

ストリームに注釈が表示されない

現象: ストリームは正常に完了しますが、 content_filter_results は常に空または null です。

原因: コンテンツ フィルター注釈がデプロイで有効になっていないか、注釈をサポートしていない API バージョンを使用している可能性があります。

解決方法:

  1. API バージョン 2024-02-01 以降を使用していることを確認する
  2. Foundry ポータルでコンテンツ フィルターの構成を確認する
  3. 選択したフィルターで注釈が有効になっていることを確認する
  4. 構成手順については 、Guardrail の注釈に関するドキュメント を確認してください

非同期フィルター モードでの遅延フィルタリング信号

現象: フィルター処理する必要があるコンテンツは、さかのぼってフラグが設定される前に短時間表示されます。

原因: これは非同期フィルター モードでの予期される動作です。 フィルター処理は、約 1,000 文字以内の保証されたシグナルで非同期的に実行されます。

解決方法:

  1. これは非同期フィルター モード用に設計されているとおりに動作します
  2. 遅延フィルター信号を受信したときにクライアント側のコンテンツの編集を実装する
  3. check_offset値を監視してモデレーションの進行状況を追跡する
  4. ユース ケースに即時フィルター処理が必要な場合は、既定のストリーミング モードの使用を検討してください

content_filter_offsetsの理解について

症状: check_offsetstart_offsetend_offset の値を解釈する方法が不明です。

説明:

  • check_offset: コンテンツが完全にモデレートされたまでの文字位置 (減少しない)
  • start_offset: この注釈が適用されるテキスト範囲の先頭
  • end_offset: この注釈が適用されるテキスト範囲の末尾

すべてのオフセットは、プロンプトの先頭を 0 とする文字の位置を示します。

次のステップ