봇에 자연어 해석 추가

적용 대상: SDK v4

참고 항목

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

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

사용자가 대화 및 상황에 맞는 의미를 이해하는 기능은 어려운 작업이 될 수 있지만 봇에게 보다 자연스러운 대화 느낌을 제공할 수 있습니다. LUIS(Language Understanding) 는 클라우드 기반 API 서비스로, 봇이 사용자 메시지의 의도를 인식하고, 사용자의 자연어를 더 잘 허용하고, 대화 흐름을 더 잘 지시할 수 있도록 할 수 있습니다.

이 항목에서는 사용자 입력에 포함된 다양한 의도 및 엔터티를 인식하기 위해 항공편 예약 애플리케이션에 LUIS를 추가하는 방법을 안내합니다.

참고 항목

Bot Framework JavaScript, C#및 Python SDK는 계속 지원되지만 Java SDK는 2023년 11월에 종료되는 최종 장기 지원으로 사용 중지됩니다.

Java SDK를 사용하여 빌드된 기존 봇은 계속 작동합니다.

새 봇 빌드의 경우 Power Virtual Agents 사용을 고려하고 올바른 챗봇 솔루션을 선택하는 방법을 읽어 보세요.

자세한 내용은 봇 빌드의 미래를 참조 하세요.

필수 조건

이 샘플 정보

이 핵심 봇 샘플은 공항 항공편 예약 애플리케이션의 예를 보여줍니다. LUIS 서비스를 사용하여 사용자 입력을 인식하고 인식된 상위 LUIS 의도를 반환합니다.

언어 모델에는 세 가지 의도 Book Flight, 즉 , CancelNone. LUIS는 이러한 의도를 사용하여 사용자가 봇에 메시지를 보낼 때의 의미를 이해합니다. 언어 모델은 또한 LUIS가 원본 또는 대상 공항과 같은 사용자의 입력에서 추출할 수 있는 엔터티를 정의합니다.

사용자 입력 DialogBot 을 처리할 때마다 둘 다 UserState 의 현재 상태를 저장합니다 ConversationState. 필요한 모든 정보가 수집되면 코딩 샘플은 데모 플라이트 예약 예약을 만듭니다. 이 문서에서는 이 샘플의 LUIS 측면을 다룹니다. 그러나 샘플의 일반적인 흐름은 다음과 같습니다.

  • 새로운 사용자가 연결되면 OnMembersAddedAsync가 호출되고 환영 카드가 표시됩니다.
  • OnMessageActivityAsync 는 수신된 각 사용자 입력에 대해 호출됩니다.

C# 샘플의 구조를 간략하게 설명하는 클래스 다이어그램입니다.

OnMessageActivityAsync 모듈은 Run 대화 확장 메서드를 통해 적절한 대화를 실행합니다. 그러면 주 대화는 LUIS 도우미 를 호출하여 가장 점수가 높은 사용자 의도를 찾습니다. 사용자 입력의 상위 의도가 "BookFlight"를 반환하는 경우 도우미는 LUIS에서 반환된 사용자의 정보를 채웁니다. 그런 다음, 기본 대화 상자가 BookingDialog시작됩니다. 이 대화 상자는 다음과 같은 사용자로부터 필요에 따라 추가 정보를 가져옵니다.

  • Origin 원래 도시
  • TravelDate 항공편 예약 날짜
  • Destination 대상 도시

이 문서에서는 봇에 LUIS를 추가하는 방법을 설명합니다. 대화 또는 상태 사용에 대한 자세한 내용은 대화 프롬프트를 사용하여 사용자 입력 수집 또는 사용자 및 대화 데이터 저장을 참조하세요.

LUIS 포털에서 LUIS 앱 만들기

  1. LUIS 포털 에 로그인하고 필요한 경우 계정작성 리소스를 만듭니다.
  2. LUIS의 대화 앱 페이지에서 가져오기, JSON으로 가져오기를 선택합니다.
  3. 새 앱 가져오기 대화 상자에서 다음을 수행합니다.
    1. 샘플의 CognitiveModels 폴더에서 FlightBooking.json 파일을 선택합니다.
    2. 앱의 선택적 이름으로 입력 FlightBooking 하고 완료를 선택합니다.
  4. 사이트에 효과적인 LUIS 앱을만들고 복합 엔터티를 업그레이드하는 방법 대화 상자가 표시 될 수 있습니다. 이러한 대화 상자를 해제하고 계속할 수 있습니다.
  5. 앱을 학습한 다음, 프로덕션 환경에 앱을 게시합니다. 자세한 내용은 앱을 학습하고 게시하는 방법에 대한 LUIS 설명서를 참조하세요.

엔터티를 사용하는 이유

LUIS 엔터티를 사용하면 봇이 표준 의도 이외의 이벤트를 이해할 수 있습니다. 이를 통해 사용자에게 추가 정보를 수집할 수 있으므로 봇이 질문을 하고 보다 지능적으로 응답할 수 있습니다. 세 개의 LUIS 의도 'Book Flight', 'Cancel', 'None'에 대한 정의와 함께 FlightBooking.json 파일에는 'From.Airport' 및 'To.Airport'와 같은 엔터티 집합도 포함되어 있습니다. 이러한 엔터티를 통해 LUIS는 새 여행 예약을 요청할 때 사용자의 원래 입력에 포함된 추가 정보를 검색하고 반환할 수 있습니다.

LUIS 앱에 연결할 값 가져오기

LUIS 앱이 게시되면 봇에서 액세스할 수 있습니다. 봇 내에서 LUIS 앱에 액세스하려면 여러 값을 기록해야 합니다. LUIS 포털을 사용하여 해당 정보를 검색할 수 있습니다.

LUIS.ai 포털에서 애플리케이션 정보 검색

설정 파일(appsettings.json.env또는config.py)은 모든 서비스 참조를 한 곳에서 함께 가져오는 위치 역할을 합니다. 검색한 정보는 다음 섹션에서 이 파일에 추가됩니다.

  1. luis.ai에서 게시된 LUIS 앱을 선택합니다.

  2. 게시된 LUIS 앱이 열려 있는 상태에서 관리 탭을 선택합니다.

  3. 왼쪽의 설정 탭을 선택하고 애플리케이션 ID < 에 표시된 값을 YOUR_APP_ID> 기록합니다.

    애플리케이션 ID를 표시하는 관리 페이지의 스크린샷.

  4. Azure 리소스를 선택한 다음, 예측 리소스를 선택합니다. Location <표시된 값을 YOUR_REGION, 기본 키를 YOUR_AUTHORING_KEY>>기록<합니다.

    위치 및 기본 키를 표시하는 관리 페이지의 스크린샷.

    또는 작성 리소스에 지역 및 기본 키를 사용할 수 있습니다.

설정 파일 업데이트

애플리케이션 ID, 작성 키 및 지역을 포함하여 LUIS 앱에 appsettings.json 액세스하는 데 필요한 정보를 파일에 추가합니다. 이전 단계에서는 게시된 LUIS 앱에서 이러한 값을 검색했습니다. API 호스트 이름은 형식 <your region>.api.cognitive.microsoft.com이어야 합니다.

appsetting.json

{
  "MicrosoftAppType": "",
  "MicrosoftAppId": "",
  "MicrosoftAppPassword": "",
  "MicrosoftAppTenantId": "",
  "LuisAppId": "",
  "LuisAPIKey": "",
  "LuisAPIHostName": ""
}

LUIS 앱을 사용하도록 봇 구성

프로젝트에 Microsoft.Bot.Builder.AI.Luis NuGet 패키지가 설치되어 있는지 확인합니다.

LUIS 서비스에 연결하기 위해 봇은 추가한 정보를 appsetting.json 파일에 가져옵니다. 클래스에는 FlightBookingRecognizer appsetting.json 파일의 설정이 포함된 코드가 포함되어 있으며 메서드를 호출 RecognizeAsync 하여 LUIS 서비스를 쿼리합니다.

FlightBookingRecognizer.cs

public class FlightBookingRecognizer : IRecognizer
{
    private readonly LuisRecognizer _recognizer;

    public FlightBookingRecognizer(IConfiguration configuration)
    {
        var luisIsConfigured = !string.IsNullOrEmpty(configuration["LuisAppId"]) && !string.IsNullOrEmpty(configuration["LuisAPIKey"]) && !string.IsNullOrEmpty(configuration["LuisAPIHostName"]);
        if (luisIsConfigured)
        {
            var luisApplication = new LuisApplication(
                configuration["LuisAppId"],
                configuration["LuisAPIKey"],
                "https://" + configuration["LuisAPIHostName"]);
            // Set the recognizer options depending on which endpoint version you want to use.
            // More details can be found in https://docs.microsoft.com/en-gb/azure/cognitive-services/luis/luis-migration-api-v3
            var recognizerOptions = new LuisRecognizerOptionsV3(luisApplication)
            {
                PredictionOptions = new Bot.Builder.AI.LuisV3.LuisPredictionOptions
                {
                    IncludeInstanceData = true,
                }
            };

            _recognizer = new LuisRecognizer(recognizerOptions);
        }
    }

    // Returns true if luis is configured in the appsettings.json and initialized.
    public virtual bool IsConfigured => _recognizer != null;

    public virtual async Task<RecognizerResult> RecognizeAsync(ITurnContext turnContext, CancellationToken cancellationToken)
        => await _recognizer.RecognizeAsync(turnContext, cancellationToken);

    public virtual async Task<T> RecognizeAsync<T>(ITurnContext turnContext, CancellationToken cancellationToken)
        where T : IRecognizerConvert, new()
        => await _recognizer.RecognizeAsync<T>(turnContext, cancellationToken);
}

FlightBookingEx.cs는 추출 위치, 대상TravelDate 논리를 포함하고 있으며, MainDialog.cs에서 FlightBookingRecognizer.RecognizeAsync<FlightBooking>을 호출할 때 LUIS 결과를 저장하는 데 사용되는 partial 클래스 FlightBooking.cs를 확장합니다.

CognitiveModels\FlightBookingEx.cs

// Extends the partial FlightBooking class with methods and properties that simplify accessing entities in the luis results
public partial class FlightBooking
{
    public (string From, string Airport) FromEntities
    {
        get
        {
            var fromValue = Entities?._instance?.From?.FirstOrDefault()?.Text;
            var fromAirportValue = Entities?.From?.FirstOrDefault()?.Airport?.FirstOrDefault()?.FirstOrDefault();
            return (fromValue, fromAirportValue);
        }
    }

    public (string To, string Airport) ToEntities
    {
        get
        {
            var toValue = Entities?._instance?.To?.FirstOrDefault()?.Text;
            var toAirportValue = Entities?.To?.FirstOrDefault()?.Airport?.FirstOrDefault()?.FirstOrDefault();
            return (toValue, toAirportValue);
        }
    }

    // This value will be a TIMEX. And we are only interested in a Date so grab the first result and drop the Time part.
    // TIMEX is a format that represents DateTime expressions that include some ambiguity. e.g. missing a Year.
    public string TravelDate
        => Entities.datetime?.FirstOrDefault()?.Expressions.FirstOrDefault()?.Split('T')[0];
}

이제 봇에 LUIS가 구성되고 연결되었습니다.

봇 테스트

최신 Bot Framework Emulator를 다운로드하고 설치합니다.

  1. 머신에서 로컬로 샘플을 실행합니다. 지침이 필요한 경우 C# 샘플, JS 샘플 또는 Python 샘플에 대한 파일을 참조 README 하세요.

  2. 에뮬레이터에 "파리 여행" 또는 "파리에서 베를린으로 이동"과 같은 메시지를 입력합니다. 파일 FlightBooking.json 있는 발언을 사용하여 의도 "Book flight"를 학습합니다.

LUIS에서 반환된 상위 의도가 "항공편 예약"으로 확인되면 봇은 여행 예약을 만들기에 충분한 정보가 저장될 때까지 더 많은 질문을 합니다. 충분한 정보가 수집되면 봇이 사용자에게 이러한 예약 정보를 다시 반환합니다.

이 시점에서 코드 봇 논리가 다시 설정되고 더 많은 예약을 계속 만들 수 있습니다.

추가 정보

LUIS에 대한 자세한 내용은 LUIS 설명서를 참조하세요.

SDK의 여러 부분에서는 별도의 엔터티 클래스 또는 요소를 정의합니다. 메시지 엔터티는 엔터티 및 활동 유형을 참조 하세요.