Перейти к основному содержимому

LLM в телефонии

Бета

В телефонном канале вы можете использовать тип ответа llmRequest, чтобы бот в потоковом режиме получал текст от LLM и синтезировал речь.

Чтобы начать работу:

  1. Добавьте токен для Caila.
  2. Используйте тип ответа llmRequest в сценарии.

Провайдеры LLM и TTS

  • Для генерации текстов сейчас вы можете обращаться только к моделям сервиса openai-proxy на платформе Caila.

    предупреждение

    LLM доступны только в платном тарифе. Чтобы использовать модели, пополните баланс Caila.

  • Синтез речи работает для любого TTS-провайдера.

Преимущества llmRequest

Тип ответа llmRequest генерирует текст и синтезирует речь в потоковом режиме. Бот по предложениям получает текст от LLM и так же по предложениям синтезирует речь. Оба процесса проходят параллельно.

Так вы можете уменьшить паузы перед ответом бота по сравнению с тем, когда генерация и синтез проходят последовательно.

Пример последовательной генерации и синтеза без llmRequest
// Бот получает текст от LLM
var llmResponse = $gpt.createChatCompletion([{ "role": "user", "content": $request.query }]);
var response = llmResponse.choices[0].message.content;
// Бот синтезирует речь сразу для всего текста
$reactions.answer(response);

Здесь бот:

  1. Обращается к LLM с помощью $gpt.createChatCompletion. Бот ждет, пока LLM сгенерирует текст полностью.
  2. Отправляет весь текст на синтез речи и ждет, пока речь будет просинтезирована для всего текста.
  3. Воспроизводит текст.

В этом случае между запросом пользователя и ответом бота может возникать длительная пауза в несколько секунд.

llmRequest также позволяет указать фразы, которые бот произнесет, чтобы заполнить паузу в начале генерации текста.

Токен доступа к Caila

Для использования сервисов и генеративных моделей из Caila в сторонних приложениях, в том числе JAICP, нужен персональный токен доступа. Чтобы выпустить токен:

  1. Перейдите в Caila.

    подсказка

    Caila и Conversational Cloud использует общую базу аккаунтов, поэтому если вы зарегистрированы в Conversational Cloud, дополнительно регистрироваться в Caila не нужно.

  2. Перейдите на страницу Мое пространствоAPI-токены.

  3. В правом верхнем углу нажмите Создать токен.

  4. Придумайте имя токена, сгенерируйте его и скопируйте в буфер обмена.

Далее добавьте этот токен в JAICP:

  1. Перейдите в JAICP. В разделе Токены и переменные добавьте новый токен.

  2. В ответе llmRequest укажите название токена в свойстве tokenSecret.

Использование llmRequest в сценарии

state: NoMatch
event!: noMatch
script:
$response.replies = $response.replies || []
$response.replies.push({
type: "llmRequest",
provider: "CAILA_OPEN_AI",
// Модель для генерации текста
model: "gpt-4o",
// Название токена
tokenSecret: "MY_LLM_TOKEN",
// Промт и запрос пользователя
messages: [
{"role": "system", "content": "Отвечай коротко. Максимум несколько предложений."},
{"role": "user","content": $request.query}
]
});

В этом примере llmRequest используется в стейте NoMatch:

  1. Бот отправляет запрос на генерацию текста в сервис openai-proxy на платформе Caila. В поле messages указаны:

    • Промт для LLM, чтобы модель генерировала короткий ответ.
    • Текст запроса пользователя, который хранится в $request.query.
  2. Когда бот получит первое предложение от LLM, он начнет синтезировать речь.

  3. Бот воспроизводит первое предложение пользователю.

  4. Бот продолжает синтезировать и воспроизводить речь по предложениям, пока не получит весь текст от LLM.

Ограничения
  • Для llmRequest не поддерживается перебивание, пользователь не сможет перебить бота.
  • После перехода в стейт бот сразу начинает готовить текст и речь для llmRequest. Лимиты Caila и синтеза речи могут быть списаны, даже если пользователь завершил вызов и бот не воспроизвел речь.
  • Сейчас текст ответа от LLM недоступен в переменной $response. Также текст ответа не будет добавлен в историю диалога, если вы получаете ее, например, с помощью метода $jsapi.chatHistoryInLlmFormat.

Заполнение пауз

В сценарии пауза может возникнуть, пока бот ждет первое предложение текста от LLM. Вы можете заполнить эту паузу двумя способами:

  • Используйте настройку fillersPhraseConfig. Вы можете указать фразу, которую бот произнесет в начале генерации. Это позволит заполнить паузу, если она слишком длинная.

    state: NoMatch
    event!: noMatch
    script:
    $response.replies = $response.replies || []
    $response.replies.push({
    type: "llmRequest",

    // Бот произнесет фразу, если пауза превысила 2000 мс.
    fillersPhraseConfig: {"fillerPhrase": "Хороший вопрос!", "activationDelayMs": 2000}
    });
  • Укажите другие ответы перед llmRequest. После перехода в стейт бот сразу начинает готовить текст и речь для llmRequest. Бот может выполнять другие реакции перед llmRequest, пока он ждет ответа от LLM.

    state: NoMatch
    event!: noMatch
    # Бот сразу начинает генерировать ответ llmRequest после перехода в стейт
    a: Хороший вопрос!
    a: Дайте подумать
    # Бот уже произнес две фразы. За это время он подготовил часть ответа
    script:
    $response.replies = $response.replies || []
    $response.replies.push({
    type: "llmRequest",

    });