MAATRIX / Блог / Как поднять свой ИИ-поиск на сервере

Как поднять свой ИИ-поиск на сервере

Как поднять свой ИИ-поиск на сервере

MAATRIX

ChatGPT ищет в браузере, Perplexity отвечает со ссылками на источники — но оба живут на чужих серверах в США, требуют VPN из России и логируют каждый ваш запрос. Свой ИИ-поиск на сервере повторяет ту же схему изнутри: метапоисковик находит свежие страницы, языковая модель складывает их в ответ со ссылками, а весь стек — от IP-адреса до истории запросов — принадлежит вам. Разберём архитектуру, три способа её собрать и сколько это стоит по железу.

Обсудить статью, задать вопрос или начать новую тему

Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество 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 — десятки моделей в одном окне. Оплата картой РФ и по СБП.