Как использовать LuisRecognizerMiddleware для вызова Luis для каждого входящего сообщения - PullRequest
1 голос
/ 10 ноября 2019

Я успешно внедрил LUIS из набора Microsoft CoreBot . Однако в моей реализации я хочу, чтобы LUIS проверял счет намерений для каждого входящего сообщения. Для достижения этого, похоже, мне нужно использовать LuisRecognizerMiddleware, но я не смог найти примеров того, как это реализовать. Я не хочу копировать и вставлять мой LUIS-код, который работает на всех этапах моих водопадов во всех моих диалогах.

Поэтому моя главная проблема здесь заключается в том, как реализовать LuisRecognizerMiddleware вместо LuisRecognizer, которыйЯ использую сейчас, чтобы вызывать LUIS для каждого сообщения от пользователя.

Заранее спасибо за помощь.

Вот мой соответствующий код для LUIS:

BotRecognizer.cs

public class BotRecognizer : IRecognizer
{
    private readonly LuisRecognizer _recognizer;

    public BotRecognizer(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"]);

            _recognizer = new LuisRecognizer(luisApplication);
        }
    }

    // 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);
}

Когнитивные модели> ContactDialogBot.cs, сгенерированный из моего файла ContactDialogBot.json

public partial class ContactDialogBot: IRecognizerConvert
{
    [JsonProperty("text")]
    public string Text;

    [JsonProperty("alteredText")]
    public string AlteredText;

    public enum Intent {
        cancel, 
        Hjelp, 
        None, 
        Products
    };
    [JsonProperty("intents")]
    public Dictionary<Intent, IntentScore> Intents;

    public class _Entities
    {
        // Simple entities
        public string[] produkt;

        // Instance
        public class _Instance
        {
            public InstanceData[] produkt;
        }
        [JsonProperty("$instance")]
        public _Instance _instance;
    }
    [JsonProperty("entities")]
    public _Entities Entities;

    [JsonExtensionData(ReadData = true, WriteData = true)]
    public IDictionary<string, object> Properties {get; set; }

    public void Convert(dynamic result)
    {
        var app = JsonConvert.DeserializeObject<ContactDialogBot>(JsonConvert.SerializeObject(result, new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore }));
        Text = app.Text;
        AlteredText = app.AlteredText;
        Intents = app.Intents;
        Entities = app.Entities;
        Properties = app.Properties;
    }

    public (Intent intent, double score) TopIntent()
    {
        Intent maxIntent = Intent.None;
        var max = 0.0;
        foreach (var entry in Intents)
        {
            if (entry.Value.Score > max)
            {
                maxIntent = entry.Key;
                max = entry.Value.Score.Value;
            }
        }
        return (maxIntent, max);
    }
}

Startup.csв методе ConfigureServices ()

var LuisAppId = "";
var LuisAPIKey = "";
var LuisAPIHostName = "";
var luisApp = new LuisApplication(LuisAppId, LuisAPIKey, LuisAPIHostName);
var luisRecognizer = new LuisRecognizer(luisApp);
// Register LUIS recognizer
services.AddSingleton<BotRecognizer>();

В одном из моих диалогов StartDialog.cs

protected readonly BotRecognizer _luisRecognizer;
public StartDialog(BotRecognizer luisRecognizer)
        : base(nameof(StartDialog))
    {
        _luisRecognizer = luisRecognizer;

        AddDialog(new TextPrompt(nameof(TextPrompt)));

        AddDialog(new ChoicePrompt(nameof(ChoicePrompt)));
        AddDialog(new ProductDialog());

        AddDialog(new WaterfallDialog(nameof(WaterfallDialog), new WaterfallStep[]
            {
                ChoiceStepAsync
            }));

        InitialDialogId = nameof(WaterfallDialog);
    }

private async Task<DialogTurnResult> ChoiceStepAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken)
    {
if (luisResult.TopIntent().intent == ContactDialogBot.Intent.Products && luisResult.TopIntent().score>0.8) {
            return await stepContext.BeginDialogAsync(nameof(ProductDialog), null, cancellationToken);
        }
}
...