Когда я решил использовать веб-поиск в OpenWebUI результат оказался бесполезным. Гайд по настройке, чтобы получать хоть сколько-то приемлемый результат найти не удалось ни на русском, ни на английском. Поэтому решил собрать всё что удалось найти в этой статье.
Очевидно, что это не сравнится с проприетарными и платными сервисами. Но могут быть разные причины для использования локальных моделей: запрет или нежелание передавать данные третьим лицам, невозможность оплатить сервисы, желание использовать Unrestricted/Derestricted/Oblitirated модели.
Настройка для видеокарты NVIDIA 3090 24GB и 32GB RAM на Windows 10 (22H2).
Установка и запуск llama.cpp
Обновляем драйвера для видеокарты.
Качаем llama.cpp для Windows x64 (CUDA 13) и CUDA 13.1 DLLS. Распаковать в одну папку. В моём случае это “G:\llama-b8477-bin-win-cuda-13.1-x64”. Так же у llama.cpp есть Docker образы. (Чтобы при каждом обновлении не класть DLL можно скачать и установить Nvidia CUDA Toolkit 13.1)
Качаем модели в gguf формате в одну папку. В моём случае это “G:\llm”.
Главная модель, которая собственно будет давать ответы Qwen3.5-27B-UD-Q4_K_XL. Так же скачайте mmproj-BF16.gguf оттуда же из “Files and versions” и переименуйте в “Qwen3.5-27B-UD-Q4_K_XL-mmproj-BF16.gguf” - благодаря этой штуке модель может распознавать картинки.
Для для эмбеддинга при веб поиске Qwen3-Embedding-4B-f16.
Для сортировки результатов веб поиска Qwen3-Reranker-4B-f16.
Модель для мелких задач (сгенерить название чата, сгенерить текст для веб запроса, мб ещё для чего-то используется) Qwen3.5-2B-BF16.
Теперь в папке, куда загрузили модели, создаём файл с параметрами запуска моделей. Например, “start-all.ini” в “G:\llm”.
[*] # Global defaults — applied to every model unless overridden no-mmap = true metrics = true cache-ram = 0 sleep-idle-seconds = 1200 n-gpu-layers = all batch-size = 2048 ubatch-size = 2048 [Qwen3.5-2B-BF16] model = G:\llm\Qwen3.5-2B-BF16.gguf ctx-size = 65536 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 = false parallel = 4 chat-template-kwargs = {"enable_thinking":false} [Qwen3-Embedding-4B-f16] model = G:\llm\Qwen3-Embedding-4B-f16.gguf embedding = true pooling = mean ctx-size = 32768 load-on-startup = false parallel = 8 [Qwen3-Reranker-4B-f16] model = G:\llm\Qwen3-Reranker-4B-f16.gguf reranking = true pooling = rank embedding = true ctx-size = 32768 load-on-startup = false parallel = 8 [Qwen3.5-27B-UD-Q4_K_XL-thinking] model = G:\llm\Qwen3.5-27B-UD-Q4_K_XL.gguf mmproj = Qwen3.5-27B-UD-Q4_K_XL-mmproj-BF16.gguf ctx-size = 32768 top-p = 0.95 top-k = 20 min-p = 0.0 temp = 1.0 repeat-penalty = 1.0 presence-penalty = 1.5 load-on-startup = false parallel = 1 [Qwen3.5-27B-UD-Q4_K_XL-instruct] model = G:\llm\Qwen3.5-27B-UD-Q4_K_XL.gguf mmproj = Qwen3.5-27B-UD-Q4_K_XL-mmproj-BF16.gguf ctx-size = 32768 top-p = 0.8 top-k = 20 min-p = 0.0 temp = 0.7 repeat-penalty = 1.0 presence-penalty = 1.5 load-on-startup = false parallel = 1 chat-template-kwargs = {"enable_thinking":false}
Теперь создаём bat файл, в котором запустим llama-server. Например, “start-all.bat”:
G:\llama-b8477-bin-win-cuda-13.1-x64\llama-server ^ --port 9999 ^ --models-max 1 ^ --models-preset start-all.ini
Пояснения некоторых параметров запуска
no-mmap = true - не использовать проецирование файла модели в RAM. В результате модель грузится только в VRAM.
metrics = true - отображать метрики модели на /metrics эндпоинте. (Пример: http://127.0.0.1:9999/metrics?model=Qwen3.5-27B-UD-Q4_K_XL-thinking)
cache-ram = 0 - нулевой кеш для запросов. В нём нет смысла если один пользователь с разными запросами.
sleep-idle-seconds = 1200 - выгружать модель из VRAM через указанное количество секунд.
n-gpu-layers = all - какое число слоёв модели грузить в VRAM.
ctx-size = 65536 - размер контекста для модели.
load-on-startup = false - загружать ли модель при старте.
parallel = 4 - на сколько запросов одноверменно будет отвечать модель. При этом контекст из ctx-size делится на это количество (65536 / 4 = 16384).
chat-template-kwargs = {“enable_thinking”:false} - отключает рассуждения у модели.
–models-max 1 - одноверменно грузить в память только одну модель. Основная модель с контекстом занимает всю VRAM. Если будет загружена ещё одна модель, то будет сильно тормозить. В идеале нужна возможность указывать не количество моделей, а количество занимаемой памяти. Например, чтобы помещалась одна крупная модель или несколько мелких. Но пока такой настройки нет. Возможно, будет в будущем. Новые фичи добавляют постоянно. Следите за обновлениями.
Про остальные можно прочитать здесь.
Запускаем start-all.bat и видим что-то подобное:

Открываем http://127.0.0.1:9999/ и можно пользоваться llama.cpp. При первом запросе надо будет дождаться пока загрузится модель.

Если достаточно чата, то можно остановиться здесь.
Установка и запуск Open WebUI
Поскольку запускать Open WebUI в контейнере, то понадобятся wsl и Docker Desktop.
Чтобы установить wsl надо выполнить комнаду “wsl install”. Однако, когда я удалил wsl “wsl --uninstall”, то установить получилось командой “wsl --update”.

После завершения установки может попросить логин и пароль для создания нового пользователя. Если возникнут проблемы посмотрите эту статью.
Теперь качаем, устанавливаем и запускаем Docker Desktop отсюда. Насколько помню там простая установка и проблем быть не должно.
Выглядеть должно так:

Теперь создаём docker-compose.yml. Создал его в G:\openwebui.
services: open-webui: image: ghcr.io/open-webui/open-webui:v0.8.6 container_name: open-webui restart: unless-stopped ports: - "3000:8080" volumes: - G:/openwebui/volume:/app/backend/data environment: - RAG_SYSTEM_CONTEXT=True - ENABLE_QUERIES_CACHE=True - ENABLE_REALTIME_CHAT_SAVE=False networks: - webui-net tika: image: apache/tika:latest-full container_name: tika restart: unless-stopped ports: - 9998:9998 networks: - webui-net networks: webui-net: driver: bridge
Открываем командную строку в каталоге, где лежит docker-compose.yaml, выполняем команду “docker compose up -d”, ждём пока скачаются образы и поднимутся контейнеры:

На скрине процесса скачивания нет, т.к. образы были скачаны ранее.
В Docker Desktop должно быть приблизительно следующее:

Открываем http://localhost:3000/ Попросит почту и пароль для нового админа.
Сверху справа жмём на иконку пользователя. В выпавшем меню выбераем “Панель администратора”:

Там выбираем “Настройки” - “Подключения” и нажмите на “+”

В появившемся окне в поле “URL” указываем “http://host.docker.internal:9999/v1”, жмём “Сохранить”.

Далее выбираем “Интерфейс” и там в “Модель локальной задачи” и “Модель внешней задачи” указываем “Qwen3.5-2B-BF16”

И в нижнем правом углу жмём “Сохранить”.
Теперь жмём слева сверху “Новый чат” - “Arena model”. Там должен появиться список наших моделей. Любая что-то да ответит. Но лучше выбирать “Qwen3.5-27B-UD-Q4_K_XL-instruct” для ответов без рассуждений. И “Qwen3.5-27B-UD-Q4_K_XL-thinking” для ответов с рассуждениями.

Вводим запрос, ждём пока загрузится модель. У меня это занимает до минуты. Получаем ответ:

Настройки для веб-поиска
Поскольку при веб-поиске используется RAG, надо будет сделать настройки для работы с документами. Стандартные модели и настройки тоже работают, но качество работы плачевное.
Заходим в “Панель администратора” - “Настройки” - “Documents”.
В “Механизм извлечения контента” выбираем Tika и указываем URL “http://host.docker.internal:9998”
В “Движок модели встраивания” URL указываем “http://host.docker.internal:9999/v1” и модель “Qwen3-Embedding-4B-f16”
В “Движок реранжирования” выбираем “Внешнее” и указываем URL “http://host.docker.internal:9999/v1/rerank” и “Модель реранжирования” - “Qwen3-Reranker-4B-f16”
Нажимаем “Сохранить” внизу справа.

И остались настройки Веб-поиска. Я выбрал Brave - даёт $5 каждый месяц, если привязать карту. Так же можно настроить лимит, чтобы не тратить больше.

Не забываем “Сохранить” настройки.
При выполнении запроса включаем использование “Веб-поиска”:

Результат:

При обычном запросе сначала загружается основная модель, поосле того как она ответила загружается маленькая модель (Qwen3.5-2B-BF16) для генерации названия чата. Не используйте рассуждающие модели для этого, т.к. это занимает много времени и часто название чата не генерируется. У меня так было, когда в “Настройки” - “Интерфейс” - “Модель локальной задачи” было указано “Текущая модель”.
При использовании веб-поиска будут так же загружаться эмбеддинг и рерангинг модели. Какие модели загружаются можно посомтреть в логе llama-server.
Что ещё?
Документация Open WebUI - там много разных функций.
Статья как запутить большую модель, если она не влезат в VRAM Запускаем GPT-OSS-120B на 6 Гб GPU и ускоряем до 30 t/s.
Статья на unsloth.ai Qwen3.5 - How to Run Locally. Так же там есть статьи, как запускать дургие модели.
Вместо Tika можно использовать Docling для более сложных документов. Сам не пробовал.
Есть множество поисковых движков (сам их не пробовал), некоторые предлагают какое-то количество бесплатных запросов в месяц:
Для поиска можно запустить в Docker - SearXNG. Пробовал, часто движки поисков банили на время. Так же есть публичные бесплатные инстансы.
docker-compose для SearXNG
searxng: image: ghcr.io/searxng/searxng:latest container_name: searxng ports: - "8888:8080" volumes: - G:/searxng/volume/config:/etc/searxng - G:/searxng/volume/data:/var/cache/searxng networks: - webui-netДля “Веб-поиска” “Движок веб-загрузчика” пробовал playwright в Docker. Работает долго, в минутах.
Настройки для playwright
playwright: image: mcr.microsoft.com/playwright:v1.58.0-noble # Version must match requirements.txt container_name: playwright command: npx -y playwright@1.58.0 run-server --port 3000 --host 0.0.0.0 networks: - webui-netВ “Панель администратора” - “Настройки” - “Веб-поиск” в “Движок веб-загрузчика” выбраем playwright, в “Playwright WebSocket URL” - “ws://playwright:3000”, Timeout - пробовать с 30000 мс.

В OpenWebUI можно подключить распознавание речи и генерацию картинок.
В OpenWebUI можно использвать внедние сервисы для осносновых моделей, эмбеддинга, реранкинга и извлечения контента с веб-страниц: perplexity.ai, openrouter.aiparallel.ai, firecrawl.dev, jina.ai
Помимо OpenWebUI, есть и другие веб интерфейсы. Например, LibreChat.
Можно настроить OpenCode, чтобы он обращался к уже запущенному llama-server.
EDIT: Уменьшил контекст основных моделей до 32768. Это помогло решить проблему с долгой работой моделей при открытой вкладке чата. Похоже дело было в том, что модель с контекстом занимала больше чем свободная VRAM.
