1
00:00:00,300 --> 00:00:03,433
Вы говорите: «Покажи ближайшие аэропорты».

2
00:00:03,533 --> 00:00:10,633
webrtc-komaroff должен распознать реплику, выбрать сценарий и показать результат на карте.

3
00:00:11,367 --> 00:00:14,433
Этот путь проходит через несколько сервисов.

4
00:00:14,533 --> 00:00:21,900
Каждый отвечает за свою часть: соединение, распознавание, состояние разговора или выполнение

5
00:00:22,000 --> 00:00:23,033
инструментов.

6
00:00:23,767 --> 00:00:27,167
Браузер передаёт микрофон по WebRTC.

7
00:00:27,267 --> 00:00:33,533
Сервис Core завершает соединение и превращает звук в короткие пакеты для распознавания.

8
00:00:34,267 --> 00:00:38,133
В текущем формате кадр содержит двадцать миллисекунд звука.

9
00:00:38,233 --> 00:00:43,500
Пакеты идут через брокер сообщений NATS в соседний проект распознавания.

10
00:00:44,233 --> 00:00:48,033
Там детектор речи отделяет голос от тишины.

11
00:00:48,133 --> 00:00:54,633
Когда фраза закончена, сервис отправляет её внешнему распознавателю LinTO и получает текст.

12
00:00:55,367 --> 00:00:59,500
Теперь голосовой и текстовый запросы идут одним путём.

13
00:00:59,600 --> 00:01:04,833
Core передаёт Агенту текст и идентификаторы сессии и реплики.

14
00:01:05,567 --> 00:01:09,533
Агент загружает состояние диалога из базы PostgreSQL.

15
00:01:09,633 --> 00:01:14,967
Так следующий вопрос может продолжить предыдущий сценарий, а не начинать разговор заново.

16
00:01:15,700 --> 00:01:18,033
Дальше работает сценарный движок.

17
00:01:18,133 --> 00:01:24,467
Он решает, какой инструмент нужен, какие данные уже есть и что ещё спросить у пользователя.

18
00:01:25,200 --> 00:01:33,167
Для нового запроса об аэропортах текущий сценарий обращается к языковой модели дважды: сначала выбирает

19
00:01:33,267 --> 00:01:36,633
намерение, затем извлекает параметры поиска.

20
00:01:37,367 --> 00:01:41,167
Сам поиск выполняет инструмент по каталогу аэропортов.

21
00:01:41,267 --> 00:01:43,533
Модель не должна придумывать координаты.

22
00:01:43,633 --> 00:01:47,867
Маршрут строится только при явном запросе пользователя.

23
00:01:48,600 --> 00:01:52,733
Агент сохраняет результат и публикует команды интерфейсу.

24
00:01:52,833 --> 00:01:56,967
Браузер получает событие и обновляет сообщение или карту.

25
00:01:57,067 --> 00:02:00,733
Ответ по HTTP — отдельная часть обмена.

26
00:02:01,467 --> 00:02:03,500
Здесь есть важная граница.

27
00:02:03,600 --> 00:02:07,833
Позиция, погода и рейсы в проверенном коде демонстрационные.

28
00:02:07,933 --> 00:02:13,333
Нарисованный маршрут не является дорожным маршрутом или инструкцией для полёта.

29
00:02:14,067 --> 00:02:17,867
Первое небольшое улучшение — начальная загрузка карты.

30
00:02:17,967 --> 00:02:20,767
Сейчас два запроса идут последовательно.

31
00:02:20,867 --> 00:02:25,967
Переиспользование соединения и параллельное выполнение уберут лишнее ожидание.

32
00:02:26,700 --> 00:02:29,533
Более серьёзная проблема — перегрузка.

33
00:02:29,633 --> 00:02:34,900
Семафор ограничивает активные вызовы, но ожидающие задачи уже созданы.

34
00:02:35,000 --> 00:02:38,000
Нужен предел очереди до приёма новой работы.

35
00:02:38,733 --> 00:02:41,167
Ещё важнее запись результата.

36
00:02:41,267 --> 00:02:44,500
Состояние и история сохраняются раздельно.

37
00:02:44,600 --> 00:02:47,867
При сбое повтор может снова вызвать сценарий.

38
00:02:47,967 --> 00:02:52,300
Нужны общая транзакция и защита от повторного исполнения.

39
00:02:53,033 --> 00:02:56,700
В репозитории три реализации сценарного движка.

40
00:02:56,800 --> 00:03:02,500
Прежде чем удалять две, надо сравнить поведение и проверить их пользователей.

41
00:03:02,600 --> 00:03:05,767
Переименование каталогов эту работу не заменяет.

42
00:03:06,500 --> 00:03:10,733
Следующий вариант — объединить Агент и выбранный сценарный движок.

43
00:03:10,833 --> 00:03:14,900
Исчезнет один сетевой переход, но пользу нужно измерить.

44
00:03:15,000 --> 00:03:18,567
Медиасоединения и модели разумно оставить отдельно.

45
00:03:19,300 --> 00:03:22,967
Начинать стоит с очередей и корректности повторов.

46
00:03:23,067 --> 00:03:27,500
Затем считать вызовы модели, задержку ответа и ошибки.

47
00:03:27,600 --> 00:03:31,167
Полное переписывание без этих измерений пока не обосновано.

48
00:03:31,900 --> 00:03:36,067
Так короткая просьба превращается в цепочку проверяемых действий.

49
00:03:36,167 --> 00:03:39,033
Этот разбор основан на снимке кода.

50
00:03:39,133 --> 00:03:44,467
Он объясняет устройство проекта, но не подтверждает состояние работающего кластера.
