3

질문이 있습니다. 불행히도 웹상의 모든 샘플이 너무 얕아서 실제로 잘 다루지 않습니다.탐색은 LUIS 하위 대화 상자에서 어떻게 작동합니까?

LuisDialog를 확장하는 RootDialog가 있습니다. 이 RootDialog는 사용자가 원하는 것을 알아내는 역할을합니다. 여러 가지 일 수 있지만 그 중 하나는 새로운 질서를 시작합니다. 이를 위해 RootDialog는 NewOrderDialog에 호출을 전달하고 NewOrderDialog의 책임은 몇 가지 기본 세부 정보 (사용자가 무엇을 원하는지, 어떤 주소를 사용하고 싶은지)를 파악한 다음 최종적으로 주문하고 RootDialog로 돌아 간다.

RootDialog의 코드는 매우 간단합니다 작동하지 않습니다 나와 같은

[Serializable] 
public class NewOrderDialog : LuisDialog<object> 
{ 
    private string _product; 
    private string _address; 

    public NewOrderDialog() : base(new LuisService(new LuisModelAttribute(ConfigurationManager.AppSettings["LuisAppId"], ConfigurationManager.AppSettings["LuisAPIKey"], domain: "westus.api.cognitive.microsoft.com"))) 
    { 
    } 

    [LuisIntent("Order.RequestedItem")] 
    public async Task RequestItemIntent(IDialogContext context, LuisResult result) 
    { 
     EntityRecommendation item; 
     if (result.TryFindEntity("Item", out item)) 
     { 
      _product = item.Entity; 
      await context.PostAsync($"Okay, I understood you want to order: {_product}."); 
     } 
     else 
     { 
      await context.PostAsync("I couldn't understand what you would like to buy. Can you try it again?"); 
     } 

     context.Wait(MessageReceived); 
    } 

    [LuisIntent("Order.AddedAddress")] 
    public async Task AddAddressIntent(IDialogContext context, LuisResult result) 
    { 
     EntityRecommendation item; 
     if (result.TryFindEntity("Address", out item)) 
     { 
      _address = item.Entity; 
      await context.PostAsync($"Okay, I understood you want to ship the item to: {_address}."); 
     } 
     else 
     { 
      await context.PostAsync("I couldn't understand where you would like to ship the item. Can you try it again?"); 
     } 

     context.Wait(MessageReceived); 
    } 
} 

코드 : 나는 또한 NewOrderDialog에 대한 마음에 몇 가지 코드를했다

[Serializable] 
public class RootDialog : LuisDialog<object> 
{ 
    public RootDialog() : base(new LuisService(new LuisModelAttribute(ConfigurationManager.AppSettings["LuisAppId"], ConfigurationManager.AppSettings["LuisAPIKey"], domain: "westus.api.cognitive.microsoft.com"))) 
    { 
    } 

    [LuisIntent("Order.Place")] 
    public async Task PlaceOrderIntent(IDialogContext context, LuisResult result) 
    { 
     await context.Forward(new NewOrderDialog(), OnPlaceOrderIntentCompleted, context.Activity, CancellationToken.None); 

     context.Wait(MessageReceived); 
    } 

    private async Task OnPlaceOrderIntentCompleted(IDialogContext context, IAwaitable<object> result) 
    { 
     await context.PostAsync("Your order has been placed. Thank you for shopping with us."); 

     context.Wait(MessageReceived); 
    } 
} 

. Order.Place intent를 입력하면 즉시 'success'콜백을 실행 한 다음이 예외가 throw됩니다.

예외 : IDialog 메서드를 실행하면 IDialogStack을 통해 지정된 여러 개의 다시 시작 핸들러가 완료됩니다. [파일 형식의 '텍스트/일반']

그래서 나는 몇 가지 질문이 있습니다

  1. 가 어떻게 내가 오류를 해결 할를?
  2. NewOrderDialog를 입력 할 때 제품과 주소가 무엇인지 이미 알고 있는지 확인하고 올바른 정보를 묻지 않는 경우 어떻게 할 수 있습니까?
  3. context.Done()과 같은 것을 호출하지 않아도 NewOrderDialog가 닫히는 이유는 무엇입니까? 모든 정보가 수집되고 주문이 확인되면 폐쇄 만하기를 원합니다.
+2

[Bot Framework를 사용하여 단일 봇에서 여러 LUIS 대화 상자를 구현하는 방법은 무엇입니까?] (https://stackoverflow.com/questions/40399973/how-do-i-implement-multiple-luis-dialogs) -one-a-single-bot-bot-framework 사용) – JasonSowers

+0

@JasonSowers 아니요. 내 질문에 대한 해결책이 보이지 않습니다. –

답변

-1

Bing Location Control for Microsoft Bot Framework에 대해 알고 계십니까? 이 주소는 사용자 주소를 얻고 유효성을 검사 할 때 '사용하고 싶은 주소'를 처리하는 데 사용할 수 있습니다.

[LuisModel("xxx", "yyy")] 
[Serializable] 
public class RootDialog : LuisDialog<object> 
{ 
    ... 

    [LuisIntent("Find Location")] 
    public async Task FindLocationIntent(IDialogContext context, LuisResult result) 
    { 
     try 
     { 
      context.Call(new FindUserLocationDialog(), ResumeAfterLocationDialog); 
     } 
     catch (Exception e) 
     { 
      // handle exceptions 
     } 
    } 

    public async Task ResumeAfterLocationDialog(IDialogContext context, IAwaitable<object> result) 
    { 
     var resultLocation = await result; 

     await context.PostAsync($"Your location is {resultLocation}"); 

     // do whatever you want 

     context.Wait(this.MessageReceived); 
    } 
} 

그리고 대한

"FindUserLocationDialog는()", 당신은 이후 선 (58)에서 sample을 따를 수 있습니다 : 여기

은 몇 가지 예제 코드입니다.

편집 :

1) 사용 시도 할 수

[LuisIntent("Order.Place")] 
public async Task PlaceOrderIntent(IDialogContext context, LuisResult result) 
{ 
    context.Forward(new NewOrderDialog(), OnPlaceOrderIntentCompleted, context.Activity, CancellationToken.None); 

    // or this 
    // context.Call(new NewOrderDialog(), OnPlaceOrderIntentCompleted); 
} 

2) 나는 당신이 당신의 의도를 구조화하는 방법에 따라 달라 말할 것입니다. 귀하의 "Order.Place"의도에는 엔티티가 포함되어 있습니까? 사용자가 "제품 X의 주문을 주소 Y"으로 보내고 싶다면, 귀하의 의도가 이미 해당 업체를 선택합니까?

"Order.Place"의도에 따라 제품과 주소를 확인하는 것이 좋습니다.제품 및 주소를 얻고 유효성을 검증 한 후에는 나머지 대화 상자 (LUIS가 아닌)로 전달하여 나머지 주문 처리를 처리 할 수 ​​있습니다.

[LuisIntent("Order.Place")] 
public async Task PlaceOrderIntent(IDialogContext context, LuisResult result) 
{ 
    EntityRecommendation item; 
    if (result.TryFindEntity("Item", out item)) 
    { 
     _product = item.Entity; 
    } 

    if (result.TryFindEntity("Address", out item)) 
    { 
     _address = item.Entity; 
    } 

    if (_product == null) 
    { 
     PromptDialog.Text(context, this.MissingProduct, "Enter the product"); 
    } 
    else if (_address == null) 
    { 
     PromptDialog.Text(context, this.MissingAddress, "Enter the address"); 
    } 

    // both product and address present 
    context.Forward(new NewOrderDialog(), OnPlaceOrderIntentCompleted, **object with _product and _address**, CancellationToken.None); 
} 

private async Task MissingProduct(IDialogContext context, IAwaitable<String> result) 
{ 
    _product = await result; 
    // perform some validation 

    if (_address == null) 
    { 
     PromptDialog.Text(context, this.MissingAddress, "Enter the address"); 
    } 
    else 
    { 
     // both product and address present 
     context.Forward(new NewOrderDialog(), OnPlaceOrderIntentCompleted, **object with _product and _address**, CancellationToken.None); 
    } 
} 

private async Task MissingAddress(IDialogContext context, IAwaitable<String> result) 
{ 
    _address = await result; 
    // perform some validation 

    // both product and address present 
    context.Forward(new NewOrderDialog(), OnPlaceOrderIntentCompleted, **object with _product and _address**, CancellationToken.None); 
} 

이 라인을 따라 뭔가. try/catch를 포함해야 할 수도 있습니다. 나는 그것이 의도 'Order.Place'루이스 ') context.Wait (MessageReceived'당신과 함께 할 수있어 한 생각

3)

+1

이것은 내 문제에 도움이되지 않으며 내 질문에 대한 해결책이 아닙니다. –

+1

다른 질문에 대한 답변으로 게시 하시겠습니까? 이것은 여기에 질문 된 질문에 대답하려는 시도로는 의미가 없습니다. –

+0

@SamHanley 흠, 질문은 "사용자의 답변을 이해하기 위해 LUIS를 사용하고 싶습니다. 예를 들어 사용자가 자신의 주소로 응답 할 수있는 여러 가지 방법이 있기 때문에" 나는이 서비스를 사용하려고 생각했습니다. 사용자의 주소를 확인하고 유효성을 검사하는 데 도움이됩니다. 그것은 '그것을 보낼 곳'부분을 처리합니다. '사용자가 주문하고자하는 것'에 대해서는 아마도 FormFlow 또는 PromptDialog를 고려할 수 있습니다. 어쩌면 나는 약간의 질문에서 벗어나고 싶지만 단지 그가 원하는 것을 얻는 다른 방법을 제안하려고 노력하고있다. –

3

그래서 첫 번째 문제는 당신이 context.Forward과를하고있는 것입니다 정의에 따라 "Order.Place"에 context.Wait이 있습니다. 다음을 선택해야합니다 : 새 대화 상자로 전달하거나 현재 대화에서 기다립니다. 게시물을 기반으로 전달하려고하므로 대기 통화를 삭제하십시오.

게다가 LUIS 대화 상자가 하나 있는데 새 LUIS 대화 상자로 전달하려고합니다 ... 작동하지 않을지 의심됩니다. 나는 그것들이 다른 두 개의 LUIS 모델이라는 것을 상상할 수있다. 그렇지 않으면 틀릴 것이다.

귀하의 의견을 바탕으로 이제 두 번째 대화 상자로 무엇을하려고하는지 이해합니다. 문제 (그리고 이것은 두 번째 질문과 관련이 있습니다) 그 방법으로 LUIS를 사용하는 것이 혼란 스러울 수 있습니다. 예 :

  • 사용자 : 나는 주문을
  • 봇 => 전달 새로운 대화 상자를 배치합니다. 그것이 앞으로이므로, activity.Text은 (두 번째 대화 상자의 모델로) LUIS로 다시 이동하고 아무 것도 탐지되지 않습니다. 두 번째 대화 상자는 사용자 입력을 위해 Wait 상태에 있습니다.

이제 사용자가 주소 나 제품을 입력해야한다는 것을 어떻게 알 수 있습니까? 사용자에게 사용자를 위해 어디에서 메시지를 보내고 있습니까? 문제를 보시겠습니까?

제가 생각하기에 귀하의 세 번째 질문은 귀하가 이미 솔루션을 제공 한 1 번 오류의 부작용입니다.

좀 더 명확히하면 더 도움이 될 것입니다. 두 번째 대화 상자에서 LUIS로 수행하려고 시도하는 것은 괜찮은 것처럼 보이지만 어쩌면 설명이있는 것 같습니다.

일반적인 경우는 LUIS ("Order.Place")에서 의도를 얻은 다음 FormFlow 또는 프롬프트 집합을 시작하여 주문 (주소, 제품 등)을 배치하는 정보를 얻거나 LUIS을 계속 사용하려면 Luis Action Binding을 확인하십시오. https://blog.botframework.com/2017/04/03/luis-action-binding-bot/에 대한 자세한 내용을 볼 수 있습니다.

+0

두 번째 단락의 의미를 이해하지 못합니다. 세 번째 단락을 다시 작성하십시오 : 사용자가 주문을 원하지만 * 주문할 * 것을 지정하지 않은 경우 봇은 LUIS를 사용하여 응답을 이해하고 설명을 요청해야합니다. 어쩌면이 흐름이 일반적으로 어떻게 보이는지에 대한 잘못된 견해를 가지고있을 수도 있습니다. 예제를 제공해 줄 수 있습니까? –

+0

OK, 알겠습니다. 아마 두 개의 LUIS 모델은 당신이 성취하려는 것을 복잡하게 만드는 요소입니다 ... 나는 당신이 찾고있는 것이 LUIS Action Binding이라고 생각합니다. https://github.com/Microsoft/BotBuilder-Samples/tree/master/CSharp/Blog-LUISActionBinding을 살펴보십시오. 원하는 내용 일 것 같습니다. –

+0

나는 또한 나의 대답을 편집했다. 현재 흐름에서보고있는 문제가 포함되었습니다. 그러나 다시, 당신이 원하는 것은 Luis Action Binding입니다. –

관련 문제