Analizowanie danych telemetrycznych bota
DOTYCZY: ZESTAW SDK w wersji 4
Analizowanie zachowania bota
Poniższa kolekcja zapytań może służyć do analizowania zachowania bota. Kolekcji można używać do tworzenia niestandardowych zapytań w usłudze Azure Monitor Log Analytics oraz do tworzenia pulpitów nawigacyjnych monitorowania i wizualizacji usługi Power BI .
Wymagania wstępne
Warto mieć podstawową wiedzę na temat następujących pojęć:
- Zapytania Kusto
- Jak używać usługi Log Analytics w witrynie Azure Portal do zapisywania zapytań dzienników usługi Azure Monitor
- Podstawowe pojęcia dotyczące zapytań dzienników w usłudze Azure Monitor
Napiwek
Jeśli utworzysz bota przy użyciu narzędzi, takich jak Copilot Studio lub Composer, użyj wersji okna dialogowego adaptacyjnego dla każdego zapytania, jeśli jest dostępne.
Pulpity nawigacyjne
Pulpity nawigacyjne platformy Azure oferują doskonały sposób wyświetlania i udostępniania informacji wygenerowanych na podstawie zapytań. Możesz tworzyć niestandardowe pulpity nawigacyjne, aby ułatwić monitorowanie aktywności botów przez skojarzenie zapytań z kafelkami dodanymi do pulpitu nawigacyjnego. Aby uzyskać więcej informacji na temat pulpitów nawigacyjnych i sposobu kojarzenia zapytań z nimi, zobacz Tworzenie i udostępnianie pulpitów nawigacyjnych danych usługi Log Analytics. W pozostałej części tego artykułu przedstawiono przykłady niektórych zapytań, które mogą być przydatne podczas monitorowania zachowania botów.
Przykładowe zapytania Kusto
Uwaga
Zaleca się przestawienia na różne wymiary, takie jak okres, kanał i ustawienia regionalne dla wszystkich zapytań w tym artykule.
Liczba użytkowników na okres
W tym przykładzie przedstawiono wykres liniowy, który pokazuje liczbę różnych użytkowników komunikujących się z botem dziennie w ciągu ostatnich 14 dni. Okres można łatwo zmienić, przypisując różne wartości do queryStartDate
queryEndDate
zmiennych i interval
.
Ważne
W tym zapytaniu uzyskasz tylko poprawną liczbę unikatowych użytkowników, jeśli są uwierzytelnieni użytkownicy, a wyniki mogą również zależeć od możliwości kanału.
// 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
Napiwek
Operator podsumowania Kusto służy do tworzenia tabeli, która agreguje zawartość tabeli wejściowej.
Funkcja Bin jest funkcją skalarną Kusto, która w połączeniu z elementem summarize operator
spowoduje zgrupowanie wyników zapytania w określoną wartość. W powyższym przykładzie jest to pogrupowane według dnia, usługa Kusto będzie również akceptować h=hours, m=minutes, s=seconds, ms=milisekundy, mikrosekundy=mikrosekundy.
Operator renderowania umożliwia łatwe renderowanie wykresów, takich jak wykres czasowy, wykres liniowy, na którym oś x jest datą/godziną, a każda inna kolumna liczbowa może być używana dla osi y. Automatycznie zachowuje odstęp osi x, nawet jeśli dane nie mają określonego czasu. Jeśli nie jest używana instrukcja renderowania, wartość domyślna to table
.
Przykładowe wyniki zapytania liczby użytkowników na okres
Działanie na okres
W tym przykładzie pokazano, jak mierzyć liczbę działań na żądany wymiar, na przykład liczbę konwersacji, okien dialogowych lub wiadomości dziennie w ciągu ostatnich 14 dni. Okres można łatwo zmienić, przypisując różne wartości do querystartdate
queryEndDate
zmiennych i interval
. Żądany wymiar jest definiowany przez klauzulę extend
w poniższym przykładzie, metric
można ustawić na InstanceId, DialogId lub activityId.
Przypisz metryki do wymiaru, który chcesz wyświetlić:
- InstanceId mierzy liczbę konwersacji
- Identyfikator dialogowy mierzy liczbę okien dialogowych
- ActivityId mierzy liczbę komunikatów
// 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
Napiwek
Operator rozszerzenia Kusto służy do tworzenia kolumn obliczeniowych i dołączania ich do zestawu wyników.
Przykładowe wyniki zapytania dla poszczególnych okresów
Aktywność na użytkownika na okres
W tym przykładzie pokazano, jak zliczyć liczbę działań na użytkownika na okres. To zapytanie przechodzi do szczegółów działania na zapytanie okresowe , aby skoncentrować się na aktywności na użytkownikach w danym okresie. Działania obejmują okna dialogowe, konwersacje lub wiadomości. To zapytanie mierzy interakcję użytkownika z botem, co może pomóc w znalezieniu potencjalnych problemów, takich jak:
- Dni z dużą częścią aktywności jednego użytkownika mogą oznaczać atak lub test
- Dni z małą interakcją mogą wskazywać na problemy z kondycją usługi
Napiwek
Możesz usunąć przez user_Id , aby uzyskać ogólny wolumin aktywności bota, który może być przestawiany na czas i okna dialogowe, wiadomości lub konwersacje.
// 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
Przykładowe wyniki zapytania dla poszczególnych użytkowników
user_Id | Sygnatury czasowej | Licznik |
---|---|---|
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 |
Uzupełnianie okna dialogowego
Po ustawieniu klienta telemetrii dla okna dialogowego okno dialogowe (i jego elementy podrzędne) będzie emitować niektóre domyślne dane telemetryczne, takie jak uruchomione i ukończone. Ten przykład może służyć do mierzenia ukończonych okien dialogowych względem uruchomionych okien dialogowych. Jeśli liczba uruchomionych okien dialogowych jest większa niż liczba ukończonych, niektórzy użytkownicy nie kończą przepływu okna dialogowego. To zapytanie ułatwia identyfikowanie i rozwiązywanie problemów z dowolną potencjalną logiką okna dialogowego. Może również służyć do identyfikowania najczęściej używanych okien dialogowych.
Napiwek
Jeśli utworzysz bota przy użyciu narzędzi, takich jak Copilot Studio lub Composer, należy użyć adaptacyjnej wersji okna dialogowego każdego zapytania.
Uzupełnianie okna dialogowego kaskadowego
// % 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)
Napiwek
Operator sprzężenia Kusto służy do scalania wierszy dwóch tabel w celu utworzenia nowej tabeli przez dopasowanie wartości określonych kolumn z każdej tabeli.
Operator projektu służy do wybierania pól, które mają być wyświetlane w danych wyjściowych. Podobnie jak w przypadku extend operator
dodawania nowego pola, project operator
można wybrać spośród istniejącego zestawu pól lub dodać nowe pole.
Okna dialogowe adaptacyjne zostały uruchomione i ukończone
// % 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)
Przykładowe wyniki zapytania uzupełniania okien dialogowych
Uzupełnianie okna dialogowego
Ten przykład może służyć do zliczania liczby przepływów okien dialogowych, które zostały uruchomione, ale nigdy nie zostały ukończone z powodu anulowania lub porzucenia w określonym przedziale czasu. Można go użyć do przeglądania niekompletnych okien dialogowych i sprawdzania, czy zostały one aktywnie anulowane z powodu nieporozumień użytkowników, czy porzuconych z powodu rozproszenia uwagi użytkownika lub utraty zainteresowania.
Okna dialogowe kaskadowe nie zostały ukończone
// 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
Okna dialogowe adaptacyjne nie zostały ukończone
// 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
Napiwek
Operator kolejności Kusto (taki sam jak sort operator
) służy do sortowania wierszy tabeli wejściowej w kolejności według co najmniej jednej kolumny. Uwaga: jeśli chcesz wykluczyć wartości null z wyników dowolnego zapytania, możesz je odfiltrować w where
instrukcji, na przykład dodać ciąg "and isnotnull(Timestamp)" lub zwrócić wartości null na początku lub na końcu, dodać lub nulls first
nulls first
na końcu instrukcji order.
Przykładowe wyniki zapytania w oknie dialogowym
Przechodzenie do szczegółów sekwencji okien dialogowych
Kaskadowy start/krok/ukończenie okna dialogowego w konwersacji
W tym przykładzie przedstawiono sekwencję kroków okna dialogowego pogrupowanych według konwersacji (instanceId), co może być przydatne podczas określania, które kroki prowadzą do przerw w działaniu okna dialogowego.
Uruchom to zapytanie, wprowadź wartość żądanego DialogId
elementu zamiast identyfikatora <SampleDialogId>
// 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>")
Napiwek
To zapytanie zostało napisane przy użyciu funkcji zdefiniowanej przez zapytanie, która jest funkcją zdefiniowaną przez użytkownika, która jest zdefiniowana i używana w zakresie pojedynczego zapytania i jest definiowana za pomocą instrukcji let. To zapytanie napisane bez użycia elementu query-defined function
:
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
Przykładowe wyniki zapytania
timestamp | name | StepName | InstanceId |
---|---|---|---|
2019-08-23T20:04... | Start kaskadowy | null | ... 79c0f03d8701 |
2019-08-23T20:04... | Kaskadowykrok | GetPointOfInterestLocations | ... 79c0f03d8701 |
2019-08-23T20:04... | Kaskadowykrok | ProcessPointOfInterestSelection | ... 79c0f03d8701 |
2019-08-23T20:04... | Kaskadowykrok | GetRoutesToDestination | ... 79c0f03d8701 |
2019-08-23T20:05... | Kaskadowykrok | ResponseToStartRoutePrompt | ... 79c0f03d8701 |
2019-08-23T20:05... | WaterfallComplete 1 | null | ... 79c0f03d8701 |
2019-08-28T23:35... | Start kaskadowy | null | ... 6ac8b3211b99 |
2019-08-28T23:35... | WaterfallStep 2 | GetPointOfInterestLocations | ... 6ac8b3211b99 |
2019-08-28T19:41... | Start kaskadowy | null | ... 8137d76a5cbb |
2019-08-28T19:41... | WaterfallStep 2 | GetPointOfInterestLocations | ... 8137d76a5cbb |
2019-08-28T19:41... | Start kaskadowy | null | ... 8137d76a5cbb |
1 Ukończono
2 Porzucone
Interpretacja: użytkownicy wydają się porzucić konwersację w kroku GetPointOfInterestLocations.
Uwaga
Okna dialogowe kaskadowe wykonują sekwencję (uruchamianie, wiele kroków, ukończenie). Jeśli sekwencja pokazuje początek bez ukończenia, oznacza to, że okno dialogowe zostało przerwane z powodu porzucenia lub anulowania okna dialogowego przez użytkownika. W tej szczegółowej analizie można zobaczyć to zachowanie (zobacz ukończone i porzucone kroki).
Kaskadowy start/krok/ukończenie/anulowanie kroków agregacji sum
W tym przykładzie pokazano zagregowane sumy łącznej liczby uruchomień sekwencji okien dialogowych, łączną łączną liczbę kroków kaskadowych, liczbę zakończonych pomyślnie, liczbę anulowanych elementów oraz różnicę między elementem WaterfallStart i łączną sumą WaterfallComplete plus WaterfallCancel daje łączną liczbę porzuconą.
// 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>")
Przykładowe wyniki zapytania zagregowanego kaskadowo
name | count |
---|---|
Start kaskadowy | 21 |
Kaskadowykrok | 47 |
WaterfallComplete | 11 |
KaskadowyCancel | 1 |
Interpretacja: Z 21 wywołań sekwencji okien dialogowych tylko 11 zostało ukończonych, 9 zostało porzuconych, a jeden został anulowany przez użytkownika.
Średni czas trwania w oknie dialogowym
W tym przykładzie mierzy średnią ilość czasu spędzanego przez użytkowników w danym oknie dialogowym. Bot może skorzystać z uproszczenia okien dialogowych, które długo potrwają przez użytkownika.
// 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")
Przykładowe wyniki zapytania o średnim czasie trwania
Średnie kroki w oknie dialogowym
W tym przykładzie przedstawiono "długość" każdego wywoływanego okna dialogowego obliczonego według średniej, minimalnej, maksymalnej i odchylenia standardowego. Może to pomóc w analizie jakości okna dialogowego. Na przykład:
- Okna dialogowe z zbyt wieloma krokami należy ocenić pod kątem możliwości uproszczenia.
- Okna dialogowe z szerokim odstępem między minimalną/maksymalną/średnią mogą oznaczać, że użytkownicy będą w stanie zatrzymać próbę wykonania zadań. Może być konieczne oszacowanie, czy istnieją krótsze ścieżki do ukończenia zadań lub sposoby zmniejszenia złożoności okna dialogowego.
- Okna dialogowe z dużym odchyleniem standardowym sugerują złożone ścieżki lub przerwane środowisko (porzucenie/anulowanie).
- Okna dialogowe z kilkoma krokami mogą być takie, ponieważ nigdy nie zostały ukończone. Analizowanie współczynników ukończenia/porzucania może pomóc w ustaleniu tego celu.
// 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
Przykładowe wyniki zapytania average-steps
Identyfikator okna dialogowego | średnia liczba kroków | minimalna liczba kroków | maksymalna liczba kroków | odchylenie standardowe | średnia krótka według kroków | średnia krótka o procent |
---|---|---|---|---|---|---|
FindArticlesDialog | 6,2 | 2 | 7 | 2.04 | 0,8 | 11.4% |
CreateTicket | 4.3 | 2 | 5 | 1.5 | 0,7 | 18% |
CheckForCurrentLocation | 3.9 | 2 | 5 | 1.41 | 1.1 | 22% |
Uwierzytelnianie podstawowe | 3.3 | 2 | 4 | 1,03 | 0,7 | 17.5% |
onboarding | 2.7 | 2 | 4 | 0.94 | 1.3 | 32.5% |
__Interpretation: Na przykład funkcja FindArticlesDialog ma szeroki zakres między minimalną/maksymalną wartością i powinna zostać zbadana i ewentualnie przeprojektowana i zoptymalizowana.
Działanie kanału według metryki działania
W tym przykładzie mierzy ilość aktywności, jaką bot otrzymuje na kanał w danym okresie. Robi to przez zliczanie jednej z następujących metryk: przychodzących komunikatów, użytkowników, konwersacji lub okien dialogowych. Może to być przydatne w przypadku analizy kondycji usługi lub mierzenia popularności kanałów.
// 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
Napiwek
Warto rozważyć wypróbowanie tych odmian:
- Uruchom zapytanie bez zasobnika sygnatury czasowej:
bin(timestamp, groupByInterval)
. - Można również użyć
dcount
dla unikatowych użytkowników icount
dla wszystkich działań zdarzeń użytkownika. Działa to również w przypadku powtarzających się użytkowników.
Przykładowe wyniki zapytania channel-activity-by-activity
Interpretacja: Testowanie emulatora używane do najpopularniejszych, ale gdy poszliśmy na żywo, DirectLineSpeech, jest najpopularniejszym kanałem.
Łączna liczba intencji według popularności
Ten przykład dotyczy botów z obsługą usługi LUIS. Przedstawia podsumowanie wszystkich intencji według popularności i odpowiedniego wyniku pewności wykrywania intencji.
Uwaga
Usługa Language Understanding (LUIS) zostanie wycofana 1 października 2025 r. Od 1 kwietnia 2023 r. nie będzie można tworzyć nowych zasobów usługi LUIS. Nowsza wersja interpretacji języka jest teraz dostępna w ramach języka sztucznej inteligencji platformy Azure.
Język konwersacyjny (CLU), funkcja języka AI platformy Azure, to zaktualizowana wersja usługi LUIS. Aby uzyskać więcej informacji na temat obsługi języka w zestawie SDK platformy Bot Framework, zobacz Opis języka naturalnego.
- W praktyce widok powinien być oddzielony dla każdej metryki.
- Popularne ścieżki intencji powinny być zoptymalizowane pod kątem środowiska użytkownika.
- Niskie średnie wyniki wskazują słabe rozpoznawanie i możliwe brak rzeczywistej intencji użytkownika.
// 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")
Przykładowe wyniki zapytań o intencje według popularności
Interpretacja: Na przykład najpopularniejsza intencja potwierdza, że jest wykrywana tylko z 23% ufnością średnio.
Napiwek
Wykresy Barchart są jedną z kilkunastu opcji dostępnych w zapytaniach Kusto. Niektóre inne opcje to: anomalychart, areachart, columnchart, linechart, scatterchart. Aby uzyskać więcej informacji, zobacz temat operator renderowania.
Schemat instrumentacji analizy botów
W poniższych tabelach przedstawiono najbardziej typowe pola, do których bot będzie rejestrować dane telemetryczne.
Koperta ogólna
Typowe pola analizy dzienników w instrumentacji usługi Application Insights.
Pole | Opis | Przykładowe wartości |
---|---|---|
name | Typ wiadomości | BotMessageSend, BotMessageReceived, LuisResult, WaterfallStep, WaterfallStart, SkillWebSocketProcessRequestLatency, SkillWebSocketOpenCloseLatency, WaterfallComplete, QnaMessage, WaterfallCancel, SkillWebSocketTurnLatency, AuthPromptValidatorAsyncFailure |
customDimensions | SDK Bot Analytics | activityId=id>, activityType=<message, channelId=emulator, fromId=<id>, fromName=User, locale=en-us, recipientId=<id>, recipientName=Bot, text=find a coffee shop |
timestamp | Czas zdarzenia | 2019-09-05T18:32:45.287082Z |
instance_Id | Identyfikator konwersacji | f7b2c416-a680-4b2c-b4cc-79c0f03d8711 |
operation_Id | Identyfikator włączania | 084b2856947e3844a5a18a8476d99aaa |
user_Id | Unikatowy identyfikator użytkownika kanału | emulator7c259c8e-2f47... |
client_IP | Adres IP klienta | 127.0.0.1 (może być nieobecny z powodu blokady prywatności) |
client_City | Miasto klienta | Redmond (jeśli wykryto, może być nieobecny) |
Uwaga
Usługa Azure AI QnA Maker zostanie wycofana 31 marca 2025 r. Od 1 października 2022 r. nie będzie można tworzyć nowych zasobów ani baz wiedzy w programie QnA Maker. Nowsza wersja funkcji pytań i odpowiedzi jest teraz dostępna w ramach języka sztucznej inteligencji platformy Azure.
Niestandardowe odpowiadanie na pytania, funkcja języka azure AI, to zaktualizowana wersja usługi QnA Maker. Aby uzyskać więcej informacji na temat obsługi pytań i odpowiedzi w zestawie SDK platformy Bot Framework, zobacz Opis języka naturalnego.
Uwaga
Usługa Language Understanding (LUIS) zostanie wycofana 1 października 2025 r. Od 1 kwietnia 2023 r. nie będzie można tworzyć nowych zasobów usługi LUIS. Nowsza wersja interpretacji języka jest teraz dostępna w ramach języka sztucznej inteligencji platformy Azure.
Język konwersacyjny (CLU), funkcja języka AI platformy Azure, to zaktualizowana wersja usługi LUIS. Aby uzyskać więcej informacji na temat obsługi języka w zestawie SDK platformy Bot Framework, zobacz Opis języka naturalnego.
Wymiary niestandardowe
Większość danych działań specyficznych dla bota jest przechowywana w polu customDimensions .
Pole | Opis | Przykładowe wartości |
---|---|---|
activityId | Identyfikator komunikatu | <id>: 8da6d750-d00b-11e9-80e0-c14234b3bc2a |
activityType | Typ wiadomości | message, conversationUpdate, event, invoke |
channelId | Identyfikator kanału | emulator, directline, msteams, webchat |
fromId | Identyfikator początkowy | <id> |
fromName | Nazwa użytkownika z klienta | John Bonham, Keith Moon, Steve Smith, Steve Gadd |
locale | Ustawienia regionalne pochodzenia klienta | en-us, zh-cn, en-GB, de-de, zh-CN |
recipientId | Identyfikator adresata | <id> |
recipientName | Imię i nazwisko adresata | John Bonham, Keith Moon, Steve Smith, Steve Gadd |
text | Tekst w komunikacie | znajdź kawiarnię |
Wymiary niestandardowe: LUIS
Uwaga
Usługa Language Understanding (LUIS) zostanie wycofana 1 października 2025 r. Od 1 kwietnia 2023 r. nie będzie można tworzyć nowych zasobów usługi LUIS. Nowsza wersja interpretacji języka jest teraz dostępna w ramach języka sztucznej inteligencji platformy Azure.
Język konwersacyjny (CLU), funkcja języka AI platformy Azure, to zaktualizowana wersja usługi LUIS. Aby uzyskać więcej informacji na temat obsługi języka w zestawie SDK platformy Bot Framework, zobacz Opis języka naturalnego.
Instrumentacja usługi LUIS przechowuje swoje dane w następujących polach Wymiarów niestandardowych.
Pole | Opis | Przykładowe wartości |
---|---|---|
Intencja | Wykryta intencja usługi LUIS | pointOfInterestSkill |
intentScore | Wynik rozpoznawania usługi LUIS | 0,98 |
Jednostki | Wykryte jednostki usługi LUIS | FoodOfGrocery = [["coffee"]], KEYWORD= ["kawiarnia"] |
Pytanie | Wykryto pytanie w usłudze LUIS | znajdź kawiarnię |
sentimentLabel | Wykryto tonację w usłudze LUIS | positive |
Wymiary niestandardowe: QnAMaker
Uwaga
Usługa Azure AI QnA Maker zostanie wycofana 31 marca 2025 r. Od 1 października 2022 r. nie będzie można tworzyć nowych zasobów ani baz wiedzy w programie QnA Maker. Nowsza wersja funkcji pytań i odpowiedzi jest teraz dostępna w ramach języka sztucznej inteligencji platformy Azure.
Niestandardowe odpowiadanie na pytania, funkcja języka azure AI, to zaktualizowana wersja usługi QnA Maker. Aby uzyskać więcej informacji na temat obsługi pytań i odpowiedzi w zestawie SDK platformy Bot Framework, zobacz Opis języka naturalnego.
Instrumentacja QnAMaker przechowuje swoje dane w następujących polach Wymiarów niestandardowych.
Napiwek
Aby włączyć rejestrowanie informacji osobistych, takich jak pytania i odpowiedzi, parametr informacji osobistych dziennika powinien być ustawiony na wartość true w konstruktorze klasy QnA Maker .
Pole | Opis | Przykładowe wartości |
---|---|---|
pytanie | Pytanie wykryte przez usługę QnA | co możesz zrobić? |
answer | Odpowiedź pytań i odpowiedzi | Masz pytania, może mam odpowiedzi. |
artykułFound | Pytania i odpowiedzi | prawda |
questionId | Identyfikator pytania pytań i odpowiedzi | 488 |
knowledgeBaseId | Identyfikator bazy wiedzy usługi QnA | 2a4936f3-b2c8-44ff-b21f-67bc413b9727 |
matchedQuestion | Tablica dopasowanych pytań | ["Czy możesz mi wyjaśnić, jaka jest Twoja rola?", "Czy możesz mi coś o sobie powiedzieć?", "Czy mogę mi powiedzieć?", "czy mogę mi pomóc", "hmmm, więc co możesz zrobić?", "jak możesz mi pomóc", "Jak mogę mi pomóc?","Jak możesz mi pomóc?", więc jak mogę używać cię w moich projektach?", "Porozmawiaj ze mną o możliwościach", "Co jesteś w stanie?", ...] |
Zobacz też
- Aby zapoznać się z samouczkiem dotyczącym pisania zapytań dzienników, zobacz Rozpoczynanie pracy z zapytaniami dzienników w usłudze Azure Monitor
- Wizualizowanie danych z usługi Azure Monitor
- Dowiedz się, jak dodać telemetrię do bota
- Dowiedz się więcej o zapytaniach dzienników usługi Azure Monitor
- Pełna lista zdarzeń usługi Application Insights platformy Bot Framework
- Tworzenie i udostępnianie pulpitów nawigacyjnych z danymi usługi Log Analytics