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

Общие события распознавания ввода (интенты и ответы на вопросы из БЗ)

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

onUtteranceRecognized

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

onUtteranceRecognized

TypeScript
1
2
3
4
5
6
function onUtteranceRecognized(
  sourceKey: OptionalParameter<UtteranceRecognizedSourceKeyType>,
  callback: (
    botEvent: UtteranceRecognizedEvent
  ) => Promise<void>
): void
  • sourceKey — ключ источника (интенты или вопросы/ответы из баз знаний) (см. UtteranceRecognizedSourceKeyType). При указании null, undefined, "*" или пустой строки обработчик вызывается при распознавании из любого источника (см. OptionalParameter). Возможные значения:
    • intents - ввод пользователя распознан как интент;
    • answers - ввод пользователя распознан как вопрос к базе знаний.
  • callback — функция, которая будет вызвана после успешного распознавания.
  • botEvent — объект события, который можно использовать в теле функции (см. UtteranceRecognizedEvent).

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

onUtteranceUnrecognized

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

onUtteranceUnrecognized

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

В событии также доступны некоторые возможности управления выполнением сценариев бота: Управление выполнением. Например, можно проверить, находится ли пользователь в корневом сценарии: Текущие сценарии. Также можно отметить текущую активность как обработанную: 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);
};

// Подписываемся на событие нераспознанного ввода.
onUtteranceUnrecognized('*', 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,
        },
    });
});