Share via


Ajuste y llamada a funciones

Los modelos que usan la API de finalizaciones de chat admiten llamadas a funciones. Desafortunadamente, las funciones definidas en las llamadas de finalización del chat no siempre funcionan según lo previsto. Ajustar el modelo con ejemplos de llamadas a funciones puede mejorar la salida del modelo al permitirle:

  • Obtener respuestas con formato similar incluso cuando la definición de función completa no esté presente. (Esto le permite ahorrar dinero en los tokens de solicitud).
  • Obtener salidas más precisas y coherentes.

Importante

Los parámetros functions y function_call han quedado en desuso con la versión de 2023-12-01-preview de la API. Sin embargo, la API de ajuste requiere actualmente el uso de los parámetros heredados.

Construcción de un archivo de entrenamiento

Al construir un archivo de entrenamiento de ejemplos de llamadas a funciones, tomaría una definición de función como esta:

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

Y exprese la información como una sola línea dentro del archivo de entrenamiento .jsonl como se indica a continuación:

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

Al igual que con todo el entrenamiento de ajuste, el archivo de ejemplo requiere al menos 10 ejemplos.

Optimizar el costo

OpenAI recomienda que si intenta optimizar para usar menos tokens de solicitud después de ajustar el modelo en las definiciones de función completas, puede experimentar con:

  • Omitir descripciones de función y parámetros: quite el campo description de la función y los parámetros.
  • Omitir parámetros: quite todo el campo de propiedades del objeto parameters.
  • Omitir la función por completo: quite todo el objeto de función de la matriz de funciones.

Optimización para la calidad

Como alternativa, si está intentando mejorar la calidad de la salida de la llamada a funciones, se recomienda que las definiciones de función presentes en el conjunto de datos de entrenamiento de ajuste y las llamadas posteriores de finalización del chat sigan siendo idénticas.

Personalización de las respuestas del modelo a las salidas de función

El ajuste basado en ejemplos de llamadas a funciones también se puede usar para mejorar la respuesta del modelo a las salidas de función. Para ello, se incluyen ejemplos consistentes en mensajes de respuesta de la función y mensajes de respuesta del asistente en los que la respuesta de la función se interpreta y contextualiza por el asistente.

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

Al igual que con el ejemplo anterior, este ejemplo se expande artificialmente para mejorar la legibilidad. La entrada real en el archivo de entrenamiento .jsonl sería una sola línea:

{"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": []}

Pasos siguientes