Bewährte Methoden für Conversational Language Understanding
Verwenden Sie die folgenden Richtlinien, um in Conversational Language Understanding die bestmöglichen Projekte zu erstellen.
Wählen Sie ein konsistentes Schema aus.
Ein Schema ist die Definition Ihrer Absichten und Entitäten. Beim Definieren, was als Absicht und was als Entität erstellt werden soll, können Sie verschiedene Ansätze verfolgen. Stellen Sie sich folgende Fragen:
- Welche Aktionen oder Abfragen möchte ich von meinem Benutzer erfassen?
- Welche Informationen sind in den einzelnen Aktionen relevant?
In der Regel können Sie sich Aktionen und Abfragen als Absichten vorstellen, während die Informationen, die zum Erfüllen dieser Abfragen erforderlich sind, Entitäten sind.
Angenommen, Sie möchten, dass Ihre Kunden Abonnements für verschiedene von Ihnen angebotene Produkte über Ihren Chatbot kündigen. Sie können eine Absicht Kündigen mit verschiedenen Beispielen erstellen, z. B. „Contoso-Dienst kündigen“ oder „Fabrikam-Abonnement nicht mehr in Rechnung stellen“. Die Absicht des Benutzers besteht darin, zu kündigen, und der Contoso-Dienst bzw. das Fabrikam-Abonnement sind die Abonnements, die gekündigt werden sollen.
Zum Fortfahren erstellen Sie eine Entität für Abonnements. Anschließend können Sie Ihr gesamtes Projekt so modellieren, dass Aktionen als Absichten erfasst und Entitäten zum Ausfüllen dieser Aktionen verwendet werden. Mit diesem Ansazt kann alles gekündigt werden, was Sie als Entität definieren, z. B. andere Produkte. Anschließend können Sie Absichten zum Registrieren, Verlängern und Upgraden verwenden, die alle die Entität Abonnements und andere Entitäten verwenden.
Im obigen Schemaentwurf können Sie vorhandene Funktionen (Kündigen, Upgraden oder Registrieren) ganz einfach auf neue Ziele erweitern, indem Sie eine neue Entität erstellen.
Ein weiterer Ansatz besteht darin, die Informationen als Absichten und die Aktionen als Entitäten zu modellieren. Nehmen wir dasselbe Beispiel, in dem Kunden Abonnements über Ihren Chatbot kündigen können.
Sie können für jedes verfügbare Abonnement eine Absicht erstellen, z. B. Contoso, mit Äußerungen wie „Kündigen Sie Contoso“, „Stellen Sie keine Contoso-Dienste nicht mehr in Rechnung“ und „Kündigen Sie das Contoso-Abonnement“. Anschließend erstellen Sie eine Entität, um die Aktion Kündigen zu erfassen. Sie können für die einzelnen Aktionen verschiedene Entitäten definieren oder Aktionen mithilfe einer Listenkomponente in einer Entität zusammenfassen, um die Aktionen anhand verschiedener Schlüssel zu unterscheiden.
Mit diesem Schemaentwurf können Sie neue Aktionen ganz einfach auf vorhandene Ziele erweitern, indem Sie neue Aktionsentitäten oder Entitätskomponenten hinzufügen.
Vermeiden Sie es, alle Konzepte als Absichten zu definieren. Erstellen Sie beispielsweise keine Absicht Contoso kündigen, die nur dem Zweck dieser speziellen Aktion dient. Absichten und Entitäten sollten zusammenarbeiten, um alle erforderlichen Informationen vom Kunden zu erfassen.
Sie sollten auch das Vermischen verschiedener Schemaentwürfe vermeiden. Erstellen Sie nicht die Hälfte Ihrer Anwendung mit Aktionen als Absichten und die andere Hälfte mit Informationen als Absichten. Stellen Sie Konsistenz sicher, um die bestmöglichen Ergebnisse zu erhalten.
Ausgewogene Trainingsdaten
Wenn es um Trainingsdaten geht, sollten Sie versuchen, Ihr Schema möglichst ausgewogen zu halten. Die Einbeziehung großer Mengen in Bezug auf eine Absicht und nur geringe Mengen zu einer anderen führt zu einem Modell, das einseitig auf bestimmte Absichten ausgerichtet ist.
Um dieses Szenario zu beheben, müssen Sie möglicherweise Ihren Trainingssatz komprimieren. Oder Sie fügen ihm Knoten hinzu. Zum Komprimieren können Sie folgende Aktionen ausführen:
- Entfernen Sie einen bestimmten Prozentsatz der Trainingsdaten zufällig.
- Analysieren Sie den Datensatz, und entfernen Sie überrepräsentierte doppelte Einträge, was ein systematischerer Ansatz ist.
Um den Trainingssatz hinzuzufügen, wählen Sie in Language Studio auf der Registerkarte Datenbezeichnung die Option Äußerungen vorschlagen aus. Conversational Language Understanding sendet einen Aufruf an Azure OpenAI, um ähnliche Äußerungen zu generieren.
Sie sollten auch nach unbeabsichtigten „Mustern“ im Trainingssatz suchen. Solche Muster können beispielsweise vorliegen, wenn der Trainingssatz für eine bestimmte Absicht nur Kleinbuchstaben enthält oder mit einem bestimmten Ausdruck beginnt. In solchen Fällen lernt das von Ihnen trainierte Modell möglicherweise diese unbeabsichtigten Verzerrungen im Trainingssatz und kann nicht verallgemeinern.
Es empfiehlt sich, im Trainingssatz Groß- und Kleinschreibung und verschiedene Satzzeichen zu verwenden. Wenn Ihr Modell Variationen verarbeiten soll, stellen Sie sicher, dass Sie über einen Trainingssatz verfügen, der diese Vielfalt auch widerspiegelt. Fügen Sie beispielsweise einige Äußerungen in richtiger Groß- und Kleinschreibung und einige nur in Kleinbuchstaben ein.
Eindeutige Beschriftung von Äußerungen
Stellen Sie sicher, dass die Konzepte, auf die sich Ihre Entitäten beziehen, klar definiert und trennbar sind. Überprüfen Sie, ob Sie die Unterschiede problemlos und zuverlässig ermitteln können. Wenn dies nicht möglich ist, kann diese fehlende Unterscheidung ein Hinweis darauf sein, dass auch die erlernte Komponente Schwierigkeiten hat.
Wenn eine Ähnlichkeit zwischen Entitäten besteht, stellen Sie sicher, dass es einen Aspekt Ihrer Daten gibt, der ein Hinweis auf den Unterschied zwischen ihnen liefert.
Wenn Sie beispielsweise ein Modell zum Buchen von Flügen erstellt haben, kann ein Benutzer eine Äußerung wie „Ich möchte einen Flug von Boston nach Seattle“ verwenden. Es würde erwartet, dass der Abflugort und der Zielort für solche Äußerungen ähnlich sind. Ein Hinweis zur Differenzierung des Abflugorts könnte sein, dass diesem Wort oft das Wort von vorangeht.
Stellen Sie sicher, dass Sie alle Instanzen jeder Entität in Ihren Trainings- und Testdaten beschriften. Ein Ansatz besteht darin, die Suchfunktion zu verwenden, um alle Instanzen eines Worts oder Ausdrucks in Ihren Daten zu finden, und dann zu überprüfen, ob sie richtig beschriftet sind.
Beschriften Sie Testdaten für Entitäten, die keine gelernte Komponente besitzen, und auch für solche, die über eine verfügen. Auf diese Weise können Sie sicherstellen, dass Ihre Auswertungsmetriken korrekt sind.
Verwenden von Standardtrainings vor dem erweiterten Training
Standardtraining ist kostenlos und schneller als fortgeschrittenes Training. Es kann Ihnen helfen, die Auswirkungen der Änderung Ihres Trainingssatz oder Schemas beim Erstellen des Modells schnell zu verstehen. Wenn Sie mit dem Schema zufrieden sind, sollten Sie das erweiterte Training in Erwägung ziehen, um die höchste Modellqualität herauszuholen.
Verwenden des Auswertungsfeatures
Beim Erstellen einer App ist es oft hilfreich, Fehler frühzeitig zu erkennen. Es empfiehlt sich in der Regel, beim Erstellen der App einen Testsatz hinzuzufügen. Schulungs- und Auswertungsergebnisse sind hilfreich beim Identifizieren von Fehlern oder Problemen in Ihrem Schema.
Machine Learning-Komponenten und -Komposition
Weitere Informationen finden Sie unter Komponententypen.
Verwenden des Bewertungsschwellenwerts „keine“
Wenn zu viele falsch positive Ergebnisse angezeigt werden, z. B. dass Äußerungen außerhalb des Kontexts als gültige Absichten markiert werden, finden Sie unter Konfidenzschwellenwert Informationen darüber, wie sich dies auf den Rückschluss auswirkt.
- Entitätskomponenten wie Listen und Regex, die nicht durch maschinelles Lernen entstanden sind, sind per Definition nicht kontextbezogen. Wenn Listen- oder Regex-Entitäten an unbeabsichtigten Stellen angezeigt werden, versuchen Sie, die Listen als synonym zu der maschinell gelernten Komponente zu beschriften.
- Für Entitäten können Sie die gelernte Komponente als „Erforderlich“ verwenden, um einzuschränken, wann eine zusammengesetzte Entität ausgelöst werden soll.
Ein Beispiel: Sie verwenden eine Entität namens Ticketanzahl, die versucht, die Anzahl der Tickets zu extrahieren, die bei Flugbuchungen reserviert werden sollen, beispielsweise bei Äußerungen wie „Für morgen zwei Tickets nach Kairo buchen“.
Dann fügen Sie in der Regel eine vordefinierte Komponente für Quantity.Number
hinzu, die in Äußerungen bereits alle Zahlen extrahiert. Wenn Sie Ihre Entität jedoch nur mit der vordefinierten Komponente definieren, extrahiert sie auch andere Zahlen als Teil der Entität Ticketanzahl, z. B. „Buche für morgen um 15 Uhr zwei Tickets nach Kairo.“
Um dieses Problem zu beheben, beschriften Sie in Ihren Trainingsdaten eine gelernte Komponente für alle Zahlen, die auf eine Ticketanzahl hinweisen. Die Entität verfügt nun über zwei Komponenten:
- Die vordefinierte Komponente, die alle Zahlen interpretieren kann.
- Die gelernte Komponente, die vorhersagt, wo sich die Ticketanzahl innerhalb eines Satzes befindet.
Indem Sie die gelernte Komponente als erforderlich festlegen, stellen Sie sicher, dass die Ticketanzahl nur zurückgegeben wird, wenn die gelernte Komponente sie im richtigen Kontext vorhersagt. Wenn Sie auch die vordefinierte Komponente anfordern, können Sie garantieren, dass die zurückgegebene Entität für die Ticketanzahl sowohl eine Zahl ist als auch an der richtigen Position steht.
Behandeln von Modellinkonsistenzen
Wenn Ihr Modell bei kleinen Grammatikänderungen wie Groß-/Kleinschreibung oder diakritischen Zeichen übermäßig empfindlich ist, können Sie das Dataset systematisch direkt in Language Studio bearbeiten. Um diese Features zu verwenden, klicken Sie in der linken Symbolleiste auf die Registerkarte Einstellungen, und suchen Sie den Abschnitt Erweiterte Projekteinstellungen.
Zunächst können Sie die Einstellung für Datentransformation für Groß-/Kleinschreibung aktivieren aktivieren. Diese normalisiert die Groß-/Kleinschreibung von Äußerungen beim Training, Testen und Implementieren Ihres Modells. Wenn Sie von LUIS migriert haben, wissen Sie möglicherweise, dass LUIS diese Normalisierung nicht standardmäßig durchgeführt hat. Um über die API auf dieses Feature zuzugreifen, legen Sie den Parameter normalizeCasing
auf true
fest. Siehe folgendes Beispiel:
{
"projectFileVersion": "2022-10-01-preview",
...
"settings": {
...
"normalizeCasing": true
...
}
...
Zweitens können Sie auch die Einstellung für Datenerweiterung für Diakritika aktivieren aktivieren, um Variationen Ihrer Trainingsdaten für mögliche diakritische Variationen in natürlicher Sprache zu generieren. Dieses Feature ist für alle Sprachen verfügbar. Es ist besonders nützlich für germanische und slawische Sprachen, in denen Benutzer häufig Wörter mit klassischen englischen Zeichen anstelle der richtigen Zeichen schreiben. Beispielsweise lautet der Ausdruck „Navigieren zum Sportkanal“ auf Französisch „Accédez à la chaîne sportive“. Wenn dieses Feature aktiviert ist, wird der Ausdruck „Accedez a la chaine sportive“ (ohne diakritische Zeichen) auch in den Trainingsdatensatz aufgenommen.
Wenn Sie dieses Feature aktivieren, erhöht sich die Anzahl der Äußerungen Ihres Trainingssatzes. Aus diesem Grund müssen Sie möglicherweise die Größe Ihrer Trainingsdaten entsprechend anpassen. Die aktuelle maximale Äußerungsanzahl nach der Erweiterung beträgt 25.000. Um über die API auf dieses Feature zuzugreifen, legen Sie den Parameter augmentDiacritics
auf true
fest. Siehe folgendes Beispiel:
{
"projectFileVersion": "2022-10-01-preview",
...
"settings": {
...
"augmentDiacritics": true
...
}
...
Umgang mit Modellen mit Überkonfidenz
Kunden können die LoraNorm-Trainingkonfigurationsversion verwenden, wenn das Modell fälschlicherweise überkonfident ist. Ein Beispiel für dieses Verhalten kann das folgende Szenario sein, bei dem das Modell die falsche Absicht mit einer Zuverlässigkeit von 100 % vorhersagt. Durch diese Bewertung kann die Projekteinstellung für den Konfidenzschwellwert nicht mehr verwendet werden.
Text | Vorhergesagte Absicht | Genauigkeitsbewertung |
---|---|---|
„Wer hat den Eiffelturm gebaut?“ | Sports |
1,00 |
„Sehe ich heute in deinen Augen gut aus?“ | QueryWeather |
1,00 |
„Ich hoffe, Sie haben einen schönen Abend.“ | Alarm |
1,00 |
Um dieses Problem zu beheben verwenden Sie die Konfigurationsversion 2023-04-15
, die Konfidenzscores normalisiert. Die Projekteinstellung für den Konfidenzschwellwert kann dann angepasst werden, um das gewünschte Ergebnis zu erzielen.
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
}
}
Nachdem die Anforderung gesendet wurde, können Sie den Fortschritt des Trainingsauftrags in Language Studio wie gewohnt nachverfolgen.
Hinweis
Sie müssen Ihr Modell nach dem Aktualisieren der Projekteinstellung confidenceThreshold
erneut trainieren. Anschließend müssen Sie die App erneut veröffentlichen, damit der neue Schwellenwert wirksam wird.
Normalisierung in Modellversion 2023-04-15
In Modellversion 2023-04-15 ermöglicht das Conversational Language Understanding eine Normalisierung in der Rückschlussschicht, die sich nicht auf das Training auswirkt.
Die Normalisierungsschicht normalisiert die Zuverlässigkeitsbewertung für die Klassifizierung auf einen begrenzten Bereich. Der ausgewählte Bereich ist derzeit [-a,a]
, wobei „a“ die Quadratwurzel der Anzahl der Absichten entspricht. Daher hängt die Normalisierung von der Anzahl der Absichten in der App ab. Wenn die Anzahl der Absichten gering ist, ist die Spanne, mit der die Normalisierungsschicht arbeiten kann, klein. Bei einer großen Anzahl von Absichten ist die Normalisierung effektiver.
Wenn diese Normalisierung keine Absichten unterstützt, die außerhalb des Gültigkeitsbereichs liegen, soweit der Zuverlässigkeitsschwellenwert verwendet werden kann, um aus Bereichsausdrücke herauszufiltern, kann dies mit der Anzahl der Absichten in der App zusammenhängen. In diesem Fall sollten Sie der App ggf. weitere Absichten hinzufügen. Falls Sie eine orchestrierte Architektur verwenden, können Sie auch Apps zusammenführen, die derselben Domäne angehören.
Debuggen von zusammengesetzten Entitäten
Entitäten sind Funktionen, die in Ihrer Eingabe Spannen mit einem zugeordneten Typ ausgeben. Die Funktion wird durch eine oder mehrere Komponenten definiert. Sie können Komponenten nach Bedarf markieren und entscheiden, ob die Einstellung Komponenten kombinieren aktiviert werden soll. Wenn Sie Komponenten kombinieren, werden alle Spannen, die sich überlappen, in einer zusammengeführt. Wenn die Einstellung nicht verwendet wird, wird jede einzelne Komponentenspanne ausgegeben.
Um die Leistung einzelner Komponenten besser zu verstehen, können Sie die Einstellung deaktivieren und jede Komponente auf Nicht erforderlich festlegen. Mit dieser Einstellung können Sie die einzelnen ausgegebenen Spannen untersuchen und mit dem Entfernen von Komponenten experimentieren, sodass nur problematische Komponenten generiert werden.
Auswerten eines Modells mithilfe mehrerer Testsätze
Daten in einem Conversational Language Understanding-Projekt können zwei Datasets enthalten: einen Testsatz und einen Trainingssatz. Wenn Sie mehrere Testsätze verwenden möchten, um Ihr Modell auszuwerten, haben Sie folgende Möglichkeiten:
- Geben Sie Ihren Testsätzen unterschiedliche Namen (z. B. „test1“ und "“test2“).
- Exportieren Sie Ihr Projekt, um eine JSON-Datei mit ihren Parametern und ihrer Konfiguration zu erhalten.
- Verwenden Sie den JSON-Code, um ein neues Projekt zu importieren. Benennen Sie den zweiten gewünschten Testsatz in „test“ um.
- Trainieren Sie das Modell, um die Auswertung mit Ihrem zweiten Testsatz auszuführen.
Benutzerdefinierte Parameter für Ziel-Apps und untergeordnete Apps
Wenn Sie orchestrierte Apps verwenden, sollten Sie benutzerdefinierte Parameterüberschreibungen für verschiedene untergeordnete Apps senden. Mithilfe des Felds targetProjectParameters
können Benutzer ein Wörterbuch senden, das die Parameter für jedes Zielprojekt darstellt. Betrachten Sie beispielsweise eine Orchestrator-App namens Orchestrator
, die zwischen einer Conversational Language Understanding-App namens CLU1
und einer benutzerdefinierten „Fragen und Antworten“-App namens CQA1
orchestriert. Wenn Sie einen Parameter mit dem Namen „top“ an die „Fragen und Antworten“-App senden möchten, können Sie den vorherigen Parameter verwenden.
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
}
}
}
}
}'
Kopieren von Projekten über Sprachressourcen hinweg
Häufig können Sie Conversational Language Understanding-Projekte von einer Ressource in eine andere kopieren, indem Sie die Schaltfläche Kopieren in Language Studio verwenden. In einigen Fällen kann es einfacher sein, Projekte mithilfe der API zu kopieren.
Identifizieren Sie zuerst Folgendes:
- Quellprojektname.
- Zielprojektname.
- Quellsprachressource.
- Zielsprachressource, in die Sie sie kopieren möchten.
Rufen Sie die API auf, um die Kopieraktion zu autorisieren, und rufen Sie später accessTokens
für den tatsächlichen Kopiervorgang ab.
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}'
Rufen Sie die API auf, um den Kopiervorgang abzuschließen. Verwenden Sie die Antwort, die Sie zuvor erhalten haben, als Nutzdaten.
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>"
}'
Umgang mit Äußerungen außerhalb der Domäne
Kunden können die neu aktualisierte Trainingskonfigurationversion 2024-08-01-preview
(vormals 2024-06-01-preview
) verwenden, wenn das Modell über eine schlechte Qualität für Nicht-Domänen-Äußerungen verfügt. Ein Beispiel für dieses Szenario mit der Standardschulungskonfiguration kann wie im folgenden Beispiel aussehen, wobei das Modell drei Absichten hat: Sports
, QueryWeather
und Alarm
. Bei den Testäußerungen handelt es sich um Äußerungen außerhalb der Domäne und das Modell klassifiziert sie als InDomain
mit einem relativ hohen Konfidenzwert.
Text | Vorhergesagte Absicht | Genauigkeitsbewertung |
---|---|---|
„Wer hat den Eiffelturm gebaut?“ | Sports |
0.90 |
„Sehe ich heute in deinen Augen gut aus?“ | QueryWeather |
1,00 |
„Ich hoffe, Sie haben einen schönen Abend.“ | Alarm |
0.80 |
Um dieses Problem zu lösen, verwenden Sie die 2024-08-01-preview
-Konfigurationsversion, die speziell dafür entwickelt wurde, dieses Problem zu beheben und gleichzeitig eine einigermaßen gute Qualität bei InDomain
-Äußerungen zu gewährleisten.
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
}
}
Nachdem die Anforderung gesendet wurde, können Sie den Fortschritt des Trainingsauftrags in Language Studio wie gewohnt nachverfolgen.
Einschränkungen:
- Der Schwellenwert für die Bewertung „Keine“ für die App (Konfidenzschwelle, unterhalb derer der
topIntent
alsNone
markiert wird) sollte bei Verwendung dieser Trainingskonfiguration auf 0 gesetzt werden. Der Grund für diese Einstellung ist, dass diese neue Trainingskonfiguration einen bestimmten Anteil der domäneninternen Wahrscheinlichkeiten den domänenexternen zuschreibt, damit das Modell nicht fälschlicherweise zu viel Vertrauen in die domäneninternen Äußerungen hat. Infolgedessen kann es vorkommen, dass die Konfidenzwerte für domäneninterne Äußerungen im Vergleich zur Trainingskonfiguration leicht reduziert werden. - Diese Trainingskonfiguration wird nicht für Apps mit nur zwei Absichten empfohlen, also z. B.
IntentA
undNone
. - Diese Trainingskonfiguration wird nicht für Apps mit einer geringen Anzahl von Äußerungen pro Absicht empfohlen. Ein Minimum von 25 Äußerungen pro Absicht wird dringend empfohlen.