AnythingLLM + Ollama: как сделать локальный RAG по PDF и документам и почему он иногда плохо ищет
AnythingLLM превращает папку PDF, DOCX, TXT и других документов в поисковую базу для LLM: файлы разбиваются на chunks, превращаются в embeddings и попадают в vector database, после чего Ollama получает только найденные фрагменты. Это позволяет держать документы локально, но качество ответа зависит не столько от красивого интерфейса, сколько от parsing, embeddings, retrieval settings и самой модели.
AnythingLLM — self-hosted платформа вокруг документов, RAG, workspaces и AI-agents
AnythingLLM можно использовать как обычный AI-чат, но его главный практический смысл — объединить LLM, embedder, vector database и документы в одном интерфейсе. Каждый workspace может иметь свои документы, model provider, system prompt, retrieval settings и историю.
AnythingLLM может использовать Ollama, OpenAI-compatible API, Anthropic, OpenAI и другие providers.
Модель для embeddings не обязана быть той же, что отвечает пользователю.
По умолчанию для локального сценария часто используется LanceDB, но доступны и другие backends.
Документы и retrieval-настройки можно разделить по проектам, темам или пользователям.
AnythingLLM и Open WebUI пересекаются, но фокус у них разный
Если задача — «один красивый интерфейс ко всем моделям», Open WebUI обычно естественнее. Если задача — «загрузить массив документов, разбить их на рабочие области и постоянно задавать вопросы по ним», AnythingLLM заслуживает отдельного рассмотрения.
Как развернуть AnythingLLM 1.16.1 с persistent storage
Для серверной установки официальный проект поддерживает Docker.
Важнее всего не потерять /app/server/storage и файл .env при пересоздании контейнера.
Linux / macOS
export STORAGE_LOCATION=$HOME/anythingllm
mkdir -p "$STORAGE_LOCATION"
touch "$STORAGE_LOCATION/.env"
docker run -d \
--name anythingllm \
-p 3001:3001 \
--cap-add SYS_ADMIN \
--add-host=host.docker.internal:host-gateway \
-v "$STORAGE_LOCATION:/app/server/storage" \
-v "$STORAGE_LOCATION/.env:/app/server/.env" \
-e STORAGE_DIR="/app/server/storage" \
--restart unless-stopped \
mintplexlabs/anythingllm:1.16.1
После запуска интерфейс доступен на http://localhost:3001.
Для Windows логика та же, но host path задаётся PowerShell-путём.
/app/server/storage
Здесь лежат SQLite database, documents, vector cache, models и другие persistent data.
Иначе настройки окружения могут не пережить пересоздание container.
1.16.1
Фиксированный stable tag воспроизводимее, чем плавающий latest.
Текущий stable нельзя бездумно выставлять напрямую в интернет: ниже есть отдельный security-раздел.
AnythingLLM в Docker должен видеть Ollama по адресу хоста, а не через localhost контейнера
Типичная ошибка: указать http://127.0.0.1:11434 внутри AnythingLLM container.
Для контейнера localhost — это сам контейнер, а не основная система.
LLM_PROVIDER=ollama
OLLAMA_BASE_PATH=http://host.docker.internal:11434
OLLAMA_MODEL_PREF=qwen3.5:8b
На Linux для host.docker.internal обычно нужен
--add-host=host.docker.internal:host-gateway.
Если Ollama работает на отдельном сервере, используйте его LAN/VPN address.
AnythingLLM и Ollama в домашней сети лучше соединять по LAN или VPN.
Открытый :11434 — плохой способ организовать удалённый доступ.
Почему LLM не читает все ваши 300 PDF при каждом вопросе
RAG не отправляет модели весь архив документов. Это было бы слишком дорого и быстро упёрлось бы в context window. Вместо этого AnythingLLM ищет несколько наиболее похожих chunks и передаёт только их.
Поэтому качество локального RAG нужно диагностировать отдельно от качества самой chat model.
Почему AnythingLLM «не находит то, что точно есть в PDF»
Сканированный PDF может выглядеть нормально человеку, но содержать почти пустой или испорченный text layer.
Слишком большой chunk смешивает темы, слишком маленький теряет контекст между соседними абзацами.
Поиск зависит от embedding model не меньше, чем от основной LLM.
Текущий default — 4 chunks. Для вопроса, требующего сопоставить несколько документов, этого может не хватить.
Default similarity threshold 0.25 может фильтровать chunks, которые кажутся embedder недостаточно похожими.
«Расскажи всё о проекте» хуже для retrieval, чем вопрос с конкретными сущностями, датами и терминами.
Парсер может потерять структуру таблицы или вовсе не извлечь визуальный текст.
Множество однотипных chunks конкурируют между собой и вытесняют более редкий релевантный фрагмент.
Диагностика по порядку
Сначала убедиться, что нужная фраза вообще присутствует после parsing/OCR.
Использовать редкое имя, номер, код или заголовок из документа.
Например, протестировать 8–12 вместо 4 и посмотреть, улучшился ли recall.
Снижать постепенно только если нужные chunks действительно отбрасываются.
Для многоязычных архивов отдельно проверить качество русского/английского retrieval.
Если retrieval плохой, более крупная LLM не исправит отсутствие исходного контекста.
topN = 4 и similarityThreshold = 0.25 — стартовые значения, а не универсальный optimum
В актуальной Prisma schema AnythingLLM workspace имеет
topN = 4 и similarityThreshold = 0.25 по умолчанию.
Это разумный безопасный старт, но не настройка для любого corpus.
Меньше мусора в prompt, но можно потерять нужный фрагмент из другого документа.
Модель видит больше источников, но часть контекста может оказаться нерелевантной.
Хорошо против случайных совпадений, но опасно для сложных переформулированных запросов.
Помогает recall, но может пропустить в prompt семантически слабые chunks.
Есть реальные self-hosted проекты, которые используют threshold 0 и topN 10–12 вместе с reranking, но это рабочая конфигурация конкретного corpus, а не официальный универсальный preset AnythingLLM.
Для локального RAG можно использовать Ollama и для embeddings
EMBEDDING_ENGINE=ollama
EMBEDDING_BASE_PATH=http://host.docker.internal:11434
EMBEDDING_MODEL_PREF=nomic-embed-text:latest
Это пример из Docker configuration проекта. Конкретную embedding model нужно выбирать под язык и corpus. Для русско-английской базы важно отдельно проверить multilingual retrieval, а не ориентироваться только на leaderboard.
Формирует ответ
Qwen, Llama, Gemma и другая LLM получает вопрос плюс найденный контекст.
Решает, какой контекст найти
Если embedder плохо связывает вопрос с нужным фрагментом, chat model этот текст не увидит.
Большой архив лучше делить по workspaces и темам, а не превращать в одну бесконечную корзину
В свежих обсуждениях локального RAG пользователи регулярно пытаются индексировать сотни PDF или десятки гигабайт документов. Основная проблема при росте corpus — не только время индексации, а падение retrieval precision: похожих chunks становится всё больше.
Отдельные workspaces для договоров, техники, нормативов, клиентов или разных продуктов.
Архив старых документов может вытеснять актуальные версии при semantic search.
Плохой текст нельзя исправить хорошей vector database.
Соберите 20–50 вопросов с известными источниками и сравнивайте настройки объективно.
Перед оценкой «умности» ответа смотрите, найден ли правильный source chunk. Иначе невозможно понять, сломался retrieval или сама LLM.
Stable 1.16.1 сейчас имеет опубликованные advisories, исправленные уже после релиза
Это важный нюанс текущего момента. Последний stable GitHub release — 1.16.1 от 27 августа,
но в сентябре были опубликованы advisories, где affected range включает <= 1.16.1,
а patched versions указаны как конкретные commits и > 1.16.1.
В single-user mode публичный embed widget мог получить private Memories владельца в system prompt. Условие требует включённых Memories и публичного embed.
Manager role мог записать вредоносный title/favicon и атаковать администратора при открытии homepage.
Для домашнего single-user сценария держите AnythingLLM в LAN/VPN, не включайте public embed widgets вместе с Personalization/Memories и дождитесь stable-релиза выше 1.16.1 либо самостоятельно проверяйте patched build.
Security policy AnythingLLM также подчёркивает, что отсутствие authentication является допустимым режимом только для полностью доверенной изолированной среды. Если authentication не включена, любой, кто видит URL, получает доступ к экземпляру.
Проект прямо пишет, что filesystem/SQL tools должны ограничиваться правами самой ОС, БД и filesystem. UI-level фильтр не считается security boundary.
AnythingLLM не обязан отправлять документы в Mintplex, но providers выбираете вы
В self-hosted terms указано, что AnythingLLM не требует постоянного соединения с Mintplex Labs для работы; optional telemetry можно отключить. Однако некоторые модели/asset files могут один раз скачиваться из CDN.
Documents, embeddings, vector DB и inference можно держать внутри LAN.
В облако отправляется не весь archive, но найденные RAG fragments входят в prompt.
Текст chunks отправляется embedding provider для построения векторов.
Gmail, web search, SQL, filesystem и другие tools имеют собственные privacy/security boundaries.
Для одного Windows-ПК Desktop проще, для сервера и нескольких устройств — Docker
- быстрая установка на Windows/macOS/Linux;
- можно импортировать GGUF непосредственно в приложение;
- в 1.16.1 появились built-in Foundry Local и GenieX варианты для поддерживаемого Windows hardware;
- подходит для одного пользователя.
- доступ с нескольких устройств;
- удобнее backup и перенос;
- можно держать Ollama на отдельной GPU-машине;
- проще интегрировать в LAN/VPN infrastructure.
Документация проекта рекомендует для browser/server версии использовать отдельный inference provider, например Ollama или LM Studio.
AnythingLLM упрощает RAG, но не отменяет сложность retrieval
Скан, таблица, сложная вёрстка и обычный text PDF требуют разного parsing/OCR quality.
Точные номера, коды, даты и редкие имена иногда лучше ищутся keyword/hybrid методами.
Даже при правильном source chunk ответ нужно сверять с цитатой.
Default topN и threshold редко оптимальны для сотен похожих документов.
Filesystem, SQL и web tools превращают AI из «читателя» в систему с реальными полномочиями.
Для публичной установки нужно дождаться следующего stable patch или использовать проверенный patched build.
Сначала измеряйте recall и citations, потом меняйте LLM.
Минимальная локальная схема без лишних компонентов
Отдельный inference server на ПК или GPU-сервере.
Чтобы chunks документов не уходили во внешний API.
Простой local default без отдельного database server.
Рабочие области, documents, settings и UI.
Не публиковать сервис напрямую в интернет.
Известный source для каждого вопроса и сравнение retrieval settings.
Исходники, Docker configuration, release и security AnythingLLM
Stable 1.16.1 выпущен 27 августа 2026 года. На дату проверки существуют сентябрьские security advisories, у которых patched versions указаны уже после 1.16.1.
AnythingLLM удобен для локальных документов, если воспринимать RAG как поиск, а не как магическую память
Связка AnythingLLM + Ollama особенно полезна, когда нужен собственный assistant по документации, техническим архивам, договорам, инструкциям или базе знаний без отправки всего corpus в облачный AI.
Но при сотнях PDF ключевым становится не размер chat model, а retrieval: качество текста после OCR, embeddings, topN, threshold и структура workspaces. Если правильный chunk не найден, LLM уже не сможет компенсировать его отсутствие.
Частые вопросы про AnythingLLM и локальный RAG
AnythingLLM — это сама LLM?
Нет. Это приложение вокруг LLM, documents, embeddings, vector database, workspaces и agents. Модель может работать в Ollama или другом provider.
Можно ли сделать полностью локальный RAG?
Да: AnythingLLM + Ollama chat model + локальная embedding model + локальная vector DB. Нужно проверить, чтобы дополнительные tools/providers тоже не использовали облако.
Почему AnythingLLM не находит текст, который точно есть в PDF?
Проверьте parsing/OCR, затем embeddings, topN и similarity threshold. Если source chunk не попал в retrieval, проблема возникает до этапа ответа LLM.
Какой topN использовать?
Default AnythingLLM — 4. Для большого multi-document corpus имеет смысл тестировать большее значение на собственном наборе вопросов, но универсального числа нет.
Что означает similarityThreshold 0.25?
Это default workspace threshold, ниже которого кандидаты могут отбрасываться. Снижать его нужно только после проверки retrieval, потому что низкий threshold увеличивает шум.
AnythingLLM лучше Open WebUI?
Это разные акценты. AnythingLLM особенно интересен для document workspaces и RAG, Open WebUI — как универсальный frontend к нескольким AI providers.
Безопасно ли сейчас выставлять AnythingLLM 1.16.1 в интернет?
Я бы не рекомендовал. На 21 сентября 2026 года есть опубликованные advisories, где 1.16.1 всё ещё входит в affected range. Держите instance в LAN/VPN или используйте проверенный patched build до следующего stable release.
Какая версия актуальна?
Последний stable GitHub release на момент проверки — AnythingLLM 1.16.1 от 27 августа 2026 года.
Нужно настроить локальный поиск по PDF, инструкциям или рабочим документам?
Можно подобрать Ollama-модель, embedder, структуру workspaces и безопасную схему доступа, а затем проверить retrieval на реальном наборе контрольных вопросов.
