Перейти к содержанию
telegram AI Бот

События распознавания ответов на вопросы из БЗ

Виды обрабатываемых событий

onQuestionRecognized

Данный обработчик вызывается, когда происходит успешное нахождение ответа на вопрос из базы знаний. Можно подписаться только на события с определенным идентификатором стадии базы знаний и/или вопроса (kbStageId/answerId) или вообще все. При обработке события доступен объект с результатами распознавания, строкой ввода пользователя, идентификатором стадии базы знаний и вопроса. С помощью обработчика этого события можно, например, дополнительно проанализировать строку ввода пользователя, попробовать найти в ней нужную информацию (название магазина, имя пользователя, регион и т. п.) или заранее заполнить соответствующие переменные бота. Обработчик вызывается один раз для каждой включенной базы знаний в боте (на текущий момент в UI можно подключить только одну базу знаний, однако в будущем данная возможность может быть расширена на несколько баз знаний).

onQuestionRecognized

TypeScript
1
2
3
4
5
6
7
function onQuestionRecognized(
  kbStageId: OptionalParameter<KbStageIdType>,
  answerId: OptionalParameter<AnswerIdType>,
  callback: (
    botEvent: QuestionRecognizedEvent
  ) => Promise<void>
): void;
  • kbStageId — идентификатор стадии базы знаний (см. KbStageIdType). При указании null, undefined, "*" или пустой строки обработчик вызывается для всех баз знаний (см. OptionalParameter).
  • answerId — идентификатор ответа (см. AnswerIdType). При указании null, undefined, "*" или пустой строки обработчик вызывается для любого ответа (см. OptionalParameter).
  • callback — функция, которая будет вызвана после успешного распознавания.
  • botEvent — объект события, который можно использовать в теле функции (см. QuestionRecognizedEvent).

В событии также доступны некоторые возможности управления выполнением сценариев бота: Управление выполнением. Например, можно проверить, находится ли пользователь в корневом сценарии: Текущие сценарии. Также можно отметить текущую активность как обработанную: activityProcessed.

onQuestionUnrecognized

Данный обработчик вызывается, когда происходит неуспешное нахождение ответа на вопрос из базы знаний. Можно подписаться только на события с определенным идентификатором стадии базы знаний и/или причиной неудачи (kbStageId/reasonKey) или вообще все. При обработке события доступен объект с результатами попытки распознавания, строкой ввода пользователя, идентификатором стадии базы знаний и причиной неудачи. С помощью обработчика этого события можно, например, обратиться к LLM/GPT и сгенерировать с помощью нее ответ для пользователя. Обработчик вызывается один раз для каждой включенной базы знаний в боте (на текущий момент в UI можно подключить только одну базу знаний, однако в будущем данная возможность может быть расширена на несколько баз знаний).

onUtteranceUnrecognized

TypeScript
1
2
3
4
5
6
7
function onQuestionUnrecognized(
  kbStageId: OptionalParameter<KbStageIdType>,
  reasonKey: OptionalParameter<QuestionUnrecognizedReasonKeyType>,
  callback: (
    botEvent: QuestionUnrecognizedEvent
  ) => Promise<void>
): void;
  • kbStageId — идентификатор стадии базы знаний (см. KbStageIdType). При указании null, undefined, "*" или пустой строки обработчик вызывается для всех баз знаний (см. OptionalParameter).
  • reasonKey — причина неудачного распознавания, после которого срабатывает обработчик события (см. QuestionUnrecognizedReasonKeyType). При указании null, undefined, "*" или пустой строки обработчик вызывается при любой причине неудачи (см. OptionalParameter). Возможные значения:
    • no_utterance - пустой ввод пользователя;
    • kb_disabled - база знаний отключена;
    • no_answers - база знанаий не содержит записей;
    • low_score - низкий score ответа из базы знаний.
  • callback — функция, которая будет вызвана после успешного распознавания.
  • botEvent — объект события, который можно использовать в теле функции (см. QuestionUnrecognizedEvent).

В событии также доступны некоторые возможности управления выполнением сценариев бота: Управление выполнением. Например, можно проверить, находится ли пользователь в корневом сценарии: Текущие сценарии. Также можно отметить текущую активность как обработанную: activityProcessed.

Пример

В это примере мы подписываемся на событие нераспознанного ответа на вопрос из базы знаний и передаем этот вопрос в Yandex GPT. На основании ответа от Yandex GPT мы формируем ответное сообщение для пользователя.

TypeScript
// Импортируем Axios.
const axios = require('axios');

// Указываем учетные данны.
const iamToken = '********';
const folderId = '********';

// Создаем HTTP-клиент.
const httpClient = axios.create({
    baseURL: 'https://llm.api.cloud.yandex.net/foundationModels/v1/completion',
    timeout: 5000,
    headers: {
        'Content-Type': 'application/json',
        'Authorization': `Bearer ${iamToken}`,
        'x-folder-id': folderId
    }
});

// Создаем запрос.
const buildRequest = (messages: {}[]) => {
    return {
        "modelUri": `gpt://${folderId}/yandexgpt-lite`,
        "completionOptions": {
            "stream": false,
            "temperature": 0.6,
            "maxTokens": "2000"
        },
        messages: messages,
    };
}

// Отправляем запрос.
const sendRequest = async (request: {}) => {
    const response = await httpClient.post('', request);
    return response.data;
};

// Отправляем сообщение.
const sendMessages = async (messages: {}[]) => {
    const request = buildRequest(messages);
    return await sendRequest(request);
}

// Отправляем ввод пользователя.
const sendUtterance = async (utterance: string) => {
  const messages = [
      {
          "role": "system",
          "text": "Пользователь задал вопрос, но мы не знаем на него ответ. Ответь на этот вопрос, пожалуйста."
      },
      {
          "role": "user",
          "text": utterance
      }
  ];
  return await sendMessages(messages);
};

// Подписываемся на событие нераспознанного ответа на вопрос из базы знаний.
onQuestionUnrecognized('*', '*', async (botEvent) => {
    // Отправляем ввод пользователя в LLM.
    const result = await sendUtterance(botEvent.userInputText);

    // Формируем сообщение на основании ответа LLM для отправки пользователю.
    context.output.activities.push({
        type: ScriptActivityTypes.Message,
        text: {
            format: TextFormatTypes.Plain,
            content: result.completion.text,
        },
    });
});