Голосовые системы

Контрольная база до переработки chat-agent

Серия проведена 06.10.2026 после поставки инструментирования C0. Функциональная переработка в эту базу не входит. Конфигурация: 522aa7a6e3b7a3357736bbfe2df6d48382b3158c, CI 4910, deploy 9755.

Реальные revisions выборочно собранных приложений различаются: Core/Agent 3bea617f, Frontend 69ef2ec6, LLM d35c9e30, Ruby AsyncGraph 522aa7a6. Конфигурация сетей и Collector применена к ним всем. Остальные сервисы не пересобирались.

Условия и результат

Всего 33 запроса по cases.json: 12 обычных текстовых, 3 инструментальных, 6 реплик с уточнениями и 12 голосовых в раундах 1/2/3/1/2/3. 32 запроса получили ответ, один завершился явной ошибкой передачи аудио. Ошибка сохранена отдельно и не входит в распределение времени успешных ответов.

Модель qwen3:30b, ASR streaming, один Agent и активный Ruby AsyncGraph runtime. Наблюдаемые загрузки модели прогретые; холодная серия отсутствует. Модель не выгружалась. Fixture: PCM16LE mono 48 kHz, 3,025 с, SHA256 bbdc8147226297b2a56f177b2b70a750dcfc44bbf57498e7ef2befe9c921a42a. После WAV источник продолжал silent PCM до штатного отключения микрофона.

Показатель Успешных образцов p50 p95
Полный обычный текстовый ответ 12 14,969 с 20,951 с
Инструментальный ход 3 11,366 с 12,995 с
Реплика с уточнением 6 19,902 с 24,072 с
Готовое SDP →connected 12 1,394 с 1,559 с
Начало WAV →ASR final 11 3,803 с 3,993 с
ASR final →полный ответ, смешанная нагрузка 1/2/3 11 46,007 с 89,399 с

Квантили вычисляются линейной интерполяцией R7. Небольшая серия служит контрольным сравнением, а не оценкой production SLO. Последняя строка объединяет нагрузки; для сравнения отдельного уровня используются исходные раунды.

Обычные 12 ответов потребовали 26 реальных генераций: десять ходов по две и два по три. Инструментальные/уточняющие девять — 14; успешные голосовые 11 — 22. Итого 62 генерации на 32 ответа. Детерминированные routing guards без вызова провайдера не считаются генерациями. Прогревочный контрольный запрос исключён.

Что показала телеметрия

Во время первого раунда из трёх потоков ожидание Agent составило 0,003 / 34,791 / 65,904 с. Во втором — 0,004 / 24,757 / 56,813 с. Очередь Ruby после входа занимала миллисекунды. Независимые чаты последовательно ждали callback Agent.

У первого одиночного потока Core делал около 50 flush/с, у трёх потоков максимум 150 flush/с на общем соединении. В раунде 4 зарегистрирован audio_transport_failed: лог Core содержит InvalidStateError при завершении PONG и затем FlushTimeoutError. Следующие раунды прошли без перезапуска. Причина подтверждается также кодом закреплённого nats-py 2.11.0: таймаут flush отменяет Future, поздний PONG вызывает set_result у отменённого Future. Исправление должно проверять этот порядок событий.

Все 12 WebRTC-подключений достигли DTLS connected; выбран путь local srflx →remote TURN relay, росли RTP counters. Core spans подтверждают декодирование первого PCM. Peer-reflexive путь этой серией не подтверждён и проверяется отдельно.

Интерфейс отображал ответы соседних контрольных сессий. Fixture отбирал только свою session_id, а история текстовых сессий проверена отдельно. Фильтрация fixture не является исправлением приложения.

Ресурсы и ограничения измерения

VictoriaMetrics: окно 1791245870–1791248060 UTC epoch, шаг 15 с, rate CPU — 60 с. Сохранены все 13 контейнеров. Окно включает паузы; сравнивать нагрузку следует по одинаковым отдельным раундам, а не только по общей средней.

Голосовые потоки, успешный раунд Максимум Core RSS Средний Core CPU Максимум Agent pending
1 120 012 800 байт 0,138 ядра 0
2, первый 121 585 664 байт 0,124 ядра 1
3, первый 129 044 480 байт 0,312 ядра 2
2, второй 130 871 296 байт 0,197 ядра 1
3, второй 134 008 832 байт 0,423 ядра 2

RSS приложения и container working set — разные показатели. Раунд с ошибкой завершился до следующего 15-секундного scrape; его ресурсы отмечены как отсутствующие, а не нулевые. Внутренние ресурсы GPU/Whisper не измерялись. Длительность synthetic ASR не доказывает точность распознавания живой речи: произношение fixture давало разные транскрипции. Время разрешения реального микрофона этой серией не измеряется.

Исходные числа

Сохранены только собственные контрольные UUID, числовые измерения и коды ошибок. Аудио, текст разговоров, SDP, токены и credentials в эти файлы не входят. Для серии после переработки сохраняются те же fixtures, prompts, модель и режим ASR.

Исходник

Скачать Markdown · К материалам исследования