봇의 원격 분석 데이터 분석

적용 대상: SDK v4

봇 동작 분석

다음 쿼리 컬렉션을 사용하여 봇 동작을 분석할 수 있습니다. 컬렉션을 사용하여 Azure Monitor Log Analytics에서 사용자 지정 쿼리를 작성하고 모니터링 및 Power BI 시각화 대시보드를 만들 수 있습니다.

필수 조건

다음 개념을 기본적으로 이해하는 것이 좋습니다.

Power Virtual Agents 또는 Composer와 같은 도구를 사용하여 봇을 만드는 경우 사용 가능한 경우 각 쿼리의 적응 대화 상자 버전을 사용하려고 합니다.

대시보드

Azure 대시보드는 쿼리에서 생성된 정보를 보고 공유하는 좋은 방법을 제공합니다. 사용자 지정 대시보드를 빌드하여 쿼리를 대시보드에 추가하는 타일과 연결하여 봇 활동을 모니터링할 수 있습니다. 대시보드 및 쿼리를 연결하는 방법에 대한 자세한 내용은 Log Analytics 데이터의 대시보드 만들기 및 공유를 참조하세요. 이 문서의 re기본der는 봇 동작을 모니터링하는 데 유용할 수 있는 일부 쿼리의 예를 보여 줍니다.

Kusto 쿼리 예제

참고 항목

이 문서의 모든 쿼리에 대해 마침표, 채널 및 로캘과 같은 다양한 차원을 피벗하는 것이 좋습니다.

기간당 사용자 수

이 예제에서는 지난 14일 동안 매일 봇과 통신한 고유 사용자 수를 보여 주는 꺾은선형 차트를 만듭니다. 기간은 queryStartDate, queryEndDateinterval 변수에 서로 다른 값을 할당하여 쉽게 변경할 수 있습니다.

Important

인증된 사용자인 경우에만 이 쿼리에서 고유한 사용자 수를 정확하게 확인할 수 있으며, 결과는 채널 기능에 따라 달라질 수도 있습니다.

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

Kusto summarize 연산 자는 입력 테이블의 내용을 집계하는 테이블을 생성하는 데 사용됩니다.

Bin 함수는 Kusto 스칼라 함수로, 쿼리 결과를 지정된 값으로 summarize operator 그룹화합니다. 위의 예제에서는 일 단위로 그룹화되며 Kusto는 h=hours, m=minutes, s=seconds, ms=milliseconds, microsecond=microseconds도 허용합니다.

렌더링 연산자를 사용하면 x축이 날짜/시간인 꺾은선형 차트, y축에 다른 숫자 열을 사용할 수 있는 시간 차트와 같은 차트를 쉽게 렌더링할 수 있습니다. 지정한 시간마다 데이터가 없는 경우에도 x축 간격을 자동으로 유지합니다. render 문이 사용되지 않는 경우 기본값은 .입니다 table.

기간별 사용자 수 쿼리 결과 샘플

Sample chart of number of users per period.

기간당 활동

이 예제에서는 지난 14일 동안의 대화 수, 대화 상자 또는 메시지 수와 같이 원하는 차원당 활동량을 측정하는 방법을 보여 줍니다. 기간은 querystartdate, queryEndDateinterval 변수에 서로 다른 값을 할당하여 쉽게 변경할 수 있습니다. 원하는 차원은 다음 예제의 extend 절에 의해 정의되며 InstanceIdmetric, DialogId 또는 activityId설정할 수 있습니다.

표시할 차원에 메트릭을 할당합니다.

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

Kusto extend 연산 자는 계산 열을 만들고 결과 집합에 추가하는 데 사용됩니다.

기간별 샘플 작업 쿼리 결과

Sample chart of activity per period.

기간별 사용자당 활동

이 예제에서는 기간당 사용자당 활동 수를 계산하는 방법을 보여 줍니다. 이 쿼리는 기간별 작업 쿼리로 드릴다운하여 기간 당 사용자별 활동에 집중합니다. 활동에는 대화, 대화 또는 메시지가 포함됩니다. 이 쿼리는 다음과 같은 잠재적인 문제를 찾는 데 도움이 될 수 있는 봇과의 사용자 상호 작용을 측정합니다.

  • 단일 사용자에 의한 활동이 많은 날은 공격 또는 테스트를 의미할 수 있습니다.
  • 상호 작용이 거의 없는 날은 서비스 상태 문제를 나타낼 수 있습니다.

user_Id 제거하면 시간 및 대화 상자, 메시지 또는 대화에서 피벗할 수 있는 일반 봇 활동 볼륨을 가져올 수 있습니다.

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

기간별 사용자별 샘플 작업 쿼리 결과

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

대화 상자 완성

대화 상자에 대한 원격 분석 클라이언트가 설정되면 대화 상자(및 해당 자식)에서 시작됨완료됨과 같은 몇 가지 기본 원격 분석 데이터를 내보냅니다. 이 예제를 사용하여 시작된 대화 상자를 기준으로 완료된 대화 상자를 측정수 있습니다. 시작된 대화 상자 수가 완료된 수보다 크면 일부 사용자가 대화 흐름을 완료하지 않습니다. 이 쿼리를 사용하여 잠재적인 대화 논리를 식별하고 문제를 해결할 수 있습니다. 가장 자주 사용되지 않는 대화 상자를 식별하는 데 사용할 수도 있습니다.

Power Virtual Agents 또는 Composer와 같은 도구를 사용하여 봇을 만드는 경우 각 쿼리의 적응형 대화 상자 버전을 사용하는 것이 좋습니다.

폭포 대화 상자 완성

// % 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)

Kusto 조인 연산 자는 두 테이블의 행을 병합하여 각 테이블의 지정된 열 값을 일치시켜 새 테이블을 형성하는 데 사용됩니다.

프로젝트 연산자는 출력에 표시할 필드를 선택하는 데 사용됩니다. 새 필드를 추가하는 extend operator와 마찬가지로 project operator는 기존 필드 세트에서 선택하거나 새 필드를 추가할 수 있습니다.

적응형 대화 시작 및 완료

// % Completed adaptive dialog: shows completes relative to starts. This type is the default dialog type when using Power Virtual Agents 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)

샘플 대화 상자 완성 쿼리 결과

Sample chart of dialogs started and dialogs completed.

대화 상자 미완성

다음 예제는 지정된 기간 동안 취소 또는 중단으로 인해 시작되었지만 완료되지 않은 대화 상자 흐름의 수를 계산하는 데 사용할 수 있습니다. 이 대화 상자를 사용하여 불완전한 대화 상자를 검토하고 사용자 혼란으로 인해 적극적으로 취소되었는지 또는 사용자의 주의 산만 또는 관심 손실로 인해 중단되었는지 검사할 수 있습니다.

폭포 대화가 완료되지 않음

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

적응형 대화가 완료되지 않음

// Show incomplete dialogs for adaptive dialogs; this type is the default dialog type when using Power Virtual Agents 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

Kusto 순서 연산자 (동일 sort operator)는 입력 테이블의 행을 하나 이상의 열로 순서대로 정렬하는 데 사용됩니다. 참고: 쿼리 결과에서 null 값을 제외하려는 경우 문에서 where 필터링할 수 있습니다. 예를 들어 "and isnotnull(Timestamp)"을 추가하거나 시작 또는 끝에 null 값을 반환하려면 order 문의 끝부분에 nulls first null 값을 추가하거나 nulls first 추가할 수 있습니다.

샘플 대화 상자 완성 쿼리 결과

Sample summary chart for incomplete dialogs.

대화 상자 시퀀스 드릴다운

대화 상자의 폭포 시작/단계/완료

이 예제에서는 대화 중단으로 이어지는 단계를 결정하는 데 유용할 수 있는 대화(instanceId)로 그룹화된 대화 단계의 시퀀스를 보여 줍니다.

이 쿼리를 실행하고 SampleDialogId 대신 <원하는 DialogId 값을 입력합니다.>

// 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>")

이 쿼리는 단일 쿼리 범위 내에서 정의되고 사용되며 let 문을 통해 정의된 사용자 정의 함수인 쿼리 정의 함수를 사용하여 작성되었습니다. 다음 쿼리는 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
샘플 쿼리 결과
timestamp 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완료됨

2버려진

해석: GetPointOfInterestLocations 단계에서 사용자가 대화를 중단하는 것 같습니다.

참고 항목

폭포 대화 상자는 시퀀스를 실행합니다(시작, 여러 단계, 완료). 시퀀스에서 시작이 완료되지 않은 것으로 표시되면 사용자가 대화 상자를 중단하거나 취소하여 대화 상자가 중단되었음을 의미합니다. 이 자세한 분석에서는 이 동작을 확인할 수 있습니다(완료된 단계와 중단된 단계 참조).

폭포 시작/단계/완료/취소 단계 집계의 합계

이 예제에서는 대화 시퀀스가 시작된 총 횟수, 총 폭포 단계 수, 성공적으로 완료된 단계 수, 취소된 횟수, WaterfallStart와 WaterfallCompleteWaterfallCancel총 합계 간의 차이를 합산하여 중단된 총 수를 보여 줍니다.

// 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>")
샘플 폭포 집계 쿼리 결과
이름 count
WaterfallStart 21
WaterfallStep 47
WaterfallComplete 11
WaterfallCancel 1

해석: 대화 시퀀스 호출 21개 중 11개만 완료되었고 9개는 중단되었으며 1개는 사용자가 취소했습니다.

대화 상자의 평균 기간

다음 예제에서는 사용자가 지정된 대화 상자에서 소비하는 평균 시간을 측정합니다. 봇은 사용자가 완료하는 데 시간이 오래 걸리는 대화 상자를 간소화하는 이점을 얻을 수 있습니다.

// 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")

샘플 평균 기간 쿼리 결과

Sample chart of dialog duration.

대화 상자의 평균 단계

이 예제에서는 호출된 각 대화 상자의 "길이"를 평균, 최소, 최대 및 표준 편차로 계산한 것으로 보여 줍니다. 이를 통해 대화 상자 품질을 분석할 수 있습니다. 예시:

  • 단계가 너무 많은 대화 상자는 단순화 기회를 평가해야 합니다.
  • 최소/최대/평균 사이의 간격이 넓은 대화 상자는 사용자가 작업을 완료하는 데 실패했음을 의미할 수 있습니다. 작업을 완료하는 데 더 짧은 경로가 있을 가능성 또는 대화 상자 복잡성을 줄이는 방법을 평가해야 할 수도 있습니다.
  • 표준 편차가 큰 대화 상자는 복잡한 경로 또는 중단된 환경(중단/취소)을 제안합니다.
  • 단계가 거의 없는 대화 상자는 완료되지 않았기 때문에 그렇게 될 수 있습니다. 완료/포기율을 분석하면 이러한 결정을 내리는 데 도움이 될 수 있습니다.
// 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

샘플 평균 단계 쿼리 결과

대화 상자 ID 평균 단계 수 최소 단계 최대 단계 std avg short by steps 평균 짧게 백분율
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%
온보딩 2.7 2 4 0.94 1.3 32.5%

__Interpretation: 예를 들어 FindArticlesDialog는 min/max 사이에 광범위한 확산을 가지며 조사 및 재설계 및 최적화되어야 합니다.

활동 메트릭별 채널 활동

이 예제에서는 지정된 기간 동안 봇이 채널당 수신하는 활동의 양을 측정합니다. 들어오는 메시지, 사용자, 대화 또는 대화 상자 중 하나를 계산하여 이 작업을 수행합니다. 서비스 상태 분석 또는 채널 인기도 측정에 유용할 수 있습니다.

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

다음과 같은 변형을 시도해 볼 수 있습니다.

  • 타임스탬프 버킷팅 없이 쿼리를 실행합니다. bin(timestamp, groupByInterval)
  • 고유 사용자 및 count 모든 사용자 이벤트 활동에 사용할 dcount 수도 있습니다. 이는 반복 사용자에게도 작동합니다.

샘플 채널 활동별 쿼리 결과

Sample chart of channel usage.

해석: 에뮬레이터 테스트는 예전에는 가장 인기가 있었지만 라이브로 전환되면 DirectLineSpeech가 가장 인기 있는 채널입니다.

인기도별 총 의도

이 예제는 LUIS 사용 봇에 적용됩니다. 인기도별 모든 의도 요약과 해당 의도 감지 확실성 점수를 보여 줍니다.

참고 항목

LUIS(Language Understanding)는 2025년 10월 1일에 사용 중지됩니다. 2023년 4월 1일부터 새 LUIS 리소스를 만들 수 없습니다. 이제 최신 버전의 언어 이해가 Azure AI Language의 일부로 제공됩니다.

Azure AI Language의 기능인 CLU(대화형 언어 이해)는 업데이트된 LUIS 버전입니다. Bot Framework SDK의 언어 이해 지원에 대한 자세한 내용은 자연어 이해를 참조하세요.

  • 실제로 각 메트릭에 대해 뷰를 구분해야 합니다.
  • 인기 있는 의도 경로는 사용자 환경에 맞게 최적화되어야 합니다.
  • 평균 점수가 낮을수록 인식이 좋지만 실제 사용자 의도가 누락된 것일 수 있습니다.
// 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")

샘플 의도별 인기 쿼리 결과

Sample chart of intent popularity.

해석: 예를 들어 가장 인기 있는 의도는 평균 23%의 신뢰도로만 확인됩니다.

Barcharts는 Kusto 쿼리에서 사용할 수 있는 12개 이상의 옵션 중 하나입니다. 다른 옵션으로 anomalychart, isachart, columnchart, linechart, scatterchart가 있습니다. 자세한 내용은 렌더링 연산항목을 참조하세요.

봇 분석 계측의 스키마

다음 표에서는 봇이 원격 분석 데이터를 기록할 가장 일반적인 필드를 보여 줍니다.

일반 봉투(Envelope)

Application Insights 계측의 일반적인 로그 분석 필드입니다.

필드 설명 샘플 값
name 메시지 유형 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 이벤트 시간 2019-09-05T18:32:45.287082Z
instance_Id 대화 ID f7b2c416-a680-4b2c-b4cc-79c0f03d8711
operation_Id ID 설정 084b2856947e3844a5a18a8476d99aaa
User_id 고유 채널 사용자 ID emulator7c259c8e-2f47...
client_IP 클라이언트 IP 주소 127.0.0.1(개인 정보 보호 차단으로 인해 결석할 수 있음)
client_City 클라이언트 도시 Redmond(감지된 경우 부재 중일 수 있음)

참고 항목

Azure AI QnA Maker는 2025년 3월 31일에 사용 중지됩니다. 2022년 10월 1일부터 새로운 QnA Maker 리소스 또는 참조 자료를 만들 수 없습니다. 이제 최신 버전의 질문 및 답변 기능이 Azure AI 언어의 일부로 사용할 수 있습니다.

Azure AI Language의 기능인 사용자 지정 질문 답변은 QnA Maker 서비스의 업데이트된 버전입니다. Bot Framework SDK의 질문 및 답변 지원에 대한 자세한 내용은 자연어 이해를 참조하세요.

참고 항목

LUIS(Language Understanding)는 2025년 10월 1일에 사용 중지됩니다. 2023년 4월 1일부터 새 LUIS 리소스를 만들 수 없습니다. 이제 최신 버전의 언어 이해가 Azure AI Language의 일부로 제공됩니다.

Azure AI Language의 기능인 CLU(대화형 언어 이해)는 업데이트된 LUIS 버전입니다. Bot Framework SDK의 언어 이해 지원에 대한 자세한 내용은 자연어 이해를 참조하세요.

사용자 지정 차원

대부분의 봇 특정 활동 데이터는 customDimensions 필드에 저장됩니다.

필드 설명 샘플 값
activityId 메시지 ID <id>: 8da6d750-d00b-11e9-80e0-c14234b3bc2a
activityType 메시지 유형 message, conversationUpdate, event, invoke
channelId 채널 식별자 emulator, directline, msteams, webchat
fromId 식별자에서 <id>
fromName 클라이언트의 사용자 이름 존 본햄, 키스 문, 스티브 스미스, 스티브 개드
locale 클라이언트 원본 로케일 en-us, zh-cn, en-GB, de-de, zh-CN
recipientId 수신자 식별자 <id>
recipientName 수신자 이름 존 본햄, 키스 문, 스티브 스미스, 스티브 개드
text 메시지의 텍스트 find a coffee shop

사용자 지정 차원: LUIS

참고 항목

LUIS(Language Understanding)는 2025년 10월 1일에 사용 중지됩니다. 2023년 4월 1일부터 새 LUIS 리소스를 만들 수 없습니다. 이제 최신 버전의 언어 이해가 Azure AI Language의 일부로 제공됩니다.

Azure AI Language의 기능인 CLU(대화형 언어 이해)는 업데이트된 LUIS 버전입니다. Bot Framework SDK의 언어 이해 지원에 대한 자세한 내용은 자연어 이해를 참조하세요.

LUIS 계측은 다음 사용자 지정 차원 필드에 데이터를 저장합니다.

필드 설명 샘플 값
의도 LUIS에서 의도를 감지했습니다. pointOfInterestSkill
intentScore LUIS 인식 점수 0.98
엔터티 LUIS 검색된 엔터티 FoodOfGrocery = [["coffee"]], KEYWORD= ["coffee shop"]
질문 LUIS 검색 질문 find a coffee shop
sentimentLabel LUIS에서 감정을 감지했습니다. 긍정

사용자 지정 차원: QnAMaker

참고 항목

Azure AI QnA Maker는 2025년 3월 31일에 사용 중지됩니다. 2022년 10월 1일부터 새로운 QnA Maker 리소스 또는 참조 자료를 만들 수 없습니다. 이제 최신 버전의 질문 및 답변 기능이 Azure AI 언어의 일부로 사용할 수 있습니다.

Azure AI Language의 기능인 사용자 지정 질문 답변은 QnA Maker 서비스의 업데이트된 버전입니다. Bot Framework SDK의 질문 및 답변 지원에 대한 자세한 내용은 자연어 이해를 참조하세요.

QnAMaker 계측은 다음 사용자 지정 차원 필드에 데이터를 저장합니다.

질문 및 답변과 같은 개인 정보의 로깅을 사용하도록 설정하려면 QnA Maker 클래스의 생성자에서 로그 개인 정보 매개 변수를 true로 설정해야 합니다.

필드 설명 샘플 값
question QnA 검색된 질문 당신은 무엇을 할 수 있습니까?
answer QnA 답변 당신은 질문이, 나는 대답이있을 수 있습니다.
articleFound QnA true
questionId QnA 질문 ID 488
knowledgeBaseId QnA KB ID 2a4936f3-b2c8-44ff-b21f-67bc413b9727
matchedQuestion 일치하는 질문의 배열 ["당신은 당신의 역할이 무엇인지 나에게 설명 할 수 있습니까?","당신은 당신에 대해 조금 말할 수 있습니까?","당신은 당신에 대해 말해 줄 수 있습니까?","당신은 나를 도울 수 있습니다","어떻게 나를 도울 수 있습니까?","당신은 나를 도울 수있는 방법?","당신은 어떻게 도울 수 있습니까?","그래서 어떻게 내 프로젝트에서 당신을 사용할 수 있습니까?", "당신의 능력에 대해 나에게 이야기","당신은 무엇을 할 수 있습니까?", ...]

참고 항목