Freigeben über


Analysieren der Telemetriedaten Ihres Bots

GILT FÜR: SDK v4

Analysieren des Botverhaltens

Mit der folgenden Fragensammlung können Sie das Botverhalten analysieren. Sie können die Sammlung verwenden, um benutzerdefinierte Abfragen in Azure Monitor Log Analytics zu erstellen und Überwachungs- und Power BI-Visualisierungsdashboards zu erstellen.

Voraussetzungen

Es ist hilfreich, ein grundlegendes Verständnis der folgenden Konzepte zu haben:

Tipp

Wenn Ihr Bot Tools wie Copilot Studio oder Composer verwendet, sollten Sie die Version des adaptiven Dialogfelds jeder Abfrage verwenden, wenn verfügbar.

Dashboards

Azure-Dashboards bieten vielfältige Möglichkeiten, um die Informationen, die von Ihren Abfragen generiert werden, anzuzeigen und für andere Benutzer freizugeben. Sie können benutzerdefinierte Dashboards erstellen, um die Aktivität Ihrer Bots zu überwachen, indem Sie Ihre Abfragen den Kacheln zuordnen, die Sie Ihrem Dashboard hinzufügen. Weitere Informationen zu Dashboards und der Zuordnung von Abfragen zu Kacheln finden Sie unter Erstellen und Freigeben von Dashboards von Log Analytics-Daten. Im vorliegenden Artikel finden Sie Beispiele für einige Abfragen, die für die Überwachung des Verhaltens Ihrer Bots nützlich sein können.

Beispiele für Kusto-Abfragen

Hinweis

Es wird empfohlen, sich auf verschiedene Dimensionen wie Punkt, Kanal und Gebietsschema für alle Abfragen in diesem Artikel zu pivotieren.

Anzahl von Benutzern pro Zeitraum

Dieses Beispiel ergibt ein Liniendiagramm, das zeigt, wie viele verschiedene Benutzer in den letzten 14 Tagen pro Tag mit Ihrem Bot kommuniziert haben. Der Zeitraum lässt sich problemlos ändern, indem Sie den Variablen queryStartDate, queryEndDate und interval unterschiedliche Werte zuweisen.

Wichtig

Sie erhalten nur eine korrekte Anzahl eindeutiger Benutzer in dieser Abfrage, wenn sie authentifizierte Benutzer sind, und die Ergebnisse hängen möglicherweise auch von den Kanalfunktionen ab.

// number of users per period
let queryStartDate = ago(14d);
let queryEndDate = now();
let groupByInterval = 1d;
customEvents
| where timestamp > queryStartDate
| where timestamp < queryEndDate
| summarize uc=dcount(user_Id) by bin(timestamp, groupByInterval)
| render timechart

Tipp

Der Kusto-Operator summarize wird verwendet, um eine Tabelle zu erzeugen, die den Inhalt der Eingabetabelle aggregiert.

Die Bin-Funktion ist eine Kusto-Skalarwertfunktion, die bei gemeinsamer Verwendung mit dem summarize operator die Abfrageergebnisse in den angegebenen Wert gruppiert. Im Beispiel oben erfolgt die Gruppierung nach Tag. Kusto akzeptiert auch folgende Werte: h (Stunden), m (Minuten), s (Sekunden), ms (Millisekunden), microsecond (Mikrosekunden).

Der render-Operator ermöglicht das einfache Rendern von Diagrammen, z. B. timechart, ein Liniendiagramm, bei dem auf der X-Achse Uhrzeiten angegeben werden und für die Y-Achse eine beliebige andere numerische Spalte verwendet werden kann. Die Werte auf der X-Achse werden automatisch gleichmäßig verteilt, auch wenn in Ihren Daten nicht jede Uhrzeit angegeben ist. Wenn keine render-Anweisung vorhanden ist, wird standardmäßig table verwendet.

Beispiel für Abfrageergebnisse pro Zeitraum

Beispieldiagramm der Anzahl der Benutzer pro Zeitraum.

Aktivität pro Zeitraum

In diesem Beispiel wird veranschaulicht, wie das Aktivitätsvolumen pro gewünschte Dimension gemessen wird, z. B. die Anzahl der Unterhaltungen, Dialogfelder oder Nachrichten pro Tag für die letzten 14 Tage. Der Zeitraum lässt sich problemlos ändern, indem Sie den Variablen querystartdate, queryEndDate und interval unterschiedliche Werte zuweisen. Die gewünschte Dimension wird durch die extend Klausel im folgenden Beispiel definiert, metric kann entweder auf "InstanceId", "DialogId" oder "activityId" festgelegt werden.

Weisen Sie der Dimension, die Sie anzeigen möchten, metric zu:

// Measures the number of activity's (conversations, dialogs, messages) per period.
let queryStartDate = ago(14d);
let queryEndDate = now();
let groupByInterval = 1d;
customEvents
| where timestamp > queryStartDate
| where timestamp < queryEndDate
| extend InstanceId = tostring(customDimensions['InstanceId'])
| extend DialogId = tostring(customDimensions['DialogId'])
| extend ActivityId = tostring(customDimensions['activityId'])
| where DialogId != '' and  InstanceId != '' and user_Id != ''
| extend metric = InstanceId // DialogId or ActivityId
| summarize Count=dcount(metric) by  bin(timestamp, groupByInterval)
| order by Count desc nulls last
| render timechart

Tipp

Der Kusto-Operator extend wird verwendet, um berechnete Spalten zu erstellen und diese an das Resultset anzufügen.

Beispielergebnisse für Aktivitäts-pro-Punkt-Abfrage

Beispieldiagramm der Aktivität pro Periode.

Aktivität pro Benutzer und Zeitraum

Dieses Beispiel veranschaulicht, wie sich die Anzahl von Aktivitäten pro Benutzer und Zeitraum ermitteln lässt. Diese Abfrage drilldowns in die Aktivität pro Zeitraumabfrage , um sich auf die Aktivität pro Benutzer pro Zeitraum zu konzentrieren. Aktivitäten umfassen Dialoge, Unterhaltungen und Nachrichten. Diese Abfrage misst die Benutzerinteraktion mit Ihrem Bot, die ihnen dabei helfen kann, potenzielle Probleme zu finden, z. B.:

  • Tage mit viel Aktivität durch einen einzelnen Benutzer können einen Angriff oder Test bedeuten
  • Tage mit wenig Interaktion können auf Probleme mit der Dienstintegrität hinweisen.

Tipp

Sie können by user_Id entfernen, um den allgemeinen Aktivitätsumfang des Bots abzurufen, der nach Zeit und Dialogen, Nachrichten oder Unterhaltungen pivotiert werden kann.

// number of users per period per dialogs
let queryStartDate = ago(14d);
let queryEndDate = now();
let interval = 6h;
customEvents
| where timestamp > queryStartDate
| where timestamp < queryEndDate
| extend InstanceId = tostring(customDimensions['InstanceId'])
| extend DialogId = tostring(customDimensions['DialogId'])
| extend ActivityId = tostring(customDimensions['activityId'])
| where DialogId != '' and InstanceId != '' and user_Id != ''
| extend metric = ActivityId // InstanceId // DialogId // or InstanceId for conversation count
| summarize Count=dcount(metric) by user_Id, bin(timestamp, groupByInterval)
| order by Count desc nulls last

Beispielaktivität pro Benutzer-pro-Punkt-Abfrageergebnisse

user_Id timestamp Count
User-8107ffd2 2019-09-03T00:00:00Z 14
User-75f2cc8f 2019-08-30T00:00:00Z 13
User-75f2cc8d 2019-09-03T00:00:00Z 13
User-3060aada 2019-09-03T00:00:00Z 10

Dialog abgeschlossen

Sobald Sie den Telemetrieclient für einen Dialog festgelegt haben, gibt der Dialog (und die zugehörigen untergeordneten Elemente) standardmäßige Telemetriedaten aus, z. B. gestartet und abgeschlossen. Mit diesem Beispiel lässt sich das Verhältnis zwischen abgeschlossenen und gestarteten Dialogen messen. Wenn die Anzahl der gestarteten Dialogfelder größer als die abgeschlossene Anzahl ist, werden einige Ihrer Benutzer den Dialogfluss nicht abschließen. Sie können diese Abfrage verwenden, um mögliche Dialoglogiken zu identifizieren und zu beheben. Sie kann auch verwendet werden, um zu ermitteln, welche Dialogfelder am häufigsten und am häufigsten verwendet werden.

Tipp

Wenn Ihr Bot mit Tools wie Copilot Studio oder Composer erstellt wird, sollten Sie die adaptive Dialogversion jeder Abfrage verwenden.

Abschluss des Dialogfelds "Wasserfall"

// % Completed Waterfall Dialog: shows completes relative to starts
let queryStartDate = ago(14d);
let queryEndDate = now();
customEvents
| where timestamp > queryStartDate
| where timestamp < queryEndDate
| where name=="WaterfallStart"
| extend DialogId = customDimensions['DialogId']
| extend InstanceId = tostring(customDimensions['InstanceId'])
| join kind=leftouter (
    customEvents
    | where name=="WaterfallComplete"
    | extend InstanceId = tostring(customDimensions['InstanceId'])
  ) on InstanceId
| summarize started=countif(name=='WaterfallStart'), completed=countif(name1=='WaterfallComplete') by tostring(DialogId)
| where started > 100  // filter for sample
// Show starts vs. completes
| project tostring(DialogId), started, completed
| order by started desc, completed asc  nulls last
| render barchart  with (kind=unstacked, xcolumn=DialogId, ycolumns=completed, started, ysplit=axes)

Tipp

Der Kusto-Operator join führt die Zeilen zweier Tabellen zu einer neuen Tabelle zusammen, indem Werte aus den angegebenen Spalten aus beiden Tabellen zugeordnet werden.

Der project-Operator wird zum Auswählen der Felder verwendet, die in der Ausgabe angezeigt werden sollen. Ähnlich wie der extend operator, der ein neues Feld hinzufügt, kann auch der project operator aus einem Satz vorhandener Felder auswählen oder ein neues Feld hinzufügen.

Adaptive Dialogfelder gestartet und abgeschlossen

// % Completed adaptive dialog: shows completes relative to starts. This type is the default dialog type when using Copilot Studio or Composer. 
customEvents
| where name=="AdaptiveDialogStart" or name == "AdaptiveDialogComplete"
| extend DialogId = tostring(customDimensions['DialogId'])
| summarize started=countif(name=='AdaptiveDialogStart'), completed=countif(name=='AdaptiveDialogComplete') by DialogId
| project DialogId, started, completed
| order by started desc, completed asc nulls last
| render barchart with (kind=unstacked, xcolumn=DialogId, ycolumns=completed, started, ysplit=axes)

Beispiel für Ergebnisse der Abfrage mit Dialogfeldervollständigung

Beispieldiagramm der gestarteten Dialogfelder und abgeschlossene Dialogfelder.

Dialog nicht abgeschlossen

Mit diesem Beispiel können Sie die Anzahl von Dialogflüssen zählen, die gestartet, aber während des angegebenen Zeitraums nicht abgeschlossen wurden, weil sie entweder abgebrochen oder vorzeitig beendet wurden. Sie können es verwenden, um unvollständige Dialogfelder zu überprüfen und zu überprüfen, ob sie aufgrund von Benutzerverwechslungen aktiv abgebrochen oder aufgrund von Benutzerabgelenkung oder Interessenverlust abgebrochen wurden.

Wasserfalldialoge nicht abgeschlossen

// Show incomplete dialogs when using waterfall dialogs.
let queryStartDate = ago(14d);
let queryEndDate = now();
customEvents 
| where timestamp > queryStartDate 
| where timestamp < queryEndDate
| where name == "WaterfallStart" 
| extend DialogId = customDimensions['DialogId']
| extend instanceId = tostring(customDimensions['InstanceId'])
| join kind=leftanti (
  customEvents
  | where name == "WaterfallComplete" 
  | extend instanceId = tostring(customDimensions['InstanceId'])
  ) on instanceId
| summarize cnt=count() by  tostring(DialogId)
| order by cnt
| render barchart

Adaptive Dialogfelder wurden nicht abgeschlossen

// Show incomplete dialogs for adaptive dialogs; this type is the default dialog type when using Copilot Studio or Composer.
let queryStartDate = ago(14d);
let queryEndDate = now();
customEvents
| where name == "AdaptiveDialogStart"
| extend DialogId = tostring(customDimensions['DialogId'])
| join kind=rightanti (
customEvents
| where name == "AdaptiveDialogComplete"
| extend DialogId = tostring(customDimensions['DialogId'])
) on name, DialogId
| summarize cnt=count() by DialogId
| order by cnt
| render barchart

Tipp

Der Kusto-Operator order (entspricht dem sort operator) wird verwendet, um die Zeilen der Eingabetabelle nach einer oder mehreren Spalte in einer bestimmten Reihenfolge zu sortieren. Hinweis: Wenn Sie NULL-Werte aus den Ergebnissen einer Abfrage ausschließen möchten, können Sie sie in Ihrer where Anweisung herausfiltern, z. B. können Sie "and isnotnull(Timestamp)" hinzufügen oder Nullwerte am Anfang oder Ende zurückgeben, fügen Sie die nulls first Oder nulls first am Ende der Order-Anweisung hinzu.

Beispielergebnisse für Dialogfeld-Invervollständigen-Abfrage

Beispielzusammenfassungsdiagramm für unvollständige Dialogfelder.

Drilldown in die Dialogsequenz

Wasserfallschritte „start/step/complete“ für einen Dialog in einer Unterhaltung

In diesem Beispiel wird die Sequenz der Dialogfeldschritte dargestellt, gruppiert nach Unterhaltung (instanceId), die hilfreich sein können, um zu bestimmen, welche Schritte zu Dialogunterbrechungen führen.

Geben Sie den Wert des gewünschten DialogId Werts anstelle von <SampleDialogId ein, um diese Abfrage auszuführen.>

// Drill down: Show waterfall start/step/complete for specific dialog
let queryStartDate = ago(14d);
let queryEndDate = now();
let DialogActivity=(dlgid:string) {
customEvents
| where timestamp > queryStartDate
| where timestamp < queryEndDate
| extend DialogId = customDimensions['DialogId']
| extend StepName = customDimensions['StepName']
| extend InstanceId = customDimensions['InstanceId']
| where DialogId == dlgid
| project timestamp, name, StepName, InstanceId
| order by tostring(InstanceId), timestamp asc
};
// For example see SampleDialogId behavior
DialogActivity("<SampleDialogId>")

Tipp

Diese Abfrage wurde unter Verwendung einer abfragedefinierten Funktion geschrieben. Dabei handelt es sich um eine benutzerdefinierte Funktion, die innerhalb des Gültigkeitsbereichs einer einzelnen Abfrage definiert und verwendet wird. Die Definition erfolgt in einer let-Anweisung. Die folgende Abfrage wurde ohne query-defined function geschrieben:

let queryStartDate = ago(14d);
let queryEndDate = now();
customEvents
| where timestamp > queryStartDate
| where timestamp < queryEndDate
| extend DialogId = customDimensions['DialogId']
| extend StepName = customDimensions['StepName']
| extend InstanceId = customDimensions['InstanceId']
| where DialogId == "<SampleDialogId>"
| project timestamp, name, StepName, InstanceId
| order by tostring(InstanceId), timestamp asc
Ergebnisse der Beispielabfrage
Zeitstempel name StepName InstanceId
2019-08-23T20:04... WaterfallStart NULL ...79c0f03d8701
2019-08-23T20:04... WaterfallStep GetPointOfInterestLocations ...79c0f03d8701
2019-08-23T20:04... WaterfallStep ProcessPointOfInterestSelection ...79c0f03d8701
2019-08-23T20:04... WaterfallStep GetRoutesToDestination ...79c0f03d8701
2019-08-23T20:05... WaterfallStep ResponseToStartRoutePrompt ...79c0f03d8701
2019-08-23T20:05... WaterfallComplete 1 NULL ...79c0f03d8701
2019-08-28T23:35... WaterfallStart NULL ...6ac8b3211b99
2019-08-28T23:35... WaterfallStep 2 GetPointOfInterestLocations ...6ac8b3211b99
2019-08-28T19:41... WaterfallStart NULL ...8137d76a5cbb
2019-08-28T19:41... WaterfallStep 2 GetPointOfInterestLocations ...8137d76a5cbb
2019-08-28T19:41... WaterfallStart NULL ...8137d76a5cbb

1 Abgeschlossen

2 Vorzeitig beendet

Interpretation: Benutzer scheinen die Unterhaltung im Schritt "GetPointOfInterestLocations" aufzugeben.

Hinweis

Wasserfalldialoge führen eine Sequenz aus (Start, verschiedene Schritte, Abschluss). Wenn eine Sequenz einen Start ohne Abschluss zeigt, bedeutet dies, dass der Dialog unterbrochen wurde, weil der Benutzer den Dialog entweder abgebrochen oder vorzeitig beendet hat. In dieser detaillierten Analyse kann dieses Verhalten angezeigt werden (siehe abgeschlossene und verlassene Schritte).

Wasserfallschritte „start/step/complete/cancel“ zum Aggregieren von Gesamtwerten

Dieses Beispiel zeigt die aggregierten Gesamtwerte für die Gesamtzahl von Startereignissen für eine Dialogsequenz, die kombinierte Gesamtzahl von Wasserfallschritten, die Anzahl der erfolgreich abgeschlossenen und der abgebrochenen Schritte sowie die Differenz zwischen WaterfallStart und dem kombinierten Gesamtwert von WaterfallComplete plus WaterfallCancel, mit der Sie die Gesamtzahl von vorzeitig beendeten Dialogen erhalten.

// Drill down: Aggregate view of waterfall start/step/complete/cancel steps totals for specific dialog
let queryStartDate = ago(14d);
let queryEndDate = now();
let DialogSteps=(dlgid:string) {
customEvents
| where timestamp > queryStartDate
| where timestamp < queryEndDate
| extend DialogId = customDimensions['DialogId']
| where DialogId == dlgid
| project name
| summarize count() by name
};
// For example see SampleDialogId behavior
DialogSteps("<SampleDialogId>")
Beispielergebnisse für Wasserfallaggregatabfragen
name count
WaterfallStart 21
WaterfallStep 47
WaterfallComplete 11
WaterfallCancel 1

Interpretation: Von 21 Aufrufen der Dialogsequenz wurde nur 11 abgeschlossen, 9 wurde abgebrochen und eine vom Benutzer abgebrochen.

Durchschnittliche Dauer in einem Dialog

Dieses Beispiel misst die durchschnittliche Zeit, die Benutzer in einem bestimmten Dialog verbringen. Ihr Bot kann von der Vereinfachung von Dialogfeldern profitieren, die einen Benutzer sehr lange dauern.

// Average dialog duration
let queryStartDate = ago(14d);
let queryEndDate = now();
customEvents
| where timestamp > queryStartDate
| where timestamp < queryEndDate
| where name=="WaterfallStart"
| extend DialogId = customDimensions['DialogId']
| extend instanceId = tostring(customDimensions['InstanceId'])
| join kind=leftouter (customEvents | where name=="WaterfallCancel" | extend instanceId = tostring(customDimensions['InstanceId'])) on instanceId
| join kind=leftouter (customEvents | where name=="WaterfallComplete" | extend instanceId = tostring(customDimensions['InstanceId'])) on instanceId
| extend duration = case(not(isnull(timestamp1)), timestamp1 - timestamp,
not(isnull(timestamp2)), timestamp2 - timestamp, 0s) // Abandoned aren't counted. Alternate: now()-timestamp
| extend seconds = round(duration / 1s)
| summarize AvgSeconds=avg(seconds) by tostring(DialogId)
| order by AvgSeconds desc nulls last
| render barchart with (title="Duration in Dialog")

Beispielergebnisse für eine Durchschnittliche Dauerabfrage

Beispieldiagramm der Dialogfelddauer.

Durchschnittliche Schritte in einem Dialog

In diesem Beispiel wird die "Länge" jedes aufgerufenen Dialogfelds als durchschnittliche, min. und standardabweichung berechnet. Dies kann bei der Analyse der Dialogqualität helfen. Zum Beispiel:

  • Dialoge mit zu vielen Schritten sollten für Vereinfachungsmöglichkeiten ausgewertet werden.
  • Dialoge mit einem großen Abstand zwischen Minimal-, Maximal- und Durchschnittswert können darauf hinweisen, dass Benutzer beim Ausführen der Aufgaben durch etwas blockiert werden. Eventuell müssen Sie herausfinden, ob es Möglichkeiten gibt, die Ausführung von Aufgaben zu vereinfachen oder die Komplexität des Dialogs zu reduzieren.
  • Dialoge mit einer großen Standardabweichung schlagen komplexe Pfade oder fehlerhafte Erfahrung vor (Abbrechen/Abbrechen).
  • Dialogfelder mit wenigen Schritten sind möglicherweise so, dass sie nie abgeschlossen wurden. Die Analyse des Verhältnisses zwischen abgeschlossenen und vorzeitig beendeten Dialogen kann bei der Bestimmung helfen.
// min/max/std/avg steps per dialog
let queryStartDate = ago(14d);
let queryEndDate = now();
customEvents
| where timestamp > queryStartDate
| where timestamp < queryEndDate
| extend DialogId = tostring(customDimensions['DialogId'])
| extend StepName = tostring(customDimensions['StepName'])
| extend InstanceId = tostring(customDimensions['InstanceId'])
| where name == "WaterfallStart" or  name == "WaterfallStep" or  name == "WaterfallComplete"
| order by InstanceId, timestamp asc
| project timestamp, DialogId, name, InstanceId, StepName
| summarize cnt=count() by InstanceId, DialogId
| summarize avg=avg(cnt), minsteps=min(cnt),maxsteps=max(cnt), std=stdev(cnt) by DialogId
| extend avgsteps = round(avg, 1)
| extend avgshortbysteps=maxsteps-avgsteps
| extend avgshortbypercent=round((1.0 - avgsteps/maxsteps)*100.0, 1)
| project DialogId, avgsteps, minsteps, maxsteps, std, avgshortbysteps, avgshortbypercent
| order by std desc nulls last

Beispielergebnisse für durchschnittliche Schritte

Dialog-ID Durchschn. Schritte Min. Schritte Max. Schritte std Durchschn. unvollständig nach Schritten Durchschn. unvollständig nach Prozent
FindArticlesDialog 6.2 2 7 2,04 0.8 11,4 %
CreateTicket 4.3 2 5 1.5 0.7 14 %
CheckForCurrentLocation 3.9 2 5 1,41 1.1 22 %
BaseAuth 3.3 2 4 1,03 0.7 17,5 %
Onboarding 2.7 2 4 0.94 1.3 32,5 %

__Interpretation: FindArticlesDialog hat z. B. eine breite Breite zwischen min/max und sollte untersucht und möglicherweise neu gestaltet und optimiert werden.

Kanalaktivität gemäß Aktivitätsmetrik

Dieses Beispiel misst die Menge an Aktivität, die Ihr Bot in einem bestimmten Zeitraum pro Kanal empfängt. Zu diesem Zweck kann eine folgenden Metriken gezählt werden: eingehende Nachrichten, Benutzer, Unterhaltungen oder Dialoge. Dies kann nützlich sein, um die Integrität eines Diensts zu analysieren oder die Beliebtheit eines Kanals zu messen.

// number of metric: messages, users, conversations, dialogs by channel
let queryStartDate = ago(14d);
let queryEndDate = now();
let groupByInterval = 1d;
customEvents
| where timestamp > queryStartDate
| where timestamp < queryEndDate
| extend InstanceId = tostring(customDimensions['InstanceId'])
| extend DialogId = tostring(customDimensions['DialogId'])
| extend ActivityId = tostring(customDimensions['activityId'])
| extend ChannelId = tostring(customDimensions['channelId'])
| where DialogId != '' and  InstanceId != '' and user_Id != ''
| extend metric = user_Id // InstanceId or ActivityId or user_Id
| summarize Count=count(metric) by  ChannelId, bin(timestamp, groupByInterval)
| order by Count desc nulls last
| render barchart with (title="Users", kind=stacked) // or Incoming Messages or Conversations or Users

Tipp

Sie können die folgenden Variationen ausprobieren:

  • Führen Sie die Abfrage ohne zeitstempel-Bucketing aus: bin(timestamp, groupByInterval).
  • Sie können auch für unterschiedliche Benutzer und count für alle Benutzerereignisaktivitäten verwendendcount. Das funktioniert auch für Benutzer, die einen Dialog wiederholt verwenden.

Beispielergebnisse für Kanalaktivitätsabfragen

Beispieldiagramm der Kanalnutzung.

Interpretation: Emulatortests waren früher am beliebtesten, aber nachdem wir live gegangen sind, ist DirectLineSpeech der beliebteste Kanal.

Total Intents nach Beliebtheit

Dieses Beispiel gilt für Bots, für die LUIS aktiviert ist. Es zeigt eine Zusammenfassung aller Absichten nach Beliebtheit und den entsprechenden Sicherheitsscore der Absichtserkennung.

Hinweis

Language Understanding (LUIS) wird am 1. Oktober 2025 eingestellt. Ab dem 1. April 2023 können Sie keine neuen LUIS-Ressourcen erstellen. Eine neuere Version von Language Understanding ist jetzt als Teil von Azure KI Language verfügbar.

Conversational Language Understanding (CLU), ein Feature von Azure KI Language, ist die aktualisierte Version von LUIS. Weitere Informationen zu Language Understanding im Bot Framework-SDK finden Sie unter Natürliches Sprachverständnis.

  • In der Praxis sollte die Ansicht für jede Metrik getrennt werden.
  • Absichten mit hohem Beliebtheitswert sollten optimiert werden, um die Benutzerfreundlichkeit zu erhöhen.
  • Niedrige Durchschnittsscores deuten auf unzureichende Anerkennung und möglicherweise auf eine fehlende tatsächliche Benutzerabsicht hin.
// show total intents
let queryStartDate = ago(14d);
let queryEndDate = now();
customEvents
| where timestamp > queryStartDate
| where timestamp < queryEndDate
| where name startswith "LuisResult"
| extend intentName = tostring(customDimensions['intent'])
| extend intentScore = todouble(customDimensions['intentScore'])
| summarize ic=count(), ac=avg(intentScore)*100 by intentName
| project intentName, ic, ac
| order by ic desc nulls last
| render barchart with (kind=unstacked, xcolumn=intentName, ycolumns=ic,ac, title="Intents Popularity")

Beispielergebnisse für Abfrageergebnisse mit Absichten nach Beliebtheit

Beispieldiagramm der Absichtspopularität.

Interpretation: Die am häufigsten verwendete Absicht wird beispielsweise nur mit 23 % Konfidenz im Durchschnitt erkannt.

Tipp

Balkendiagramme sind nur eine von Dutzenden Optionen, die für Kusto-Abfragen verfügbar sind. Andere Optionen sind Anomaliediagramme, Bereichsdiagramme, Spaltendiagramme, Zeilendiagramme oder Punktdiagramme. Weitere Informationen finden Sie im Thema zum Renderoperator .

Schema der Instrumentierung von Botanalysen

Die folgenden Tabellen zeigen die gängigsten Felder, in denen Ihr Bot Telemetriedaten protokolliert.

Allgemeine Felder

Gängige Log Analytics-Felder bei der Application Insights-Instrumentierung.

Feld Beschreibung Beispielwerte
name Nachrichtentyp BotMessageSend, BotMessageReceived, LuisResult, WaterfallStep, WaterfallStart, SkillWebSocketProcessRequestLatency, SkillWebSocketOpenCloseLatency, WaterfallComplete, QnaMessage, WaterfallCancel, SkillWebSocketTurnLatency, AuthPromptValidatorAsyncFailure
customDimensions SDK-Bot-Analyse activityId=<id>, activityType=message, channelId=emulator, fromId=<id>, fromName=User, locale=en-us, recipientId=<id>, recipientName=Bot, text=find a coffee shop
Zeitstempel Zeitpunkt des Ereignisses 2019-09-05T18:32:45.287082Z
instance_Id Unterhaltungs-ID f7b2c416-a680-4b2c-b4cc-79c0f03d8711
operation_Id ID abgeben 084b2856947e3844a5a18a8476d99aaa
user_Id Eindeutige Kanalbenutzer-ID emulator7c259c8e-2f47...
client_IP Client-IP-Adresse 127.0.0.1 (kann aufgrund einer Datenschutzsperre fehlen)
client_City Ort des Kunden Redmond (sofern erkannt, kann fehlen)

Hinweis

Azure KI QnA Maker wird am 31. März 2025 eingestellt. Ab dem 01. Oktober 2022 können Sie keine neuen QnA Maker-Ressourcen oder Wissensdatenbanken mehr erstellen. Eine neuere Version der Funktionalität „Fragen und Antworten“ ist jetzt als Teil von Azure KI Language verfügbar.

Benutzerdefiniertes Fragen und Antworten, eine Azure KI Language-Funktion, ist die aktualisierte Version des QnA Maker-Diensts. Weitere Informationen zur Unterstützung von Fragen und Antworten im Bot Framework SDK finden Sie unter Natürliches Sprachverständnis.

Hinweis

Language Understanding (LUIS) wird am 1. Oktober 2025 eingestellt. Ab dem 1. April 2023 können Sie keine neuen LUIS-Ressourcen erstellen. Eine neuere Version von Language Understanding ist jetzt als Teil von Azure KI Language verfügbar.

Conversational Language Understanding (CLU), ein Feature von Azure KI Language, ist die aktualisierte Version von LUIS. Weitere Informationen zu Language Understanding im Bot Framework-SDK finden Sie unter Natürliches Sprachverständnis.

Benutzerdefinierte Dimensionen

Die meisten botspezifischen Aktivitätsdaten werden im Feld customDimensions gespeichert.

Feld Beschreibung Beispielwerte
activityId Meldungs-ID <id>: 8da6d750-d00b-11e9-80e0-c14234b3bc2a
activityType Typ der Nachricht message, conversationUpdate, event, invoke
channelId Kanalbezeichner emulator, directline, msteams, webchat
fromId Ab-Bezeichner <id>
fromName Benutzername vom Kunden John Bonham, Keith Moon, Steve Smith, Steve Gadd
locale Gebietsschema des Client-Ursprungs en-us, zh-cn, en-GB, de-de, zh-CN
recipientId Empfängerbezeichner <id>
recipientName Empfängername John Bonham, Keith Moon, Steve Smith, Steve Gadd
Text Text in Nachricht find a coffee shop

Benutzerdefinierte Dimensionen: LUIS

Hinweis

Language Understanding (LUIS) wird am 1. Oktober 2025 eingestellt. Ab dem 1. April 2023 können Sie keine neuen LUIS-Ressourcen erstellen. Eine neuere Version von Language Understanding ist jetzt als Teil von Azure KI Language verfügbar.

Conversational Language Understanding (CLU), ein Feature von Azure KI Language, ist die aktualisierte Version von LUIS. Weitere Informationen zu Language Understanding im Bot Framework-SDK finden Sie unter Natürliches Sprachverständnis.

Die LUIS-Instrumentierung speichert ihre Daten in den folgenden Feldern für benutzerdefinierte Dimensionen.

Feld Beschreibung Beispielwerte
Absicht Von LUIS erkannte Absicht pointOfInterestSkill
intentScore Score der LUIS-Erkennung 0.98
Entitäten Von LUIS erkannte Entitäten FoodOfGrocery = [["coffee"]], KEYWORD= ["coffee shop"]
Frage Von LUIS erkannte Frage find a coffee shop
sentimentLabel Von LUIS erkannte Stimmung Positiv

Benutzerdefinierte Dimensionen: QnAMaker

Hinweis

Azure KI QnA Maker wird am 31. März 2025 eingestellt. Ab dem 01. Oktober 2022 können Sie keine neuen QnA Maker-Ressourcen oder Wissensdatenbanken mehr erstellen. Eine neuere Version der Funktionalität „Fragen und Antworten“ ist jetzt als Teil von Azure KI Language verfügbar.

Benutzerdefiniertes Fragen und Antworten, eine Azure KI Language-Funktion, ist die aktualisierte Version des QnA Maker-Diensts. Weitere Informationen zur Unterstützung von Fragen und Antworten im Bot Framework SDK finden Sie unter Natürliches Sprachverständnis.

Die QnAMaker-Instrumentierung speichert ihre Daten in den folgenden Feldern für benutzerdefinierte Dimensionen.

Tipp

Um die Protokollierung von persönlichen Informationen wie Fragen und Antworten zu ermöglichen, sollte der Parameter für persönliche Informationen im Konstruktor der QnA Maker-Klasse auf "true" festgelegt werden.

Feld Beschreibung Beispielwerte
question Von QnA erkannte Frage what can you do?
answer QnA-Antwort You have questions, I may have answers.
articleFound QnA true
questionId QnA-Frage-ID 488
knowledgeBaseId QnA KB-ID 2a4936f3-b2c8-44ff-b21f-67bc413b9727
matchedQuestion Array mit passenden Fragen ["Können Sie mir erklären, was Ihre Rolle ist?","Können Sie mir ein bisschen über sich selbst sagen?","Können Sie mir etwas über Dich sagen?","könnten Sie mir helfen","hmmm so was können Sie tun?","Wie können Sie mir helfen?","Wie können Sie mir helfen?","Wie können Sie mir helfen?","Wie kann ich Ihnen helfen?","so wie kann ich Sie in meinen Projekten verwenden?", "Sprechen Sie mit mir über Ihre Fähigkeit","Was sind Sie in der Lage?", ...]

Weitere Informationen