Универсальный чат-бот не знает ваших продуктов, цен, регламентов и внутренних документов, а загружать их в публичный ИИ-сервис часто недопустимо. При генерации с дополненной выборкой (retrieval-augmented generation, RAG) ассистент сначала ищет информацию в ваших собственных документах и отвечает на основе найденного, со ссылками на источники. В этой статье мы развернём AnythingLLM с локальной моделью, которую обслуживает Ollama на вашем сервере: установка, подключение языковой модели и модели эмбеддингов, загрузка документов в рабочие пространства, настройка ответов строго по документам, добавление пользователей и публикация по HTTPS. О планировании более крупного развёртывания (регион, векторная база данных, защита данных) см. приватная база знаний поддержки на ИИ на выделенном сервере.
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; ответы генерирует чат-модель.
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.
Направьте поддомен, например 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;
}
}
Откройте https://kb.example.com и пройдите первоначальную настройку (позже всё это можно изменить в разделе настроек Settings):
http://host.docker.internal:11434, чат-модель qwen2.5:7b.nomic-embed-text (или встроенный эмбеддер AnythingLLM).Прежде чем что-либо загружать, включите многопользовательский режим в настройках безопасности и задайте пароль администратора. Затем создайте учётную запись для каждого коллеги с ролью Default (обычный пользователь): такие пользователи могут общаться с выданными им рабочими пространствами, но не могут менять настройки и не видят другие пространства.
Рабочее пространство (workspace) — это отдельная база знаний со своими документами и настройками, например «Каталог продукции», «Регламенты поддержки» или «Кадровые политики».
Лучшие результаты дают аккуратные текстовые документы. Сканированные PDF сначала нужно распознать (OCR); в длинных документах с понятными заголовками искать проще, чем в одном огромном файле обо всём сразу.
В настройках рабочего пространства:
В каждом ответе есть ссылки на источники: нажмите на них, чтобы увидеть, какой фрагмент документа был использован.
Когда документ меняется, удалите старую версию из рабочего пространства и загрузите новую, чтобы ассистент не цитировал устаревшие цены или регламенты. Регулярно делайте резервную копию /opt/anythingllm: там хранятся документы, векторы, пользователи и история чатов. AnythingLLM также предоставляет API и встраиваемый чат-виджет, если позже вы захотите использовать рабочее пространство на своём сайте или в своих приложениях.
Переключите рабочее пространство в режим Query, ужесточите системный промпт и проверьте ссылки на источники. Если нужный фрагмент так и не находится, разбейте документ на файлы поменьше с понятными названиями или попробуйте более крупную чат-модель.
Основное время уходит на генерацию текста чат-моделью на CPU. Для быстрых справок используйте модель поменьше, уменьшите число фрагментов на ответ и держите модель загруженной (см. советы по производительности в руководстве по Ollama).
Да, AnythingLLM поддерживает множество поставщиков. Учтите, что в этом случае ваши документы и вопросы передаются поставщику, и используйте только тех поставщиков и те регионы, которые допускаются их условиями. Для конфиденциальных материалов локальная схема из этой статьи хранит всё на вашем сервере.
Если проблема не решена, создайте тикет — техническая поддержка IMIDC работает 24/7. Укажите IP сервера, версию ОС, CPU и объём RAM, вывод docker logs anythingllm и полный текст ошибки, чтобы мы быстрее нашли причину.