45:57Chase AI
Log in to leave a comment
No posts yet
При создании RAG-системы в локальной среде первым препятствием, с которым вы столкнетесь, станут объем видеопамяти (VRAM) и жесточайшие конфликты версий между библиотеками. Модели с 8-битной квантованием потребляют около 1 ГБ VRAM на каждый миллиард параметров. Учитывая потребление самой Windows или macOS, необходимо оставлять как минимум 20% свободного пространства. Без этого запаса скорость генерации токенов упадет до жалких 2 токенов в секунду. В частности, фреймворк lightrag-hku часто выдает ошибки выполнения при использовании последних версий numpy 2.x.
Для начала откройте терминал и зафиксируйте версию, введя pip install numpy==1.26.4 --force-reinstall. Затем установите nest_asyncio и добавьте nest_asyncio.apply() в самом верху вашего кода. Без этого асинхронные циклы в Jupyter Notebook запутаются, и весь процесс остановится. Если объем памяти GPU составляет 8 ГБ или меньше, при инициализации LightRAG установите embedding_batch_num не более 10, а llm_model_max_async — около 4. Эти настройки помогут предотвратить внезапные сбои системы из-за нехватки памяти (OOM, Out Of Memory) и сэкономят вам как минимум пару часов напрасного труда.
Простое сохранение текста кусками приводит к потере контекста между информационными блоками. Однако, если правильно распарсить структуру вики-ссылок ([[link]]) в Obsidian, можно создать весьма впечатляющий граф знаний. Ключевой момент — удаление ненужных символов Markdown перед тем, как LLM прочитает данные. Очистка от лишних символов позволяет сэкономить почти 30% потребления токенов.
Приучите себя добавлять поля вроде type и domain в YAML-область в верхней части заметок. Это значительно повысит скорость фильтрации при поиске. Используйте паттерн r"\[\[(.+?)\]\]" в модуле re на Python для извлечения связей между документами, а затем преобразуйте их в датасет отношений в формате JSONL. Имена файлов также важны. Вместо дат типа «2024-04-14» используйте в качестве заголовка ключевую тему знаний — тогда проиндексированные узлы будут работать эффективно. Такие связанные данные позволяют выйти за рамки простого поиска и обеспечивают логические переходы между концепциями.
Самое обидное при работе с локальной LLM — тратить время на повторное вычисление уже рассчитанных эмбеддингов. Стандартный кэш Python исчезает после закрытия программы. Поэтому необходимо создать физическое хранилище с помощью DiskCache на базе SQLite. Спроектируйте систему так, чтобы при косинусном сходстве между вопросами выше 0.95 система не вызывала LLM, а сразу возвращала закэшированный ответ. Применение такого семантического кэширования позволяет сократить время отклика до 100 мс и меньше.
Метод прост: установите библиотеку через pip install diskcache и создайте класс для хранения пар текста и векторов эмбеддингов. Будет еще лучше, если вы добавите алгоритм временного затухания:
Логика строится так, чтобы только что отредактированная заметка появлялась в топе результатов поиска. Если установить TTL (время жизни) для кэша эмбеддингов на 1 час, а для кэша ответов генерации на 2 часа, можно создать систему мгновенных ответов на повторяющиеся вопросы.
Диаграммы архитектуры или скриншоты внутри заметок содержат гораздо больше информации, чем текст. Исключать их из поиска — большая потеря. Используя модель CLIP, можно расположить изображения и текст в одном векторном пространстве, так что поиск по запросу «схема потоков данных» найдет соответствующие изображения. Если у вас нет мощного GPU, можно конвертировать модель CLIP-ViT-B-32 в формат OpenVINO и запускать ее на CPU.
При нахождении пути к изображению в Markdown-файле объединяйте его с примерно 200 символами окружающего текста. Затем используйте легкую локальную VLM, например Phi-3.5-vision, для автоматического извлечения описания (caption) изображения. Сохраните вектор этого описания вместе с вектором признаков изображения в локальной векторной БД, такой как Qdrant. Благодаря этому в результаты поиска попадут даже сложные схемы, которые трудно описать словами.
Переиндексировать всё хранилище каждый раз при изменении одного файла — неразумно. С помощью библиотеки watchdog на Python можно отслеживать момент сохранения файла и обновлять только измененную часть. Однако, если индексация будет запускаться непрерывно во время написания текста, CPU начнет «задыхаться», поэтому необходима обработка антидребезга (debouncing).
При написании скрипта используйте watchdog.observers для мониторинга папки и настройте так, чтобы работа начиналась через 5 секунд после возникновения события изменения. Также добавьте процесс сравнения SHA-256 хеш-значений файлов, чтобы убедиться, что содержимое действительно изменилось. Выбирайте только файлы с изменившимся хешем, удаляйте старые узлы и записывайте новые векторы. В таком случае ваша база знаний будет обновляться в реальном времени сразу после сохранения заметки, и вам не придется нажимать кнопку обновления вручную.