- BrainTools - https://www.braintools.ru -

Вики из 48 часов видео: конвейер, который не даёт LLM выдумывать

У меня было 48 часов видеозаписей учебного курса и простая мысль: пересматривать это я не буду никогда. Сырой транскрипт немногим лучше — болото на сотни страниц. Я собрал конвейер, который превратил записи в Obsidian-вики: 47 связанных статей, и каждое утверждение в любой из них — в двух кликах от места в записи, где это было сказано.

Зачем, если есть готовое

Задача личная: вики для собственного использования. Я недавно писал [1] про код обращения в банковской системе — про принцип «любую цифру можно проследить до источника». Здесь тот же принцип, только источник — не строка лога, а минута записи: утверждению в вики, которое нельзя проверить по первоисточнику, я не верю, даже если его написала модель по моему же заказу.

Из этого требования конвейер и вырос. Код открыт: media-to-wiki-convertor [2], MIT, Python. Всё, кроме извлечения знаний, происходит локально: видео → аудио → транскрибация whisper-medium на Apple Silicon → чанки → извлечение → каталог → черновики статей → сборка vault. Каждая стадия пишет результат на диск и умеет узнавать уже сделанное, поэтому конвейер идемпотентный: любая его часть может упасть по любой причине — хоть свет отключили — а повторный запуск продолжит ровно с того же места. Прошлый прогресс не теряется никогда. Я на этапе первых прогонов это несколько раз сэкономило по полчаса скучного разглядывания монитора с бегущими логами.

Чанки режутся окнами по десять минут с перехлёстом в две — чтобы мысль, разрезанная границей окна, целиком попала хотя бы в одно из соседних. А если на входе готовый текстовый транскрипт без таймкодов, окна считаются в словах, и поля времени остаются пустыми: выдумывать фейковые таймстампы конвейер не станет даже ради красоты ссылок.

Слой первый: экстракция под конвоем схемы

Наружу уходит один вызов — извлечение знаний из чанка. И этот вызов зажат структурой. Промпт начинается с запрета: задача — НЕ пересказать транскрипт. Извлекаются только проверяемые единицы: темы, практические советы, ошибки [3], термины, вопросы с ответами. Ответ — строгая JSON-схема, и в ней две вещи, которые я считаю главными.

Первая: каждая единица знания обязана нести source — идентификатор записи, чанк, начало и конец. Не бывает «полезного совета» без адреса, откуда он взят. Схема с strict: true это просто не пропустит.

Вторая: у модели есть право вернуть пустоту. Если фрагмент шумный или бессодержательный — пустые массивы, и это легальный ответ. Модель, которой запрещено отвечать «ничего», начнёт выдумывать; модель, которой разрешено, — перестаёт. Рядом обязательное поле уверенности, и если уверенность низкая, модель обязана объяснить почему: поле why_low_confidence заполняется не по желанию.

Слой второй: ценз на входе в статьи

Из 353 чанков извлеклось 1543 темы. Писать статью по каждой — получить 1543 пересказа шума. Дальше работает нормализация (регистр, пунктуация, варианты названий сливаются в одну тему) и отбор с простым правилом, которое я завёл первым же решением: статьёй становится тема, встретившаяся минимум в двух независимых чанках. Сказанное один раз — не статья, а отложенная тема. Прогон с этим цензом дал 47 статей, остальные полторы тысячи тем легли в очередь.

А потом я пожил с этой вики и ценз снизил до единицы, коммитом с тестами. Для библиотеки собственного использования полнота оказалась дороже строгости: лучше бедная статья-зацепка, за которой стоит один честный источник, чем тема, которой не найти вообще. Строгий фильтр остался ручкой в CLI. Параметры, как я уже не раз убеждался на своих системах, — это дневник: по ним видно, как менялось твоё собственное понимание задачи.

Слой третий: ссылки под надзором

Вики без связей — это папка файлов. Связи здесь делает модель, но под конвоем с двух сторон.

На входе: когда модель пишет статью, она получает белый список уже существующих заголовков и инструкцию: ссылаться в формате [[Название]] можно только на темы из списка. Выдумать ссылку на несуществующую статью из этого промпта сложно.

На выходе: при сборке vault каждая ссылка в каждом черновике перепроверяется против реальных страниц. Известная — переписывается на настоящий путь. Неизвестная не остаётся битой и не выбрасывается: она уходит в отдельный индекс Unlinked Mentions с пометкой, кто её упоминал. Этот индекс оказался неожиданно полезным сам по себе: это готовая очередь кандидатов на следующие статьи, отсортированная самой жизнью — чем чаще темы тянутся друг к другу, тем выше им пора становиться страницами.

И финальный метр того же принципа: в каждую собранную статью вшивается блок источников — ссылки на заметки чанков, а из чанка ссылка ведёт в полный транскрипт. «Два клика до первоисточника» — это не метафора, это буквально устройство vault.

Цена

Теперь про деньги, потому что без денег это разговоры. Вся LLM-обработка 48 часов записей обошлась примерно в четыре доллара токенов OpenAI: транскрибация локальная и бесплатная, платная стадия одна — извлечение знаний. Четыре доллара за библиотеку, которой пользуешься каждую неделю.

Конвейер написан примерно за две недели вечеров — 71 коммит от «scaffold pipeline» до текущего состояния. И он уже пережил первый раунд чужих рук, что для личного инструмента отдельное испытание: люди принесли Windows без mlx-whisper (появился импорт готовых транскриптов), записи без видеодорожки (появились audio-only входы) и свои форматы. Телеметрия прогонов пишется в JSONL — когда у кого-то падает многочасовая транскрибация, «пришлите лог» работает лучше, чем «опишите словами».

Возражения

«Есть же NotebookLM и подобные». Есть, и для разовой задачи их хватит. Мне нужно другое: свой vault в Obsidian, свои форматы заметок, локальная транскрибация и конвейер, который можно перезапустить с середины и подкрутить в любом месте. Личная база знаний — это дом, а не номер в отеле.

«RAG бы решил без всякой вики». RAG отвечает на вопросы, а мне нужна карта: читать, бродить по ссылкам, дописывать своё. Хотя честно: vault по устройству и есть готовый RAG-корпус: чанки, источники, статьи. Агент поверх напрашивается, и это следующий шаг, а не текущий.

«Качество текстов LLM известно какое». Поэтому и три слоя конвоя. А то, что просочилось, — правится: статья в вики это обычная Obsidian-заметка, источник в двух кликах, читаешь, сверяешь, исправляешь. Вики, которую нельзя править, мне и не нужна.

Что я из этого вынес

  1. Схема со строгими полями работает лучше любых просьб в промпте: обязательный source при каждой единице знания отсекает выдумки надёжнее, чем «пожалуйста, не выдумывай».

  2. Право вернуть пустоту так же важно, как обязанность отвечать. Модель без этого права заполняет тишину фантазией.

  3. Пороги отбора — ручки, а не истины: я начал с «минимум два источника» и осознанно снизил до одного, когда пожил с результатом. Закладывайте ручку сразу.

  4. Битые ссылки — не мусор, а очередь работ: индекс несуществующих страниц с частотой упоминаний сам говорит, что писать дальше.

  5. Пишите каждую стадию на диск. Идемпотентный конвейер прощает всё: упавшую модель, кончившиеся кредиты, отключённый свет и собственную ошибку в коде.

А 48 часов видео я так и не пересмотрел. Теперь уже и незачем.

Автор: Timur555

Источник [4]


Сайт-источник BrainTools: https://www.braintools.ru

Путь до страницы источника: https://www.braintools.ru/article/34471

URLs in this post:

[1] писал: https://habr.com/ru/articles/1068856/

[2] media-to-wiki-convertor: https://github.com/TimurTsedik/media-to-wiki-convertor

[3] ошибки: http://www.braintools.ru/article/4192

[4] Источник: https://habr.com/ru/articles/1069706/?utm_source=habrahabr&utm_medium=rss&utm_campaign=1069706

www.BrainTools.ru

Rambler's Top100