Как поднять свой ИИ-поиск на сервере
ChatGPT ищет в браузере, Perplexity отвечает со ссылками на источники — но оба живут на чужих серверах в США, требуют VPN из России и логируют каждый ваш запрос. Свой ИИ-поиск на сервере повторяет ту же схему изнутри: метапоисковик находит свежие страницы, языковая модель складывает их в ответ со ссылками, а весь стек — от IP-адреса до истории запросов — принадлежит вам. Разберём архитектуру, три способа её собрать и сколько это стоит по железу.
Содержание
- Что такое свой ИИ-поиск и зачем его поднимать на сервере
- Из чего состоит стек: три слоя, которые не путать
- Путь первый: готовая сборка — Perplexica или Open WebUI
- Путь второй: своя склейка — n8n или скрипт
- Модель для синтеза: облако или своя — развилка, которая решает всё остальное
- Что портится на практике, а не в теории
- Какой сервер под свой ИИ-поиск брать в MAATRIX
Обсудить статью, задать вопрос или начать новую тему
Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.
Перейти в сообщество →Что такое свой ИИ-поиск и зачем его поднимать на сервере
«ИИ-поиск» — не чат-бот и не обычная выдача ссылок, а связка двух шагов: retrieval (найти актуальные страницы по запросу) и generation (модель читает найденное и формулирует ответ, ссылаясь на источники как [1], [2]). Так устроены Perplexity, поиск в ChatGPT и Copilot — разница только в том, что там это закрытый сервис по подписке, а внутри — тот же метапоиск плюс LLM.
Причины поднимать такой стек самому:
- Доступность. OpenAI, Anthropic и Google блокируют запросы с российских IP на уровне API — тем же 403, что и обычный ChatGPT в браузере. Сервер за рубежом снимает вопрос раз и навсегда, без VPN на каждом устройстве.
- Приватность. Запросы и найденные страницы не улетают в чужую аналитику — критично для рабочих, юридических или медицинских тем.
- Контроль источников. Сами решаете состав движков: можно выключить соцсети, добавить внутренний портал отдельным движком, задать язык. В закрытом сервисе такой настройки нет.
- Цена на масштабе. У Perplexity Pro и аналогов — квота «pro-поисков» в месяц; при ежедневном использовании командой это дороже сервера, где вы платите за токены API по факту или не платите вовсе с локальной моделью.
Честно: для одного вопроса вечером быстрее открыть браузер. Свой стек оправдан там, где нужна регулярность, приватность или встраивание поиска в свой продукт — Telegram-бота или CRM.
Из чего состоит стек: три слоя, которые не путать
Любой ИИ-поиск — это три независимых слоя, и путаница между ними — источник половины вопросов «почему не работает».
Слой поиска. SearXNG — метапоисковик без собственного индекса: рассылает запрос параллельно по внешним движкам (Google, DuckDuckGo, Brave, Wikipedia и десяткам других) и отдаёт результат единым JSON через /search?q=...&format=json. Вопросов он не понимает и ответов не пишет — только достаёт сырые страницы. Разбор конфига — в статье про установку SearXNG на VPS.
Слой модели. Языковая модель получает вопрос и найденные сниппеты и возвращает связный ответ со ссылками. Бывает облачной (OpenAI, Anthropic, DeepSeek) или локальной (Ollama на том же сервере) — от этого выбора зависят качество и требования к железу, разберём в пятой секции.
Слой склейки. Кто-то должен вызвать поиск, собрать из результатов промпт, отправить его модели и показать ответ — чатом человеку или JSON другому приложению. Три пути, и они не взаимоисключающие:
| Путь | Что это | Готовый UI | Своя логика промпта | API для интеграции |
|---|---|---|---|---|
| Perplexica | Готовое приложение под ИИ-поиск | Да, из коробки | Нет | Ограниченно |
| Open WebUI + веб-поиск | Чат общего назначения с плагином поиска | Да, если уже стоит | Частично, системным промптом | Нет |
| n8n или скрипт | Собственная склейка вызовов | Нет, строите сами | Полная | Да, любой формат |
Слой поиска один и тот же во всех трёх — SearXNG. Разница только в том, кто и как обращается к его JSON.
Развернуть за пару минут
Готовый образ на VPS MAATRIX: NVMe, AMD EPYC, root-доступ. Локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.
Развернуть SearXNGПуть первый: готовая сборка — Perplexica или Open WebUI
Быстрее всего получить рабочий ИИ-поиск, взяв готовое приложение поверх SearXNG.
Perplexica — открытый клон Perplexity: то же поле ввода и формат ответа со ссылками, режимы фокуса под академические источники или Reddit. Ставится docker-compose из двух сервисов — свой и SearXNG рядом, — а связь между ними задаётся в config.toml:
[API_ENDPOINTS]
SEARXNG = "http://searxng:8080"
OLLAMA = "http://ollama:11434"
[API_KEYS]
OPENAI = "sk-proj-..."
Интерфейс поднимается на порту 3000. Модель облачная — строку OLLAMA оставляете пустой. Важно: Perplexica ждёт от SearXNG именно JSON, значит search.formats: [html, json] в его settings.yml должен быть выставлен заранее, иначе связка не соберётся вообще.
Open WebUI — универсальный чат, где веб-поиск — один из режимов, а не отдельное приложение. Включается тремя переменными:
ENABLE_RAG_WEB_SEARCH=true
RAG_WEB_SEARCH_ENGINE=searxng
SEARXNG_QUERY_URL=http://searxng:8080/search?q=<query>
Берите Open WebUI, если он и так уже стоит и поиск нужен как ещё один режим; отдельный Perplexica — если нужен именно поисковый интерфейс, а не довесок к большому чату.
Симптом обрыва связки одинаков в обоих случаях: ответ приходит без единой ссылки на источник, будто модель ответила из головы. Проверяется с сервера одной командой:
curl -s 'http://127.0.0.1:8080/search?q=test&format=json' | jq '.results | length'
Ноль или 403 вместо числа — проблема в SearXNG, а не в надстройке; каталог причин — в статье частые ошибки SearXNG на сервере.
Путь второй: своя склейка — n8n или скрипт
Готовые приложения рассчитаны на чат с человеком. Если поиск с ИИ нужен как эндпоинт для своего продукта — Telegram-бота, внутреннего сервиса — проще собрать связку самому и получить на выходе JSON, а не HTML-страницу.
В n8n это workflow из трёх узлов: HTTP Request к SearXNG забирает сырые результаты, узел-функция режет их до трёх-пяти самых релевантных и собирает промпт, второй HTTP Request уходит к модели — облачной или к локальной Ollama по её OpenAI-совместимому эндпоинту /v1/chat/completions. Webhook-триггер превращает всё это в собственный POST-адрес. Установка n8n — в статье про AI-автоматизации на сервере.
То же самое руками, без n8n, — на bash с jq, чтобы увидеть, что происходит внутри любого готового приложения:
# 1. достаём пять свежих результатов из SearXNG
RESULTS=$(curl -s 'http://127.0.0.1:8080/search?q=цена+биткоина+сегодня&format=json' \
| jq -c '[.results[:5][] | {title, url, content}]')
# 2. собираем промпт с источниками и отправляем модели
jq -n --arg q "цена биткоина сегодня" --argjson src "$RESULTS" \
'{model:"gpt-4o-mini", messages:[
{role:"system", content:"Отвечай только по источникам ниже и указывай их как [1], [2]. Если ответа в источниках нет — так и скажи."},
{role:"user", content:("Вопрос: " + $q + "\nИсточники:\n" + ($src|tostring))}
]}' | curl -s https://api.openai.com/v1/chat/completions \
-H "Authorization: Bearer $OPENAI_API_KEY" -H "Content-Type: application/json" -d @-
Системный промпт здесь не формальность: уберите вторую строку — и модель при первой возможности подмешает то, что помнит из обучения, никак это не пометив.
Если контейнеры не в одной docker-сети или порт SearXNG не опубликован, запрос из n8n падает без единого байта ответа:
curl: (7) Failed to connect to searxng port 8080: Connection refused
Это сетевая ошибка, а не проблема конфига — лечится общим docker network, а не правкой settings.yml.
Путь дороже по настройке, но только он отдаёт поиск с источниками как API — для встраивания в свой бэкенд, а не отдельным сайтом.
Модель для синтеза: облако или своя — развилка, которая решает всё остальное
Слой поиска везде один, а выбор модели сильнее всего меняет и качество ответов, и требования к серверу.
Облачный API — самый быстрый путь: недорогие модели вроде gpt-4o-mini или через DeepSeek обходятся в доли цента за запрос и справляются с синтезом по источникам даже в минимальной конфигурации сервера. Требование одно — сервер должен стоять там, откуда провайдер вообще отвечает: с российского IP OpenAI отдаёт 403 {"code":"unsupported_country_region_territory"} независимо от того, верный у вас ключ или нет. Несколько провайдеров с фолбэком между ними — отдельная задача шлюза, она разобрана в статье про единый шлюз к OpenAI, Claude и Gemini.
Локальная модель через Ollama — путь ради приватности: сниппеты страниц и ответы не покидают сервер вообще, а стоимость запроса после его покупки — ноль. Плата за это — память. Модель уровня qwen2.5:14b, которая прилично складывает несколько источников в связный ответ, весит около 9 ГБ в Q4-квантовании и требует RAM сверх этого веса под контекст: пять сниппетов по паре сотен слов — уже тысячи токенов промпта ещё до того, как модель начала отвечать. Формула и таблица по моделям — в статье сколько RAM нужно для Ollama; для ИИ-поиска берите её ориентиры, прибавляя запас под сам SearXNG и оболочку.
Честно о скорости: цифр замеров не будет — они зависят от конкретной модели и сервера, но логика простая: облачный API считает на чужих GPU и отвечает за секунды, а CPU-инференс сначала обрабатывает весь промпт с источниками целиком и только потом начинает печатать ответ.
Практичный вариант для старта: SearXNG и оболочка на сервере, синтез — через облачный API; к локальной модели переходите осознанно, это отдельная конфигурация, а не довесок к прежней.
Что портится на практике, а не в теории
Капча съедает не запрос, а тишину. У чистого SearXNG отказ движка виден в /stats/errors. В ИИ-поиске тот же отказ прячется за уверенным ответом модели: источников осталось два вместо пяти, а модель всё равно складывает связный текст — выглядит нормально при обрывке выдачи. Включайте немного движков (5–10), а не сотню из коробки: меньше параллельных запросов с одного IP — меньше поводов для капчи.
Источники не спасают от галлюцинаций полностью. Даже с жёстким системным промптом модель иногда домысливает деталь, которой нет в сниппетах, особенно если вопрос требует вывода из нескольких источников, а не прямой цитаты. Ссылка в ответе — это адрес, где утверждение можно проверить самому, а не гарантия, что оно взято оттуда дословно.
Счёт растёт быстрее, чем кажется. Каждый вопрос к облачной модели тянет за собой не только сам запрос, а весь текст найденных страниц — тысячи токенов входа при копеечной цене одного обращения, но при активном использовании командой сумма набегает за недели. Ограничивайте бюджет на уровне ключа или прокси, а не постфактум по счёту в конце месяца.
Движки ломаются со временем сами по себе. Источники меняют вёрстку, требуют JavaScript, блокируют дата-центровые подсети — это внешние условия, а не баг вашей установки. ИИ-поиск на таком движке молча получит меньше источников и не пожалуется явно; изредка сверяйтесь со /stats/errors, а не только с тем, отвечает ли модель.
Какой сервер под свой ИИ-поиск брать в MAATRIX
Нагрузка стека почти целиком сетевая и упирается в память процессов, а не в процессор — если только вы не выбрали локальную модель из пятой секции.
Для набора «SearXNG + один слой склейки (Perplexica или Open WebUI) + облачный API» память раскладывается так: SearXNG — 200–400 МБ на воркер, Valkey под лимитер — 30–50 МБ, сама оболочка (Node- или Python-процесс) — 300–700 МБ, Nginx с TLS — около 50 МБ, плюс 500 МБ – 1 ГБ на Ubuntu 24.04 и демон Docker.
Честный минимум: 2 vCPU, 4 ГБ RAM, 40 ГБ NVMe. Хватает на SearXNG, один слой склейки и облачную модель для одного-двух человек. Ограничение прямое: на 4 ГБ выбирайте — либо SearXNG с оболочкой, либо ещё и Postgres под историю и бюджеты ключей.
Комфортный вариант: 4 vCPU, 8 ГБ RAM, 60–80 ГБ NVMe. Помещаются Valkey с лимитером, Postgres под историю и лимиты, запас на логи и несколько человек без очереди. Если вместо готового приложения поднимаете свою склейку на n8n — закладывайте её память отдельно, это ещё один процесс Node.js.
Локальная модель — отдельная история, не довесок к этим цифрам: закладывайте RAM по таблице из статьи про Ollama и RAM, а конфигурацию под неё берите отдельно от поискового слоя.
Локация — Лондон (UK). Двойная причина, которой нет у чистого SearXNG: британский IP снижает шанс капчи от поисковых движков и штатно пропускает к OpenAI, Anthropic и другим провайдерам — без 403 unsupported_country_region_territory для российских адресов. США — если стек строится вокруг конкретного американского сервиса; Россия не подходит ни для поиска, ни для облачных моделей — здесь ограничены оба слоя.
SearXNG есть в каталоге apps.maatrix.io и ставится автоматически при заказе сервера — на Ubuntu и на Debian; адрес интерфейса и доступы появляются в личном кабинете, в разделе «Доступ». Слой склейки — Perplexica, Open WebUI или n8n — вы добавляете поверх сами через Docker: каталог даёт готовую поисковую часть, а не весь стек целиком. Оплата — картой российского банка, по СБП, криптовалютой или токеном MAAT.
Развернуть за пару минут
Готовый образ на VPS MAATRIX: NVMe, AMD EPYC, root-доступ. Локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.
Развернуть SearXNGОбсудить статью, задать вопрос или начать новую тему
Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.
Перейти в сообщество →Частые вопросы
Обязательно ли ставить локальную модель ради приватности?
Нет. Синтез через облачный API — рабочий вариант по умолчанию: сервер за рубежом снимает блокировку, а запросы и найденные страницы всё равно не логирует чужой публичный сервис вроде ChatGPT. Локальная модель нужна, только если требование жёстче — чтобы текст источников и ответ не покидали инфраструктуру.
Perplexica или Open WebUI — что выбрать?
Perplexica — если нужен отдельный поисковый интерфейс, похожий на Perplexity. Open WebUI — если чат для работы с моделями уже стоит и поиск нужен как ещё один режим, а не второе приложение.
Можно ли получить такой поиск как API для своего продукта, а не как отдельный сайт?
Да, путь из четвёртой секции: n8n-workflow с Webhook-триггером или собственный скрипт возвращают JSON с ответом и списком источников — встраивается в Telegram-бота или внутренний сервис.
Нужны сами нейросети для контента?
Генерируйте изображения, видео и озвучку нейросетями на falapi.io — десятки моделей в одном окне. Оплата картой РФ и по СБП.