📚

AnythingLLM: установка, настройка и работа с документами

Полный гайд по AnythingLLM — платформе для создания RAG-приложений с документами. Установка через Docker, подключение локальных и облачных LLM, загрузка PDF/кода, API-интеграции и лучшие практики.

RAG ⏱ 15 мин

🏗️ Архитектура AnythingLLM: RAG-пайплайн

📄 Документы PDF, TXT, MD, код, CSV 🔪 Чанкинг Разбивка на чанки 🧮 Эмбеддинги Текст → вектор (768/1536d) 🗄️ Векторная БД LanceDB / Pinecone Weaviate / Chroma Хранение векторов 🔍 Семантический поиск Запрос → эмбеддинг → top-K чанков Косинусное сходство 🧠 LLM Ollama / OpenAI Claude / LM Studio Контекст + промпт → Ответ 💬 Запрос пользователя

# 1. Что такое AnythingLLM и зачем он нужен

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-образ для самостоятельного хостинга и облачная версия от разработчиков.

# 2. Установка AnythingLLM: Docker, Desktop и Self-hosted

Самый гибкий и рекомендуемый способ установки 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
  

# 3. Подключение локальных и облачных LLM

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
  

# 4. Загрузка документов и создание Knowledge Base

База знаний (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. Обратите внимание: при смене векторной БД все индексы потребуется перестроить заново, так как эмбеддинги хранятся локально для каждой БД.

# 5. RAG-пайплайн: как он работает под капотом

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)              # генерируем ответ
  

# 6. Практические примеры: чат с PDF и код-документацией

Рассмотрим два реальных сценария использования 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, документация — это улучшит качество ответов за счёт меньшего уровня шума.

# 7. Интеграции: API, вебхуки и эмбеддинги

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"])
  

# 8. Лучшие практики: безопасность, производительность и масштабирование

При внедрении 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 — вы удивитесь, насколько быстро ваши документы «заговорят».

⭐ GitHub (30k+ звёзд) 📖 Официальная документация