Как сделать так, чтобы интеграция QnA Maker и Luis BOT работала точно? - PullRequest
1 голос
/ 22 мая 2019

Проблема, с которой я столкнулся, заключалась в том, что я следую этой документации по интеграции как 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);
          }
}

1 Ответ

0 голосов
/ 22 мая 2019

Когда вы планируете построить модель LUIS, выберите хорошее соглашение об именах. В противном случае вам будет трудно ссылаться на конкретное намерение из вашего кода.

Не используйте слишком длинные слова в качестве имен намерений. Просто используйте короткие описательные формулировки. Хорошей практикой является использование верблюжьих или разделенных точками фраз

Необходимо помнить о LUIS:

  1. Определить различные намерения

Убедитесь, что словарь для каждого намерения только для этого намерения и не перекрывается с другим намерением

  1. Найти место для намерений

Используйте данные прогноза от LUIS, чтобы определить, являются ли ваши намерения перекрытия. Пересекающиеся намерения сбивают с толку LUIS. Результатом является то, что Наивысший балл слишком близок к другому. Потому что LUIS делает не использовать один и тот же путь через данные для обучения каждый раз, перекрывающиеся намерения имеют шанс быть первым или вторым в обучение

  1. Баланс ваших высказываний по всем направлениям

Для того, чтобы прогнозы LUIS были точными, количество примеров высказывания в каждом намерении (за исключением намерения None), должны быть относительно равный.

Если у вас есть намерение с 100 примерами высказываний и намерение с 20 примеров высказываний, намерение из 100 высказываний будет иметь более высокий скорость прогнозирования

Вот несколько дел и не для Луиса:

enter image description here

Примечание: Для более подробной информации вы можете обратиться к этому документы

Обновление:

enter image description here

Если у вас еще есть какие-либо вопросы, не стесняйтесь делиться ими в комментариях. Спасибо и счастливого кодирования!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...