Upgrade to Pro — share decks privately, control downloads, hide ads and more …

[SnowOne 2025] Настя Лисицкая: "Алиса: засценар...

[SnowOne 2025] Настя Лисицкая: "Алиса: засценарье. Сквозь сценарии и что там может найти разработчик"

Рассмотрим принцип работы умного ассистента и постепенно погрузимся в детали разработки. Разберемся, что такое сценарий в терминах Алисы и посмотрим, как все меняется с применением LLM для реализации смарт-функций.

Видео: https://youtu.be/fT83db4tN2E

Avatar for jugnsk

jugnsk

May 07, 2025
Tweet

More Decks by jugnsk

Other Decks in Programming

Transcript

  1. 2 • Больше 8 лет в Яндексе занимаюсь java разработкой

    • Сейчас тимлид в команде разработки продуктивности и международных сценариев в Алисе • Участник рабочей группы java-комьюнити в Яндексе Кто я
  2. 3 Введение • Поверхности • Терминология • Инфраструктурные компоненты Эволюция

    архитектуры • Архитектура v1 • Архитектура v2 • Архитектура v3 Постконстракшен • Тестирование • Релизы • Проблемы Выводы 01 • 0 • 0 • 0 02 • 0 • 0 • 0 • 0 • 0 03 • 0 • 0 • 0 04
  3. 4 01 Будет: • Обзор развития архитектуры Алисы 02 Не

    будет: • Про железки • Про джавовые кишки • ML О чём
  4. 6

  5. 7 Места обитания Устройства Яндекса • Станции • ТВ станции

    Поверхности партнеров • Девайсы с экраном • Операционная система YaOS Приложения • Дом с Алисой • Приложение Алисы • Браузер, приложения Яндекса и тд.
  6. 8 «И вправду, план был замечательный — такой простой и

    ясный. Одно только плохо: Алиса не имела ни малейшего представления о том, как всё это сделать» — Льюис Кэрол История Запрос Ответ
  7. 9 Терминология • Интент — задача, которую пользователь формулирует в

    конкретной реплике. • Сценарий — задача пользователя, которую он решает с помощью голосового помощника. Сценарии состоят из одного или нескольких интентов.
  8. 18 Архитектура v1 Запрос VINS (Voice Interface Service) — диалоговый

    движок Алисы. BASS (Back End Assistant) — реализация бизнес-логики и работа с внешними источниками Ответ … weather music A S R T T S
  9. 21 Архитектура v2 Ответ Begemot (NLU) Запрос auth geo …

    музыка видео будильники календарь Алиса v1 music back kinopoisk calendar Сценарии
  10. 22 Аппхост — это экосистема для создания сервисов на базе

    микросервисной инфраструктуры внутри Яндекса. Позволяет декларативно описать, как запрос в сервис должен быть обработан. Предоставляет: • масштабируемый сервис с трейсами, мониторингами • сервис дискавери • балансировку нагрузки и тп. Apphost Про apphost
  11. 27 Графы сценариев • Запросы отправляются по gRPC в формате

    Binary Protobuf • Ответ каждой ручки должен укладываться в 300 мс.
  12. 29 1. Фреймворк на С++ 2. С базовым графогенератором 3.

    Релизный флоу — 2 раза в неделю Hollywood
  13. 30 1. Фреймворк на Kotlin 2. С базовым графогенератором 3.

    Релизный флоу с ежедневными релизами Кronstadt
  14. 32 Name: "Calendar" Description: "Работа с календарём” DataSources: [{Type: AUTH_INFO}]

    Capabilities: [{Type: ViewCapabilityType}, {Type: OnOffCapabilityType}] AcceptedIntents: [ "alice.calendar.event_set", "alice.calendar.event_show", …] Enabled: True Конфиг сценария в Megamind
  15. 33 1. Определение сцены по интенту 2. Формирование аргументов сцены

    3. Обработка запроса сценой 4. Формирование ответа Для реализации сценария из одной сцены достаточно реализовать два соответствующих интерфейса Реализация сценария
  16. 34 interface IScenario<State> { val scenarioMeta: ScenarioMeta val scenes: List<Scene<State,

    *>> val grpcHandlers: List<RpcHandler<*, *>> … val name: String get() = scenarioMeta.name fun doPrepareSelectScene(request: MegaMindRequest<State>, responseBuilder: ScenePrepareBuilder) fun doSelectScene(request: MegaMindRequest<State>): SelectedScene.Running<State, *>? fun prepareRun(request: MegaMindRequest<State>, responseBuilder: ApphostResponseBuilder, selectedScene: SelectedScene.Running<State, *>) … Scenario
  17. 35 interface Scene<State, Args : Any> { val name: String

    @get:JsonIgnore val argsClass: KClass<Args> // process request for the given scene fun selectScene(request: MegaMindRequest<State>): SelectedScene.Running<State, *>? = null fun process(request: MegaMindRequest<State>, args: Args): BaseRunResponse<State>? } Scene
  18. 36 @Component class CalendarInformerScene(private val nlg: CalendarNlg) : AbstractScene<CalendarState, CalendarInformerSceneArgs>(CALENDAR_INFORMER,

    CalendarInformerSceneArgs::class) { private val logger = LogManager.getLogger() override fun process(request: MegaMindRequest<CalendarState>, args: CalendarInformerSceneArgs): RelevantResponse<CalendarState> { logger.info("Process CalendarInformer") val phrase = when (args.kind) { CalendarInformerSceneArgs.InfoType.BIO_UNSUPPORTED -> nlg.bioUnsupported(request) CalendarInformerSceneArgs.InfoType.HOW_TO_SET_EVENT -> nlg.howToSetEvent(request) CalendarInformerSceneArgs.InfoType.ONBOARDING -> nlg.calendarOnboarding(request) CalendarInformerSceneArgs.InfoType.LOGIN_REQUIRED -> nlg.loginRequired(request) else -> nlg.calendarOnboarding(request) } return RunOnlyResponse( layout = CalendarNlg.prepareLayout(phrase), analyticsInfo = buildCommonAI( intent = CALENDAR_INFORMER ), ) }
  19. 38 { "vertical": "ALICE", "name": "calendar_run", "settings": { "node_deps": {

    ... "CALENDAR__GET_EVENT_API_PROXY": { "input_deps": [ "CALENDAR__SELECT_SCENE@!calendar_get_events_http_request- >http_request" ] }, … "RESPONSE": { "input_deps": [ "CALENDAR__COMMON_RUN_PROCESS@mm_scenario_response" ] } }, "input_deps": [ "DATASOURCES", "WALKER_RUN_STAGE0" ], "output_deps": [ "RESPONSE" ], "nodes": { "CALENDAR__PRE_SELECT_SCENE": { "backend_name": "KRONSTADT", "params": { "handler": "/kronstadt/scenario/calendar/run/pre_select", "timeout": "100ms", "soft_timeout": "30ms", "attempts": { "max_attempts": 2 } … "responsibles": {} }, "monitoring": { "alerts": [ { "operation": "perc", "warn": 0.09, "crit": 0.1, "prior": 10 } ] } } Конфиг графа сценария
  20. 42 Включи третью серию Богатырей и выключись после неё Надо

    было бы написать сцену, которая в это матчится и делает действия из двух сценариев Идея v2 сцена_1 сцена_2 сцена_3 сцена_4 Сценарий Минимальная единица операции
  21. 43 Сценарий, который состоял из интентов превращается в набор смарт-функций

    (Tool Calling или Function Calling) Идея v3 Смарт-функция Включи третью серию Богатырей и выключись после неё content_search + Включили контент и поставили таймер сна Минимальная единица операции play_content set_sleep_timer →
  22. 44 Как работает Контекст Промпт с описанием смарт-функций Запрос YandexGPT

    Смарт-функция 1 … Смарт-функция N Ответ Финальный ответ
  23. 45 В сценарии В смарт-функциях Сценарий знает весь запрос Запрос

    знает только модель У модели есть перечень функций с описаниями Классификатор определяет интент. Тэггер выделяет из запроса параметры LLM модель выбирает подходящие функции и заполняет аргументы Реализация логики интента Реализация логики функции Формируем в сценарии полный ответ Заполняем параметры ответа и ошибку, если что не так. Моделька формирует ответ Разница
  24. 46 interface LlmFunction<Arg : Message, Result : Message> { val

    name: String … /** * Initial step of a function, needed to setup request to another node */ fun setup(request: LlmFunctionRequest<Arg>, responseBuilder: ScenePrepareBuilder) { // default noop implementation } /** * Main step of a function to create final response for llm and MegaMind response merger */ fun process(request: LlmFunctionRequest<Arg>): LlmFunctionResponse<Result> } Реализация в фреймворке
  25. 47 1. Сбор запросов и генерация стейтов • Описание инструкций

    для толокеров/ассесоров • Генеративные запросы 2. Разметка редакторами на правильность и вызовы функций 3. Лерн модели на размеченных данных Про сбор данных для лерна
  26. 48 Что даёт • Не надо писать под каждую комбинацию

    какой-то новый интент и для него обучать классификатор с тэггером • Можно научить вызывать последовательность функций • Учитывать контекст • Переиспользовать логику сценариев готовых
  27. 50 • Бот в телеграме — можно настроить любую поверхность,

    задать экспы, конфиги, переопределить урлы • Реальные устройства и приложения — куда можно запушить конфигурацию с переопределенными урлами и своим набором флагов и экспериментов Тестирование
  28. 51 Отладка srcrwr (source rewrite) — позволяет переопределить любую ноду

    апхостового графа или вообще весь урл на свою локальную копию и запушить на колонку
  29. 53 • Unit • It2 — имитируют запрос в сценарий

    и получают на выходе соответствующий ответ сценария • Evo — эмулируется работа разных поверхностей Алисы. Принимают запрос (текст, как строчку, или голос, как набор байтов) и возвращают предобработанный ответ от бэкенда Алисы. Тесты
  30. 54 Релизный флоу • Разработка под флагами • Бета (на

    стаф) • А/Б на проценты • Фичетоглы • Запуск на 100%
  31. 55 • Неоднозначность запросов пользователей • Много компонент — релизы

    • Сбор данных для приёмки новой фичи • Контроль качества Проблемы сложности
  32. 56 • Мир не стоит на месте • Развитие продукта

    и окружающих технологий влияет на архитектуру • Нет предела совершенству • Алиса много говорит J Выводы