Partager via


Appel de fonction sur Azure Databricks

Important

Cette fonctionnalité est disponible en préversion publique et est prise en charge uniquement sur les points de terminaison de paiement par jeton des API Foundation Model.

Cet article décrit l’appel de fonction et comment l’utiliser dans le cadre des flux de travail de votre application d’IA générative. L’appel de fonction Databricks compatible avec OpenAI n’est disponible que pendant la mise en service du modèle dans le cadre des API du modèle de base.

Qu’est-ce que l’appel de fonction

L’appel de fonction vous permet de contrôler la sortie des grands modèles de langage (LLM, Large Language Model) , afin qu’ils génèrent des réponses structurées de manière plus fiable. Lorsque vous utilisez un appel de fonction, vous décrivez les fonctions dans l’appel d’API en décrivant les arguments de la fonction à l’aide d’un schéma JSON. Le LLM lui-même n’appelle pas ces fonctions, mais il crée plutôt un objet JSON que les utilisateurs peuvent employer pour appeler les fonctions dans leur code.

Pour l’appel de fonction sur Databricks, la séquence de base des étapes est la suivante :

  1. Appelez le modèle en utilisant la requête soumise et un ensemble de fonctions définies dans le paramètre tools.
  2. Le modèle détermine s’il faut appeler ou non les fonctions définies. Lorsque la fonction est appelée, le contenu est un objet JSON de chaînes qui adhère à votre schéma personnalisé.
  3. Analysez les chaînes en JSON dans votre code et appelez votre fonction avec les arguments fournis s’ils existent.
  4. Appelez à nouveau le modèle en ajoutant la réponse structurée en tant que nouveau message. La structure de la réponse est définie par les fonctions que vous avez précédemment fournies dans tools. À partir de là, le modèle récapitule les résultats et envoie ce résumé à l’utilisateur.

Quand utiliser l’appel de fonction

Voici des exemples d’utilisation de l’appel de fonction :

  • Créer des assistants capables de répondre aux questions en appelant d’autres API. Par exemple, vous pouvez définir des fonctions telles que send_email(to: string, body: string) ou current_weather(location: string, unit: 'celsius' | 'fahrenheit').
  • Définir et utiliser des appels d’API basés sur le langage naturel. Comme prendre l’énoncé, « Qui sont mes meilleurs clients ? » et en faire un appel d’API nommé get_customers(min_revenue: int, created_before: string, limit: int) et appeler cette API.
  • Convertir des données non structurées en données structurées. Comme l’identification et la classification des commentaires des avis sur les produits comme négatives, positives ou neutres.

Modèles pris en charge

L’appel de fonction sur Databricks prend en charge les modèles d’API de modèle de fondation payants par jeton suivants :

Important

DBRX est fourni sous la licence Databricks Open Model, Copyright © Databricks, Inc. Tous droits réservés. Les clients sont responsables de la conformité aux licences de modèles applicables, notamment aux règles de bon usage Databricks.

Llama 3 est concédé sous licence de la communauté LLAMA 3, Copyright © Meta Platforms, Inc. Tous droits réservés. Les clients sont tenus de d’assurer de leur conformité vis-à-vis des licences de modèle applicables.

Utilisation de l’appel de fonction

Pour utiliser l’appel de fonction avec votre application d’IA générative, vous devez fournir les parameters de fonction et une description.

Le comportement par défaut pour tool_choice est "auto". Cela permet au modèle de décider quelles fonctions appeler et s’il doit les appeler.

Vous pouvez personnaliser le comportement par défaut en fonction de votre cas d’utilisation. Les options suivantes vous sont proposées :

  • Définissez tool_choice: "required". Dans ce scénario, le modèle appelle toujours une ou plusieurs fonctions. Le modèle sélectionne quelle fonction ou quelles fonctions appeler.
  • Définissez tool_choice: {"type": "function", "function": {"name": "my_function"}}. Dans ce scénario, le modèle appelle uniquement une fonction spécifique.
  • Définissez tool_choice: "none" pour désactiver l’appel de fonction et faire en sorte que le modèle génère uniquement un message destiné à l’utilisateur.

L’exemple suivant est un exemple à tour unique utilisant le Kit de développement logiciel (SDK, Software Development Kit) d’OpenAI et son paramètre tools. Pour plus d’informations sur la syntaxe, veuillez consulter Tâche de conversation.

Important

Pendant la Préversion publique, l’appel de fonction sur Databricks est optimisé pour l’appel de fonction à tour unique.

import os
import json
from openai import OpenAI

DATABRICKS_TOKEN = os.environ.get('YOUR_DATABRICKS_TOKEN')
DATABRICKS_BASE_URL = os.environ.get('YOUR_DATABRICKS_BASE_URL')

client = OpenAI(
  api_key=DATABRICKS_TOKEN,
  base_url=DATABRICKS_BASE_URL
  )

tools = [
  {
    "type": "function",
    "function": {
      "name": "get_current_weather",
      "description": "Get the current weather in a given location",
      "parameters": {
        "type": "object",
        "properties": {
          "location": {
            "type": "string",
            "description": "The city and state, e.g. San Francisco, CA"
          },
          "unit": {
            "type": "string",
            "enum": [
              "celsius",
              "fahrenheit"
            ]
          }
        }
      }
    }
  }
]

messages = [{"role": "user", "content": "What is the current temperature of Chicago?"}]

response = client.chat.completions.create(
    model="databricks-meta-llama-3-70b-instruct",
    messages=messages,
    tools=tools,
    tool_choice="auto",
)

print(json.dumps(response.choices[0].message.model_dump()['tool_calls'], indent=2))

Schéma JSON

Les API du modèle de base prennent largement en charge les définitions de fonctions acceptées par OpenAI. Cependant, l’utilisation d’un schéma JSON plus simple pour les définitions d’appels de fonction entraîne une génération JSON d’appel de fonction de qualité supérieure. Pour promouvoir une génération de qualité supérieure, les API du modèle de base ne prennent en charge qu’un sous-ensemble des spécifications du schéma JSON.

Les clés de définition d’appel de fonction suivantes ne sont pas prises en charge :

  • Expressions régulières utilisant pattern.
  • Composition et validation complexes imbriquées ou de schéma à l’aide de : anyOf, oneOf, allOf, prefixItems ou $ref.
  • Listes de types à l’exception du cas spécial de [type, “null”] où un type dans la liste est un type JSON valide et l’autre est "null"

Par ailleurs, les limites suivantes s’appliquent :

  • Le nombre maximal de clés spécifié dans le schéma JSON est de 16.
  • Les API du model de base n’imposent pas de contraintes de longueur ou de taille pour les objets et les tableaux.
    • Cela inclut des mots clés tels que maxProperties, minProperties et maxLength.
  • Les schémas JSON fortement imbriqués entraîneront une génération de qualité inférieure. Si possible, essayez d’aplatir le schéma JSON pour obtenir de meilleurs résultats.

Utilisation d’un jeton

L’injection de prompt et d’autres techniques sont utilisées pour améliorer la qualité des appels d’outils. Cela a un impact sur le nombre de jetons d’entrée et de sortie consommés par le modèle, ce qui entraîne des implications de facturation. Plus vous utilisez d’outils, plus vos jetons d’entrée augmentent.

Limites

Les limitations suivantes s’appliquent à l’appel de fonctions pendant la Préversion publique :

  • L’appel de fonction n’est pas pris en charge sur les points de terminaison de débit approvisionnés des API Foundation Model.
  • La solution d’appel de fonction actuelle est optimisée pour les appels de fonction à tour unique. L’appel de fonction à plusieurs tours est pris en charge pendant la préversion, mais est en cours de développement.
  • L’appel de fonction parallèle n’est pas pris en charge.
  • Le nombre maximal de fonctions pouvant être définies dans tools est de 32 fonctions.

Exemple de notebook

Consultez le bloc-notes suivant pour des exemples détaillés d’appel de fonctions

Bloc-notes d’exemple d’appel de fonction

Obtenir le notebook