대화 언어 이해를 위한 모범 사례
다음 지침을 사용하여 대화 언어 이해에서 최상의 프로젝트를 만듭니다.
일관된 스키마 선택
스키마는 의도 및 엔터티의 정의입니다. 의도로 만들어야 하는 항목과 엔터티를 정의할 때 수행할 수 있는 방법은 여러 가지가 있습니다. 다음과 같이 질문에 답해 보세요.
- 내 사용자로부터 캡처하려는 작업 또는 쿼리는 무엇인가요?
- 각 작업과 관련된 정보는 무엇인가요?
일반적으로 작업 및 쿼리를 의도로 생각할 수 있지만 이러한 쿼리를 수행하는 데 필요한 정보는 엔터티로 간주할 수 있습니다.
예를 들어 고객이 챗봇을 통해 제공하는 다양한 제품에 대한 구독을 취소하기를 원한다고 가정합니다. "Contoso 서비스 취소" 또는 "Fabrikam 구독에 대한 요금 청구 중지"와 같은 다양한 예를 사용하여 취소 의도를 만들 수 있습니다. 여기서 사용자의 의도는 취소하는 것이며, Contoso 서비스 또는 Fabrikam 구독은 취소하려는 구독입니다.
계속하려면 구독에 대한 엔터티를 만듭니다. 그런 다음, 전체 프로젝트를 모델링하여 작업을 의도로 캡처하고 엔터티를 사용하여 해당 작업을 채울 수 있습니다. 이 방식을 사용하면 다른 제품 등 엔터티로 정의한 모든 것을 취소할 수 있습니다. 그런 다음, 구독 및 기타 엔터티를 모두 사용하는 등록, 갱신, 업그레이드에 대한 의도를 가질 수 있습니다.
위의 스키마 디자인을 사용하면 새 엔터티를 만들어 기존 기능(취소, 업그레이드 또는 가입)을 새 대상으로 쉽게 확장할 수 있습니다.
또 다른 방식은 정보를 의도로 모델링하고 작업을 엔터티로 모델링하는 것입니다. 고객이 챗봇을 통해 구독을 취소할 수 있도록 하는 동일한 예를 살펴보겠습니다.
"Contoso 취소", "Contoso 서비스에 대한 요금 청구 중지", "Contoso 구독 취소"와 같은 발화가 있는 Contoso와 같이 사용 가능한 각 구독에 대한 의도를 만들 수 있습니다. 그런 다음 취소 작업을 캡처하는 엔터티를 만듭니다. 각 작업에 대해 서로 다른 엔터티를 정의하거나 목록 구성 요소가 있는 하나의 엔터티로 작업을 통합하여 서로 다른 키를 가진 작업을 구분할 수 있습니다.
이 스키마 디자인을 사용하면 새 작업 엔터티 또는 엔터티 구성 요소를 추가하여 새 작업을 기존 대상으로 쉽게 확장할 수 있습니다.
모든 개념을 의도로 이동하려고 하지 않아야 합니다. 예를 들어, 단 하나의 특정 작업만을 목적으로 하는 Contoso 취소 의도를 만들려고 하지 마세요. 의도와 엔터티가 함께 작동하여 고객으로부터 필요한 모든 정보를 캡처해야 합니다.
또한 서로 다른 스키마 디자인이 혼합되는 것을 방지하려고 합니다. 작업을 의도로 사용하고 나머지 절반은 정보를 의도로 사용하여 애플리케이션의 절반을 빌드하지 마세요. 가능한 결과를 가져오려면 일관성을 유지합니다.
학습 데이터 균형 조정
학습 데이터에 관해서는 스키마를 균형 있게 유지하도록 노력합니다. 한 의도의 대량을 포함하고 다른 의도 중 극소수만 포함하면 특정 의도에 편향된 모델이 생성됩니다.
이 시나리오를 해결하려면 학습 집합을 저해상도로 처리해야 할 수도 있습니다. 아니면 추가해야 할 수도 있습니다. 저해상도로 처리하려면 다음을 수행합니다.
- 학습 데이터의 특정 비율을 임의로 제거합니다.
- 데이터 세트를 분석하고 과도하게 표현된 중복 항목을 제거하는 것이 더 체계적인 방법입니다.
학습 집합을 추가하려면 Language Studio의 데이터 레이블 지정 탭에서 발화 제안을 선택합니다. 대화 언어 이해는 Azure OpenAI에 호출을 보내 유사한 발화를 생성합니다.
또한 학습 집합에서 의도하지 않은 "패턴"을 찾아야 합니다. 예를 들어, 특정 의도에 대한 학습 집합이 모두 소문자인지 또는 특정 구로 시작하는지 살펴봅니다. 이러한 경우 학습하는 모델은 일반화할 수 없는 대신 학습 집합에서 이러한 의도하지 않은 편향을 학습할 수 있습니다.
학습 집합에 대/소문자 구분과 문장 부호의 다양성을 도입하는 것이 좋습니다. 모델이 변형을 처리해야 하는 경우 해당 다양성을 반영하는 학습 집합이 있어야 합니다. 예를 들어 적절한 대/소문자에서 일부 발화를 포함하고 일부 발화는 모두 소문자로 포함합니다.
발화에 명확하게 레이블 지정
엔터티가 참조하는 개념이 잘 정의되고 분리 가능한지 확인합니다. 차이점을 안정적으로 쉽게 확인할 수 있는지 확인합니다. 그렇지 않은 경우, 이러한 구분의 부족은 학습한 구성 요소에서도 어려움이 있을 수 있음을 나타낼 수 있습니다.
엔터티 간에 유사점이 있는 경우 데이터 간의 차이점에 대한 신호를 제공하는 데이터 측면이 있는지 확인합니다.
예를 들어, 항공편을 예약하는 모델을 빌드했다면 사용자는 "보스턴에서 시애틀로 가는 항공편이 필요해"와 같은 발화를 할 수 있습니다. 이러한 발화에서 출발 도시와 도착 도시는 유사할 것으로 예상됩니다. 출발 도시를 구별하는 신호는 종종 에서라는 단어가 뒤에 붙는다는 것입니다.
학습 및 테스트 데이터 모두에서 각 엔터티의 모든 인스턴스에 레이블을 지정해야 합니다. 한 가지 방법은 검색 함수를 사용하여 데이터에서 단어나 구문의 모든 인스턴스를 찾아 올바른 레이블이 지정되었는지 확인하는 것입니다.
학습된 구성 요소가 없는 엔터티와 학습된 구성 요소가 있는 엔터티에 대한 테스트 데이터에 레이블을 지정합니다. 이러한 사례는 평가 메트릭의 정확성을 보장하는 데 도움이 됩니다.
고급 학습 전에 표준 학습 사용
표준 학습은 무료이며 고급 학습보다 빠릅니다. 모델을 빌드하는 동안 학습 집합이나 스키마를 변경하는 효과를 빠르게 이해하는 데 도움이 될 수 있습니다. 스키마에 만족하면 고급 학습을 사용하여 최상의 모델 품질을 가져오는 것이 좋습니다.
평가 기능 사용
앱을 빌드할 때 오류를 조기에 잡아내는 것이 도움이 되는 경우가 많습니다. 일반적으로 앱을 빌드할 때 테스트 집합을 추가하는 것이 좋습니다. 학습과 평가 결과는 스키마의 오류나 문제를 식별하는 데 유용합니다.
기계 학습 구성 요소 및 구성
자세한 내용은 구성 요소 형식을 참조하세요.
없음 점수 임계값 사용
컨텍스트를 벗어난 발화가 유효한 의도로 표시되는 것과 같이 너무 많은 가양성이 표시되는 경우 유추에 미치는 영향에 대한 자세한 내용은 신뢰도 임계값을 참조하세요.
- 목록 및 정규식과 같은 기계 학습되지 않은 엔터티 구성 요소는 정의에 따라 컨텍스트가 아닙니다. 의도하지 않은 위치에 목록 또는 정규식 엔터티가 표시되면 목록 동의어에 기계 학습 구성 요소로 레이블을 지정해 보세요.
- 엔터티의 경우 학습된 구성 요소를 필수 구성 요소로 사용하여 구성된 엔터티가 실행되어야 하는 시기를 제한할 수 있습니다.
예를 들어 "내일 카이로행 티켓 2장 예약"과 같은 발화의 경우 항공편을 예약하려는 티켓 수를 추출하려고 하는 Ticket Quantity라는 엔터티가 있다고 가정해 보겠습니다.
일반적으로 Quantity.Number
에 대해 이미 발화에 나오는 모든 숫자를 추출하는 미리 빌드된 구성 요소를 추가합니다. 그러나 엔터티가 미리 빌드된 구성으로만 정의된 경우 "내일 오후 3시에 카이로행 티켓 2장 예약"과 같이 Ticket Quantity 엔터티의 일부로 다른 숫자도 추출합니다.
이 문제를 해결하려면 티켓 수량으로 간주되는 모든 숫자에 대해 학습 데이터에서 학습된 구성 요소에 레이블을 지정합니다. 이제 엔터티에는 다음 두 가지 구성 요소가 있습니다.
- 모든 숫자를 해석할 수 있는 미리 빌드된 구성 요소.
- 문장에서 티켓 수량이 어디에 있는지 예측하는 학습된 구성 요소입니다.
학습된 구성 요소가 필요한 경우 학습된 구성 요소가 올바른 컨텍스트에서 티켓 수량을 예측하는 경우에만 Ticket Quantity가 반환되는지 확인합니다. 미리 빌드된 구성 요소도 필요한 경우 반환된 Ticket Quantity 엔터티가 숫자이고 올바른 위치에 있는지 확인할 수 있습니다.
모델 불일치 해결
모델이 대/소문자 또는 분음 부호와 같은 작은 문법 변경 사항에 지나치게 민감한 경우 Language Studio에서 직접 데이터 세트를 체계적으로 조작할 수 있습니다. 이러한 기능을 사용하려면 왼쪽 창에서 설정 탭을 선택하고 고급 프로젝트 설정 섹션을 찾습니다.
먼저, 모델을 학습, 테스트 및 구현할 때 발화의 대/소문자 구분을 정규화하는 대/소문자 구분에 대한 데이터 변환 사용 설정을 사용하도록 설정할 수 있습니다. LUIS에서 마이그레이션한 경우 LUIS가 기본적으로 이 정규화를 수행했음을 알게 될 수도 있습니다. API를 통해 이 기능에 액세스하려면 normalizeCasing
매개 변수를 true
로 설정합니다. 다음 예제를 참조하십시오.
{
"projectFileVersion": "2022-10-01-preview",
...
"settings": {
...
"normalizeCasing": true
...
}
...
두 번째로, 구분 기호에 대한 데이터 증강 사용하도록 설정 설정을 사용하도록 설정하여 자연어에서 사용되는 가능한 구분 기호 변형에 대한 학습 데이터 변형을 생성할 수도 있습니다. 이 기능은 모든 언어로 제공됩니다. 이 기능은 사용자가 올바른 문자 대신 고전 영어 문자를 사용하여 단어를 쓰는 경우가 많은 게르만 및 슬라브 언어에 특히 유용합니다. 예를 들어 프랑스어로 "스포츠 채널로 이동"이라는 문구는 "Accédez à la chaîne sportive"입니다. 이 기능을 사용하도록 설정하면 분음 부호 문자 없이 "Accedez a la chaine sportive"라고 쓴 문구도 학습 데이터 세트에 포함됩니다.
이 기능을 사용하도록 설정하면 학습 집합의 발화 횟수가 늘어납니다. 이러한 이유로 학습 데이터 크기를 이에 맞게 조정해야 할 수도 있습니다. 증강 후 현재 최대 발화 수는 25,000개입니다. API를 통해 이 기능에 액세스하려면 augmentDiacritics
매개 변수를 true
로 설정합니다. 다음 예제를 참조하십시오.
{
"projectFileVersion": "2022-10-01-preview",
...
"settings": {
...
"augmentDiacritics": true
...
}
...
모델 과신 해결
모델이 잘못해서 과신하고 있는 경우, 고객은 LoraNorm 훈련 구성 버전을 사용할 수 있습니다. 이러한 동작의 한 예는 모델이 100% 신뢰도로 잘못된 의도를 예측하는 다음 시나리오와 같습니다. 이 점수로 인해 신뢰도 임계값 프로젝트 설정을 사용할 수 없습니다.
Text | 예측된 의도 | 신뢰도 점수 |
---|---|---|
"누가 에펠탑을 지었나요?" | Sports |
1.00 |
"제가 오늘 당신에게 보기 좋아 보이나요?" | QueryWeather |
1.00 |
"좋은 저녁을 보내기 바랍니다." | Alarm |
1.00 |
이 시나리오를 해결하려면 신뢰도 점수를 정규화하는 2023-04-15
구성 버전을 사용합니다. 그런 다음 신뢰도 임곗값 프로젝트 설정을 조정하여 원하는 결과를 얻을 수 있습니다.
curl --location 'https://<your-resource>.cognitiveservices.azure.com/language/authoring/analyze-conversations/projects/<your-project>/:train?api-version=2022-10-01-preview' \
--header 'Ocp-Apim-Subscription-Key: <your subscription key>' \
--header 'Content-Type: application/json' \
--data '{
"modelLabel": "<modelLabel>",
"trainingMode": "advanced",
"trainingConfigVersion": "2023-04-15",
"evaluationOptions": {
"kind": "percentage",
"testingSplitPercentage": 0,
"trainingSplitPercentage": 100
}
}
요청이 전송되면 Language Studio에서 평소와 같이 학습 작업의 진행률을 추적할 수 있습니다.
참고 항목
confidenceThreshold
프로젝트 설정을 업데이트한 후에는 모델을 다시 학습시켜야 합니다. 그런 다음, 새로운 임계값을 적용하려면 앱을 다시 게시해야 합니다.
모델 버전 2023-04-15의 정규화
모델 버전 2023-04-15를 사용하여 대화 언어 이해는 학습에 영향을 주지 않는 유추 계층에서 정규화를 제공합니다.
정규화 계층은 분류 신뢰도 점수를 제한된 범위로 정규화합니다. 현재 선택한 범위는 "a"가 의도 수의 제곱근인 [-a,a]
범위입니다. 결과적으로 정규화는 앱의 의도 수에 따라 달라집니다. 의도의 수가 적으면 정규화 계층이 작업할 수 있는 범위가 좁아집니다. 의도의 수가 많을수록 정규화가 더 효과적입니다.
이 정규화가 신뢰도 임계값을 사용하여 범위 밖 발화를 필터링할 수 있을 정도로 범위 밖 인텐트에 도움이 되지 않는 경우 이는 앱의 의도 수와 관련이 있을 수 있습니다. 앱에 더 많은 의도를 추가하는 것이 좋습니다. 또는 오케스트레이션된 아키텍처를 사용하는 경우 동일한 도메인에 속한 앱을 병합하는 것이 좋습니다.
구성된 엔터티 디버그
엔터티는 연결된 형식을 사용하여 입력의 범위를 내보내는 함수입니다. 하나 이상의 구성 요소가 함수를 정의합니다. 필요에 따라 구성 요소를 표시할 수 있으며 구성 요소 결합 설정을 사용할지를 결정할 수 있습니다. 구성 요소를 결합하면 겹치는 모든 범위가 단일 범위로 병합됩니다. 해당 설정을 사용하지 않으면 각 개별 구성 요소 범위가 방출됩니다.
개별 구성 요소의 성능을 더 잘 이해하려면 설정을 사용하지 않도록 설정하고 각 구성 요소를 필수 아님으로 설정할 수 있습니다. 이 설정으로 내보내는 개별 범위를 검사하고 문제가 있는 구성 요소만 생성되도록 구성 요소 제거를 실험할 수 있습니다.
여러 테스트 집합을 사용하여 모델 평가
대화 언어 이해 프로젝트의 데이터에는 테스트 집합과 학습 집합이라는 두 가지 데이터 세트가 있을 수 있습니다. 여러 테스트 집합을 사용하여 모델을 평가하려는 경우 다음을 수행할 수 있습니다.
- 테스트 집합에 다른 이름을 지정합니다(예: "test1" 및 "test2").
- 프로젝트를 내보내 매개 변수 및 구성을 사용하여 JSON 파일을 가져옵니다.
- JSON을 사용하여 새로운 프로젝트를 가져옵니다. 두 번째로 원하는 테스트 집합의 이름을 "test"로 바꿉니다.
- 두 번째 테스트 집합을 사용하여 평가를 실행하도록 모델을 학습합니다.
대상 앱 및 자식 앱에 대한 사용자 지정 매개 변수
오케스트레이션된 앱을 사용하는 경우 다양한 하위 앱에 대한 사용자 지정 매개 변수 재정의를 보낼 수 있습니다. targetProjectParameters
필드를 사용하면 사용자가 각 대상 프로젝트의 매개 변수를 나타내는 사전을 보낼 수 있습니다. 예를 들어 CLU1
이라는 대화 언어 이해 앱과 CQA1
이라는 사용자 지정 질문 응답 앱 사이를 오케스트레이션하는 Orchestrator
라는 오케스트레이터 앱을 생각해 보세요. "top"이라는 이름의 매개 변수를 질문 답변 앱에 전송하려면 이전 매개 변수를 사용하면 됩니다.
curl --request POST \
--url 'https://<your-language-resource>.cognitiveservices.azure.com/language/:analyze-conversations?api-version=2022-10-01-preview' \
--header 'ocp-apim-subscription-key: <your subscription key>' \
--data '{
"kind": "Conversation",
"analysisInput": {
"conversationItem": {
"id": "1",
"text": "Turn down the volume",
"modality": "text",
"language": "en-us",
"participantId": "1"
}
},
"parameters": {
"projectName": "Orchestrator",
"verbose": true,
"deploymentName": "std",
"stringIndexType": "TextElement_V8",
"targetProjectParameters": {
"CQA1": {
"targetProjectKind": "QuestionAnswering",
"callingOptions": {
"top": 1
}
}
}
}
}'
언어 리소스 전반에 걸쳐 프로젝트 복사
종종 Language Studio의 복사 단추를 사용하여 대화 언어 이해 프로젝트를 한 리소스에서 다른 리소스로 복사할 수 있습니다. 어떤 경우에는 API를 사용하여 프로젝트를 복사하는 것이 더 쉬울 수도 있습니다.
먼저 다음을 식별합니다.
- 원본 프로젝트 이름.
- 대상 프로젝트 이름.
- 소스 언어 리소스.
- 복사하려는 대상 언어 리소스입니다.
API를 호출하여 복사 작업을 권한 부여하고 나중에 실제 복사 작업을 위해 accessTokens
를 가져옵니다.
curl --request POST \
--url 'https://<target-language-resource>.cognitiveservices.azure.com//language/authoring/analyze-conversations/projects/<source-project-name>/:authorize-copy?api-version=2023-04-15-preview' \
--header 'Content-Type: application/json' \
--header 'Ocp-Apim-Subscription-Key: <Your-Subscription-Key>' \
--data '{"projectKind":"Conversation","allowOverwrite":false}'
API를 호출하여 복사 작업을 완료합니다. 이전에 받은 응답을 페이로드로 사용합니다.
curl --request POST \
--url 'https://<source-language-resource>.cognitiveservices.azure.com/language/authoring/analyze-conversations/projects/<source-project-name>/:copy?api-version=2023-04-15-preview' \
--header 'Content-Type: application/json' \
--header 'Ocp-Apim-Subscription-Key: <Your-Subscription-Key>\
--data '{
"projectKind": "Conversation",
"targetProjectName": "<target-project-name>",
"accessToken": "<access-token>",
"expiresAt": "<expiry-date>",
"targetResourceId": "<target-resource-id>",
"targetResourceRegion": "<target-region>"
}'
도메인 외부 발화 처리
모델의 도메인 외부 발화 품질이 좋지 않은 경우 고객은 새로 업데이트된 학습 구성 버전 2024-08-01-preview
(이전 2024-06-01-preview
)을 사용할 수 있습니다. 기본 학습 구성을 사용하는 이 시나리오의 예는 모델에 Sports
, QueryWeather
, Alarm
의 세 가지 의도가 있는 다음 예와 같습니다. 테스트 발화는 도메인 외부 발화이며 모델은 이를 비교적 높은 신뢰도 점수로 InDomain
으로 분류합니다.
Text | 예측된 의도 | 신뢰도 점수 |
---|---|---|
"누가 에펠탑을 지었나요?" | Sports |
0.90 |
"제가 오늘 당신에게 보기 좋아 보이나요?" | QueryWeather |
1.00 |
"좋은 저녁을 보내기 바랍니다." | Alarm |
0.80 |
이 시나리오를 해결하려면 InDomain
발화에 대해 비교적 좋은 품질을 유지하면서도 이 문제를 해결하도록 특별히 빌드된 2024-08-01-preview
구성 버전을 사용합니다.
curl --location 'https://<your-resource>.cognitiveservices.azure.com/language/authoring/analyze-conversations/projects/<your-project>/:train?api-version=2022-10-01-preview' \
--header 'Ocp-Apim-Subscription-Key: <your subscription key>' \
--header 'Content-Type: application/json' \
--data '{
"modelLabel": "<modelLabel>",
"trainingMode": "advanced",
"trainingConfigVersion": "2024-08-01-preview",
"evaluationOptions": {
"kind": "percentage",
"testingSplitPercentage": 0,
"trainingSplitPercentage": 100
}
}
요청이 전송되면 Language Studio에서 평소와 같이 학습 작업의 진행률을 추적할 수 있습니다.
주의 사항:
- 이 학습 구성을 사용할 때 앱의 None 점수 임계값(
topIntent
가None
으로 표시되는 신뢰도 임계값)은 0으로 설정해야 합니다. 이 설정은 새로운 학습 구성에서 도메인 내 확률의 특정 부분을 도메인 외부에 귀속시켜 모델이 도메인 내 발화에 대해 부당하게 과신하지 않도록 하는 데 사용됩니다. 결과적으로, 사용자는 프로덕션 학습 구성에 비해 도메인 내 발화에 대한 신뢰도 점수가 약간 낮아지는 것을 볼 수 있습니다. - 예를 들어,
IntentA
및None
과 같이 두 개의 의도만 있는 앱의 경우 이러한 학습 구성을 권장하지 않습니다. - 의도당 발화 수가 적은 앱에는 이러한 학습 구성을 권장하지 않습니다. 의도당 최소 25개의 발화를 권장합니다.