Частный второй мозг ИИ: локальная система RAG с использованием AnythingLLM, Ollama и Obsidian
Личный второй мозг: AnythingLLM и модель эмбеддингов на виртуальной машине Proxmox позволяют локальной версии Mistral 7B искать записи в Obsidian с помощью Ollama RAG с учётом фактического использования ресурсов.
Источники: Giving My Local AI a Memory: Turning It Into a Private AI Second Brain with RAG and AnythingLLM
Гениальный амнезик
Местная языковая модель может вести разговоры, объяснять понятия и помогать обдумывать идеи, причем ни один байт не покидает здание. Однако она не может сама восстановить что-либо из сохранённых вами данных.
Представьте год накопленных заметок в Obsidian: ссылки, сохранённые в полночь, незавершённые мысли, длинную вырезку статьи об поисковых системах, объявления о работе и записи с семинаров. Всё это находится в папке на ноутбуке и остаётся невидимым для ИИ, которому потребовалось целое выходное, чтобы запуститься в офлайн-режиме.
Проблема никогда не была в хранилище — проблема в поиске. Способность извлечь нужную заметку в нужный момент превращает папку с ссылками в знания, а не в хорошо организованную корзину мусора. Поэтому следующим логичным шагом при настройке частного ИИ является предоставление ему доступа к этим заметкам.
Что такое RAG и почему это важно
Большинство руководств по «работе с ИИ локально» пропускают эту часть, вероятно, потому что понятие эмбеддингов кажется скучным. Действительно, они довольно сухи, но их стоит понимать.
RAG — это аббревиатура от Retrieval-Augmented Generation. Она позволяет языковой модели использовать ваши собственные документы без повторной настройки и без загрузки их на сервер сторонней организации.
Представьте себе найм очень быстрого библиотекаря вместо того, чтобы просить ИИ запомнить каждую книгу. Библиотекарь не знает ваших заметок наизусть, он лишь знает, какую книгу нужно взять, когда вы задаете вопрос.
Вот что происходит на самом деле:
- Документы делятся на фрагменты и преобразуются в эмбеддинги — числовые представления смысла, которые хранятся в векторной базе данных.
- Вопрос также преобразуется в эмбеддинг.
- База данных находит фрагменты, наиболее близкие по смыслу к вопросу.
- Эти фрагменты передаются языковой модели в качестве контекста.
Инструмент: AnythingLLM
AnythingLLM подходит для этой конфигурации по нескольким причинам:
- Рабочие пространства хранят отдельные базы знаний для разных контекстов, таких как заметки, исследования или черновики блогов.
- Он поддерживает формат Markdown нативно, поэтому заметки в Obsidian не требуют конвертации.
- Он подключается напрямую к Ollama.
- Он работает в самохостинговом режиме в виде контейнера Docker, без необходимости использования учетной записи или облачных сервисов.
- У него также есть десктопное приложение, которое полезно тем, у кого нет домашней лаборатории.
Это не единственный вариант. Open WebUI также имеет встроенную функцию RAG. Однако модель рабочего пространства AnythingLLM более точно соответствует концепции «второго мозга», а его интерфейс достаточно интуитивен, чтобы его рекомендовать читателям без технических знаний.
Создание среды
Начальная точка
В данной конфигурации используется следующая основа:
- хост Proxmox VE в чистом виде;
- одна виртуальная машина Ubuntu 24.04, в которой запущен Ollama с моделью Mistral 7B;
- интерфейс Open WebUI в качестве фронтенда для чата.
Для дальнейшей настройки добавляется ещё одна виртуальная машина рядом с ней.
Новая виртуальная машина в Proxmox
Создайте новую виртуальную машину Ubuntu 24.04 LTS специально для AnythingLLM. Размещение её отдельно от виртуальной машины Ollama позволяет создавать снимки состояния, намеренно нарушать работу системы и восстанавливать её без вмешательства в основную конфигурацию инференса. Лучше намеренно что-то сломать, чем позже это произойдёт случайно.
Рекомендуемые характеристики:
- 4 процессора vCPUs
- 8 ГБ ОЗУ
- 40 ГБ диска, поскольку векторные базы данных занимают много места
Здесь нет ничего сложного. Вся информация содержится в документации, плюс немного проб и ошибок, особенно для тех, кто уже настроил виртуальную машину Ollama. Настоящим ограничением является имеющееся оборудование, и работа в рамках этих ограничений и составляет суть упражнения.
Установка модели эмбеддингов
Большинство руководств пропускают этот шаг, и это вызывает наибольше затруднений.
Для работы RAG требуются две модели. Одна — это модель инференса, которая уже предоставлена Mistral 7B. Другая — модель эмбеддингов, преобразующая текст в векторы. Это разные вещи, но мало кто в руководствах указывает на это сразу.
На существующей виртуальной машине Ollama загрузите модель эмбеддингов:
ollama pull nomic-embed-text
nomic-embed-text имеет небольшие размеры — примерно 270 МБ, быстро работает на процессоре и хорошо справляется с английским текстом, что делает его разумным выбором для оборудования без видеокарты.
Ещё одна проблема: по умолчанию Ollama прослушивает только локальный хост. Чтобы AnythingLLM, находящийся в другой виртуальной машине, мог с ним связаться, Ollama должен быть доступен по всем интерфейсам. Начните с редактирования настроек сервиса:
sudo systemctl edit ollama
Затем добавьте этот переопределение:
[Service]
Environment="OLLAMA_HOST=0.0.0.0"
Перезагрузите systemd и запустите сервис заново:
sudo systemctl daemon-reload
sudo systemctl restart ollama
Далее откройте порт 11434 в брандмауэре Proxmox между двумя виртуальными машинами. Урок повторяется: сервис работал нормально, модель тоже. Проблема заключалась в предположении, что по умолчанию все могут взаимодействовать друг с другом.
Сетевая настройка могла бы быть более строгой, и, вероятно, так и должно быть в конечном итоге. Это типичная позиция любителей: сначала заставить всё работать, понять, что было создано, а затем разобрать всё и сделать заново правильно.
AnythingLLM через Docker
На новой виртуальной машине сначала установите Docker:
# Install Docker
curl -fsSL <https://get.docker.com> | sh
sudo usermod -aG docker $USER
newgrp docker
Затем запустите AnythingLLM:
# Run AnythingLLM
docker run -d \
-p 3001:3001 \
--name anythingllm \
-v ~/.anythingllm:/app/server/storage \
mintplexlabs/anythingllm
Откройте в браузере http://<new-vm-ip>:3001. На первый запуск конфигурация выглядит следующим образом:
- Провайдер LLM: Ollama, по адресу
http://<ollama-vm-ip>:11434 - Модель чата: Mistral 7B
- Провайдер эмбеддингов: Ollama, с использованием модели
nomic-embed-text - База векторных данных: LanceDB, встроенная в систему и не требующая дополнительной настройки
Загрузка заметок
Создайте рабочее пространство под названием «Second Brain» и настройте AnythingLLM на работу с хранилищем Obsidian. Его менеджер документов принимает загрузку папок, поэтому укажите ему каталог с заметками и позвольте ему обработать всё содержимое.
Он поддерживает форматы .md, .txt, .pdf, .docx и .csv. Файлы Obsidian Canvas на самом деле представляют собой JSON, поэтому они не вызовут ошибок, но и не принесут никакой полезной информации.
После загрузки на рабочем поле отображается количество фрагментов и статус встраивания. Каждая заметка разбивается на перекрывающиеся фрагменты по примерно 500 токенов, что означает, что длинная вставленная статья об поисковых системах превращается в десятки отдельно доступных фрагментов.
Момент нажатия
Настоящее испытание — это обычный запрос, например, просьба к ассистенту проверить конкретную заметку под названием «Улучшения домашней лаборатории».
Ассистент находит реальный файл, указывает его название и цитирует точную строку вместе с временной меткой. В ссылке указываются название источника документа и дата публикации. Получение информации происходит так, как заявлено: файл получает название и находится, без выдуманного контента и расплывчатых перефразировок, только точная информация вместе с ссылкой.
Самое забавное происходит тогда, когда модель пытается объяснить эту записку. В ней Claude Code описывается как своего рода личный ассистент или сервис. Mistral 7B, работающий офлайн на домашнем компьютере с только процессором, совершенно не понимает, что такое Claude Code или сервер MCP. Он может извлекать слова, но не может полностью их осмыслить.
В этом и заключается более полезный урок: извлечение информации и её понимание — это разные задачи. Технология RAG предоставляет модели нужный контекст, но способность к его пониманию по-прежнему ограничена самой моделью. При использовании небольшой модели объемом 7 миллиардов параметров и без доступа в Интернет эти ограничения проявляются быстро.
Что пошло не так и что это дало нам
Несколько предположений не выдержали проверки в процессе разработки.
- RAG — это не волшебство. Его полезность зависит только от того, что ему предоставляется, а неупорядоченные записки приводят к неупорядоченным результатам. Что входит, то и выходит.
- Сетевое взаимодействие становится частью проекта на раннем этапе. Как только сервисы распределяются между несколькими устройствами, важно обеспечить их надежное взаимодействие не меньше, чем настройку каждого из них.
- Не спешите винить модель. Иногда проблема кроется в предоставленном контексте. Эффективный механизм поиска может сделать небольшую модель удивительно полезной, но он не может предоставить знания, которых у модели никогда не было.
Что в итоге получается и какова его стоимость
Год сохранённых ссылок, идей и незавершённых мыслей становится доступным для поиска, причём не только по ключевым словам, но и семантически. Если задать вопрос о каком-либо концепте, появляются связанные заметки, о существовании которых вы забыли, причём каждая из них снабжена ссылкой на исходный файл.
Тестовым устройством был EliteDesk с процессором i5, 32 ГБ ОЗУ и без видеокарты, и всё работало офлайн. Результаты одного запуска:
| Параметр | Результат |
|---|---|
| Время обработки запроса от начала до конца | 1 минута 35,9 секунды, причем AnythingLLM указывает на 41,9 секунды на генерацию |
| Память AnythingLLM в режиме ожидания | примерно 440 МБ из выделенных 7,76 ГБ |
| Используемая память виртуальной машины Ollama | 7,8 ГБ из 19 ГБ |
| Память во время работы Mistral | примерно 6,5 ГБ |
| nomic-embed-text | примерно 360 МБ |
| Open WebUI | примерно 1 ГБ |
Приблизительная разница в 54 секунды между двумя временными показателями не имеет объяснения. Вероятной причиной может быть перезагрузка модели Ollama с жесткого диска.
Ничто из этого не работает быстро, и это даже не предусмотрено. Сейчас лишь первый день настройки системы RAG в домашней лаборатории, которая еще находится в стадии развития, и это не эталон для сравнения с серьезными решениями. Будет интересно взглянуть на эти цифры, когда местное оборудование сможет обрабатывать гораздо больше токенов в секунду.
Что у вас получится в итоге
Проект начинается с простой цели — позволить локальному ИИ просматривать ваши заметки, — но он учит гораздо большему. По ходу вы узнаете, как работает RAG, что такое векторные базы данных, что делает поиск эффективным и почему правильный контекст может быть важнее, чем более крупная модель.
Что ещё важнее, результатом становится что-то, что вы действительно сможете использовать. Двенадцать месяцев собранных знаний больше не разбросаны по папкам, а превращаются в то, о чём можно просто спросить. Всё это работает на подержанном ноутбуке в углу комнаты, что неплохо для устройства, которое должно было уже пойти на пенсию.
RAG действительно работает. Но понимание — это уже другая история.
Дополнительная литература
В документации к AnythingLLM, Ollama, LanceDB и Obsidian приводятся все детали. Оригинальная статья по технологии RAG «Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks» объясняет суть всего процесса. Все описанное работает на переоборудованном оборудовании без использования облаков, без необходимости подписки и без выхода данных за пределы сети.