Локальный LLM-сервер на Windows: Интеграция llama.cpp, Open WebUI, RAG и AI-агентов


Опубликовано 18.05.2026 12:11 | Автор: Admin
Данная публикация была обновлена 21.05.2026 09:05

В данной статье рассматривается:
В этой статье мы будем делать - установим локальный сервер по работе с языковыми моделями совместимый с Open AI, на базе llama.cpp. Подключим ряд, открытых моделей LLM. Развернем Open WebUI. Настроим RAG, WEB-поиск. Настроим работу с локальной MediaWiki. Создадим базу знаний на основе своих документов. Сделаем чат-бота поддержки. Установим AI-агента Goose. Все это будет работать на Windows на CPU. Большая часть будет упакована в Docker.

Введение

Данное руководство описывает процесс развертывания полноценной локальной инфраструктуры для работы с большими языковыми моделями (LLM) на базе операционной системы Windows. В качестве вычислительного ядра используется движок llama.cpp, а в качестве интерфейса — Open WebUI.

Технологии LLM и связанного с ними ПО развиваются экстремально быстро. Приведенные ниже версии, пути и конфигурации актуальны на момент написания статьи. Возможны изменения в будущих релизах.

Зачем нам вообще все это надо. Тут каждый сам решает нужно ли ему это или нет. А так:

  • - чисто для интереса, посмотреть, что это такое и с чем это едят
  • - для обработки внутренней документации, инструкций, технической документации и получения по ним быстрых ответов
  • - написание и улучшения скриптов используемых для внутренних целей
  • - оценка безопасности, анализ логов, сетевых пакетов
  • - для работы с локальными файлами для их обработки

И многое другое

Можно со всем этим не морочиться, а использовать бесплатные сервисы с AI, такие как:

QWEN

DEEPSEEK

Модели, встроенные в поисковые системы Google и Yandex.

Это основные модели, которыми я пользуюсь, а так их большое множество.


Аппаратное обеспечение и программная среда

Для данного решения будет использоваться сервер следующей конфигурации:

  • Процессор: 2x Intel Xeon Gold 6342 @ 2.80GHz (96 потоков).
  • ОЗУ: 512 ГБ.
  • ОС: Windows Server 2022 (21H2).
  • Видеокарта: Не используется (работа исключительно на CPU).

Используемые компоненты

Компонент Версия Назначение Ссылка
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) Платформа для контейнеризации приложений. Смотреть

И прочие зависимые компоненты

Выбранные модели LLM

Все модели загружаются из Hugging Face в формате .gguf. Рекомендуется скачивать их заранее из-за большого размера.

Выбор был чисто субъективный, под свои нужны. Все модели хорошо работают с Русским языком. Разновидностей моделей на самом деле очень много, на любой вкус и цвет с разными навыками и направлением использования.

Выбирать модели надо в формате .gguf, т. к. llama.cpp работает исключительно в этом формате. Про квантование, количество параметров, размер контекста, разновидности архитектур и т.д. и как все это влияет на железо я не буду, т. к. это огромный пласт информации.

  1. Основная генеративная модель: Qwen3.6-35B-A3B-Q5_K_S.gguf
    • Архитектура: MoE (Mixture of Experts). Всего 35B параметров, но для каждого токена активируется только 3B активных весов.
    • Квантование: Q5_K_S (высокая точность при сжатии).
    • У данной модели и llama.cpp есть некие терки, но все же работает очень хорошо, выдает  ~100 токенов/сек (генерация), ~140 токенов/сек (контекст). При этом довольно качественные ответы по сравнению с полноценными моделями и в разы лучше, чем модели на меньшее количество параметров. Какая-нибудь модель на 14B будет работать в два раза медленнее и давать менее качественный ответ. Рекомендуется модель от unsloth, с исправлениями косяков, актуально по работе с AI-агентами.   

  2. Модель эмбеддингов: Qwen3-Embedding-4B-Q5_K_M.gguf
    • Назначение: Векторизация текста для RAG-систем (поиск по базе знаний).

  3. Модель реранкинга: Qwen3-Reranker-4B-Q4_K_M.gguf
    • Назначение: Cross-Encoder для переранжирования результатов поиска (повышение релевантности NDCG).

  4. Быстрая вспомогательная модель: Qwen3.5-2B-Q8_0.gguf
    • Назначение: Простые задачи, требующие минимальной задержки.

Примечание: Модели Qwen поддерживают режим "мышления" (reasoning). Он улучшает качество сложных ответов, но требует значительно больше токенов и времени. Для сервера на CPU это ресурсоемкая функция, поэтому в настройках ниже она будет отключена или ограничена. Модели с префиксом instruct не имеют такого режима и обучены выполнять указания без раздумья

p.s. т. к. памяти на сервере у меня много, я пробовал модели до 235B, но все же такие модели не для процессора.


Развертывание ядра llama.cpp

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:\LLM
  • Исполняемые файлы llama.cpp: d:\LLM\llama\
  • Папка для моделей: d:\LLM\models\

Настройка конфигурации моделей (start-all.ini)

Файл .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-модель

Скрипт запуска (start-all.bat)

Создайте 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 (контекст) - лучшие значения по результатам тестов.

Существующая проблема:

  1. Модель загружает только один NUMA-узел. Выход за его пределы бесполезен из-за узкого места в работе с памятью.
  2. На Windows не работает распределение по NUMA (--numa distribute), плюс ограничение в 65 ядер. Раскидать модель по ядрам сервера не получится ни через настройки llama.cpp, ни через внешние инструменты.

Решение:

Для использования всех ядер сервера необходимо перейти на Linux или WSL2.

Также мы отключили --no-webui, веб-интерфейс встроенный в llama-server, но убрав этот параметр вы уже сейчас можете протестировать свои модели.

Интеграция с Open WebUI и Docker

Open WebUI предоставляет удобный веб-интерфейс для управления моделями, файлами и диалогами.

Установка Docker Desktop

Установите Docker Desktop для Windows. Это необходимо для работы с compose-файлами и изолированными контейнерами.

Конфигурация Open WebUI

Создайте папку 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.

  • Apache Tika — это Java‑библиотека для автоматического обнаружения и извлечения текста и метаданных из огромного количества форматов файлов.
  • SearXNG — это метапоисковая система с открытым исходным кодом, ориентированная на конфиденциальность.

  • Если мы не будем работать с документами RAG, а только чат, убираем из файла Tika и SearXNG
  • Если мы не планируем искать что-то в интернете с помощью LLM, то убираем SearXNG

Запускаем в каталоге d:\LLM\ командную строку и выполняем

docker-compose up -d 

Начнется скачивание необходимых образов и развёртывание Open WebUI

За работой докеров и из состояния, логов и т.д. можно наблюдать из графического интерфейса.

Как только все установится и запуститься мы можем зайти на веб-интерфейс по адресу

http://ip_computer:8081/

Сервер llama-server должен быть уже настроен и запущен.

WebUI русифицирован, но не полностью. Вы можете выбрать в настройках язык.

Настройка подключения моделей в Open WebUI
  1. Перейдите в Admin Panel (Панель администратора) ->  Settings  (Настройки) ->  Connections (Подключения)
  2. Добавьте источник OpenAI:
    • URL: http://host.docker.internal:8080/v1
    • Bearer API Key: YOUR_SECRET_API_TOKEN
  3. Жмем Сохранить. Модели из start-all.ini должны появиться в списке доступных. Их можно будет увидеть в разделе Модели

YOUR_SECRET_API_TOKEN - из настроек start-all.bat

Если мы будем использовать wiki-rag, то сразу пропишем ссылку и на него

  1. URL: http://host.docker.internal:8082/v1
  2. Bearer API Key: Токен из .env

Подключение локальной LLM к WebUI



Настройка RAG в Open WebUI

RAG (Retrieval‑Augmented Generation, генерация с дополненной выборкой) - подход, который улучшает работу LLM за счёт подключения внешних источников данных в момент генерации ответа.

RAG нам позволит получать ответы на вопросы на основе наших документов.

При разворачивании Open WebUI мы также развернули Apache Tika, нужные нам для обработки документов перед тем, как они попадут в модель. Также у нас уже должны быть запущены дополнительные модели на llama: 

  • Qwen3-Embedding-4B
  • Qwen3-Reranker-4B
  • Qwen3.5-2B

Настройка движков обработки

  1. В Open WebUI перейдите в Admin Panel (Панель администратора) -> Settings (Настройки) -> Documents (Документы).
  2. Механизм извлечения контента: http://tika:9998
  3. Движок модели встраивания: http://host.docker.internal:8080/v1 (Token: YOUR_SECRET_API_TOKEN)
  4. Модель встраивания: Qwen3-Embedding-4B
  5. Движок реранжирования: http://host.docker.internal:8080/v1/rerank (Token: YOUR_SECRET_API_TOKEN)
  6. Модель реранжирования: Qwen3-Reranker-4B
Настройка параметров поиска (Advanced)
  • Top K (Vector Search): 20-50 (Первичный поиск: сколько всего фрагментов достать из базы данных).
  • Top K (Reranker): 3-10 (сколько лучших фрагментов передать модели).

Настройка RAG в Open WebUI

Теперь в чате мы можем добавить своей документ и задавать вопросы ИИ по нем. При первом добавлении будет идти долгая обработка, но потом этот документ уже будет у вас в базе и его не надо добавлять вновь. Жмем + и там выбираем Attach Files.

Создание базы знаний

  1. В Open WebUI в меню пользователя выбираем Рабочее пространство -> Знания
  2. Нажмите Новое знание
  3. Заполняем поля и выбираем видимость данных знаний
  4. Далее просто жмем + в верхнем правом углу и подгружаем файл или каталог.
  5. Как только вы добавили документ, начнётся долгая его обработка. Чем больше документ и их количество, тем дольше придется ждать.
  6. Когда все документы обработаются (а это не факт), в своем чате вы можете подгружать эти знания набрав решётку # и выбрать знание.
  7. Используя активную модель, вы можете задавать вопросы по данной базе знаний.

Все это, конечно, хорошо, но мы пойдем дальше и создадим чат-бота, который будет оперировать этими знаниями и отвечать пользователям.

Создание чат-бота по работе с базой знаний

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

  1. В Open WebUI в меню пользователя выбираем Рабочее пространство -> Модели
  2. Жмем Новая модель
  3. Вносим название, ID и т.д.
  4. В разделе Знания выбираем ранее созданные знания

В системный промт пишем примерно следующее:

# Роль
Вы — ИТ-помощник. Ваша специализация — техническая поддержка пользователей.

# Язык
Вы общаетесь ТОЛЬКО на русском языке.

# Источник знаний
Вы обязаны отвечать исключительно на основе предоставленной базы знаний (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

Данная настройка позволит нам задавать вопросы по нашей MediaWiki. 

WIKI-RAG — работает как самостоятельная модель, т. е. надо будет подключить как еще один источник API OpenAI, но если мы делали по пунктам, то она у нас уже подключена.

Ниже представлены файлы конфигурации с уже прописанными настройками под раннее сделанное окружение.

Развертывание Wiki-RAG

Создайте папку 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