LLM в телефонии
Бета
В телефонном канале вы можете использовать тип ответа llmRequest
, чтобы бот в потоковом режиме получал текст от LLM и синтезировал речь.
Чтобы начать работу:
- Добавьте токен для Caila.
- Используйте тип ответа
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);
Здесь бот:
- Обращается к LLM с помощью
$gpt.createChatCompletion
. Бот ждет, пока LLM сгенерирует текст полностью. - Отправляет весь текст на синтез речи и ждет, пока речь будет просинтезирована для всего текста.
- Воспроизводит текст.
В этом случае между запросом пользователя и ответом бота может возникать длительная пауза в несколько секунд.
llmRequest
также позволяет указать фразы, которые бот произнесет, чтобы заполнить паузу в начале генерации текста.
Токен доступа к Caila
Для использования сервисов и генеративных моделей из Caila в сторонних приложениях, в том числе JAICP, нужен персональный токен доступа. Чтобы выпустить токен:
-
Перейдите в Caila.
подсказкаCaila и Conversational Cloud использует общую базу аккаунтов, поэтому если вы зарегистрированы в Conversational Cloud, дополнительно регистрироваться в Caila не нужно.
-
Перейдите на страницу Мое пространство → API-токены.
-
В правом верхнем углу нажмите Создать токен.
-
Придумайте имя токена, сгенерируйте его и скопируйте в буфер обмена.
Далее добавьте этот токен в JAICP:
-
Перейдите в JAICP. В разделе Токены и переменные добавьте новый токен.
-
В ответе
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
:
-
Бот отправляет запрос на генерацию текста в сервис
openai-proxy
на платформе Caila. В полеmessages
указаны:- Промт для LLM, чтобы модель генерировала короткий ответ.
- Текст запроса пользователя, который хранится в
$request.query
.
-
Когда бот получит первое предложение от LLM, он начнет синтезировать речь.
-
Бот воспроизводит первое предложение пользователю.
-
Бот продолжает синтезировать и воспроизводить речь по предложениям, пока не получит весь текст от 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",
…
});