0032. Обработка видео/записей для базы знаний (транскрипция → RAG)
Копия ADR из репозитория:
backend/docs/adr/0032-kb-video-ingestion-asr.md. Канонический текст — в репозитории; портал обновляется командойnpm run sync:adr.
- Статус: accepted (рекомендация спайка согласована 2026-07-07 — self-hosted faster-whisper как база, переключение на облачный ASR за флагом)
- Дата: 2026-07-07
- Связанные задачи: OP-149 (Spike · 5.15 · База знаний); потребители — OP-148 (загрузка/индексация документов), OP-150 (API базы знаний), OP-120 (оркестратор ИИ-помощника, 5.9)
- Связанные ADR: ADR-0015 (RAG-минимум на pgvector — переиспользуется как есть), ADR-0014 (абстракция LLM-провайдера), ADR-0007 (BullMQ — асинхронная обработка)
Контекст и проблема
ТЗ 5.9 требует пополнять базу знаний видео, вебинарами, записями Zoom, разборами, а «Механизм обработки видео/записей» помечен «уточняется». Текстовые материалы (PDF/Excel/ ссылки) закрывает OP-148 поверх существующего RAG (ADR-0015). Вопрос спайка — как превратить видео/аудио в индексируемый текст и не завести ради этого новое хранилище.
Пайплайн очевиден и не оспаривается: ingest → ASR (транскрипция) → чанкинг → эмбеддинги в pgvector. Открытый выбор — чем делать ASR и как принимать источники.
Рассмотренные варианты (ASR)
| Вар. | Суть | Плюсы | Минусы |
|---|---|---|---|
| A. Whisper API (OpenAI) | Облачная транскрипция | Просто, высокое качество RU, ноль инфры | Поминутная оплата; аудио материалов уходит вовне (приватность/152-ФЗ) |
| B. Self-hosted faster-whisper (CTranslate2) | Whisper на нашем VPS | Нулевая переменная стоимость, данные не покидают периметр, RU ок, модель сменная (base→large-v3) | Нужен вычислит. ресурс; на CPU медленно (длинные видео — фоном) |
| C. Прочие облачные ASR (Deepgram/AssemblyAI) | Облачная транскрипция | Быстро, диаризация из коробки | RU слабее/дороже; те же вопросы приватности |
Решение
Принят вариант B — self-hosted faster-whisper как база, с возможностью переключения на облачный ASR (A) за фиче-флагом при пиковой нагрузке:
- Ingest-источники: файловая загрузка (mp4/mp3/wav), Zoom Cloud Recording API (OAuth) для записей Zoom, вебинары/видео по URL (скачивание аудио-дорожки). Единая точка входа — материал базы знаний (модель из OP-147) со ссылкой на исходник.
- ASR: faster-whisper (стартовая модель —
large-v3/mediumпо ресурсу), запуск в фоновой очереди (BullMQ, ADR-0007) — обработка асинхронная, длинные записи не блокируют. - Чанкинг: транскрипт нормализуется и режется на смысловые сегменты с сохранением таймкодов и метаданных (материал, источник, спикер-если-есть) — чтобы ИИ-помощник (OP-120) мог цитировать «видео X, 12:30».
- Индексация: эмбеддинги через существующий провайдер и хранение в pgvector (ADR-0015) — никакого нового хранилища; чанки видео живут рядом с чанками PDF/Excel из OP-148.
- Переключаемость ASR: реализовать за узким интерфейсом
Transcriber, чтобы уход на Whisper API/Deepgram был сменой адаптера, а не переписыванием пайплайна.
Последствия
- Положительные: ноль новой инфраструктуры хранения (pgvector переиспользуется); приватность материалов (аудио не уходит вовне); нулевая переменная стоимость ASR; асинхронная обработка через уже принятый BullMQ; таймкоды дают цитируемость в ответах помощника.
- Границы (осознанно): self-host требует вычислит. ресурса на VPS (для больших объёмов — вынести ASR-воркер/GPU отдельно); качество на плохом звуке ниже; диаризация спикеров и перевод — вне MVP.
- Разблокирует: архитектуру видео-ингеста для 5.15. Отдельного impl-тикета видео-ингеста в
беклоге пока нет (OP-148 покрывает только PDF/Excel/ссылки) — его следует завести при старте
Phase 2 (модуль
mod-kb), реализация против интерфейсаTranscriberиз этого ADR.