Перейти к основному содержимому

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) за фиче-флагом при пиковой нагрузке:

  1. Ingest-источники: файловая загрузка (mp4/mp3/wav), Zoom Cloud Recording API (OAuth) для записей Zoom, вебинары/видео по URL (скачивание аудио-дорожки). Единая точка входа — материал базы знаний (модель из OP-147) со ссылкой на исходник.
  2. ASR: faster-whisper (стартовая модель — large-v3/medium по ресурсу), запуск в фоновой очереди (BullMQ, ADR-0007) — обработка асинхронная, длинные записи не блокируют.
  3. Чанкинг: транскрипт нормализуется и режется на смысловые сегменты с сохранением таймкодов и метаданных (материал, источник, спикер-если-есть) — чтобы ИИ-помощник (OP-120) мог цитировать «видео X, 12:30».
  4. Индексация: эмбеддинги через существующий провайдер и хранение в pgvector (ADR-0015) — никакого нового хранилища; чанки видео живут рядом с чанками PDF/Excel из OP-148.
  5. Переключаемость 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.