2016-11-14 33 views
1

私はボットを構築しようとしています。 最初に私はNode.jsを使用していましたが、それは明らかにクライアント用にはC#が優れていたので、私はC#でBotを作成し始めました。私はLUISアプリケーションも作成しました。Microsoft Bot Framework、LUISとwaterfalling

ここで、このボットの背後にあるアイデアは、最終結果を組み合わせて答えに基づいて解決策を選ぶ前に一連の質問をすることです。私が持っている問題は、どのようにしてボットを設定できるのか分かりません。ノードでは、それはwaterfallingについて話しましたが、C#バージョンではそれを見ることができません。 また、私は注意を集中する必要があるLUISにあるべきかどうかはわかりません。それは小さな

  1. です:

    例として

    は、ののような3つの質問を聞いて、私は、ユーザーがそのオブジェクトに基づいてオブジェクトを、選択したいとしましょうか?

  2. 軽いですか?
  3. どのような色をお選びいただけますか?

最後に、「あなたは黒い、小さい、明るいカメラがほしい」と言う。私はそれを働かせるように見えません。 FormFlowを使用すると言う人もいるでしょうが、質問は動的でオブジェクトもそうです。それが私がLUISを使用した理由です。

LUISを使用して同様のフローを作成する方法の良い記事がどこにあるか知っていますか?

答えて

1

FormFlowがあまりにも制限的な場合は、ダイアログを使用することを検討する必要があります。彼らははるかに開いた会話を可能にします。

私は、次の操作を行います:

1)カテゴリを選択するようにユーザーに確認して下さい。

可能であれば、ボタンを使用して、選択可能なカテゴリのリストをユーザーに提供します。つまり、ユーザーが選択したカテゴリについてLUISに問い合わせる必要はありません。

それ以外の場合は、カテゴリを入力してLUISに渡すことができます。 LUISからの応答にはエンティティが含まれます。エンティティはカテゴリの名前を保持します。そのカテゴリのエンティティによって

が前方に次の質問

[LuisIntent("AskQuestionAboutCategory")] 
    public async Task AskQuestion(IDialogContext context, LuisResult result) 
    { 
     //get Entity from LUIS response 
     string category = result.Entities.FirstOrDefault(e => e.Type == "Category")?.Entity; 

     switch (category) 
     { 
      case "Category 1": 

       //forward to Dialog for Category1 

       await 
        context.Forward(new Category1Dialog(), ResumeAfter, 
         new Activity {Text = result.Query}, CancellationToken.None); 
       break; 

      case "Category 2": 

       //forward to Dialog for Category2 

       await 
        context.Forward(new Category2Dialog(), ResumeAfter, 
         new Activity {Text = result.Query}, CancellationToken.None); 
       break; 

     } 
    } 

    private async Task ResumeAfter(IDialogContext context, IAwaitable<object> result) 
    { 
     context.Wait(MessageReceived); 
    } 

3を尋ねるを担当する適切なダイアログに、LUISから返されたダイアログに転送

2))ダイアログ内で質問する

ダイアログの中で、プロンプトダイアログを使用して質問1を求めます。質問1の回答にスイッチを使用してd質問2のために何を求めるか決定してください。 このような会話を続けてください。

[Serializable] 
public class Category1Dialog : IDialog<object> 
{ 
    public async Task StartAsync(IDialogContext context) 
    { 
     context.Wait(MessageReceivedAsync); 
    } 

    public virtual async Task MessageReceivedAsync(IDialogContext context, IAwaitable<IMessageActivity> argument) 
    { 

     var prompt = "what is the answer to question 1 ?"; 

     //ASK QUESTION 1 
     PromptDialog.Text(context, ResumeAfterQuestion1, prompt); 
    } 

    private async Task ResumeAfterQuestion1(IDialogContext context, IAwaitable<string> result) 
    { 
     var input = await result; 

     switch (input) 
     { 
      //ASK QUESTION 2, DEPENDING ON WHAT WAS ANSWERED FOR QUESTION 1 
      case "Answer A": 
       PromptDialog.Text(context, ResumeAfterQuestion2, "what is the answer to question 2 ?"); 
       break; 
      case "Answer B": 
       PromptDialog.Text(context, ResumeAfterQuestion2, "what is the answer to question 2 ?"); 
       break; 
     } 
    } 


    private async Task ResumeAfterQuestion2(IDialogContext context, IAwaitable<string> result) 
    { 
     var input = await result; 

     switch (input) 
     { 
      //ASK QUESTION 3 
      case "Answer C": 
       PromptDialog.Text(context, ResumeAfterQuestion3, "what is the answer to next question after Answer C ?"); 
     break; 
      case "Answer D": 
       PromptDialog.Text(context, ResumeAfterQuestion3, "what is the answer to next question after Answer D ?"); 
     break; 
    } 
    } 

スイッチのステートメントを使用して次に質問する必要があるようです。

click here for more info on Dialogs

+0

これは私が必要なもの – r3plica

+0

である。これは、前方:(機能していないことが取り組んでいるMessageReceivedAsync – r3plica

+1

にそれを作ることはありません、それはそこに表示されるのに役立ちますので、私はあなたに1を与えています3.2.1のバグだった – r3plica

1

これを手動で処理したい場合は別の方法もあります。それぞれの質問に対して異なるcontext.Waitメソッドを設定することができます。

あなたがChooseCategoryインテントを持つLuisDialogを持っているとします。その方法では、カテゴリを決定し、いくつかのカスタムロジックを基に新しい質問をします。

これは、PromptDialog/ResumeAfterまたは手動のコンテキストで行うことができます.PostAsync/context.Wait(基本的に次のメッセージを待機するメソッドを定義します)。

私はあなたのカスタムロジックがどのようになっているのかわかりませんが、次に来るメッセージを聞く次の方法を動的に決定できるはずです。

[LuisIntent("Choose category")] 
public async Task ChooseCategory(IDialogContext context, LuisResult result) 
{ 
    // get category logic.. 

    await context.PostAsync("This is my first question?"); 
    context.Wait(CaptureFirstQuestionAnswerAsync); 
} 

public async Task CaptureFirstQuestionAnswerAsync(IDialogContext context, IAwaitable<IMessageActivity> argument) 
{ 
    IMessageActivity message = await argument; 
    switch (message.Text.ToLower()) 
    { 
     case "answer 1": 
      // do something 
      break; 
     case "answer 2": 
      // do something different 
      break; 
     default: 
      // do something ... 
      break; 
    } 

    await context.PostAsync($"This is my second question?"); 

    context.Wait(CaptureSecondQuestionAnswerAsync); 
} 

public async Task CaptureSecondQuestionAnswerAsync(IDialogContext context, IAwaitable<IMessageActivity> argument) 
{ 
    //... 
} 
+1

、これはあまりにも – r3plica

関連する問題