Udostępnij za pośrednictwem


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 queryStartDatequeryEndDate 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

Przykładowy wykres liczby użytkowników w danym okresie.

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 querystartdatequeryEndDate 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

Przykładowy wykres aktywności na okres.

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

Przykładowy wykres okien dialogowych uruchomionych i zakończonych 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

Przykładowy wykres podsumowania dla niekompletnych okien dialogowych.

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

Przykładowy wykres czasu trwania okna dialogowego.

Ś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 i count 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

Przykładowy wykres użycia kanału.

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

Przykładowy wykres popularności intencji.

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ż