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

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

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

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,
        },
    });
});