Использование RASA для создания email-бота - в общем, об управлении диалогами email-ботов - PullRequest
0 голосов
/ 28 апреля 2020

Я задаю общий вопрос о том, как создавать ботов, работающих через канал электронной почты. В частности, о том, как найти решения, используя RASA * ​​1002 *.

1. E-MAIL GATEWAY SERVER

Автоматическая отправка и получение почты представляется "несложной" задачей шлюза. Нужен сервер шлюза, который получает почту через IMAP и вызывает RASA REST API, отвечает на ответы RASA Core, отправляет обратно пользователю почту через SMTP.

Вопрос 1:

Есть ли уже готовый почтовый шлюз, который будет использоваться в качестве соединителя для RASA (или любого другого диалогового механизма)?


2. E-MAILS-EXCHANGE DIALOG MANAGEMENT

Сообщения электронной почты являются лишь примером длинных входных текстов, содержащих много связанных "намерений". Здесь сложные топи c.

Давайте избавимся от обычной парадигмы чата, когда бот и человек обмениваются небольшими разговорами со спиной и вперед, сделанной несколькими словами / часто всего одним предложением, возможно, за короткое время (секунды / минуты). В этом сценарии я предполагаю, что темы чата довольно «контекстуализированы» в последовательностях чатов близких ходов. Чат можно рассматривать как « синхронный обмен сообщениями ».

Вместо этого давайте подумаем о другом сценарии, в котором разговор происходит только через электронную почту.

BTW , Моё вертикальное приложение касается академических исследований в образовательных сферах, об использовании «репетитора», чтобы студенты могли задавать вопросы боту-репетитору о содержании курса или обо всем, что связано с курсом, экзаменами и т. Д. c.

В этом сценарии пользователь отправляет электронное письмо боту, поскольку получатель был настоящим учителем-человеком (возможно, студент не знает, является ли получатель почты настоящим человеком-наставником или ботом. TBD / частично не имеет значения) .

Дело в том, что при обычном общении по электронной почте между людьми пользователи «собирают» в одном тексте (письме), может быть, больше, чем один топи c (скажем «намерение» в нашем на язык), которые могут быть не связаны друг с другом (просто), или, может быть, есть зависимость между ними (трудно!).

Необходимость этой «подборки» вопросов / тем заключается в том, что электронная почта является асинхронным каналом связи, поэтому обмен сообщениями между людьми является обычным делом для сбора в одном сообщении группы тем. КСТАТИ; Я называю электронное письмо « асинхронный обмен сообщениями ».

Вопрос 2:

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

Моя первая идея состоит в том, чтобы разбить входной текст на несколько предложений, обрабатывая их вслепую, хотя бы RASA NLU , как последовательность намерений. по одному. Ответ бота будет тривиально создавать текст NLG, просто объединяя ответы вышеупомянутых намерений.

Пример входящей почты пользователя:

 Hi Mr. tutor, 

 I'm very interested in topic X mentioned in video Y.
 Can I have more study material? Maybe some papers about it?
 BTW, what's examination next session date? 

 Thanks & regards

 giorgio

Ответ бота-репетитора может быть объединением намерений. ответы, без какой-либо памяти / корреляции среди ответов. Это, возможно, может работать для простых случаев. См. Этот ответ:

 Hi Giorgio,

 I'm glad you are interested in topic X. 
 You were right to watch video about Y. 
 That's coherent with your study programme! 
 I also suggest to read these papers: Z, W. 

 The next examination date is to be decided yet. 
 I'll inform you asap via email! 

 Regards

 The teacher

С точки зрения намерений RASA входная почта может быть:

intent greet
intent interest_on
intent interest_more_info
intent next_exam
intent_thanks
intent_signature

С точки зрения ответов RASA, выходная почта может быть:

answer_greet
answer_interest_on
answer_interest_more_info
answer_next_exam
answer_signature

Пока это кажется простым ... но что, если входные предложения в той или иной степени связаны друг с другом?

Рассказы Расы Ядра , как предсказание последовательностей намерений, входная почта кажется теоретически лучшим решением, но мне не совсем понятно, как реализовать использование историй в коде приложения.

Можете ли вы помочь мне понять на практике, как возможно использовать истории RASA в этом письме контекст? Я имею в виду: как можно использовать ядро ​​RASA для прогнозирования следующего намерения / ответа, учитывая обнаружение предыдущих намерений? Можете ли вы дать мне пример кода? (Я не RASA / python умник)

Спасибо Джорджио

Ответы [ 2 ]

0 голосов
/ 08 мая 2020

Реализация Boilerplate, которую вы выполнили в nodejs, только разбить текст электронной почты и отправить предложения в Rasa API Rest.

Для службы ботов электронной почты проблема заключается в том, что должен быть задан сценарий с несколькими намерениями ios , Rasa NLU поддерживает дескриптор многоцелевого сценария ios.

https://blog.rasa.com/how-to-handle-multiple-intents-per-input-using-rasa-nlu-tensorflow-pipeline/

0 голосов
/ 28 апреля 2020

Я переосмыслил свой вопрос, и это мое первое подходящее решение, которое можно проверить здесь. Поэтому мне, возможно, просто нужно «буферизовать» входящие почтовые предложения, разбивая их и собирая / «буферизируя» также ответы от бота, чтобы окончательно отправить их как уникальный ответ по электронной почте. Вот грубый код nodejs:

  const listOfUndesiredIntents = ['chitchat', 'out_of_scope', 'interjection']

  /**
   * email reply 
   * @param {String} sender - email address or user id/name
   * @param {String} inputMailText - contains the body text of incoming mail
   * @param {String[]} listOfUndesiredIntents
   * @return {String}
   */
  const emailResponse = (sender, inputMailText, listOfUndesiredIntents) => {

    // full text is split into a sequence (array) of sentences.
   const sentences = sentenceTokeniker(inputMailText)

    const outputMailText = ''

    for (const sentence of sentences) {
      outputMailText += getFiteredRasaCoreResponse(sender, sentence, listOfUndesiredIntents)

    return outputMailText
  }


const getFiteredRasaCoreResponse = (sender, sentence, listOfUndesiredIntents) => {

  const sentenceSeparator = '\n\n'

    const reply = await getRASACoreResponse(sender, sentence)

    // output mail would contain just "meaningful" contents.
    // it would be better if it doesn't contain answers to some kind of intents, 
    // e.g. answer must removed if related intent is 
    // a fallback, a "not understand", an interjection or (maybe/TBD) any chitchat, etc.

    const intent = await getRASALastSelectedIntent(sender)


    return listOfUndesiredIntents.includes(intent) ? '' : reply + sentenceSeparator 

}


const getRasaCoreResponse = (sender, sentence) => {

    // submit sentence to RASA engine, calling HTTP POST RASA Core server,
    // to endpoint: http://rasaRunServer:port/webhooks/rest/webhook

}


const getRasaCoreResponse = (sender, sentence) => {

    // submit sentence to RASA engine, calling HTTP POST RASA Core server,
    // to endpoint: http://rasaRunServer:port/webhooks/rest/webhook

}


const getRASALastSelectedIntent = (sender) => {

    // using RASA API endpoint: conversations/sender/tracker
    // returns intent name corresponding of last message processed

}

Примечание: getFiteredRasaCoreResponse() если исключить "бесполезные" ответы (UtteranceActions).

...