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







Мой идеальный Obsidian
Прежде чем приступать к написанию кода, я четко сформулировал архитектуру будущего пайплайна. Инструмент должен работать с любыми программами на ПК — будь то браузер с обучающим видео, подкаст или текстовый редактор. На первом этапе я потребляю контент стандартным способом, после чего открываю Obsidian и сразу вижу готовые заметки.

Основными источниками информации выступают звук и текст. Чтобы не зависеть от конкретных платформ, я решил перехватывать системный аудиопоток операционной системы, а текстовые данные забирать, например, из буфера обмена. Обрабатывать этот массив должна локальная языковая модель: отправлять личные данные в сторонние облака мне не хотелось, к тому же проект задумывался полностью бесплатным. На выходе нейросеть формирует структурированные файлы формата .md, которые автоматически попадают в локальное хранилище Obsidian.
Создание прототипа
Реализацию я решил начать со звуковой составляющей, так как работа с системным аудиопотоком в среде ОС представляет наибольший интерес. Поскольку я использую Windows и эта платформа остается самой популярной, я сосредоточился именно на ней. Перехватив звук и получив его в виде потока байт, я столкнулся с тем, что LLM не умеет напрямую расшифровывать аудио. Для решения этой проблемы я интегрировал в пайплайн модель Whisper, созданную специально для качественной транскрибации.

Полученный текст нарезается на отдельные чанки, которые отправляются в языковую модель. Здесь возник ключевой вопрос о контексте: если разорвать фразу посередине между двумя чанками, нейросеть потеряет смысл сказанного. Самым наивным методом стало применение техники FloatingWindow, когда фрагменты частично перекрывают друг друга, передавая часть контекста в следующий блок.
Для запуска самой логики я выбрал связку из легковесного инференса llama.cpp и компактной, но умной языковой модели Qwen3-4B-Q4. Подготовив детальный промпт, я заставил ИИ выдавать результаты строго в формате JSON для дальнейшего автоматического парсинга. Система заработала: звук оцифровывается, Whisper расшифровывает речь, а нейросеть выделяет ключевые тезисы.

Делаем лучше
Чтобы развивать проект дальше, я четко разделил базовые понятия, используемые в архитектуре приложения:
- Термин — самодостаточная сущность, обладающая собственным именем и четким определением.
- Мысль — логическая связь, объединяющая несколько терминов между собой.
- Конспект — итоговый набор терминов и мыслей, сгенерированный LLM из группы чанков.
В первой версии прототипа ответы языковой модели отправлялись в базу напрямую, что было недопустимо для продакшена из-за возможных галлюцинаций ИИ. Обязательным этапом стало ручное подтверждение конспектов пользователем перед их записью в хранилище.
Введение этапа верификации вскрыло новую проблему: прежний метод FloatingWindow генерировал слишком много дублирующейся информации. Из-за перекрывающихся фрагментов текста модель постоянно обрабатывала одинаковые куски контекста. Чтобы избавиться от этого, я перешел на новый алгоритм Focus. Теперь входящий текст разделяется на фокусную группу, из которой LLM извлекает сущности, и дополнительный контекст, используемый исключительно для уточнения смысла без создания новых записей.
Доведение до production
Для комфортного использования утилиты я разработал графический интерфейс в виде компактного виджета. Он всегда находится под рукой, позволяет запускать и останавливать запись в один клик и не загромождает экран рабочей среды.

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

Проект получил название memplua и распространяется как open-source решение с открытым исходным кодом. На данный момент утилита находится на стадии alpha-тестирования, но уже полностью готова к повседневной эксплуатации. Все желающие могут ознакомиться с исходным кодом на GitHub или загрузить удобный установщик с официального сайта, который автоматически подтягивает необходимые модели и компоненты.
