Linux-сервер

AnythingLLM и Ollama: приватная база знаний RAG и чат-бот по документам на своём сервере

8 шагов 17 мин чтения 32 просмотров 0
Содержание

Универсальный чат-бот не знает ваших продуктов, цен, регламентов и внутренних документов, а загружать их в публичный ИИ-сервис часто недопустимо. При генерации с дополненной выборкой (retrieval-augmented generation, RAG) ассистент сначала ищет информацию в ваших собственных документах и отвечает на основе найденного, со ссылками на источники. В этой статье мы развернём AnythingLLM с локальной моделью, которую обслуживает Ollama на вашем сервере: установка, подключение языковой модели и модели эмбеддингов, загрузка документов в рабочие пространства, настройка ответов строго по документам, добавление пользователей и публикация по HTTPS. О планировании более крупного развёртывания (регион, векторная база данных, защита данных) см. приватная база знаний поддержки на ИИ на выделенном сервере.

Эта статья опирается на руководство запуск локальной LLM с Ollama. Сначала выполните его, включая правила файрвола: API Ollama не имеет аутентификации, и порт 11434 ни в коем случае не должен быть доступен из интернета.

Шаг 1: Подготовка моделей

RAG использует две модели: модель эмбеддингов, которая превращает фрагменты документов и вопросы в векторы для поиска, и чат-модель, которая формулирует ответ. Обе работают в Ollama.

ollama pull nomic-embed-text      # embedding model (small and fast on CPU)
ollama pull qwen2.5:7b            # chat model; good with Chinese and English
ollama list

# AnythingLLM runs in a container, so Ollama must accept connections from Docker
# (OLLAMA_HOST=0.0.0.0 plus the firewall rules from the Ollama guide). Check:
curl -s http://172.17.0.1:11434/api/tags | head -c 300; echo

Сервер с 8 и более ядрами и 16 ГБ RAM без труда справляется с такой связкой для небольшой команды. При загрузке большого количества файлов построение эмбеддингов какое-то время нагружает CPU; ответы генерирует чат-модель.

Шаг 2: Запуск AnythingLLM

AnythingLLM работает в Docker (см. наше руководство по установке Docker).

export STORAGE_LOCATION=/opt/anythingllm
mkdir -p $STORAGE_LOCATION && touch "$STORAGE_LOCATION/.env"
chown -R 1000:1000 $STORAGE_LOCATION      # the container runs as user ID 1000

docker run -d --name anythingllm --restart always \
  -p 127.0.0.1:3002: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" \
  mintplexlabs/anythingllm

docker logs -f anythingllm      # wait until the server reports it is listening

Веб-интерфейс слушает порт 3001 внутри контейнера; на хосте он проброшен на 127.0.0.1:3002, поэтому доступен только через HTTPS-прокси из шага 3.

Шаг 3: Публикация по HTTPS

Направьте поддомен, например kb.example.com, на сервер, получите сертификат (см. бесплатный SSL с Certbot или acme.sh) и настройте проксирование на контейнер:

server {
    listen 443 ssl;
    http2 on;
    server_name kb.example.com;

    ssl_certificate     /etc/letsencrypt/live/kb.example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/kb.example.com/privkey.pem;
    client_max_body_size 100m;          # document uploads

    location / {
        proxy_pass         http://127.0.0.1:3002;
        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-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header   X-Forwarded-Proto $scheme;
        proxy_read_timeout 600s;
    }
}

Шаг 4: Подключение моделей

Откройте https://kb.example.com и пройдите первоначальную настройку (позже всё это можно изменить в разделе настроек Settings):

  • Поставщик LLM (LLM provider): Ollama, базовый URL http://host.docker.internal:11434, чат-модель qwen2.5:7b.
  • Поставщик эмбеддингов (Embedding provider): Ollama с nomic-embed-text (или встроенный эмбеддер AnythingLLM).
  • Векторная база данных (Vector database): встроенная LanceDB, дополнительная настройка не нужна.

Шаг 5: Пользователи и разграничение доступа

Прежде чем что-либо загружать, включите многопользовательский режим в настройках безопасности и задайте пароль администратора. Затем создайте учётную запись для каждого коллеги с ролью Default (обычный пользователь): такие пользователи могут общаться с выданными им рабочими пространствами, но не могут менять настройки и не видят другие пространства.

Шаг 6: Создание рабочих пространств и загрузка документов

Рабочее пространство (workspace) — это отдельная база знаний со своими документами и настройками, например «Каталог продукции», «Регламенты поддержки» или «Кадровые политики».

  1. Создайте рабочее пространство и откройте его окно загрузки.
  2. Загрузите файлы PDF, Word, текстовые файлы, Markdown или CSV либо получите веб-страницу по URL.
  3. Переместите загруженные файлы в рабочее пространство и нажмите Save and Embed (сохранить и построить эмбеддинги). AnythingLLM разобьёт их на фрагменты и сохранит векторы.

Лучшие результаты дают аккуратные текстовые документы. Сканированные PDF сначала нужно распознать (OCR); в длинных документах с понятными заголовками искать проще, чем в одном огромном файле обо всём сразу.

Шаг 7: Ответы только по вашим документам

В настройках рабочего пространства:

  • Установите режим чата Query: ассистент отвечает, только если находит релевантные фрагменты, а иначе сообщает, что информации нет, вместо того чтобы додумывать.
  • Напишите системный промпт, например: «Ты — внутренний ассистент компании ACME. Отвечай только на основе предоставленных документов, указывай источник и отвечай на языке вопроса».
  • Настройте количество фрагментов, используемых для одного ответа, и порог сходства, если в ответах не хватает нужных фактов или попадаются посторонние.

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

Шаг 8: Сопровождение базы знаний

Когда документ меняется, удалите старую версию из рабочего пространства и загрузите новую, чтобы ассистент не цитировал устаревшие цены или регламенты. Регулярно делайте резервную копию /opt/anythingllm: там хранятся документы, векторы, пользователи и история чатов. AnythingLLM также предоставляет API и встраиваемый чат-виджет, если позже вы захотите использовать рабочее пространство на своём сайте или в своих приложениях.

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

Ассистент даёт ответы, которых нет в моих документах

Переключите рабочее пространство в режим Query, ужесточите системный промпт и проверьте ссылки на источники. Если нужный фрагмент так и не находится, разбейте документ на файлы поменьше с понятными названиями или попробуйте более крупную чат-модель.

Ответы приходят медленно

Основное время уходит на генерацию текста чат-моделью на CPU. Для быстрых справок используйте модель поменьше, уменьшите число фрагментов на ответ и держите модель загруженной (см. советы по производительности в руководстве по Ollama).

Можно ли вместо Ollama использовать облачный ИИ-API?

Да, AnythingLLM поддерживает множество поставщиков. Учтите, что в этом случае ваши документы и вопросы передаются поставщику, и используйте только тех поставщиков и те регионы, которые допускаются их условиями. Для конфиденциальных материалов локальная схема из этой статьи хранит всё на вашем сервере.

Если проблема не решена, создайте тикет — техническая поддержка IMIDC работает 24/7. Укажите IP сервера, версию ОС, CPU и объём RAM, вывод docker logs anythingllm и полный текст ошибки, чтобы мы быстрее нашли причину.

Помог ли вам данный ответ?

Похожие руководства