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:
- Kusto-Abfragen
- Verwenden von Log Analytics im Azure-Portal zum Schreiben von Azure Monitor-Protokollabfragen
- Grundlegende Konzepte von Protokollabfragen in Azure Monitor
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
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:
- InstanceId misst die Anzahl von Unterhaltungen.
- DialogId misst die Anzahl von Dialogen.
- ActivityId misst die Anzahl von Nachrichten.
// 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
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
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
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
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
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
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
- Ein Tutorial zum Schreiben von Protokollabfragen finden Sie unter Erste Schritte mit Protokollabfragen in Azure Monitor.
- Visualisieren von Daten aus Azure Monitor
- Hinzufügen von Telemetriefunktionen zu Ihrem Bot
- Protokollabfragen in Azure Monitor
- Vollständige Auflistung der Bot Framework Application Insights-Ereignisse
- Erstellen und Freigeben von Dashboards von Log Analytics-Daten