Я успешно внедрил 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);
}
}