Проблема, с которой я столкнулся, заключалась в том, что я следую этой документации по интеграции как LUIS, так и QnA maker
https://docs.microsoft.com/en-us/azure/cognitive-services/qnamaker/tutorials/integrate-qnamaker-luis
И я изменил код для FAQ-бота.У меня есть два намерения: одно намерение часто задаваемых вопросов, в котором находится производитель QnA, а затем другое намерение.Когда я задаю вопрос в чат-боте из намерения FAQ, он дает точный ответ, а когда я задаю совершенно другой вопрос, он также переходит к другому намерению.Однако, когда я задаю еще один новый вопрос, которого нет в базе знаний, но в котором есть несколько слов, которые похожи на существующие вопросы, он дает мне ответ, предсказывая, что это из намерения FAQ.вместо другого намерения.Как повысить точность модели?
public class Metadata
{
public string name { get; set; }
public string value { get; set; }
}
public class Answer
{
public IList<string> questions { get; set; }
public string answer { get; set; }
public double score { get; set; }
public int id { get; set; }
public string source { get; set; }
public IList<object> keywords { get; set; }
public IList<Metadata> metadata { get; set; }
}
public class QnAAnswer
{
public IList<Answer> answers { get; set; }
}
[Serializable]
public class QnAMakerService
{
private string qnaServiceHostName;
private string knowledgeBaseId;
private string endpointKey;
public QnAMakerService(string hostName, string kbId, string endpointkey)
{
qnaServiceHostName = hostName;
knowledgeBaseId = kbId;
endpointKey = endpointkey;
}
async Task<string> Post(string uri, string body)
{
using (var client = new HttpClient())
using (var request = new HttpRequestMessage())
{
request.Method = HttpMethod.Post;
request.RequestUri = new Uri(uri);
request.Content = new StringContent(body, Encoding.UTF8, "application/json");
request.Headers.Add("Authorization", "EndpointKey " + endpointKey);
var response = await client.SendAsync(request);
return await response.Content.ReadAsStringAsync();
}
}
public async Task<string> GetAnswer(string question)
{
string uri = qnaServiceHostName + "/qnamaker/knowledgebases/" + knowledgeBaseId + "/generateAnswer";
string questionJSON = "{\"question\": \"" + question.Replace("\"","'") + "\"}";
var response = await Post(uri, questionJSON);
var answers = JsonConvert.DeserializeObject<QnAAnswer>(response);
if (answers.answers.Count > 0)
{
return answers.answers[0].answer;
}
else
{
return "No good match found.";
}
}
}
[Serializable]
public class BasicLuisDialog : LuisDialog<object>
{
// LUIS Settings
static string LUIS_appId = "29e08438-43ae-40ab-8a77-7bb6474edd13";
static string LUIS_apiKey = "95137566e76443019e26a653f99d7a0c";
static string LUIS_hostRegion = "westus.api.cognitive.microsoft.com";
// QnA Maker global settings
// assumes all KBs are created with same Azure service
static string qnamaker_endpointKey = "40dfaeb5-5679-4f8f-863f-a5f587101a88";
static string qnamaker_endpointDomain = "azurebot123";
// QnA Maker TA_FAQbot Knowledge base
static string TA_FAQbot_kbID = "13fed287-64d7-43aa-9a39-2c6bc86ea511";
// Instantiate the knowledge bases
public QnAMakerService azurebot123QnAService = new QnAMakerService("https://" + qnamaker_endpointDomain + ".azurewebsites.net", TA_FAQbot_kbID, qnamaker_endpointKey);
public BasicLuisDialog() : base(new LuisService(new LuisModelAttribute(
LUIS_appId,
LUIS_apiKey,
domain: LUIS_hostRegion)))
{
}
[LuisIntent("None")]
public async Task NoneIntent(IDialogContext context, LuisResult result)
{
HttpClient client = new HttpClient();
await this.ShowLuisResult(context, result);
}
[LuisIntent("RandomFAQ")]
public async Task RandomFAQIntent(IDialogContext context, LuisResult result)
{
HttpClient client = new HttpClient();
await this.ShowLuisResult(context, result);
}
// TA_FAQbot Intent
[LuisIntent("TA_FAQbot")]
public async Task TA_FAQbotIntent(IDialogContext context, LuisResult result)
{
// Ask the FAQ knowledge base
var qnaMakerAnswer = await azurebot123QnAService.GetAnswer(result.Query);
await context.PostAsync($"{qnaMakerAnswer}");
context.Wait(MessageReceived);
}
=
private async Task ShowLuisResult(IDialogContext context, LuisResult result)
{
await context.PostAsync($"You have reached {result.Intents[0].Intent}. Sorry, I do not have the answer to this question. I will get back to you with an answer soon.");
context.Wait(MessageReceived);
}
[LuisIntent("Cancel")]
public async Task CancelIntent(IDialogContext context, LuisResult result)
{
await this.ShowLuisResult(context, result);
}
[LuisIntent("Help")]
public async Task HelpIntent(IDialogContext context, LuisResult result)
{
await this.ShowLuisResult(context, result);
}
}