Ваш интерактивный помощник для работы с заметками Obsidian с помощью LLM и RAG-подхода
- Генерация ответов на вопросы по заметкам в Obsidian
- Приложение разворачивается локально как с помощью Docker, так и без него (инструкции ниже)
- Приложение отслеживает изменения в заметках автоматически
- Визуализация заметок пользователя в виде облака точек
- Темная/светлая тема
backend
— бекенд часть проекта, отвечающая за обработку данных и интеграцию с базой знаний.frontend
— фронтенд часть проекта для взаимодействия пользователя с системой.experiments
— раздел для исследований и экспериментов, связанных с RAG.
- Бекенд: FastAPI, SQLModel (asyncpg и psycopg), uvicorn, PostgreSQL
- RAG: MistralAI API, aiohttp, pgvector, langchain (только TextSplitter)
- Фронтенд: TypeScript, Mantine UI, React Query, Vite
Приложение RAG-On-Obsidian состоит из следующих компонентов:
-
Web-сервис:
- Используется FastAPI на базе uvicorn
- Обрабатывает пользовательские запросы и взаимодействует с векторной базой данных
- Раздает фронтенд и необходимые для него статические файлы
-
База данных:
- Используется PostgreSQL с установленным расширением pgvector
- Хранит настройки, сообщения в чате и векторные представления заметок
- Обеспечивает эффективным поиск по векторам с использованием HNSW-алгоритма
Все компоненты разворачиваются в Docker-контейнерах, оркестрация осуществляется с помощью Docker Compose.
Для проекта настроен пайплайны
- для сборки Docker-образа при изменении файлов в директориях backend или frontend
- для запуска линтера Ruff над кодом в директории backend
Интерфейс состоит из трех основных вкладок: Chat
, Index
и Settings
. Рассмотрим подробее каждую из них.
Во вкладке Chat
происходит основное взаимодействие пользователя с приложением. Через окно чата пользователь может отправлять интересующие вопросы по документам к RAG системе и получать на них ответ от выбранной в настройках языковой модели.
Вкладка Index
содержит визуализацию индекса базы данных, а также возможность этот индекс обновить, удалить и получить актуальную информацию по текущему индексу.
Здесь, пользователь может выбрать темную или светлую тему для приложении, а также задать настройки для используемой генеративной модели (пока используется только Mistral AI).
При получении пользовательского запроса:
- Генерируем эмбеддинг запроса с помощью модели Mistral-Embed
- Ищем topK релевантных чанков для данного запроса
- На основе запроса и чанков с помощью LLM (сейчас интеграция только с MistralAI) генерируем ответ
При запросе пользователя на обновление индекса:
- Получаем список файлов, которые изменились
- Генерируем по этим файлам новые эмбеддинги по измененным файлам
- По всем эмбеддингам в базе данных считаем PCA разложение, чтобы получить первые две компоненты векторов
- По полученному результату обновляем наш индекс
Подробнее про сплиттинг текста, выбор эмбединговой модели и оценивание качества ретривал-части RAG можно почитать здесь.
- Убедитесь, что он установлен и запущен на машине командой
docker -v
- Скачиваем файл docker-compose.yml
- Указываем в web.volumes вместо
./backend/obsidian
абсолютный путь до директории с заметками Obsidian - Выполняем в директории с файлом команду
docker-compose up -d
илиdocker compose up -d
- Переходим на http://localhost/ в браузере
- Вы великолепны!
- Если у вас Linux/MacOS, то рассмотрите вариант с установкой Docker, а потом вернитесь к запуску из Docker
- Если у вас Windows, то рассмотрите вариант с установкой WSL и поверх него Docker, а потом вернитесь к запуску из Docker
Если предыдущие два варианта не подходят, то поехали запускать без Docker:
- Устанавливаем PostgreSQL, создаем базу данных, не забываем пароль
- Устанавливаем расширение pgvector в этой базе данных командой:
CREATE EXTENSION IF NOT EXISTS vector;
- Скачиваем репозиторий командой:
git clone https://github.com/Daniil-Solo/RAG-On-Obsidian.git
- Создаем виртуальное окружение в директории backend и устанавливаем зависимости:
pip install poetry==1.8.5 && poetry install
- Скачиваем папку с билдом фронта в директорию backend папку с Google-диска
- Создаем в директори backend файл .env и заполняем его:
MODE=production
OBSIDIAN_PATH=<YOUR-ABSOLUTE-PATH-TO-OBSIDIAN-NOTES-DIRECTORY>
STATIC_PATH=<YOUR-ABSOLUTE-PATH-TO-FRONT-BUIKD-DIRECTORY>
DB_HOST=<YOUR-DATABASE-HOST> # default is localhost
DB_PORT=<YOUR-DATABASE-PORT> # default is 5432
DB_USER=<YOUR-USER-NAME-IN-POSTGRES> # default is postgres
DB_PASSWORD=<YOUR-PASSWORD-IN-POSTGRES>
DB_NAME=<YOUR-DATABASE-NAME-IN-POSTGRES> # default is postgres
- Из директории backend запускаем командой:
poetry run uvicorn src.app:app --port 5000
- Переходим на http://localhost/ в браузере
- Вы восхитительны!
Проектом занимались: