Головна / Статті

Приватний AI-допоміжний мозок: локальний RAG з використанням AnythingLLM, Ollama та Obsidian

Приватний другий мозок: AnythingLLM та модель ембеддингів на віртуальній машині Proxmox дозволяють локальному Mistral 7B шукати нотатки в Obsidian за допомогою Ollama RAG із реальним використанням ресурсів.

Видавець: REACTAPP.TOP8 хв читання1758 слів

Джерела: Giving My Local AI a Memory: Turning It Into a Private AI Second Brain with RAG and AnythingLLM

Блискучий амнезик

Місцева мовна модель може вести розмову, пояснювати концепції та допомагати обмірковувати ідеї, причому жоден байт не виходить за межі приміщення. Однак вона не може сама по собі відтворювати будь-що з того, що ви зберегли.

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

Зберігання ніколи не було проблемою. Проблема — у отриманні інформації. Завдяки можливості отримати потрібну нотатку у потрібний момент папка з посиланнями перетворюється на знання, а не на добре організовану купу сміття. Тож наступним логічним кроком у налаштуванні приватного ШІ є надання йому доступу до цих нотаток.

Що таке RAG та чому це важливо

Більшість посібників з «роботи з ШІ локально» пропускають цю частину, ймовірно, тому що поняття ембеддингів здається нудним. Вони дійсно трохи нудні, але їх варто зрозуміти.

RAG — це скорочення від Retrieval-Augmented Generation. Він дозволяє мовній моделі користуватися вашими власними документами без повторної підготовки та без завантаження їх на сервер сторонньої організації.

Уявіть собі наймання дуже швидкого бібліотекаря замість того, щоб просити ШІ запам’ятати кожну книгу. Бібліотекар не знає ваші нотатки напам’ять, а лише знає, яку з них взяти, коли ви поставите запитання.

Ось що відбувається насправді:

  1. Документи діляться на фрагменти та перетворюються на ембеддинги — числові представлення значень, які зберігаються у векторній базі даних.
  2. Запитання також перетворюється на ембеддинг.
  3. База даних знаходить фрагменти, які за значенням найбільше схожі на запитання.
  4. Ці фрагменти надсилаються до мовної моделі як контекст.
  • Модель відповідає на запитання на основі ваших реальних документів, а не лише на основі того, що вона засвоїла під час навчання.
  • Інструмент: 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 GB RAM
    • 40 GB диска, оскільки векторні бази даних займають багато місця

    Тут немає нічого складного. У документації все пояснено, а також потрібно трохи спробувати та помилятися, особливо для тих, хто вже налаштував віртуальну машину Ollama. Справжньою обмеженням є наявне обладнання, і саме праця в межах цих обмежень є метою цього завдання.

    Встановлення моделі ембеддингу

    Більшість посібників пропускають цей крок, і це створює найбільше проблем.

    RAG потребує двох моделей. Одна — це модель інференсу, яку вже надає Mistral 7B. Інша — це модель ембеддингу, яка перетворює текст на вектори. Це різні речі, але мало хто з посібників зазначає це з самого початку.

    На існуючій віртуальній машині Ollama завантажте модель ембеддингу:

    ollama pull nomic-embed-text
    

    nomic-embed-text має невеликі розміри — близько 270 МБ, швидко працює на процесорі та добре справляється з англійським текстом, що робить його розумним вибором для обладнання без відеокарти.

    Ще одна проблема: за замовчуванням Ollama працює лише на localhost. Щоб 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, який працює офлайн на пристрої homelab лише з процесором, зовсім не розуміє, що таке Claude Code чи сервер MCP. Він може отримати слова, але не може повністю їх зрозуміти.

    Ось більш корисний урок: отримання та розуміння інформації — це окремі завдання. RAG ставить правильний контекст перед моделлю, але розуміння цього контексту все одно обмежене можливостями самої моделі. З невеликою моделлю 7B без інтернету ці обмеження настають дуже швидко.

    Що пішло не так та що це навчило

    Кілька припущень не витримали тестування.

    • 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 з жорсткого диска.

    Жоден з цих показників не є швидким, і це й не має бути таким ще. Це перший день налаштування homelab RAG, який ще знаходить свої ритми, і це не є критерієм для порівняння з чимось серйозним. Буде цікаво подивитися назад на ці цифри, коли локальне обладнання зможе обробляти значно більше токенів на секунду.

    Що залишається після цього

    Проєкт починається з простої мети — дозволити місцевому ШІ бачити ваші нотатки, — але він вчить і більшого. Протягом цього процесу ви дізнаєтесь, як працює RAG, що роблять векторні бази даних, що робить пошук ефективним та чому правильний контекст може мати більше значення, ніж більша модель.

    Ще важливіше те, що результатом є щось, що ви справді зможете використовувати. Дванадцять місяців зібраних знань більше не розкидані по папках, а стають чимось, про що можна просто запитати. Усе це працює на вживаному ноутбуці в кутку кімнати, що є непогано для пристрою, який мав піти на зберігання.

    RAG працює. Але розуміння — це вже інша історія.

    Додаткова література

    Документація до AnythingLLM, Ollama, LanceDB та Obsidian містить усі деталі. Оригінальна стаття про RAG під назвою „Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks“ пояснює ідею, яка лежить в основі всього цього. Усе, що описано, працює на переосмисленому обладнанні без використання хмари, без підписки та без виходу даних за межі мережі.