Данное руководство описывает процесс развертывания полноценной локальной инфраструктуры для работы с большими языковыми моделями (LLM) на базе операционной системы Windows. В качестве вычислительного ядра используется движок llama.cpp, а в качестве интерфейса — Open WebUI.
Зачем нам вообще все это надо. Тут каждый сам решает нужно ли ему это или нет. А так:
И многое другое
Можно со всем этим не морочиться, а использовать бесплатные сервисы с AI, такие как:
Модели, встроенные в поисковые системы Google и Yandex.
Это основные модели, которыми я пользуюсь, а так их большое множество.
Для данного решения будет использоваться сервер следующей конфигурации:
| Компонент | Версия | Назначение | Ссылка |
|---|---|---|---|
| llama.cpp | v9128 | Ядро для инференса LLM в формате GGUF. | Смотреть |
| Open WebUI | v0.9.2 | Веб-интерфейс с поддержкой Ollama/OpenAI API. | Смотреть |
| Wiki-RAG | v0.15.0 | Система RAG для работы с MediaWiki API. | Смотреть |
| Goose Agent | v1.34.0 | AI-агент для выполнения задач в ОС. | Смотреть |
| SearXNG | (latest) | Метапоисковик для веб-поиска без слежки. | Смотреть |
| Apache Tika | (latest) | Извлечение текста из файловых форматов. | |
| Milvus | (latest) | Векторная база данных для RAG. | |
| Docker | (latest) | Платформа для контейнеризации приложений. | Смотреть |
И прочие зависимые компоненты
Все модели загружаются из Hugging Face в формате .gguf. Рекомендуется скачивать их заранее из-за большого размера.
Выбор был чисто субъективный, под свои нужны. Все модели хорошо работают с Русским языком. Разновидностей моделей на самом деле очень много, на любой вкус и цвет с разными навыками и направлением использования.
Выбирать модели надо в формате .gguf, т. к. llama.cpp работает исключительно в этом формате. Про квантование, количество параметров, размер контекста, разновидности архитектур и т.д. и как все это влияет на железо я не буду, т. к. это огромный пласт информации.
Qwen3.6-35B-A3B-Q5_K_S.gguf
Qwen3-Embedding-4B-Q5_K_M.gguf
Qwen3-Reranker-4B-Q4_K_M.gguf
Qwen3.5-2B-Q8_0.gguf
Примечание: Модели Qwen поддерживают режим "мышления" (reasoning). Он улучшает качество сложных ответов, но требует значительно больше токенов и времени. Для сервера на CPU это ресурсоемкая функция, поэтому в настройках ниже она будет отключена или ограничена. Модели с префиксом instruct не имеют такого режима и обучены выполнять указания без раздумья.
p.s. т. к. памяти на сервере у меня много, я пробовал модели до 235B, но все же такие модели не для процессора.
Llama.cpp — это легковесный, высокопроизводительный open-source движок для локального запуска больших языковых моделей (LLM) на обычном пользовательском железе. Многие другие проекты имеет под капотом этот движок, такие как Ollama, LM Studio и т.д.
Если у вас есть видеокарты NVIDIA, то тут могу посоветовать ExLlamaV3, обещают лучшую производительность, чем у других подобных движков.
Llama.cpp – также работает с видеокартами, вам просто надо дополнительно скачать библиотеки CUDA с страницы проекта. Настройки запуска там будут другие, т. к. мы используем GPU. При этом Llama.cpp может работать в гибридном режиме, что-то помещая в память GPU, что-то на CPU. В зависимости от размещения модели у нас будет разная производительность. Llama.cpp нормально работает с разными сериями GPU, т. е. можно поставить 10 серию и 30 серию вместе и все они будут работать совместно. Про AMD не скажу, с ними дело не имел. Под Windows обязательно задайте файл подкачки в размер всей ОЗУ видеокарт иначе модели не будут помещаться в память GPU.
Скачайте последнюю сборку llama.cpp для Windows (x86_64) с официального репозитория.
d:\LLMd:\LLM\llama\d:\LLM\models\Файл .ini управляет загрузкой моделей и их параметрами. Создайте файл start-all.ini в папке с исполняемыми файлами
[*]
metrics = true
batch-size = 15000
ubatch-size = 15000
# Основная модель
[Qwen_Qwen3.6-35B-A3B]
model = d:\LLM\models\Qwen_Qwen3.6-35B-A3B-Q5_K_S.gguf
ctx-size = 500000
load-on-startup = true
# Отключаем режим мышления для скорости
chat-template-kwargs = {"enable_thinking": false}
# Вспомогательная быстрая модель
[Qwen3.5-2B]
model = d:\LLM\models\Qwen3.5-2B-Q8_0.gguf
ctx-size = 327000
top-p = 1.0
top-k = 20
min-p = 0.0
temp = 0.5
repeat-penalty = 1.0
presence-penalty = 2.0
load-on-startup = true
chat-template-kwargs = {"enable_thinking": false}
# Модель для эмбеддингов (RAG)
[Qwen3-Embedding-4B]
model = d:\LLM\models\Qwen3-Embedding-4B-Q5_K_M.gguf
embedding = true
pooling = mean
ctx-size = 327000
load-on-startup = true
chat-template-kwargs = {"enable_thinking": false}
# Модель для реранкинга (RAG)
[Qwen3-Reranker-4B]
model = d:\LLM\models\Qwen3-Reranker-4B-Q4_K_M.gguf
reranking = true
pooling = rank
embedding = true
ctx-size = 163000
load-on-startup = true
# chat-template-kwargs отключен, так как это не chat-модельСоздайте batch-файл для запуска сервера.
d:\LLM\llama\llama-server ^
-t 48 ^
-tb 70 ^
--api-key YOUR_SECRET_API_TOKEN ^
--no-webui ^
--numa distribute ^
--cache-ram 16384 ^
--host 0.0.0.0 ^
--timeout 7200 ^
--parallel 5 ^
--flash-attn on ^
--cont-batching ^
--context-shift ^
--reasoning-budget 100 ^
--verbose ^
--models-preset start-all.iniКлючевые параметры:
chat-template-kwargs = {"enable_thinking":false} - почти у всех моделей мы отключаем режим мышления, т. к. он занимает львиную долю генерации.
batch-size и ubatch-size – задан довольно большой, такой он нам нужен чтобы нормально работать с тем же wiki-rag.
ctx-size – также заданы большие, т. к. для обработки информации из википедии или файлов надо иметь большой контекст. При этом, указанный контекст надо делить на количество --parallel 5 запросов.
Тюнинг параметров:
Используются -t 48 (генерация) и -tb 70 (контекст) - лучшие значения по результатам тестов.
Существующая проблема:
--numa distribute), плюс ограничение в 65 ядер. Раскидать модель по ядрам сервера не получится ни через настройки llama.cpp, ни через внешние инструменты.Решение:
Для использования всех ядер сервера необходимо перейти на Linux или WSL2.
Также мы отключили --no-webui, веб-интерфейс встроенный в llama-server, но убрав этот параметр вы уже сейчас можете протестировать свои модели.
Open WebUI предоставляет удобный веб-интерфейс для управления моделями, файлами и диалогами.
Установите Docker Desktop для Windows. Это необходимо для работы с compose-файлами и изолированными контейнерами.
Создайте папку d:\LLM\openwebui\ и файл docker-compose.yml.
services:
open-webui:
image: ghcr.io/open-webui/open-webui:latest
container_name: open-webui
restart: unless-stopped
# Порт наружу только для open-webui
ports:
- "8081:8080"
volumes:
- d:/LLM/openwebui/volume:/app/backend/data
environment:
- RAG_SYSTEM_CONTEXT=True
- ENABLE_QUERIES_CACHE=True
- ENABLE_REALTIME_CHAT_SAVE=False
- USER_AGENT=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36
- TIKI_URI=http://tika:9998
- SEARXNG_BASE_URL=http://searxng:8080
networks:
- webui-net
tika:
image: apache/tika:latest-full
container_name: tika
restart: unless-stopped
# Убраны порты наружу. Доступен только внутри сети webui-net
# ports:
# - 9998:9998
networks:
- webui-net
searxng:
image: ghcr.io/searxng/searxng:latest
container_name: searxng
# Убраны порты наружу. Доступен только внутри сети webui-net
# ports:
# - "8888:8080"
volumes:
- d:/LLM/searxng/volume/config:/etc/searxng:rw
- d:/LLM/searxng/volume/usr/settings.yml:/usr/local/searxng/searx/settings.yml:rw
- d:/LLM/searxng/volume/data:/var/cache/searxng:rw
environment:
- SEARXNG_SETTINGS=/etc/searxng/settings.yml
env_file:
- .env
restart: unless-stopped
cap_drop:
- ALL
cap_add:
- CHOWN
- SETGID
- SETUID
- DAC_OVERRIDE
logging:
driver: "json-file"
options:
max-size: "1m"
max-file: "1"
networks:
- webui-net
networks:
webui-net:
driver: bridgeВ файле docker-compose.yml прописаны и дополнительные сервисы такие как Tika и SearXNG.
Запускаем в каталоге d:\LLM\ командную строку и выполняем
docker-compose up -d Начнется скачивание необходимых образов и развёртывание Open WebUI
За работой докеров и из состояния, логов и т.д. можно наблюдать из графического интерфейса.
Как только все установится и запуститься мы можем зайти на веб-интерфейс по адресу
http://ip_computer:8081/
Сервер llama-server должен быть уже настроен и запущен.
WebUI русифицирован, но не полностью. Вы можете выбрать в настройках язык.
http://host.docker.internal:8080/v1YOUR_SECRET_API_TOKENstart-all.ini должны появиться в списке доступных. Их можно будет увидеть в разделе МоделиYOUR_SECRET_API_TOKEN - из настроек start-all.bat
Если мы будем использовать wiki-rag, то сразу пропишем ссылку и на него
http://host.docker.internal:8082/v1Токен из .envRAG (Retrieval‑Augmented Generation, генерация с дополненной выборкой) - подход, который улучшает работу LLM за счёт подключения внешних источников данных в момент генерации ответа.
RAG нам позволит получать ответы на вопросы на основе наших документов.
При разворачивании Open WebUI мы также развернули Apache Tika, нужные нам для обработки документов перед тем, как они попадут в модель. Также у нас уже должны быть запущены дополнительные модели на llama:
http://tika:9998http://host.docker.internal:8080/v1 (Token: YOUR_SECRET_API_TOKEN)Qwen3-Embedding-4Bhttp://host.docker.internal:8080/v1/rerank (Token: YOUR_SECRET_API_TOKEN)Qwen3-Reranker-4B20-50 (Первичный поиск: сколько всего фрагментов достать из базы данных).3-10 (сколько лучших фрагментов передать модели).Теперь в чате мы можем добавить своей документ и задавать вопросы ИИ по нем. При первом добавлении будет идти долгая обработка, но потом этот документ уже будет у вас в базе и его не надо добавлять вновь. Жмем + и там выбираем Attach Files.
Все это, конечно, хорошо, но мы пойдем дальше и создадим чат-бота, который будет оперировать этими знаниями и отвечать пользователям.
Данный чат-бот будет искать информацию в базе знаний и отвечать пользователям по ней. При этом мы заранее выберем, какая модель будет обслуживать эту базу и как вести себя с пользователями, отвечая на их вопросы. Чат-бот должен будет не уходить от темы разговора, не выдумывать того, чего нет, и т.д.
В системный промт пишем примерно следующее:
# Роль
Вы — ИТ-помощник. Ваша специализация — техническая поддержка пользователей.
# Язык
Вы общаетесь ТОЛЬКО на русском языке.
# Источник знаний
Вы обязаны отвечать исключительно на основе предоставленной базы знаний (RAG).
Ключевые темы, освещенные в базе:
- Система РТУ МОА
- МикроРТУ (программная абонентская станция IP-АТС)
- Сопутствующие технологии и инструменты: Dionis, tcpdump, SIP, а также любые другие материалы, доступные в контексте RAG.
# Правила поведения
1. **Строго следуйте контексту:** Если ответ на вопрос пользователя содержится в базе знаний, предоставьте его.
2. **Отсутствие информации:** Если в базе знаний нет достаточной информации для ответа или вопрос выходит за рамки ИТ-поддержки (например, общие вопросы, творческие задания, дискуссии не по теме), вы ОБЯЗАНЫ вежливо отказаться от ответа.
3. **Формат отказа:** В случае отсутствия информации или нерелевантного вопроса используйте точную формулировку:
"Я не могу ответить на этот вопрос, так как в базе знаний отсутствует соответствующая информация. Для получения дополнительной информации обратитесь к документации."
4. **Стиль ответа:**
- Избегайте вступлений и лишних слов.
- Если вопрос предполагает решение проблемы, предоставляйте короткие, четкие пошаговые инструкции.
- Не используйте маркеры списка, если шаги можно описать коротким абзацем, но для сложных инструкций используйте нумерованные списки.
5. **Запреты:**
- Не придумывайте факты.
- Не отклоняйтесь от роли ИТ-поддержки.
- Не пишите сочинения, эссе или участвуйте в философских дискуссиях.
# Формат вывода
1. Основной ответ (пошаговая инструкция или объяснение).
2. В конце сообщения, на новой строке, выведите список использованных документов в формате:
**Использованные источники:**
- [Название документа из RAG] — [Номер пункта/раздела из документа]
*Важно:* Имена документов должны совпадать с именами в RAG точно-точь. Номер пункта указывайте только если он явно указан в тексте ответа как источник конкретного шага.
# Пример поведения
Пользователь: "Как перезагрузить службу Dionis?"
Вы:
1. Откройте меню «Пуск».
2. Выберите «Выполнить».
3. Введите `services.msc` и нажмите Enter.
4. Найдите в списке службу «Dionis».
5. Нажмите правой кнопкой мыши и выберите «Перезапустить».
**Использованные источники:**
- Руководство пользователя Dionis — п. 4.2
Пользователь: "Напиши стихотворение про налоги"
Вы:
Я не могу ответить на этот вопрос, так как в базе знаний отсутствует соответствующая информация. Для получения дополнительной информации обратитесь к документации.Жмем сохранить. Не забываем выдать разрешения в Доступ, чтоб модель была видна всем.
Теперь можно протестировать, выбрав в новом чате эту модель.
Данная настройка позволит нам задавать вопросы по нашей MediaWiki.
WIKI-RAG — работает как самостоятельная модель, т. е. надо будет подключить как еще один источник API OpenAI, но если мы делали по пунктам, то она у нас уже подключена.
Ниже представлены файлы конфигурации с уже прописанными настройками под раннее сделанное окружение.
Создайте папку d:\LLM\Wiki-RAG\ и добавьте файлы:
docker-compose.yml
services:
# Include the contents of milvus-standalone.yml
etcd:
extends:
file: ./milvus-standalone.yml
service: etcd
minio:
extends:
file: ./milvus-standalone.yml
service: minio
standalone:
extends:
file: ./milvus-standalone.yml
service: standalone
# Define the wiki-rag service
wiki-rag:
image: ghcr.io/moodlehq/wiki-rag:latest
container_name: wiki-rag
volumes:
- ./config.yml:/app/config.yml:ro
- ./app/data:/app/data
- ./app/wiki_rag:/app/wiki_rag
- ./.env:/app/.env
environment:
MILVUS_URL: http://milvus-standalone:19530
OPENAI_API_KEY: #Ключ который прописан в llama-server
LOG_LEVEL: info
ports:
- "8082:8080"
depends_on:
- standalone
milvus-standalone.yml
version: '3.5'
services:
etcd:
container_name: milvus-etcd
image: quay.io/coreos/etcd:v3.5.18
environment:
- ETCD_AUTO_COMPACTION_MODE=revision
- ETCD_AUTO_COMPACTION_RETENTION=1000
- ETCD_QUOTA_BACKEND_BYTES=4294967296
- ETCD_SNAPSHOT_COUNT=50000
volumes:
- ${DOCKER_VOLUME_DIRECTORY:-.}/volumes/etcd:/etcd
command: etcd -advertise-client-urls=http://etcd:2379 -listen-client-urls http://0.0.0.0:2379 --data-dir /etcd
healthcheck:
test: ["CMD", "etcdctl", "end