Streaming di contenuti

Questa guida confronta il filtro predefinito e asincrono per lo streaming di completamenti della chat. Filtro asincrono restituisce i token generati prima che i risultati del filtro contenuto corrispondenti siano disponibili, anziché attendere la valutazione del contenuto memorizzato nel buffer.

Nota

La configurazione del filtro asincrono richiede l'autorizzazione per modificare i criteri di filtro del contenuto nel portale di Foundry.

Scegliere la modalità di streaming corretta

Usare lo streaming predefinito quando:

  • Il contenuto deve essere valutato prima che l'applicazione lo visualizzi.
  • L'applicazione non può gestire segnali di filtro ritardati o rimuovere il contenuto dopo averlo visualizzato.

Usare il filtro asincrono quando:

  • Una minore latenza di streaming è importante per l'applicazione.
  • L'applicazione utilizza annotazioni ritardate e segnali di filtro.
  • L'applicazione può interrompere la visualizzazione del contenuto e rimuovere o sostituire il contenuto già visualizzato quando arriva un segnale di filtro.
  • È stato valutato il rischio che il contenuto che viola i criteri possa essere visualizzato prima dell'arrivo del segnale di filtro e sono state implementate misure di mitigazione aggiuntive appropriate per l'applicazione.

Comportamento di filtro predefinito

Il sistema di protezione del contenuto è integrato e abilitato per impostazione predefinita per tutti i clienti. Con il flusso predefinito di Chat Completions, il contenuto di completamento viene memorizzato nel buffer e valutato dal sistema di guardrail del contenuto. A seconda della configurazione della guardrail, il contenuto memorizzato nel buffer viene restituito se non viola i criteri di protezione o viene bloccato e viene restituito un errore di protezione. Questo processo viene ripetuto fino alla fine del flusso. Il contenuto viene valutato rispetto ai criteri di protezione prima che venga restituito all'applicazione, quindi arriva in blocchi di contenuto memorizzati nel buffer anziché token per token.

Nota

L'ultimo segmento di una risposta trasmessa potrebbe essere restituito prima dell'applicazione della policy di guardrail. Nei test con un elenco di blocchi personalizzato (blocco, applicato ai completamenti) in una distribuzione gpt-4o, un termine nell'elenco di blocco in circa le ultime 15-30 parole di una risposta trasmessa è stato restituito al client con finish_reason: "stop". La stessa risposta è stata bloccata quando stream era impostato su false e bloccata durante lo streaming quando il termine era seguito da altro testo. Se l'applicazione non può tollerare contenuti che violano i criteri che raggiungono il client, usare richieste non di streaming o applicare un filtro personalizzato al segmento finale del flusso.

Filtro asincrono per i completamenti della chat

Con il filtro asincrono, i filtri di contenuto vengono eseguiti in modo asincrono e il contenuto di completamento viene restituito token per token senza buffering per il filtro del contenuto. Questo approccio rimuove la latenza di filtro del contenuto dal recapito dei token, ma ritarda i risultati del filtro e i segnali di violazione dei criteri.

I clienti devono comprendere che, mentre la funzionalità migliora la latenza, si tratta di un compromesso rispetto alla sicurezza e al controllo in tempo reale di sezioni più piccole dell'output del modello. Poiché i filtri di contenuto vengono eseguiti in modo asincrono, i messaggi di moderazione del contenuto e i segnali di violazione dei criteri vengono ritardati, il che significa che alcune sezioni di contenuto dannoso che altrimenti sarebbero state filtrate immediatamente potrebbero essere visualizzate all'utente.

Annotazioni: durante il flusso vengono restituite annotazioni di Chat Completions e messaggi di moderazione del contenuto. Utilizzare questi messaggi nell'applicazione e implementare il comportamento per i segnali ritardati, ad esempio arrestare la visualizzazione del contenuto e rimuovere o sostituire il contenuto già visualizzato.

Segnale di filtro del contenuto: il segnale di errore di filtro del contenuto viene ritardato. Se si verifica una violazione dei criteri, viene restituita non appena è disponibile e il flusso si arresta. Il segnale di filtro del contenuto è garantito all'interno di una finestra di circa 1.000 caratteri del contenuto che viola i criteri.

Impegno per il copyright del cliente: il contenuto contrassegnato retroattivamente come materiale protetto potrebbe non essere idoneo per la copertura dell'impegno per il copyright del cliente.

Considerazioni sul costo

Importante

Fatturazione per il filtraggio dei contenuti in streaming

Quando il filtro del contenuto viene attivato durante lo streaming, gli addebiti si applicano sia per i token di richiesta che per i token di completamento:

  • Stato 400 (richiesta filtrata): addebito per la valutazione della richiesta
  • Stato 200 con finish_reason: "content_filter": addebito per i token di richiesta e per i token di completamento generati prima del filtro

Questo vale sia per le modalità default che per il filtro asincrono. Per dettagli, vedere prezzi di Azure OpenAI.

Per abilitare il Filtro asincrono nel Microsoft Foundry portal, seguire la guida pratica su come utilizzare il filtro dei contenuti per creare una nuova configurazione di filtro del contenuto, e selezionare Filtro asincrono nella sezione Streaming.

Nota

Il filtro asincrono è disponibile nell'API versione 2024-02-01 e successive. Usare OpenAI Python SDK v1.0+ o Azure OpenAI SDK con versioni API compatibili.

Confronto tra le modalità di filtro del contenuto

Confrontare Streaming - Impostazione predefinita Streaming - Filtro asincrono
Stato GA GA
Ammissibilità Tutti i clienti Tutti i clienti
Come abilitare Abilitato per impostazione predefinita, nessuna azione necessaria I clienti possono configurarlo direttamente nel portale foundry (come parte di una configurazione di filtro del contenuto, applicata a livello di distribuzione)
Modalità e disponibilità Testo; tutti i modelli GPT Testo; tutti i modelli GPT
Esperienza di streaming Il contenuto viene memorizzato nel buffer e restituito in blocchi Latenza zero (nessun buffering, i filtri vengono eseguiti in modo asincrono)
Segnale di filtro del contenuto Segnale di filtro immediato Segnale di filtro ritardato (fino a ~1.000 caratteri per blocco)
Configurazioni di filtro del contenuto Supporta l'impostazione predefinita e qualsiasi impostazione di filtro definita dal cliente (inclusi i modelli facoltativi) Supporta l'impostazione predefinita e qualsiasi impostazione di filtro definita dal cliente (inclusi i modelli facoltativi)

annotazioni e risposte di esempio di Chat Completions

Messaggio di annotazione prompt

Questo messaggio corrisponde alle annotazioni predefinite.

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

Messaggio del token di completamento

I messaggi di completamento vengono inoltrati immediatamente. Il servizio non esegue la moderazione né fornisce inizialmente annotazioni.

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 
} 

Messaggio di annotazione

Il campo di testo è sempre una stringa vuota, che indica che non sono presenti nuovi token. Le annotazioni si applicano solo ai token già inviati. Più messaggi di annotazione possono fare riferimento agli stessi token.

"start_offset" e "end_offset" sono offset di granularità bassa nel testo (con 0 all'inizio della richiesta) che contrassegnano il testo a cui si applica l'annotazione.

"check_offset" mostra la quantità di testo completamente moderata. Si tratta di un vincolo inferiore esclusivo sui valori "end_offset" delle annotazioni future. Non diminuisce mai.

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 
} 

Spiegazione dei campi chiave:

  • check_offset: posizione del carattere fino a cui il contenuto è stato completamente moderato (non diminuisce mai)
  • start_offset: posizione iniziale del carattere in cui viene avviato questo batch di annotazioni
  • end_offset: posizione del carattere finale in cui termina il batch di annotazione

Tutti gli offset vengono calcolati a partire da 0 all'inizio del testo originale del prompt.

Flusso di risposta di esempio (passa filtri)

L'esempio seguente mostra una risposta di completamento della chat reale che usa il filtro asincrono. Le annotazioni dei prompt non cambiano, i token di completamento vengono inviati senza annotazioni e i nuovi messaggi di annotazione vengono inviati senza token. Questi nuovi messaggi di annotazione vengono invece collegati a determinati offset di filtro contenuto.

{"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] 

Flusso di risposta di esempio (bloccato dai filtri)

{"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] 

Risoluzione dei problemi

Il flusso si interrompe con il motivo content_filter

Sintomo: il flusso termina in modo imprevisto con finish_reason: "content_filter".

Causa: il contenuto generato dal modello ha violato i criteri di filtro del contenuto. In modalità filtro asincrono questo segnale può arrivare dopo che è già stato visualizzato un contenuto.

Risoluzione:

  1. Controllare l'ultimo blocco content_filter_results per identificare quale categoria ha attivato il filtro (odio, violenza, contenuto sessuale, autolesionismo, materiale protetto)
  2. Se si usa il filtro asincrono, implementare la redazione del contenuto nella propria applicazione per rimuovere il contenuto che è già stato visualizzato.
  3. Esaminare la configurazione del filtro del contenuto nel portale di Foundry per regolare le soglie di gravità, se appropriato
  4. Prendere in considerazione la riformulazione del prompt per evitare l'attivazione di filtri

Annotazioni non visualizzate nel flusso

Sintomo: il flusso viene completato correttamente, ma content_filter_results è sempre vuoto o null.

Causa: le annotazioni di filtro del contenuto potrebbero non essere abilitate per la distribuzione o si usa una versione dell'API che non supporta le annotazioni.

Risoluzione:

  1. Verificare di usare l'API versione 2024-02-01 o successiva
  2. Controllare la configurazione del filtro del contenuto nel portale di Foundry
  3. Verificare che le annotazioni siano abilitate per i filtri selezionati
  4. Consultare la documentazione relativa alle annotazioni Guardrail per i passaggi di configurazione

Segnali di filtro ritardato in modalità filtro asincrono

Sintomo: il contenuto che deve essere filtrato viene visualizzato brevemente prima di essere contrassegnato retroattivamente.

Causa: si tratta di un comportamento previsto in modalità filtro asincrono. Il filtro viene eseguito in modo asincrono con un segnale garantito entro circa 1.000 caratteri.

Risoluzione:

  1. Funziona come progettato per la modalità filtro asincrono
  2. Implementare la redazione del contenuto lato client quando si ricevono segnali di filtro ritardati
  3. Monitorare i check_offset valori per tenere traccia dello stato di avanzamento della moderazione
  4. Prendere in considerazione l'uso della modalità di streaming predefinita se è necessario applicare filtri immediati per il caso d'uso

Comprendere content_filter_offsets

Sintomo: non chiaro come interpretare check_offseti valori , start_offsete end_offset .

Spiegazione:

  • check_offset: posizione del carattere fino a cui il contenuto è stato completamente moderato (non diminuisce mai)
  • start_offset: inizio dell'intervallo di testo a cui si applica questa annotazione
  • end_offset: fine dell'intervallo di testo a cui si applica questa annotazione

Tutti gli offset sono posizioni di caratteri con 0 all'inizio della richiesta.

Passaggi successivi