Ottimizzazione e chiamata di funzioni

I modelli che usano l'API di completamento della chat supportano la chiamata di funzioni. Sfortunatamente, le funzioni definite nelle chiamate di completamento della chat non sempre vengono eseguite come previsto. L'ottimizzazione del modello con esempi di chiamata di funzioni può migliorare l'output del modello consentendo di:

  • Ottenere risposte formattate in modo analogo anche quando la definizione completa della funzione non è presente. (Consentendo di risparmiare denaro sui token di richiesta.)
  • Ottenere output più accurati e coerenti.

Importante

I parametri functions e function_call sono stati deprecati con il rilascio della versione 2023-12-01-preview dell'API. Tuttavia, l'API di ottimizzazione richiede attualmente l'uso dei parametri legacy.

Creazione di un file di training

Quando si crea un file di training di esempi di chiamata di funzione, si accetta una definizione di funzione simile alla seguente:

{
    "messages": [
        {"role": "user", "content": "What is the weather in San Francisco?"},
        {"role": "assistant", "function_call": {"name": "get_current_weather", "arguments": "{\"location\": \"San Francisco, USA\", \"format\": \"celsius\"}"}
    ],
    "functions": [{
        "name": "get_current_weather",
        "description": "Get the current weather",
        "parameters": {
            "type": "object",
            "properties": {
                "location": {"type": "string", "description": "The city and country, eg. San Francisco, USA"},
                "format": {"type": "string", "enum": ["celsius", "fahrenheit"]}
            },
            "required": ["location", "format"]
        }
    }]
}

Ed esprimere le informazioni come una singola riga all'interno del file di training .jsonl come indicato di seguito:

{"messages": [{"role": "user", "content": "What is the weather in San Francisco?"}, {"role": "assistant", "function_call": {"name": "get_current_weather", "arguments": "{\"location\": \"San Francisco, USA\", \"format\": \"celsius\"}"}}], "functions": [{"name": "get_current_weather", "description": "Get the current weather", "parameters": {"type": "object", "properties": {"location": {"type": "string", "description": "The city and country, eg. San Francisco, USA"}, "format": {"type": "string", "enum": ["celsius", "fahrenheit"]}}, "required": ["location", "format"]}}]}

Come per tutti i training di ottimizzazione, il file di esempio richiede almeno 10 esempi.

Ottimizzare in base ai costi

OpenAI raccomanda che se si sta provando a ottimizzare per usare un minor numero di token di richiesta dopo l'ottimizzazione del modello nelle definizioni di funzione complete è possibile sperimentare:

  • Omettere le descrizioni di funzioni e parametri: rimuovere il campo di descrizione dalla funzione e dai parametri.
  • Omettere i parametri: rimuovere l'intero campo delle proprietà dall'oggetto parametri.
  • Omettere completamente la funzione: rimuovere l'intero oggetto funzione dalla matrice di funzioni.

Ottimizzare per la qualità

In alternativa, se si sta tentando di migliorare la qualità dell'output delle chiamate di funzione, è consigliabile che le definizioni di funzione presenti nel set di dati di training di ottimizzazione e le chiamate di completamento della chat successive rimangano identiche.

Personalizzare le risposte del modello agli output delle funzioni

L'ottimizzazione basata sugli esempi di chiamata di funzioni può essere usata anche per migliorare la risposta del modello agli output delle funzioni. A tale scopo, includere esempi costituiti da messaggi di risposta della funzione e messaggi di risposta dell'assistente in cui la risposta della funzione viene interpretata e inserita nel contesto dall'assistente.

{
    "messages": [
        {"role": "user", "content": "What is the weather in San Francisco?"},
        {"role": "assistant", "function_call": {"name": "get_current_weather", "arguments": "{\"location\": \"San Francisco, USA\", \"format\": \"celcius\"}"}}
        {"role": "function", "name": "get_current_weather", "content": "21.0"},
        {"role": "assistant", "content": "It is 21 degrees celsius in San Francisco, CA"}
    ],
    "functions": [...] // same as before
}

Come nell'esempio precedente, questo esempio viene espanso artificialmente per la leggibilità. La voce effettiva nel file di training .jsonl sarà una singola riga:

{"messages": [{"role": "user", "content": "What is the weather in San Francisco?"}, {"role": "assistant", "function_call": {"name": "get_current_weather", "arguments": "{\"location\": \"San Francisco, USA\", \"format\": \"celcius\"}"}}, {"role": "function", "name": "get_current_weather", "content": "21.0"}, {"role": "assistant", "content": "It is 21 degrees celsius in San Francisco, CA"}], "functions": []}

Passaggi successivi