Partager via


Meilleures pratiques pour la compréhension du langage courant

Utilisez les instructions suivantes pour créer les meilleurs projets possibles dans la compréhension du langage conversationnel.

Choisir un schéma cohérent

Le schéma est la définition de vos intentions et entités. Vous pouvez suivre différentes approches pour définir ce que vous devez créer comme intention et ce que vous devez créer comme entité. Posez-vous ces questions :

  • Quelles actions ou requêtes essayez-vous de capturer à partir de mon utilisateur ?
  • Quelles informations sont pertinentes pour chaque action ?

Vous pouvez généralement considérer les actions et les requêtes comme des intentions, tandis que les informations requises pour répondre à ces requêtes sont des entités.

Par exemple, supposons que vos clients annulent les abonnements pour différents produits que vous proposez via votre chatbot. Vous pouvez créer une intention annuler avec différents exemples tels que « Annule le service Contoso » ou « Arrête de me facturer pour l’abonnement Fabrikam ». L’intention de l’utilisateur ici est d’annuler, et le service Contoso ou l’abonnement Fabrikam sont les abonnements qu’il souhaite annuler.

Pour continuer, vous créez une entité pour les abonnements. Vous pouvez ensuite modéliser l’intégralité de votre projet pour capturer des actions comme intentions et utiliser des entités pour remplir ces actions. Cette approche vous permet d’annuler tout ce que vous définissez comme entité, par exemple d’autres produits. Vous pouvez ensuite avoir des intentions d’inscription, de renouvellement et de mise à niveau qui utilisent toutes les abonnements et d’autres entités.

La conception de schéma précédente vous permet d’étendre facilement les fonctionnalités existantes (annulation, mise à niveau ou inscription) aux nouvelles cibles en créant une entité.

Une autre approche consiste à modéliser les informations comme intentions et les actions comme entités. Prenons le même exemple qui permet à vos clients d’annuler des abonnements via votre chatbot.

Vous pouvez créer une intention pour chaque abonnement disponible, par exemple Contoso avec des énoncés tels que « Annule Contoso », « Arrête de me facturer pour des services Contoso » et « Annule l’abonnement Contoso ». Vous créez ensuite une entité pour capturer l’action annuler. Vous pouvez définir différentes entités pour chaque action ou consolider des actions en tant qu’entité avec un composant de liste pour différencier les actions avec différentes clés.

Cette conception de schéma vous permet d’étendre facilement de nouvelles actions aux cibles existantes en ajoutant de nouvelles entités d’action ou composants d’entité.

Veillez à ne pas essayer de canaliser tous les concepts dans des intentions. Par exemple, n’essayez pas de créer une intention Annule Contoso qui n’a pour objectif que cette action spécifique. Les intentions et les entités doivent fonctionner ensemble pour capturer toutes les informations requises du client.

Vous voudrez également éviter de mélanger différentes conceptions de schéma. Ne développez pas la moitié de votre application avec des actions comme intentions et l’autre moitié avec des informations comme intentions. Pour obtenir les résultats possibles, assurez-vous que votre schéma est cohérent.

Équilibrer les données d’apprentissage

Concernant les données d’apprentissage, essayez de garder votre schéma bien équilibré. Le fait d’inclure de grandes quantités d’une intention et très peu d’autres intentions aboutit à un modèle biaisé en faveur d’intentions particulières.

Pour remédier à ce problème, vous devrez peut-être sous-échantillonner votre jeu d’apprentissage. Vous devrez peut-être aussi l’étendre. Pour sous-échantillonner, vous pouvez :

  • Vous débarrasser de façon aléatoire d’un certain pourcentage des données d’apprentissage.
  • Analyser le jeu de données et supprimer les entrées en double surreprésentées, ce qui est une méthode plus systématique.

Pour étendre le jeu d’apprentissage, dans Language Studio, sous l’onglet Étiquetage des données, sélectionnez Suggérer des énoncés. La compréhension du langage courant envoie un appel à Azure OpenAI pour générer des énoncés similaires.

Capture d’écran montrant une suggestion d’énoncé dans Language Studio.

Vous pouvez également rechercher des « modèles » involontaires dans le jeu d’apprentissage. Par exemple, regardez si le jeu d’apprentissage d’une intention particulière est en minuscules ou commence par une expression particulière. Dans ce cas, le modèle que vous entraînez peut apprendre ces biais involontaires dans le jeu d’apprentissage au lieu de pouvoir généraliser.

Nous vous recommandons d’introduire une diversité de casses et de ponctuations dans le jeu d’apprentissage. Si votre modèle est censé gérer les variations, veillez à disposer d’un jeu d’apprentissage qui reflète également cette diversité. Par exemple, incluez certains énoncés dans une casse conventionnelle et d’autres entièrement en minuscules.

Étiqueter clairement les énoncés

  • Assurez-vous que les concepts auxquels vos entités font référence sont bien définis et séparables. Vérifiez si vous pouvez facilement déterminer les différences de manière fiable. Si ce n’est pas possible, ce manque de distinction peut indiquer que le composant appris aura également des difficultés.

  • En cas de similarité entre les entités, assurez-vous qu’un aspect de vos données signale la différence entre elles.

    Par exemple, si vous avez créé un modèle pour réserver des vols, un utilisateur peut utiliser un énoncé tel que le suivant : « Je veux un vol de Boston à Seattle » La ville d’origine et la ville de destination de ces énoncés sont censées être similaires. Un signal permettant de différencier la ville d’origine peut être le mot de qui la précède souvent.

  • Veillez à étiqueter toutes les instances de chaque entité dans vos données d’apprentissage et de test. Une approche consiste à utiliser la fonction de recherche pour rechercher toutes les instances d’un mot ou d’une expression dans vos données afin de vérifier si elles sont correctement étiquetées.

  • Étiquetez les données de test pour les entités qui n’ont pas de composant appris et pour celles qui en ont un. Cette pratique permet de garantir l’exactitude de vos métriques d’évaluation.

Utiliser l’apprentissage standard avant l’apprentissage avancé

L’apprentissage standard est gratuit et plus rapide que l’apprentissage avancé. Il peut vous aider à comprendre rapidement l’effet de la modification de votre jeu d’apprentissage ou de votre schéma lors de la génération du modèle. Une fois que le schéma vous convient, vous pouvez utiliser la formation avancée pour obtenir la meilleure qualité de modèle.

Utiliser la fonctionnalité d’évaluation

Lorsque vous créez une application, il est souvent utile d’intercepter les erreurs tôt. Il est généralement recommandé d’ajouter un jeu de test lorsque vous générez l’application. Les résultats de l’apprentissage et de l’évaluation sont utiles pour identifier les erreurs ou les problèmes dans votre schéma.

Composants et composition de l’apprentissage automatique

Pour plus d’informations, consultez Types de composants.

Utiliser le seuil de score None

Si vous voyez trop de faux positifs, tels que des énoncés hors contexte marqués comme des intentions valides, consultez Seuil de confiance pour obtenir des informations sur la façon dont il affecte l’inférence.

  • Par définition, les composants d’entité non issus du Machine Learning, comme les listes et les expressions régulières, ne sont pas contextuels. Si vous voyez des entités listes ou expressions régulières à des endroits inattendus, essayez d’étiqueter les synonymes de liste en tant que composant issu de l’apprentissage automatique.
  • Pour les entités, vous pouvez utiliser le composant appris comme composant obligatoire pour limiter le déclenchement d’une entité composée.

Par exemple, supposons que vous disposiez d’une entité appelée Quantité de billets qui tente d’extraire le nombre de billets que vous souhaitez réserver pour des vols, pour des énoncés tels que « Réserve deux billets demain pour Le Caire ».

En temps normal, vous ajoutez un composant prédéfini pour Quantity.Number qui extrait déjà tous les nombres des énoncés. Toutefois, si votre entité a été seulement définie avec le composant prédéfini, elle extrait aussi d’autres nombres dans le cadre de l’entité Quantité de billets, comme « Réserve deux billets demain pour Le Caire à 15 heures. »

Pour résoudre ce problème, vous étiquetez un composant appris dans vos données d’apprentissage pour tous les nombres censés être une quantité de billets. L’entité comporte maintenant deux composants :

  • Le composant prédéfini qui peut interpréter tous les nombres.
  • Le composant appris qui prédit où se trouve la quantité de billets dans une phrase.

Si vous avez besoin du composant appris, vérifiez que la Quantité de billets est retournée uniquement lorsque le composant appris la prédit dans le bon contexte. Si vous avez également besoin du composant prédéfini, vous pouvez alors garantir que l’entité Quantité de billets retournée est à la fois un nombre et à la bonne position.

Résoudre les incohérences d’un modèle

Si votre modèle est trop sensible aux petites modifications grammaticales, comme la casse ou les caractères diacritiques, vous pouvez manipuler systématiquement votre jeu de données directement dans Language Studio. Pour utiliser ces fonctionnalités, sélectionnez l’onglet Paramètres dans le volet de gauche et recherchez la section Paramètres de projet avancés.

Capture d’écran montrant un exemple de paramètres de projet avancés.

Tout d’abord, vous pouvez activer le paramètre Activer la transformation des données pour la casse pour normaliser la casse des énoncés lors de l’apprentissage, du test et de l’implémentation de votre modèle. Si vous avez effectué une migration à partir de LUIS, vous savez peut-être que LUIS effectuait cette normalisation par défaut. Pour accéder à cette fonctionnalité via l’API, définissez le paramètre normalizeCasing sur true. Voir l’exemple suivant :

{
  "projectFileVersion": "2022-10-01-preview",
    ...
    "settings": {
      ...
      "normalizeCasing": true
      ...
    }
...

Deuxièmement, vous pouvez également activer le paramètre Activer l’augmentation des données pour les diacritiques pour générer des variations de vos données d’apprentissage pour les variations diacritiques possibles utilisées dans le langage naturel. Cette fonctionnalité est disponible pour toutes les langues. Elle est particulièrement utile pour les langues germaniques et slaves, où les utilisateurs écrivent souvent des mots en utilisant des caractères anglais classiques au lieu des caractères corrects. Par exemple, l’expression anglaise « Navigate to the sports channel » se traduit en français par « Accédez à la chaîne des sports ». Quand cette fonctionnalité est activée, l’expression « Accedez a la chaine des sports » (sans caractères diacritiques) est également incluse dans le jeu de données d’apprentissage.

Si vous activez cette fonctionnalité, le nombre d’énoncés de votre jeu d’apprentissage augmente. Pour cette raison, vous devrez peut-être ajuster la taille de vos données d’apprentissage en conséquence. Le nombre maximal d’énoncés actuel après l’augmentation est de 25 000. Pour accéder à cette fonctionnalité via l’API, définissez le paramètre augmentDiacritics sur true. Voir l’exemple suivant :

{
  "projectFileVersion": "2022-10-01-preview",
    ...
    "settings": {
      ...
      "augmentDiacritics": true
      ...
    }
...

Résoudre l’excès de confiance d’un modèle

Les clients peuvent utiliser la version de la configuration de formation LoraNorm si le modèle est à tort trop confiant. Un exemple de ce comportement peut être le scénario suivant dans lequel le modèle prédit l’intention incorrecte avec une confiance de 100 %. Ce score rend le paramètre de seuil de confiance du projet inutilisable.

Détails Intention prédite Score de fiabilité
« Qui a construit la Tour Eiffel ? » Sports 1,00
« Est-ce que j’ai l’air bien aujourd’hui ? » QueryWeather 1,00
« J’espère que vous passez une bonne soirée. » Alarm 1,00

Pour résoudre ce problème, utilisez la version de configuration 2023-04-15 qui normalise les scores de confiance. Leparamètre de seuil de confiance du projet peut ensuite être ajusté pour obtenir le résultat souhaité.

curl --location 'https://<your-resource>.cognitiveservices.azure.com/language/authoring/analyze-conversations/projects/<your-project>/:train?api-version=2022-10-01-preview' \
--header 'Ocp-Apim-Subscription-Key: <your subscription key>' \
--header 'Content-Type: application/json' \
--data '{
      "modelLabel": "<modelLabel>",
      "trainingMode": "advanced",
      "trainingConfigVersion": "2023-04-15",
      "evaluationOptions": {
            "kind": "percentage",
            "testingSplitPercentage": 0,
            "trainingSplitPercentage": 100
      }
}

Une fois la requête envoyée, vous pouvez suivre la progression du travail d’apprentissage dans Language Studio comme d’habitude.

Remarque

Vous devez recycler votre modèle après la mise à jour du paramètre de projet confidenceThreshold. Ensuite, vous devez republier l’application pour que le nouveau seuil prenne effet.

Normalisation dans le modèle version 2023-04-15

Avec la version 2023-04-15 du modèle, la compréhension du langage courant fournit une normalisation dans la couche d’inférence qui n’affecte pas l’apprentissage.

La couche de normalisation normalise les scores de confiance de classification dans une plage bornée. La plage sélectionnée est actuellement [-a,a], où « a » est la racine carrée du nombre d’intentions. Par conséquent, la normalisation dépend du nombre d’intentions dans l’application. Si le nombre d’intentions est faible, la couche de normalisation a une faible marge de manœuvre. Avec un grand nombre d’intentions, la normalisation est plus efficace.

Si cette normalisation ne semble pas aider les intentions hors de portée à tel point que le seuil de confiance peut être utilisé pour filtrer les énoncés hors de portée, cela peut être lié au nombre d’intentions dans l’application. Envisagez d’ajouter d’autres intentions à l’application. Ou, si vous utilisez une architecture orchestrée, envisagez de fusionner les applications appartenant au même domaine.

Déboguer des entités composées

Les entités sont des fonctions qui émettent des étendues dans votre entrée avec un type associé. Un ou plusieurs composants définissent la fonction. Vous pouvez marquer les composants en fonction des besoins et décider d’activer le paramètre Combiner les composants ou non. Lorsque vous combinez des composants, toutes les étendues qui se chevauchent sont fusionnées en une seule étendue. Si le paramètre n’est pas utilisé, chaque étendue de composant individuelle est émise.

Pour mieux comprendre les performances des composants individuels, vous pouvez désactiver le paramètre et définir chaque composant sur Non obligatoire. Ce paramètre vous permet d’inspecter les étendues individuelles émises et d’expérimenter la suppression de composants afin que seuls les composants problématiques soient générés.

Évaluer un modèle à l’aide de plusieurs jeux de test

Les données dans un projet de compréhension du langage courant peuvent avoir deux jeux de données : un jeu de test et un jeu d’apprentissage. Si vous souhaitez utiliser plusieurs jeux de test pour évaluer votre modèle, vous pouvez :

  • Attribuer des noms différents à vos jeux de test (par exemple, « test1 » et « test2 »).
  • Exporter votre projet pour obtenir un fichier JSON avec ses paramètres et sa configuration.
  • Utilisez le fichier JSON pour importer un nouveau projet. Renommez votre deuxième jeu de test souhaité « test ».
  • Effectuez l’apprentissage du modèle pour exécuter l’évaluation en utilisant votre deuxième jeu de test.

Paramètres personnalisés pour les applications cibles et les applications enfants

Si vous utilisez des applications orchestrées, vous pouvez envoyer des remplacements de paramètres personnalisés pour différentes applications enfants. Le champ targetProjectParameters permet aux utilisateurs d’envoyer un dictionnaire représentant les paramètres de chaque projet cible. Par exemple, une application orchestrateur nommée Orchestrator orchestrant entre une application de compréhension du langage courant nommée CLU1 et une application de réponse aux questions personnalisée nommée CQA1. Si vous souhaitez envoyer un paramètre nommé « top » à l’application de réponse aux questions, vous pouvez utiliser le paramètre précédent.

curl --request POST \
   --url 'https://<your-language-resource>.cognitiveservices.azure.com/language/:analyze-conversations?api-version=2022-10-01-preview' \
   --header 'ocp-apim-subscription-key: <your subscription key>' \
   --data '{
     "kind": "Conversation",
     "analysisInput": {
         "conversationItem": {
             "id": "1",
             "text": "Turn down the volume",
             "modality": "text",
             "language": "en-us",
             "participantId": "1"
         }
     },
     "parameters": {
         "projectName": "Orchestrator",
         "verbose": true,
         "deploymentName": "std",
         "stringIndexType": "TextElement_V8",
"targetProjectParameters": {
            "CQA1": {
                "targetProjectKind": "QuestionAnswering",
                "callingOptions": {
                    "top": 1
                }
             }
         }
     }
 }'

Copiez des projets à travers des ressources linguistiques

Souvent, vous pouvez copier des projets de compréhension du langage courant d’une ressource vers une autre à l’aide du bouton Copier dans Language Studio. Dans certains cas, il peut être plus facile de copier des projets à l’aide de l’API.

Tout d’abord, identifiez les éléments suivants :

  • Nom du projet source.
  • Nom du projet cible.
  • Ressource de langue source.
  • Ressource de langue cible, à savoir l’endroit où vous souhaitez la copier.

Appelez l’API pour autoriser l’action de copie et obtenez le accessTokens pour l’opération de copie réelle ultérieurement.

curl --request POST \ 
  --url 'https://<target-language-resource>.cognitiveservices.azure.com//language/authoring/analyze-conversations/projects/<source-project-name>/:authorize-copy?api-version=2023-04-15-preview' \ 
  --header 'Content-Type: application/json' \ 
  --header 'Ocp-Apim-Subscription-Key: <Your-Subscription-Key>' \ 
  --data '{"projectKind":"Conversation","allowOverwrite":false}' 

Appelez l’API pour terminer l’opération de copie. Utilisez la réponse que vous avez obtenue précédemment comme charge utile.

curl --request POST \ 
  --url 'https://<source-language-resource>.cognitiveservices.azure.com/language/authoring/analyze-conversations/projects/<source-project-name>/:copy?api-version=2023-04-15-preview' \ 
  --header 'Content-Type: application/json' \ 
  --header 'Ocp-Apim-Subscription-Key: <Your-Subscription-Key>\ 
  --data '{ 
"projectKind": "Conversation", 
"targetProjectName": "<target-project-name>", 
"accessToken": "<access-token>", 
"expiresAt": "<expiry-date>", 
"targetResourceId": "<target-resource-id>", 
"targetResourceRegion": "<target-region>" 
}'

Traiter les énoncés hors domaine

Les clients peuvent utiliser la version récemment mise à jour de la configuration de formation 2024-08-01-preview (précédemment 2024-06-01-preview) si le modèle présente une qualité médiocre pour les énoncés hors domaine. Un exemple de ce scénario avec la configuration de formation par défaut peut ressembler à l’exemple suivant où le modèle a trois intentions : Sports, QueryWeather et Alarm. Les énoncés de test sont des énoncés hors domaine, et le modèle les classifie comme InDomain avec un score de confiance relativement élevé.

Détails Intention prédite Score de fiabilité
« Qui a construit la Tour Eiffel ? » Sports 0,90
« Est-ce que j’ai l’air bien aujourd’hui ? » QueryWeather 1,00
« J’espère que vous passez une bonne soirée. » Alarm 0.80

Pour résoudre ce problème, utilisez la version de configuration 2024-08-01-preview créée spécialement pour résoudre ce problème tout en conservant une qualité raisonnablement bonne sur les énoncés InDomain.

curl --location 'https://<your-resource>.cognitiveservices.azure.com/language/authoring/analyze-conversations/projects/<your-project>/:train?api-version=2022-10-01-preview' \
--header 'Ocp-Apim-Subscription-Key: <your subscription key>' \
--header 'Content-Type: application/json' \
--data '{
      "modelLabel": "<modelLabel>",
      "trainingMode": "advanced",
      "trainingConfigVersion": "2024-08-01-preview",
      "evaluationOptions": {
            "kind": "percentage",
            "testingSplitPercentage": 0,
            "trainingSplitPercentage": 100
      }
}

Une fois la requête envoyée, vous pouvez suivre la progression du travail d’apprentissage dans Language Studio comme d’habitude.

Avertissements :

  • Le seuil de score None pour l’application (seuil de confiance sous lequel topIntent est marqué comme None) lorsque vous utilisez cette configuration de formation doit être défini sur 0. Ce paramètre est utilisé parce que cette nouvelle configuration de formation attribue une certaine partie des probabilités dans le domaine en dehors du domaine afin que le modèle ne soit pas indûment trop confiant concernant les énoncés dans le domaine. Par conséquent, les utilisateurs peuvent voir des scores de confiance légèrement inférieurs dans les énoncés dans le domaine par rapport à la configuration de formation de prod.
  • Nous déconseillons cette configuration de formation pour les applications avec seulement deux intentions, par exemple IntentA et None.
  • Nous déconseillons cette configuration de formation pour les applications avec un faible nombre d’énoncés par intention. Nous recommandons fortement un minimum de 25 énoncés par intention.