Informazioni su come usare l'output riproducibile (anteprima)

Per impostazione predefinita, se si chiede a un modello di completamento della chat Azure OpenAI la stessa domanda più volte, è probabile che si ottenga una risposta diversa. Le risposte sono quindi considerate non deterministiche. L'output riproducibile è una nuova funzionalità di anteprima che consente di modificare in modo selettivo il comportamento predefinito per contribuire a produrre output più deterministici.

Supporto dell'output riproducibile

L'output riproducibile è attualmente supportato solo con i seguenti elementi:

Modelli supportati

  • gpt-35-turbo (1106)
  • gpt-35-turbo (0125)
  • gpt-4 (1106-anteprima)
  • gpt-4 (0125-anteprima)
  • gpt-4 (turbo-2024-04-09)
  • gpt-4o (2024-05-13)

Consultare la pagina dei modelli per informazioni aggiornate sulla disponibilità a livello di area del modello.

Versione dell'API

Il supporto per l'output riproducibile è stato aggiunto per la prima volta nella versione dell'API 2023-12-01-preview

Esempio

Prima di tutto, verranno generate tre risposte alla stessa domanda per dimostrare la variabilità comune alle risposte di completamento della chat anche quando altri parametri sono uguali:

import os
from openai import AzureOpenAI

client = AzureOpenAI(
  azure_endpoint = os.getenv("AZURE_OPENAI_ENDPOINT"), 
  api_key=os.getenv("AZURE_OPENAI_API_KEY"),  
  api_version="2024-02-01"
)

for i in range(3):
  print(f'Story Version {i + 1}\n---')
    
  response = client.chat.completions.create(
    model="gpt-35-turbo-0125", # Model = should match the deployment name you chose for your 0125-preview model deployment
    #seed=42,
    temperature=0.7,
    max_tokens =50, 
    messages=[
      {"role": "system", "content": "You are a helpful assistant."},
      {"role": "user", "content": "Tell me a story about how the universe began?"}
    ]
  )
  
  print(response.choices[0].message.content)
  print("---\n")
  
  del response

Output

Story Version 1
---
Once upon a time, before there was time, there was nothing but a vast emptiness. In this emptiness, there existed a tiny, infinitely dense point of energy. This point contained all the potential for the universe as we know it. And
---

Story Version 2
---
Once upon a time, long before the existence of time itself, there was nothing but darkness and silence. The universe lay dormant, a vast expanse of emptiness waiting to be awakened. And then, in a moment that defies comprehension, there
---

Story Version 3
---
Once upon a time, before time even existed, there was nothing but darkness and stillness. In this vast emptiness, there was a tiny speck of unimaginable energy and potential. This speck held within it all the elements that would come

Si noti che, mentre ogni storia potrebbe avere elementi simili e una ripetizione verbatim, più la risposta va avanti più tendono a divergere.

A questo punto, si eseguirà lo stesso codice di prima, ma questa volta viene rimosso il commento dalla riga per il parametro che indica seed=42

import os
from openai import AzureOpenAI

client = AzureOpenAI(
  azure_endpoint = os.getenv("AZURE_OPENAI_ENDPOINT"), 
  api_key=os.getenv("AZURE_OPENAI_API_KEY"),  
  api_version="2024-02-01"
)

for i in range(3):
  print(f'Story Version {i + 1}\n---')
    
  response = client.chat.completions.create(
    model="gpt-35-turbo-0125", # Model = should match the deployment name you chose for your 0125-preview model deployment
    seed=42,
    temperature=0.7,
    max_tokens =50, 
    messages=[
      {"role": "system", "content": "You are a helpful assistant."},
      {"role": "user", "content": "Tell me a story about how the universe began?"}
    ]
  )
  
  print(response.choices[0].message.content)
  print("---\n")
  
  del response

Output

Story Version 1
---
In the beginning, there was nothing but darkness and silence. Then, suddenly, a tiny point of light appeared. This point of light contained all the energy and matter that would eventually form the entire universe. With a massive explosion known as the Big Bang
---

Story Version 2
---
In the beginning, there was nothing but darkness and silence. Then, suddenly, a tiny point of light appeared. This point of light contained all the energy and matter that would eventually form the entire universe. With a massive explosion known as the Big Bang
---

Story Version 3
---
In the beginning, there was nothing but darkness and silence. Then, suddenly, a tiny point of light appeared. This was the moment when the universe was born.

The point of light began to expand rapidly, creating space and time as it grew.
---

Usando lo stesso parametro seed di 42 per ognuna delle tre richieste, mantenendo allo stesso tempo tutti gli altri parametri, è possibile ottenere risultati molto più coerenti.

Importante

Il determinismo non è garantito con output riproducibile. Anche nei casi in cui il parametro di inizializzazione e system_fingerprint sono uguali nelle chiamate API, non è attualmente insolito osservare ancora un grado di variabilità nelle risposte. Le chiamate API identiche con valori max_tokens maggiori, in genere generano risposte meno deterministiche anche quando viene impostato il parametro di inizializzazione.

Dettagli del parametro

seed è un parametro opzionale, che può essere impostato su un numero intero o null.

Questa funzionalità è in anteprima. Se specificato, il nostro sistema esegue un'operazione ottimale per campionare in modo deterministico, in modo che le richieste ripetute con gli stessi seed e gli stessi parametri restituiscano lo stesso risultato. Il determinismo non è garantito ed è necessario fare riferimento al parametro di risposta system_fingerprint per monitorare le modifiche nel back-end.

system_fingerprint è una stringa e fa parte dell'oggetto di completamento della chat.

Questa impronta digitale rappresenta la configurazione back-end con cui viene eseguito il modello.

Può essere usato con il parametro di richiesta seed per comprendere quando sono state apportate modifiche back-end che potrebbero influire sul determinismo.

Per visualizzare l'oggetto di completamento della chat completo con system_fingerprint, è possibile aggiungere print(response.model_dump_json(indent=2)) al codice Python precedente accanto all'istruzione di stampa esistente o $response | convertto-json -depth 5 alla fine dell'esempio di PowerShell. Questa modifica comporta l'inserimento delle informazioni aggiuntive seguenti nell'output:

Output

{
  "id": "chatcmpl-8LmLRatZxp8wsx07KGLKQF0b8Zez3",
  "choices": [
    {
      "finish_reason": "length",
      "index": 0,
      "message": {
        "content": "In the beginning, there was nothing but a vast emptiness, a void without form or substance. Then, from this nothingness, a singular event occurred that would change the course of existence forever—The Big Bang.\n\nAround 13.8 billion years ago, an infinitely hot and dense point, no larger than a single atom, began to expand at an inconceivable speed. This was the birth of our universe, a moment where time and space came into being. As this primordial fireball grew, it cooled, and the fundamental forces that govern the cosmos—gravity, electromagnetism, and the strong and weak nuclear forces—began to take shape.\n\nMatter coalesced into the simplest elements, hydrogen and helium, which later formed vast clouds in the expanding universe. These clouds, driven by the force of gravity, began to collapse in on themselves, creating the first stars. The stars were crucibles of nuclear fusion, forging heavier elements like carbon, nitrogen, and oxygen",
        "role": "assistant",
        "function_call": null,
        "tool_calls": 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"
        }
      }
    }
  ],
  "created": 1700201417,
  "model": "gpt-4",
  "object": "chat.completion",
  "system_fingerprint": "fp_50a4261de5",
  "usage": {
    "completion_tokens": 200,
    "prompt_tokens": 27,
    "total_tokens": 227
  },
  "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"
        }
      }
    }
  ]
}

Considerazioni aggiuntive

Quando si vogliono usare output riproducibili, è necessario impostare seed con lo stesso numero intero tra le chiamate di completamento della chat. È anche consigliabile trovare la corrispondenza con qualsiasi altro parametro, ad esempio temperature, max_tokens e così via.