У меня было 48 часов видеозаписей учебного курса и простая мысль: пересматривать это я не буду никогда. Сырой транскрипт немногим лучше — болото на сотни страниц. Я собрал конвейер, который превратил записи в Obsidian-вики: 47 связанных статей, и каждое утверждение в любой из них — в двух кликах от места в записи, где это было сказано.
Зачем, если есть готовое
Задача личная: вики для собственного использования. Я недавно писал про код обращения в банковской системе — про принцип «любую цифру можно проследить до источника». Здесь тот же принцип, только источник — не строка лога, а минута записи: утверждению в вики, которое нельзя проверить по первоисточнику, я не верю, даже если его написала модель по моему же заказу.
Из этого требования конвейер и вырос. Код открыт: media-to-wiki-convertor, MIT, Python. Всё, кроме извлечения знаний, происходит локально: видео → аудио → транскрибация whisper-medium на Apple Silicon → чанки → извлечение → каталог → черновики статей → сборка vault. Каждая стадия пишет результат на диск и умеет узнавать уже сделанное, поэтому конвейер идемпотентный: любая его часть может упасть по любой причине — хоть свет отключили — а повторный запуск продолжит ровно с того же места. Прошлый прогресс не теряется никогда. Я на этапе первых прогонов это несколько раз сэкономило по полчаса скучного разглядывания монитора с бегущими логами.
Чанки режутся окнами по десять минут с перехлёстом в две — чтобы мысль, разрезанная границей окна, целиком попала хотя бы в одно из соседних. А если на входе готовый текстовый транскрипт без таймкодов, окна считаются в словах, и поля времени остаются пустыми: выдумывать фейковые таймстампы конвейер не станет даже ради красоты ссылок.
Слой первый: экстракция под конвоем схемы
Наружу уходит один вызов — извлечение знаний из чанка. И этот вызов зажат структурой. Промпт начинается с запрета: задача — НЕ пересказать транскрипт. Извлекаются только проверяемые единицы: темы, практические советы, ошибки, термины, вопросы с ответами. Ответ — строгая 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-заметка, источник в двух кликах, читаешь, сверяешь, исправляешь. Вики, которую нельзя править, мне и не нужна.
Что я из этого вынес
-
Схема со строгими полями работает лучше любых просьб в промпте: обязательный source при каждой единице знания отсекает выдумки надёжнее, чем «пожалуйста, не выдумывай».
-
Право вернуть пустоту так же важно, как обязанность отвечать. Модель без этого права заполняет тишину фантазией.
-
Пороги отбора — ручки, а не истины: я начал с «минимум два источника» и осознанно снизил до одного, когда пожил с результатом. Закладывайте ручку сразу.
-
Битые ссылки — не мусор, а очередь работ: индекс несуществующих страниц с частотой упоминаний сам говорит, что писать дальше.
-
Пишите каждую стадию на диск. Идемпотентный конвейер прощает всё: упавшую модель, кончившиеся кредиты, отключённый свет и собственную ошибку в коде.
А 48 часов видео я так и не пересмотрел. Теперь уже и незачем.
Автор: Timur555


