Проблемы с соединением с Translator Text API версии 3.0 - чат-бот Microsoft Azure QnA - PullRequest
0 голосов
/ 01 июля 2018

Я хочу подключить своего бот-чата Azure QnA к когнитивной системе уровня перевода. Я использую эту страницу в качестве ссылки: https://docs.microsoft.com/en-us/azure/cognitive-services/translator/quickstart-csharp-translate

Я делаю это в C # и в онлайн-редакторе кода Microsoft Azure .

К сожалению, я не могу подключиться к слою перевода (по крайней мере, так).

Когда я попытался отладить его, я вижу, что он останавливается на этой конкретной части:

var response = await client.SendAsync(request);

var responseBody = await response.Content.ReadAsStringAsync();

Я проверил ошибки тайм-аута сети, и их много (20). Все они говорят: «При отправке этого сообщения вашему боту произошла ошибка: код состояния HTTP GatewayTimeout».

Я могу "build.cmd" нормально, без каких-либо ошибок, и когда я пытаюсь сделать Debug.WriteLine или Console.WriteLine, ничего не распечатывается (я даже пробовал в VS и эмуляторе)

Единственное, что я делаю по-другому, по сравнению с приведенной выше ссылкой, это то, что я определил "хост" и "ключ" вне приватного метода:

private static async Task<string> TranslateQuestionToEnglish (...)

Итак, я беру любое слово и хочу перевести его на английский. Когда я вынимаю эти две строки кода и тестирую метод со статическими значениями, он, очевидно, работает (все вместе с QnA и всем остальным).

Позже я вызываю этот метод в «Task MessageReceivedAsync».

Я создал когнитивную службу перевода, и единственное, что я там взял, это первый ключ от «Ключей» и использовал его здесь, в этом методе. Это единственное, что мне нужно от созданного познавательного служения ??

Еще одна вещь, в которой я не уверен, и если эта проблема создает проблемы, это то, что когда я обращаюсь ко всем ресурсам, я вижу, что мои qnatestbot (бот веб-приложения) и translationator_test (когнитивные сервисы) имеют тип " global "location", в то время как мой qnatestbot (служба приложений) относится к типу "west europe". Может ли то, что они в разных регионах создают проблемы? Должен ли я поместить их всех в Западной Европе (так как я в Германии)?

Хотя теперь, когда я смотрю на конечную точку translationator_test (когнитивные сервисы), я вижу, что это ... api.congitivemicrosft.com/.../v1.0.

Но когда я создавал ресурс, он автоматически создавался таким образом, без указания его с моей стороны? Как я могу это изменить?

Я надеюсь, что кто-то успешно сталкивался с такой проблемой и может мне помочь. Заранее спасибо

1 Ответ

0 голосов
/ 02 июля 2018

Я хочу подключить моего бот-чата QnA Azure к когнитивной системе уровня перевода. Я использую эту страницу в качестве ссылки: https://docs.microsoft.com/en-us/azure/cognitive-services/translator/quickstart-csharp-translate

Я пытаюсь создать пример для удовлетворения ваших требований: перевести пользовательские вводные данные на английский язык и передать текст перевода в диалоговое окно QnAMaker, пример отлично работает как на локальном, так и на Azure, вы можете обратиться к нему.

В сообщениях контроллера:

[BotAuthentication]
public class MessagesController : ApiController
{

    static string uri = "https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&to=en";
    static string key = "{the_key}";

    /// <summary>
    /// POST: api/Messages
    /// receive a message from a user and send replies
    /// </summary>
    /// <param name="activity"></param>
    [ResponseType(typeof(void))]
    public virtual async Task<HttpResponseMessage> Post([FromBody] Activity activity)
    {
        // check if activity is of type message
        if (activity.GetActivityType() == ActivityTypes.Message)
        {
            if (activity.Text != null)
            {
                var textinEN = await TranslateQuestionToEnglish(activity.Text);
                activity.Text = textinEN;
            }

            await Conversation.SendAsync(activity, () => new RootDialog());
        }
        else
        {
            HandleSystemMessage(activity);
        }
        return new HttpResponseMessage(System.Net.HttpStatusCode.Accepted);
    }

    private static async Task<string> TranslateQuestionToEnglish(string text)
    {
        System.Object[] body = new System.Object[] { new { Text = text } };
        var requestBody = JsonConvert.SerializeObject(body);

        using (var client = new HttpClient())
        using (var request = new HttpRequestMessage())
        {
            request.Method = HttpMethod.Post;
            request.RequestUri = new Uri(uri);
            request.Content = new StringContent(requestBody, Encoding.UTF8, "application/json");
            request.Headers.Add("Ocp-Apim-Subscription-Key", key);

            var response = await client.SendAsync(request);
            var responseBody = await response.Content.ReadAsStringAsync();

            dynamic jsonResponse = JsonConvert.DeserializeObject(responseBody);
            var textinen = jsonResponse[0]["translations"][0]["text"].Value;

            return textinen;
        }
    }

    private Activity HandleSystemMessage(Activity message)
    {
        if (message.Type == ActivityTypes.DeleteUserData)
        {
            // Implement user deletion here
            // If we handle user deletion, return a real message
        }
        else if (message.Type == ActivityTypes.ConversationUpdate)
        {
            // Handle conversation state changes, like members being added and removed
            // Use Activity.MembersAdded and Activity.MembersRemoved and Activity.Action for info
            // Not available in all channels
        }
        else if (message.Type == ActivityTypes.ContactRelationUpdate)
        {
            // Handle add/remove from contact lists
            // Activity.From + Activity.Action represent what happened
        }
        else if (message.Type == ActivityTypes.Typing)
        {
            // Handle knowing tha the user is typing
        }
        else if (message.Type == ActivityTypes.Ping)
        {
        }

        return null;
    }
}

В диалоговом окне:

[Serializable]
public class RootDialog : IDialog<object>
{
    public async Task StartAsync(IDialogContext context)
    {
        /* Wait until the first message is received from the conversation and call MessageReceviedAsync 
        *  to process that message. */
        context.Wait(this.MessageReceivedAsync);
    }

    private async Task MessageReceivedAsync(IDialogContext context, IAwaitable<IMessageActivity> result)
    {
        /* When MessageReceivedAsync is called, it's passed an IAwaitable<IMessageActivity>. To get the message,
            *  await the result. */
        var message = await result;

        var qnaAuthKey = GetSetting("QnAAuthKey"); 
        var qnaKBId = Utils.GetAppSetting("QnAKnowledgebaseId");
        var endpointHostName = Utils.GetAppSetting("QnAEndpointHostName");

        // QnA Subscription Key and KnowledgeBase Id null verification
        if (!string.IsNullOrEmpty(qnaAuthKey) && !string.IsNullOrEmpty(qnaKBId))
        {
            // Forward to the appropriate Dialog based on whether the endpoint hostname is present
            if (string.IsNullOrEmpty(endpointHostName))
                await context.Forward(new BasicQnAMakerPreviewDialog(), AfterAnswerAsync, message, CancellationToken.None);
            else
                await context.Forward(new BasicQnAMakerDialog(), AfterAnswerAsync, message, CancellationToken.None);
        }
        else
        {
            await context.PostAsync("Please set QnAKnowledgebaseId, QnAAuthKey and QnAEndpointHostName (if applicable) in App Settings. Learn how to get them at https://aka.ms/qnaabssetup.");
        }

    }

    private async Task AfterAnswerAsync(IDialogContext context, IAwaitable<IMessageActivity> result)
    {
        // wait for the next user message
        context.Wait(MessageReceivedAsync);
    }

    public static string GetSetting(string key)
    {
        var value = Utils.GetAppSetting(key);
        if (String.IsNullOrEmpty(value) && key == "QnAAuthKey")
        {
            value = Utils.GetAppSetting("QnASubscriptionKey"); // QnASubscriptionKey for backward compatibility with QnAMaker (Preview)
        }
        return value;
    }
}

// Dialog for QnAMaker Preview service
[Serializable]
public class BasicQnAMakerPreviewDialog : QnAMakerDialog
{
    // Go to https://qnamaker.ai and feed data, train & publish your QnA Knowledgebase.
    // Parameters to QnAMakerService are:
    // Required: subscriptionKey, knowledgebaseId, 
    // Optional: defaultMessage, scoreThreshold[Range 0.0 – 1.0]
    public BasicQnAMakerPreviewDialog() : base(new QnAMakerService(new QnAMakerAttribute(RootDialog.GetSetting("QnAAuthKey"), Utils.GetAppSetting("QnAKnowledgebaseId"), "No good match in FAQ.", 0.5)))
    { }
}

// Dialog for QnAMaker GA service
[Serializable]
public class BasicQnAMakerDialog : QnAMakerDialog
{
    // Go to https://qnamaker.ai and feed data, train & publish your QnA Knowledgebase.
    // Parameters to QnAMakerService are:
    // Required: qnaAuthKey, knowledgebaseId, endpointHostName
    // Optional: defaultMessage, scoreThreshold[Range 0.0 – 1.0]
    public BasicQnAMakerDialog() : base(new QnAMakerService(new QnAMakerAttribute(RootDialog.GetSetting("QnAAuthKey"), Utils.GetAppSetting("QnAKnowledgebaseId"), "No good match in FAQ.", 0.5, 1, Utils.GetAppSetting("QnAEndpointHostName"))))
    { }

}

Результат теста: enter image description here

Примечание: Мы можем использовать ConfigurationManager.AppSettings["QnAKnowledgebaseId"]; для доступа к настройкам QnAKnowledgebaseId и т. Д. Из web.config, если приложение бота запускается локально. Для получения дополнительной информации, пожалуйста, обратитесь к этой теме SO .

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