Полный гайд по AnythingLLM — платформе для создания RAG-приложений с документами. Установка через Docker, подключение локальных и облачных LLM, загрузка PDF/кода, API-интеграции и лучшие практики.
AnythingLLM — это open-source платформа для построения RAG-приложений (Retrieval-Augmented Generation), которая позволяет «общаться» с вашими документами через любой LLM. Проект создан командой Mintplex Labs и набрал более 30 000 звёзд на GitHub. Ключевая идея: вы загружаете свои PDF-файлы, текстовые документы, фрагменты кода или веб-страницы, а AnythingLLM индексирует их и даёт возможность задавать вопросы на естественном языке, получая точные ответы с цитированием исходных документов.
В отличие от обычных чат-ботов, которые «галлюцинируют» или опираются только на свои тренировочные данные, AnythingLLM использует технику RAG: при каждом запросе он ищет релевантные фрагменты в вашей базе знаний, добавляет их в контекст LLM и только затем генерирует ответ. Это критически важно для бизнес-сценариев: юридические документы, техническая документация, внутренние базы знаний компании, научные статьи — везде, где фактическая точность имеет значение.
Ключевые возможности: поддержка множества LLM-провайдеров (Ollama, OpenAI, Anthropic Claude, LM Studio, локальные модели), встроенная векторная база данных LanceDB, мульти-пользовательский режим, REST API и вебхуки для интеграций, возможность создавать агентов с доступом к инструментам (браузинг, выполнение кода). Платформа доступна в трёх вариантах: Desktop-приложение (macOS/Windows/Linux), Docker-образ для самостоятельного хостинга и облачная версия от разработчиков.
Самый гибкий и рекомендуемый способ установки AnythingLLM для продакшен-сценариев — Docker. Контейнер включает всё необходимое: веб-интерфейс, встроенную векторную БД LanceDB, коллектор документов и API. Запуск занимает менее минуты, а обновления сводятся к pull нового образа.
Для разработчиков, которые хотят полного контроля, доступна ручная установка из исходников (self-hosted) через Node.js и yarn. Десктопная версия подходит для персонального использования на локальной машине и не требует командной строки — просто скачайте установщик с официального сайта. Ниже приведены команды для каждого варианта установки.
# === Вариант 1: Установка через Docker (рекомендуемый) === # Скачиваем и запускаем контейнер одной командой docker pull mintplexlabs/anythingllm:latest docker run -d \ --name anythingllm \ -p 3001:3001 \ -v anythingllm_storage:/app/server/storage \ -v anythingllm_hotdir:/app/collector/hotdir \ -v anythingllm_outputs:/app/collector/outputs \ -e STORAGE_DIR="/app/server/storage" \ mintplexlabs/anythingllm # Приложение будет доступно по адресу http://localhost:3001 # Для остановки: docker stop anythingllm && docker rm anythingllm
# === Вариант 2: Docker Compose (с Nginx и SSL) === # Создайте docker-compose.yml: version: '3.8' services: anythingllm: image: mintplexlabs/anythingllm:latest ports: - "3001:3001" volumes: - ./storage:/app/server/storage - ./hotdir:/app/collector/hotdir - ./outputs:/app/collector/outputs environment: - STORAGE_DIR=/app/server/storage - UID='1000' - GID='1000' # Запуск: docker compose up -d
# === Вариант 3: Self-hosted установка из исходников === git clone https://github.com/Mintplex-Labs/anything-llm.git cd anything-llm # Установка зависимостей сервера cd server && yarn install # Установка зависимостей фронтенда cd ../frontend && yarn install # Копирование и настройка конфигурации cp server/.env.example server/.env # Сборка фронтенда и запуск cd ../frontend && yarn build cd ../server && node index.js
AnythingLLM поддерживает десятки провайдеров LLM — от локальных моделей Ollama до OpenAI GPT-4o и Anthropic Claude. Выбор провайдера определяется вашими требованиями к конфиденциальности данных (локально — никакие данные не покидают ваш сервер), стоимости и качеству генерации. Конфигурация выполняется через веб-интерфейс в разделе Settings → LLM Preference, а настройки сохраняются в JSON-конфигурации.
Для локального запуска моделей через Ollama сначала необходимо установить сам Ollama и загрузить модель. Обратите внимание на параметр num_ctx — он определяет размер контекстного окна. Для RAG-сценариев рекомендуется значение не менее 4096 токенов, так как в промпт будут добавлены релевантные чанки документов.
# === Подключение Ollama (локальные модели) === # 1. Установите Ollama и скачайте модель ollama pull llama3.1:8b ollama pull nomic-embed-text # эмбеддинг-модель для RAG # 2. В веб-интерфейсе AnythingLLM: Settings → LLM Preference # Выберите Ollama, укажите Base URL: http://localhost:11434 # Модель: llama3.1:8b, Token Context Window: 4096 # 3. Альтернатива: настройка через .env (для self-hosted) LLM_PROVIDER=ollama OLLAMA_BASE_PATH=http://localhost:11434 OLLAMA_MODEL_PREF=llama3.1:8b OLLAMA_MODEL_TOKEN_LIMIT=4096
# === Подключение OpenAI (облачные модели) === # В веб-интерфейсе: Settings → LLM Preference → OpenAI # Либо через переменные окружения: LLM_PROVIDER=openai OPEN_AI_KEY=sk-ваш_ключ_здесь OPENAI_MODEL_PREF=gpt-4o # === Подключение Anthropic Claude === LLM_PROVIDER=anthropic ANTHROPIC_API_KEY=sk-ant-ваш_ключ_здесь ANTHROPIC_MODEL_PREF=claude-3-5-sonnet-latest # === Альтернативный OpenAI-совместимый сервер (vLLM, LM Studio) === LLM_PROVIDER=generic-openai GENERIC_OPEN_AI_BASE_PATH=http://localhost:1234/v1 GENERIC_OPEN_AI_MODEL_PREF=local-model GENERIC_OPEN_AI_KEY=not-needed
База знаний (Workspace) — центральная концепция AnythingLLM. Каждый workspace изолирован: у него свой набор документов, свой LLM-провайдер, своя эмбеддинг-модель и температура генерации. Это позволяет создавать отдельные пространства для разных проектов: например, workspace «Юридические документы» с Claude и workspace «Техническая документация» с локальной Llama.
Загрузка документов происходит через drag-and-drop в веб-интерфейсе или через API. Поддерживаются форматы: PDF, TXT, Markdown, CSV, DOCX, JSON, а также HTML-страницы по ссылке. После загрузки AnythingLLM автоматически выполняет чанкинг (разбивку на фрагменты), генерирует эмбеддинги для каждого чанка и сохраняет их в векторную базу данных. Встроенная векторная БД LanceDB не требует отдельной установки и отлично подходит для проектов любого масштаба, но для высоконагруженных систем можно подключить Pinecone, Weaviate или Chroma.
# === Загрузка документов через REST API === # Требуется API-ключ (получить в Settings → API Keys) curl -X POST http://localhost:3001/api/v1/document/upload \ -H "Authorization: Bearer YOUR_API_KEY" \ -F "file=@contract_2024.pdf" # === Добавление веб-страницы в базу знаний === curl -X POST http://localhost:3001/api/v1/document/upload-link \ -H "Authorization: Bearer YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{"link": "https://docs.example.com/api-reference.html"}' # === Получение списка загруженных документов === curl http://localhost:3001/api/v1/documents \ -H "Authorization: Bearer YOUR_API_KEY"
Для настройки векторной БД перейдите в Settings → Vector Database. По умолчанию используется LanceDB (файловая, не требует сервера), но для масштабирования можно переключиться на Pinecone или Weaviate, указав API-ключ и endpoint. Обратите внимание: при смене векторной БД все индексы потребуется перестроить заново, так как эмбеддинги хранятся локально для каждой БД.
Retrieval-Augmented Generation (RAG) — это архитектурный паттерн, объединяющий поиск релевантной информации и генерацию текста. В контексте AnythingLLM пайплайн состоит из пяти этапов, каждый из которых можно тонко настроить под свои задачи.
Этап 1 — Ингестия документов: загруженный файл проходит парсинг (извлечение текста, таблиц, кода). Для PDF используется встроенный парсер на базе pdf-parse, для DOCX — mammoth.js, для HTML — cheerio. Результат — чистый текст без форматирования.
Этап 2 — Чанкинг (разбивка на фрагменты): текст разбивается на перекрывающиеся чанки. Размер чанка по умолчанию — 1000 символов с перекрытием 200 символов. Перекрытие нужно, чтобы контекст не терялся на границах фрагментов. Для кода и технической документации имеет смысл уменьшить размер чанка до 500 символов — так повышается точность поиска по конкретным функциям или API-методам.
Этап 3 — Эмбеддинг: каждый чанк преобразуется в вектор (числовой массив размерности 768 или 1536). Для этого AnythingLLM использует выбранную эмбеддинг-модель: встроенную native (all-MiniLM-L6-v2, 384 измерения), OpenAI text-embedding-ada-002 (1536) или любую модель Ollama, например, nomic-embed-text.
Этап 4 — Поиск (Retrieval): при поступлении запроса от пользователя запрос также векторизуется той же эмбеддинг-моделью. Затем выполняется поиск по косинусному сходству между вектором запроса и векторами чанков в базе. Топ-K наиболее релевантных чанков (обычно 4–8) извлекаются и ранжируются.
Этап 5 — Генерация (Augmented Generation): извлечённые чанки добавляются в системный промпт вместе с инструкцией «Ответь на вопрос, используя ТОЛЬКО предоставленный контекст. Если в контексте нет ответа, скажи об этом». LLM получает запрос, обогащённый фактами из документов, и генерирует ответ с цитированием источников.
# === Настройка параметров RAG через веб-интерфейс === # Settings → Vector Database → Chunk Settings # Эти параметры влияют на качество поиска и скорость индексации: chunk_size: 1000 # символов на чанк (меньше = точнее поиск) chunk_overlap: 200 # перекрытие между чанками top_n: 4 # сколько чанков извлекать для ответа similarity_threshold: 0.55 # минимальный порог релевантности # === Диаграмма процесса (псевдокод) === # query = "Какие штрафы за просрочку по договору?" # query_vector = embed(query) # → [0.12, -0.34, ...] # chunks = vector_db.search(query_vector, top_n=4) # похожие чанки # context = "\n---\n".join(chunks) # собираем контекст # prompt = f"Контекст:\n{context}\n\nВопрос: {query}\nОтвет:" # answer = llm.generate(prompt) # генерируем ответ
Рассмотрим два реальных сценария использования AnythingLLM, которые демонстрируют мощь RAG-подхода в повседневной работе разработчиков, аналитиков и юристов.
Сценарий 1 — Анализ договора (PDF): вы загружаете 50-страничный договор подряда. AnythingLLM индексирует его (~120 чанков по 1000 символов с перекрытием 200). Теперь вы можете задать вопрос: «Какие штрафные санкции предусмотрены за срыв сроков?». Система найдёт раздел «Ответственность сторон», извлечёт соответствующие пункты (п. 7.3, п. 7.4), передаст их в контекст LLM и получит структурированный ответ с точными суммами неустоек и ссылками на пункты договора. Без RAG обычный ChatGPT либо «придумал» бы пункты, либо честно признался, что не знает содержания вашего документа.
Сценарий 2 — Вопросы по кодовой базе: загрузите директорию с исходным кодом (Python, TypeScript, Go — поддерживаются все текстовые форматы). Создайте workspace «Codebase Q&A» и задавайте вопросы вроде: «Где определён класс UserRepository и какие у него методы?» или «Какие middleware используются в этом проекте и в каком порядке они применяются?». AnythingLLM проиндексирует все файлы, и вы получите точный ответ с указанием файлов и строк. Это особенно полезно при онбординге новых разработчиков или работе с легаси-кодом.
# === Чат с документами через API (практический пример) === # Отправляем запрос к workspace с ранее загруженным договором curl -X POST http://localhost:3001/api/v1/workspace/my-contracts/chat \ -H "Authorization: Bearer YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "message": "Какие штрафные санкции предусмотрены за срыв сроков поставки?", "mode": "chat" }' # Пример ответа API: { "id": "chat_abc123", "type": "textResponse", "textResponse": "Согласно п. 7.3 Договора, за каждый день просрочки поставки начисляется пеня в размере 0.1% от стоимости непоставленного товара. При задержке более 30 дней (п. 7.4) покупатель вправе расторгнуть договор в одностороннем порядке...", "sources": [ {"title": "contract_2024.pdf", "chunk": "п. 7.3–7.5 Ответственность сторон"} ] }
Совет по индексации кода: для кодовых баз используйте уменьшенный размер чанка (500–600 символов) и увеличьте top_n до 6–8. Код обычно более «плотный» по смыслу, и маленькие чанки с большим перекрытием (150–200) дают лучшие результаты поиска. Также можно создать отдельные workspace для разных частей проекта: backend, frontend, документация — это улучшит качество ответов за счёт меньшего уровня шума.
AnythingLLM предоставляет полноценный REST API для автоматизации рабочих процессов. Вы можете интегрировать его с CRM-системами, чат-ботами в Telegram/Slack, CI/CD пайплайнами и внутренними инструментами компании. Каждый workspace получает уникальный slug, а все запросы аутентифицируются через API-ключи, которые генерируются в веб-интерфейсе.
Эмбеддинг-провайдер — отдельный компонент, который можно настроить независимо от LLM. Например, вы можете использовать OpenAI эмбеддинги (text-embedding-3-small) для высокого качества векторизации, а отвечать через локальную Llama 3.1 для экономии. Поддерживаются эмбеддинг-провайдеры: AnythingLLM Native (бесплатно, локально), OpenAI, Azure OpenAI, Ollama, LM Studio и любые OpenAI-совместимые серверы.
# === Создание Workspace через API === curl -X POST http://localhost:3001/api/v1/workspace/new \ -H "Authorization: Bearer YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "name": "Документация API v2", "similarityThreshold": 0.55, "openAiTemp": 0.7, "openAiHistory": 20, "chatMode": "chat" }' # === Настройка эмбеддинг-провайдера (переменные окружения) === EMBEDDING_ENGINE=openai OPEN_AI_KEY=sk-ваш_ключ EMBEDDING_MODEL_PREF=text-embedding-3-small # Альтернатива: локальные эмбеддинги через Ollama EMBEDDING_ENGINE=ollama EMBEDDING_BASE_PATH=http://localhost:11434 EMBEDDING_MODEL_PREF=nomic-embed-text
# === Python-скрипт для пакетной загрузки документов === import requests import os API_BASE = "http://localhost:3001/api/v1" API_KEY = "your-api-key-here" WORKSPACE = "my-docs" headers = {"Authorization": f"Bearer {API_KEY}"} # Загрузка всех PDF из директории for filename in os.listdir("./documents"): if filename.endswith(".pdf"): with open(f"./documents/{filename}", "rb") as f: resp = requests.post( f"{API_BASE}/document/upload", headers=headers, files={"file": (filename, f)} ) print(f"✅ {filename}: {resp.status_code}") # Отправка вопроса к workspace chat_resp = requests.post( f"{API_BASE}/workspace/{WORKSPACE}/chat", headers=headers, json={"message": "Какие ключевые метрики в отчёте?", "mode": "chat"} ) print(chat_resp.json()["textResponse"])
При внедрении AnythingLLM в корпоративную среду необходимо учитывать несколько критических аспектов: безопасность хранения документов, производительность векторного поиска на больших объёмах данных и стратегию масштабирования при росте нагрузки.
Безопасность: все документы и эмбеддинги хранятся локально. При использовании Docker убедитесь, что volumes примонтированы к защищённой файловой системе. API-ключи генерируются с правами на конкретные workspace — создавайте отдельные ключи для каждого сервиса-потребителя. Для продакшена обязательно настройте HTTPS через Nginx-прокси и ограничьте доступ по IP через файрвол.
Производительность: LanceDB отлично справляется с базами до 100 000 чанков. При большем объёме рассмотрите миграцию на Pinecone (облачный, с serverless-режимом) или Weaviate (self-hosted, с поддержкой гибридного поиска: векторного + BM25). Критически важно выбрать правильный размер чанка: для длинных аналитических документов — 1000–1500 символов, для технической документации — 500–800, для FAQ и коротких ответов — 300–400.
# === Настройка Nginx reverse proxy с SSL (production) === server { listen 443 ssl http2; server_name llm.yourcompany.com; ssl_certificate /etc/letsencrypt/live/llm/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/llm/privkey.pem; location / { proxy_pass http://127.0.0.1:3001; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; client_max_body_size 100M; # для больших PDF } }
Мониторинг и резервное копирование: регулярно делайте бэкап директории storage/ — в ней хранятся все документы, эмбеддинги, настройки workspace и история чатов. Для высоконагруженных инсталляций настройте мониторинг через health-check эндпоинт GET /api/v1/system/health и алертинг при деградации RAG-качества (например, если similarityThreshold даёт менее 2 релевантных чанков на запрос).
AnythingLLM — это зрелая и гибкая платформа для построения RAG-приложений поверх ваших документов. Менее чем за 15 минут вы получаете полноценную систему, способную отвечать на вопросы по PDF, коду, веб-страницам и любым текстовым данным — с фактической точностью, недоступной обычным чат-ботам. Docker-установка избавляет от головной боли с зависимостями, поддержка десятков LLM-провайдеров позволяет выбрать оптимальный баланс между стоимостью и качеством, а REST API и вебхуки делают интеграцию с существующими бизнес-процессами тривиальной. Ключевые факторы успешного внедрения: правильный подбор размера чанка под тип контента, выбор эмбеддинг-модели под язык документов и настройка similarity-порога для фильтрации нерелевантных результатов. Начните с Docker-образа и одного workspace — вы удивитесь, насколько быстро ваши документы «заговорят».