2017-08-22 1 views
1

私はluisとqnamakerのダイアログを使ってボットを作成しました。私の質問では、LuisDialog.csのコードの一部です。会話中にユーザーがqnaの意図(QnADialogのボットジャンブ)の一部である質問をしたが、ユーザーがボットに別の質問をしたときに他のインテントに渡したい。qnadialogを終了して他のルイインテントを続ける方法

LuisDialog.cs他の目的で更新されたコードです。私はqnadialogから、ユーザが、例えば意図をテストするために対応して質問を入力し

using Microsoft.Bot.Builder.Dialogs; 
    using System; 
    using System.Collections.Generic; 
    using System.Linq; 
    using System.Web; 
    using Microsoft.Bot.Builder.Luis; 
    using System.Threading.Tasks; 
    using Microsoft.Bot.Builder.Luis.Models; 
    using Microsoft.Bot.Connector; 
    using MultiDialogsBot.Dialogs; 
    using System.Threading; 

    namespace MultiDialogsBot 
    { 

[LuisModel("xxxxxxx", "yyyyyyyyyyy")] 
[Serializable] 
public class LuisDialog : LuisDialog<object> 
{ 
    private object activity; 


    public async Task StartAsync(IDialogContext context) 
    { 
     context.Wait(MessageReceived); 
    } 


    [LuisIntent("None")] 
    [LuisIntent("")] 
    public async Task None(IDialogContext context, LuisResult result) 
    { 
     string message = $"Désolé je n'ai pas compris '{result.Query}'. Veuillez formuler votre question"; 

     await context.PostAsync(message); 

     context.Wait(this.MessageReceived); 


    } 

    [LuisIntent("test")] 

    public async Task test(IDialogContext context, LuisResult result) 
    { 
     await context.PostAsync("nous testons"); 
     context.Wait(MessageReceived); 

    } 



    [LuisIntent("qna")] 
    public async Task qna(IDialogContext context, IAwaitable<IMessageActivity> activity, LuisResult result) 
    { 
     var msg = await activity; 

     // await context.Forward(new QnADialog(), ResumeAfterOptionDialog, msg, CancellationToken.None); 
     context.Call(new QnADialog(), this.ResumeAfterOptionDialog); 

    } 

    public async Task ResumeAfterOptionDialog(IDialogContext context, IAwaitable<object> result) 
    { 
     var messageHandled = await result; 
     if (messageHandled != null) 
     { 
      await context.PostAsync("Désolé je n'ai pas compris"); 
      context.Wait(MessageReceived); 
     } 
    } 
+0

あなたが何をしたいのか説明できますか?それは明確ではない –

+0

私はluisとqnamakerのダイアログを使ってボットを作成しました。私の質問では、LuisDialog.csのコードの一部です。会話中にqnaの意図(QnADialogへのボットジャンパー)の一部である質問をユーザーが作成したが、ユーザーがボットに別の質問をしたときに他のインテントに渡したい場合(私が今よりはっきりしていることを望みます) – user38

+0

Ok、すべてのLuisDialog.csを追加できますか?明確にするには:あなたのQnA KBにフォールバックしたくない場合は、QnAが意図を取得する必要がありますか? –

答えて

1

を終了したいあなたが最初にあなたのQnAシリーズのデータ​​ベース内のユーザーの入力を処理したい場合は、あなたがあなたの質問とセットで説明あなたのロジックを変更する必要がありますあなたのユーザー入力を最初に取得するオーバーライドされたQnADialogと、応答がない場合、LuisDialogを呼び出して、1つまたは複数の興味深いインテントを持つケースを処理しようとします。

hereの確認方法はQnAMakerDialogです。あなたはおそらくここQnAMakerDialogからの返信を避けるためにMessageReceivedAsync方法を変更するには、クラスを書き換える必要があることが表示されます。

if (sendDefaultMessageAndWait) 
{ 
    // The following line should be removed if you don't want that the QnADialog replies if no answer found 
    await context.PostAsync(qnaMakerResults.ServiceCfg.DefaultMessage); 
    await this.DefaultWaitNextMessageAsync(context, message, qnaMakerResults); 
} 

あなたQnAOverriddenDialogは、あなたのLuisDialogが以前に(あなたのMessageControllerから私が推測すると呼ばれていたところから呼び出さなければなりませんあなたの実装の詳細はわかりません)。

そして、あなたのLuisDialogは次のようになります。

[LuisModel("xxxxxxx", "yyyyyyyyyyy")] 
[Serializable] 
public class LuisDialog : LuisDialog<object> 
{ 
    public async Task StartAsync(IDialogContext context) 
    { 
     context.Wait(MessageReceived); 
    } 

    [LuisIntent("None")] 
    [LuisIntent("")] 
    public async Task None(IDialogContext context, LuisResult result) 
    { 
     string message = $"Désolé je n'ai pas compris '{result.Query}'. Veuillez formuler votre question"; 

     await context.PostAsync(message);  
     context.Wait(this.MessageReceived); 
    } 

    [LuisIntent("test")] 
    public async Task test(IDialogContext context, LuisResult result) 
    { 
     await context.PostAsync("nous testons"); 
     context.Wait(MessageReceived); 
    } 

    [LuisIntent("yourOtherIntent1")] 
    public async Task OtherIntent1(IDialogContext context, LuisResult result) 
    { 
     await context.PostAsync("fallback 1"); 
     context.Wait(MessageReceived); 
    } 

    [LuisIntent("yourOtherIntent2")] 
    public async Task OtherIntent1(IDialogContext context, LuisResult result) 
    { 
     await context.PostAsync("fallback 2"); 
     context.Wait(MessageReceived); 
    } 

    public async Task ResumeAfterOptionDialog(IDialogContext context, IAwaitable<object> result) 
    { 
     var messageHandled = await result; 
     if (messageHandled != null) 
     { 
      await context.PostAsync("Désolé je n'ai pas compris"); 
      context.Wait(MessageReceived); 
     } 
    } 
} 
+0

Soory ...私は初心者です。私は非常に混乱しています。私はQnAMakerDialogでコードを更新しました(他のクラスに関連しています)ので、すべてのライブラリ...しかし結果はありません。 luisとqnamakerの両方を使用するコード例を見つけることは可能でしょうか。あなたが入力した場合、インテントグリーティングと呼ばれるインテントグリーティングと呼ばれます。テストインテントと呼ばれ、モバイルを入力すると(qnadialogを呼び出します)、この質問の後に再度入力すると、greetingを呼び出します意図。私の問題は、私はqnamakerの中でループに入り、私はそこから出ることができないということです。 :(お返事ありがとうございました... – user38

+0

LUISが最初に呼び出されるコードの例がいくつかあり、開発者が一致するインテントを持たない場合は、QnAMakerDialogが呼び出されて答えが得られます。私はあなたの最終的なビジネスケースが何であるかまだ分かりませんが、これはソリューションを開発する方法を変えるでしょう。質問にユースケースを追加して、文章の種類を入力し、返答はどうすればいいのですか(LUISまたはQnA)はどこから来るのですか? –

関連する問題