MAATRIX / Блог / Как поднять RAG по своим документам на сервере

Как поднять RAG по своим документам на сервере

Как поднять RAG по своим документам на сервере

MAATRIX

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

Обсудить статью, задать вопрос или начать новую тему

Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.

Перейти в сообщество →

Что вы получаете на выходе и чего RAG не умеет

Файл проходит четыре стадии: извлечение текста, нарезка на чанки по несколько сотен символов, эмбеддинг каждого чанка в вектор и поиск — вопрос тоже становится вектором, находятся ближайшие фрагменты. Найденное подставляется модели в промпт, и она отвечает по нему.

Ключевой факт, который меняет ожидания: модель не читает ваш документ. Она видит несколько фрагментов — в AnythingLLM по умолчанию четыре. Остального содержимого базы для неё не существует. Хорошо работают вопросы, ответ на которые лежит в конкретном абзаце («где написано про порядок согласования командировок»), и предсказуемо ломаются три класса.

  • Агрегирующие вопросы. «В скольких договорах есть пункт про неустойку» — поиск вернёт четыре фрагмента, а не все. Модель уверенно назовёт число по ним, и оно будет неверным.
  • Актуальность версии. У векторов нет понятия даты: лежат редакции 2023 и 2025 годов — ответ придёт из той, что ближе по смыслу.
  • Отрицания. «В каких инструкциях не упомянут пожарный выход» — поиск ищет похожее, а не отсутствующее, и такой вопрос не решает в принципе.

Честно говоря, RAG — это поисковик с пересказывателем сверху: чего не находит грамотный полнотекстовый поиск по вашим файлам, не найдёт и он.

Конвейер здесь собирает AnythingLLM: коллектор форматов, локальный эмбеддер, база LanceDB и чат с цитатами уже внутри. Установка разобрана в руководстве по AnythingLLM на VPS; здесь речь про документы.

Подготовка документов: здесь решается 80 % качества

Самое дорогое заблуждение — что файлы можно просто перетащить в окно загрузки. Коллектор достаёт текстовый слой; где его нет, вы получите документ с нулём слов, который честно проиндексируется и никогда ничего не найдёт. Начните с инвентаризации корпуса.

for f in *.pdf; do
  printf '%7s  %s\n' "$(pdftotext -layout "$f" - 2>/dev/null | wc -w)" "$f"
done | sort -n | tee inventory.txt | head -30

Вверху списка с нулями окажутся сканы и PDF-обёртки вокруг картинок; отдельно всплывут защищённые файлы — на них pdftotext печатает Command Line Error: Incorrect password. Сканы прогоняем через OCR до загрузки.

apt install -y ocrmypdf tesseract-ocr-rus tesseract-ocr-eng
tesseract --list-langs
ocrmypdf --skip-text -l rus+eng scan.pdf ocr/scan.pdf

Две ошибки здесь встречают всех. PriorOcrFoundError: page already has text! — часть страниц уже с текстовым слоем; --skip-text их пропускает, --redo-ocr переделывает кривой слой. И The installed version of tesseract does not have language data for the following requested languages: rus — без языкового пакета русский распознается латиницей, и в базу приедет формально не пустая, но бесполезная каша. OCR грузит все ядра и идёт десятками минут — не запускайте его в рабочее время.

Офисные форматы коллектор понимает, но двухколоночная вёрстка и таблицы у него разъезжаются — надёжнее конвертировать самому.

soffice --headless -env:UserInstallation=file:///tmp/lo1 \
        --convert-to 'txt:Text (encoded):UTF8' --outdir txt/ reglament.docx

pandoc -f docx -t markdown --wrap=none -o md/reglament.md reglament.docx

Вариант с pandoc лучше: он сохраняет заголовки, а заголовок внутри чанка — бесплатный контекст. Про -env:UserInstallation забывать нельзя: два параллельных soffice дерутся за один профиль, и второй молча отдаёт пустой результат. Что ещё чистить:

  • Таблицы. Строку прайса разворачивайте в предложение: «Тариф для Москвы: срок 14 дней, стоимость 3800 рублей» вместо Москва | 14 | 3800. Оторванная от шапки строка — цифры, неотличимые от сотни таких же.
  • Колонтитулы. Штамп «ООО „Ромашка“, конфиденциально» попадает в каждый чанк и размывает смысл: sed -i '/^ООО «Ромашка», конфиденциально$/d' txt/*.txt.
  • Дубликаты. Одинаковые файлы занимают места в выдаче дважды: find . -name '*.pdf' -exec sha256sum {} + | sort | uniq -w64 -d.
  • Гигантские файлы. Мануал на 900 страниц режется нормально, но в цитате вы увидите одно имя: qpdf --split-pages=50 big.pdf part.pdf.

Двести подготовленных документов дают лучшие ответы, чем пять тысяч сырых.

Развернуть за пару минут

Готовый образ на VPS MAATRIX: NVMe, AMD EPYC, root-доступ. Локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.

Развернуть AnythingLLM

Как разложить корпус: пространства, имена и версии

Разложить корпус важнее, чем выбрать модель.

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

Имя файла — метаданные, которые доживают до ответа. Оно показывается в цитате, по нему человек решает, верить ли: doc_final_v2(1).pdf не говорит ничего, 2024-11-15_prikaz-142_otpuska.md говорит всё.

На длинных регламентах сильно помогает резать документ по разделам самому и вшивать заголовок в каждый кусок: нарезка по символам про структуру не знает, и середина сорокастраничного документа приезжает модели без единого признака источника.

csplit -z -f razdel- -b '%02d.md' reglament.md '/^## /' '{*}'
for f in razdel-*.md; do
  sed -i '1i > Регламент оказания услуг, редакция от 12.03.2025' "$f"
done

Версии — главная причина уверенно неверных ответов. Загрузили новую редакцию, старую не удалили: обе в индексе, поиск возвращает обе, модель цитирует ту, что ближе. Замена документа — это удаление старого плюс повторное вшивание, а не догрузка. Нужна история — заведите отдельное пространство «архив» и не подключайте его к рабочему чату.

Эмбеддер и поиск: что крутить, когда ответ мимо

Инструмент диагностики у вас один — блок цитат под ответом: он показывает фрагменты, которые реально ушли в модель. Не разобрав их, вы крутите настройки вслепую.

Что видно в цитатахДиагнозКуда идти
Цитат нет вовсепорог отсекает всё либо документ не вшитпорог схожести → «без ограничения», проверить статус файла
Цитаты из чужой темывсё свалено в одно пространство, слабый эмбеддерразнести пространства, сменить эмбеддер
Нужный документ есть, кусок не тотчанк разрезал мысль пополамперекрытие, нарезка по разделам, больше фрагментов
Найдено верно, ответ мимоэто уже не RAGрежим Query, системный промпт, окно контекста

Последняя строка важна: если правильный абзац в цитатах есть, а ответ неверный, менять эмбеддер и чанки бессмысленно.

Эмбеддер под русский корпус. Встроенная all-MiniLM-L6-v2 обучалась в основном на английском и на русских регламентах заметно слабее многоязычных. Альтернатива — поднять рядом Ollama и взять bge-m3 (в реестре Ollama около 1,2 ГБ) либо multilingual-e5-large: считается на процессоре, наружу ничего не уходит. Облако дешевле, чем кажется: 50 МБ русского текста — порядка 14 млн токенов, а text-embedding-3-small стоит около $0,02 за миллион, то есть индексация обойдётся в тридцать центов. Платить придётся приватностью — каждый чанк уходит на сторону.

Смена эмбеддера обязывает переиндексировать всё. Отдельная ловушка — кэш storage/vector-cache/: векторы лежат там по хэшу файла, и повторная загрузка того же документа поднимет старые. Каталог чистится руками.

Внутренний жаргон. Синонимы поиск переживает, аббревиатуры — нет: «СЗ» и «служебная записка» для него разные вещи, и лечится это документом-глоссарием, а не настройками. Честная граница: ни одна настройка не вытащит текст из нераспознанного скана и не склеит таблицу, разрезанную между чанками.

Проверка качества: тестовый набор вместо ощущений

Пока вы оцениваете базу на глаз по паре вопросов, любое изменение — вопрос веры. Соберите 25–40 реальных вопросов из очереди поддержки и писем, для каждого запишите, в каком документе лежит ответ, — получится TSV из двух колонок. Ключ выдаётся в настройках, раздел Developer API; документация — на /api/docs вашей установки.

API=https://llm.example.com/api/v1
KEY="$ANYLLM_KEY"
OUT="run-$(date +%F-%H%M).tsv"

while IFS=

Развернуть за пару минут

Готовый образ на VPS MAATRIX: NVMe, AMD EPYC, root-доступ. Локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.

Развернуть AnythingLLM

Как разложить корпус: пространства, имена и версии

Разложить корпус важнее, чем выбрать модель.

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

Имя файла — метаданные, которые доживают до ответа. Оно показывается в цитате, по нему человек решает, верить ли: doc_final_v2(1).pdf не говорит ничего, 2024-11-15_prikaz-142_otpuska.md говорит всё.

На длинных регламентах сильно помогает резать документ по разделам самому и вшивать заголовок в каждый кусок: нарезка по символам про структуру не знает, и середина сорокастраничного документа приезжает модели без единого признака источника.

csplit -z -f razdel- -b '%02d.md' reglament.md '/^## /' '{*}'
for f in razdel-*.md; do
  sed -i '1i > Регламент оказания услуг, редакция от 12.03.2025' "$f"
done

Версии — главная причина уверенно неверных ответов. Загрузили новую редакцию, старую не удалили: обе в индексе, поиск возвращает обе, модель цитирует ту, что ближе. Замена документа — это удаление старого плюс повторное вшивание, а не догрузка. Нужна история — заведите отдельное пространство «архив» и не подключайте его к рабочему чату.

Эмбеддер и поиск: что крутить, когда ответ мимо

Инструмент диагностики у вас один — блок цитат под ответом: он показывает фрагменты, которые реально ушли в модель. Не разобрав их, вы крутите настройки вслепую.

Что видно в цитатахДиагнозКуда идти
Цитат нет вовсепорог отсекает всё либо документ не вшитпорог схожести → «без ограничения», проверить статус файла
Цитаты из чужой темывсё свалено в одно пространство, слабый эмбеддерразнести пространства, сменить эмбеддер
Нужный документ есть, кусок не тотчанк разрезал мысль пополамперекрытие, нарезка по разделам, больше фрагментов
Найдено верно, ответ мимоэто уже не RAGрежим Query, системный промпт, окно контекста

Последняя строка важна: если правильный абзац в цитатах есть, а ответ неверный, менять эмбеддер и чанки бессмысленно.

Эмбеддер под русский корпус. Встроенная all-MiniLM-L6-v2 обучалась в основном на английском и на русских регламентах заметно слабее многоязычных. Альтернатива — поднять рядом Ollama и взять bge-m3 (в реестре Ollama около 1,2 ГБ) либо multilingual-e5-large: считается на процессоре, наружу ничего не уходит. Облако дешевле, чем кажется: 50 МБ русского текста — порядка 14 млн токенов, а text-embedding-3-small стоит около $0,02 за миллион, то есть индексация обойдётся в тридцать центов. Платить придётся приватностью — каждый чанк уходит на сторону.

Смена эмбеддера обязывает переиндексировать всё. Отдельная ловушка — кэш storage/vector-cache/: векторы лежат там по хэшу файла, и повторная загрузка того же документа поднимет старые. Каталог чистится руками.

Внутренний жаргон. Синонимы поиск переживает, аббревиатуры — нет: «СЗ» и «служебная записка» для него разные вещи, и лечится это документом-глоссарием, а не настройками. Честная граница: ни одна настройка не вытащит текст из нераспознанного скана и не склеит таблицу, разрезанную между чанками.

Проверка качества: тестовый набор вместо ощущений

Пока вы оцениваете базу на глаз по паре вопросов, любое изменение — вопрос веры. Соберите 25–40 реальных вопросов из очереди поддержки и писем, для каждого запишите, в каком документе лежит ответ, — получится TSV из двух колонок. Ключ выдаётся в настройках, раздел Developer API; документация — на /api/docs вашей установки.

API=https://llm.example.com/api/v1
KEY="$ANYLLM_KEY"
OUT="run-$(date +%F-%H%M).tsv"

while IFS=$'\t' read -r q src; do
  resp=$(curl -s -X POST "$API/workspace/baza-znanij/chat" \
    -H "Authorization: Bearer $KEY" -H 'Content-Type: application/json' \
    -d "$(jq -nc --arg m "$q" '{message:$m, mode:"query"}')")
  hit=$(echo "$resp" | jq -r --arg s "$src" '[.sources[].title] | index($s) // "MISS"')
  printf '%s\t%s\t%s\n' "$hit" "$src" "$q"
done < golden.tsv | tee "$OUT"

echo "промахов: $(grep -c MISS "$OUT") из $(wc -l < golden.tsv)"

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

Не пугайтесь первого прогона: на сыром корпусе промах на трети вопросов — обычное дело, и самый большой скачок почти всегда даёт не подбор настроек, а возврат к подготовке. Дальше набор работает регрессионным тестом: старые вопросы начали промахиваться после догрузки — новые документы вытеснили ответы из выдачи, корпус пора разносить.

Эксплуатация: обновление базы, доступ и приватность

Руками через веб-интерфейс базу обновляют недели две, дальше нужен конвейер. Загрузка и вшивание — два разных вызова API:

curl -s -X POST "$API/document/upload" \
  -H "Authorization: Bearer $KEY" -F "file=@md/reglament.md"
# в ответе: "location": "custom-documents/reglament-<uuid>.json"

curl -s -X POST "$API/workspace/baza-znanij/update-embeddings" \
  -H "Authorization: Bearer $KEY" -H 'Content-Type: application/json' \
  -d '{"adds":["custom-documents/reglament-<uuid>.json"],"deletes":[]}'

Из них собирается синхронизация папки по cron: держите файл состояния с хэшами, изменённые загружайте, исчезнувшие передавайте в deletes. Встроенное наблюдение (watch) обновляет ссылки на сайты, за каталогом на диске не следит.

Резервная копия. Состояние целиком лежит в каталоге хранилища: anythingllm.db (SQLite с пользователями, пространствами, чатами и реестром документов), documents/ (разобранный текст), vector-cache/ (векторы по хэшу), lancedb/ (индекс). Копировать SQLite на ходу нельзя — получите битый файл:

sqlite3 /opt/anythingllm/storage/anythingllm.db ".backup '/var/backups/anythingllm.db'"
tar czf /var/backups/storage-$(date +%F).tgz -C /opt/anythingllm/storage \
    documents lancedb vector-cache

Перед docker compose pull бэкап обязателен: на старте новой версии идут миграции базы.

Доступ. Роли и членство в пространствах есть, но прав на отдельный документ внутри пространства не существует: единица доступа — пространство целиком. Кадровые документы не кладутся в общую базу с припиской «не отвечай про зарплаты» — такая защита обходится одним переформулированным вопросом.

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

Какой сервер под RAG по своим документам брать в MAATRIX

Аппетитов три: приложение на Node держит сотни мегабайт в покое, индексация даёт короткие всплески на все ядра, а генерация — либо ноль ресурсов при внешней модели, либо главный потребитель при локальной.

Честный минимум: 2 vCPU, 4 ГБ RAM, 40 ГБ NVMe. Хватает на корпус в несколько сотен документов, локальный эмбеддер и внешнюю модель по API. Разработчики называют минимумом 2 ГБ, и приложение поднимется, но коллектор держит разбираемый файл в памяти целиком: стостраничная презентация на 2 ГБ заканчивается процессом, убитым по OOM, посреди индексации.

Комфортный вариант: 4 vCPU, 8 ГБ RAM, 80 ГБ NVMe. Помещаются локальный многоязычный эмбеддер через Ollama (bge-m3 — около 1,2 ГБ на диске плюс память под рантайм), параллельный OCR, отдельный Qdrant рядом, несколько пространств и команда. Арифметика по диску простая: размерность 1024 по четыре байта на число — это 4 КБ на фрагмент, то есть сто тысяч чанков дают около 400 МБ векторов, а каждый документ хранится трижды. Локальная генеративная модель — другая планка: 7B в Q4 это порядка 4,5 ГБ одних весов плюс контекст, вход от 16 ГБ RAM, комфорт — GPU-сервер под инференс LLM.

Локация — Великобритания (Лондон). Причин две. Юрисдикция: в корпусе документы компании и данные людей, европейская площадка привычнее контрагентам из ЕС. И доступность API: с британского адреса эндпоинты эмбеддингов OpenAI, Anthropic и Voyage отвечают штатно, тогда как с российского приходит 403 unsupported_country_region_territory и переиндексация просто не запускается. Задержка для RAG не критична — время ответа определяет генерация, а не поиск по векторам. Российскую локацию берут в одном случае: если в базе персональные данные под 152-ФЗ, но тогда и модель придётся держать локальной.

AnythingLLM выбирается в каталоге apps.maatrix.io при заказе сервера и разворачивается автоматически — ставить руками ничего не нужно, работает на Ubuntu и Debian. Адрес панели и доступы появятся в личном кабинете, в разделе «Доступ». Оплата — картой российского банка, по СБП, криптовалютой или токеном MAAT. Разбор сбоев на загрузке — в статье про то, почему AnythingLLM не индексирует документы, выбор внешней базы — в материале про векторную базу для RAG.

Развернуть за пару минут

Готовый образ на VPS MAATRIX: NVMe, AMD EPYC, root-доступ. Локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.

Развернуть AnythingLLM

Нужны сами нейросети для контента?

Генерируйте изображения, видео и озвучку нейросетями на falapi.io — десятки моделей в одном окне. Оплата картой РФ и по СБП.

#x27;\t' read -r q src; do resp=$(curl -s -X POST "$API/workspace/baza-znanij/chat" \ -H "Authorization: Bearer $KEY" -H 'Content-Type: application/json' \ -d "$(jq -nc --arg m "$q" '{message:$m, mode:"query"}')") hit=$(echo "$resp" | jq -r --arg s "$src" '[.sources[].title] | index($s) // "MISS"') printf '%s\t%s\t%s\n' "$hit" "$src" "$q" done < golden.tsv | tee "$OUT" echo "промахов: $(grep -c MISS "$OUT") из $(wc -l < golden.tsv)"

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

Не пугайтесь первого прогона: на сыром корпусе промах на трети вопросов — обычное дело, и самый большой скачок почти всегда даёт не подбор настроек, а возврат к подготовке. Дальше набор работает регрессионным тестом: старые вопросы начали промахиваться после догрузки — новые документы вытеснили ответы из выдачи, корпус пора разносить.

Эксплуатация: обновление базы, доступ и приватность

Руками через веб-интерфейс базу обновляют недели две, дальше нужен конвейер. Загрузка и вшивание — два разных вызова API:

curl -s -X POST "$API/document/upload" \
  -H "Authorization: Bearer $KEY" -F "file=@md/reglament.md"
# в ответе: "location": "custom-documents/reglament-<uuid>.json"

curl -s -X POST "$API/workspace/baza-znanij/update-embeddings" \
  -H "Authorization: Bearer $KEY" -H 'Content-Type: application/json' \
  -d '{"adds":["custom-documents/reglament-<uuid>.json"],"deletes":[]}'

Из них собирается синхронизация папки по cron: держите файл состояния с хэшами, изменённые загружайте, исчезнувшие передавайте в deletes. Встроенное наблюдение (watch) обновляет ссылки на сайты, за каталогом на диске не следит.

Резервная копия. Состояние целиком лежит в каталоге хранилища: anythingllm.db (SQLite с пользователями, пространствами, чатами и реестром документов), documents/ (разобранный текст), vector-cache/ (векторы по хэшу), lancedb/ (индекс). Копировать SQLite на ходу нельзя — получите битый файл:

sqlite3 /opt/anythingllm/storage/anythingllm.db ".backup '/var/backups/anythingllm.db'"
tar czf /var/backups/storage-$(date +%F).tgz -C /opt/anythingllm/storage \
    documents lancedb vector-cache

Перед docker compose pull бэкап обязателен: на старте новой версии идут миграции базы.

Доступ. Роли и членство в пространствах есть, но прав на отдельный документ внутри пространства не существует: единица доступа — пространство целиком. Кадровые документы не кладутся в общую базу с припиской «не отвечай про зарплаты» — такая защита обходится одним переформулированным вопросом.

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

Какой сервер под RAG по своим документам брать в MAATRIX

Аппетитов три: приложение на Node держит сотни мегабайт в покое, индексация даёт короткие всплески на все ядра, а генерация — либо ноль ресурсов при внешней модели, либо главный потребитель при локальной.

Честный минимум: 2 vCPU, 4 ГБ RAM, 40 ГБ NVMe. Хватает на корпус в несколько сотен документов, локальный эмбеддер и внешнюю модель по API. Разработчики называют минимумом 2 ГБ, и приложение поднимется, но коллектор держит разбираемый файл в памяти целиком: стостраничная презентация на 2 ГБ заканчивается процессом, убитым по OOM, посреди индексации.

Комфортный вариант: 4 vCPU, 8 ГБ RAM, 80 ГБ NVMe. Помещаются локальный многоязычный эмбеддер через Ollama (bge-m3 — около 1,2 ГБ на диске плюс память под рантайм), параллельный OCR, отдельный Qdrant рядом, несколько пространств и команда. Арифметика по диску простая: размерность 1024 по четыре байта на число — это 4 КБ на фрагмент, то есть сто тысяч чанков дают около 400 МБ векторов, а каждый документ хранится трижды. Локальная генеративная модель — другая планка: 7B в Q4 это порядка 4,5 ГБ одних весов плюс контекст, вход от 16 ГБ RAM, комфорт — GPU-сервер под инференс LLM.

Локация — Великобритания (Лондон). Причин две. Юрисдикция: в корпусе документы компании и данные людей, европейская площадка привычнее контрагентам из ЕС. И доступность API: с британского адреса эндпоинты эмбеддингов OpenAI, Anthropic и Voyage отвечают штатно, тогда как с российского приходит 403 unsupported_country_region_territory и переиндексация просто не запускается. Задержка для RAG не критична — время ответа определяет генерация, а не поиск по векторам. Российскую локацию берут в одном случае: если в базе персональные данные под 152-ФЗ, но тогда и модель придётся держать локальной.

AnythingLLM выбирается в каталоге apps.maatrix.io при заказе сервера и разворачивается автоматически — ставить руками ничего не нужно, работает на Ubuntu и Debian. Адрес панели и доступы появятся в личном кабинете, в разделе «Доступ». Оплата — картой российского банка, по СБП, криптовалютой или токеном MAAT. Разбор сбоев на загрузке — в статье про то, почему AnythingLLM не индексирует документы, выбор внешней базы — в материале про векторную базу для RAG.

Развернуть за пару минут

Готовый образ на VPS MAATRIX: NVMe, AMD EPYC, root-доступ. Локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.

Развернуть AnythingLLM

Обсудить статью, задать вопрос или начать новую тему

Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.

Перейти в сообщество →

Частые вопросы

Нужен ли GPU, чтобы поднять RAG по своим документам?

Для поиска нет: он считается на процессоре и памяти. Эмбеддинги на CPU тоже приемлемы — это разовая операция при индексации. GPU нужен, только если генеративную модель вы держите локально.

Сколько документов вытянет один сервер?

Считайте не файлы, а фрагменты: страница текста — это два-три чанка. Сто тысяч фрагментов (тридцать-сорок тысяч страниц) занимают под полгигабайта векторов и живут на 8 ГБ RAM. Раньше упрётся не железо, а качество: чем разнороднее корпус, тем чаще нужный кусок вытесняется из выдачи.

Можно ли обновлять базу автоматически из папки?

Да, но писать это придётся самому: связка POST /api/v1/document/upload и POST /api/v1/workspace/{slug}/update-embeddings с файлом хэшей и заданием в cron. Встроенное наблюдение переобходит ссылки на сайты, а за каталогом на диске или облачным хранилищем не следит.

Нужны сами нейросети для контента?

Генерируйте изображения, видео и озвучку нейросетями на falapi.io — десятки моделей в одном окне. Оплата картой РФ и по СБП.