SearXNG: как дать локальной LLM и AI-агенту собственный поиск в интернете
Локальная модель знает только то, что попало в её weights и текущий context. Чтобы получать свежие данные из интернета, ей нужен отдельный поисковый слой. SearXNG — self-hosted metasearch engine: он агрегирует результаты разных поисковых сервисов, не строит пользовательский профиль и предоставляет простой HTTP API, который удобно подключать к LLM-агентам.
SearXNG отправляет один запрос нескольким поисковым сервисам и объединяет результаты
Это принципиально отличается от собственного crawler/indexer. SearXNG не пытается самостоятельно проиндексировать весь интернет. Он обращается к настроенным engines и агрегирует ответы.
Agent не обязан отдельно интегрировать каждый search service.
Можно комбинировать engines, categories и специализированные источники.
Вы сами решаете, какие engines включены, какие форматы разрешены и кто имеет доступ к instance.
SearXNG не профилирует пользователя и убирает часть идентифицирующих данных из upstream requests.
Search превращается в обычный tool, а не в отдельный коммерческий API каждого провайдера
Модель ищет данные после своего training cutoff.
Agent собирает несколько независимых источников перед ответом.
Поиск новых публикаций, releases и обсуждений по time range.
GitHub, package/docs и технические результаты в одном backend.
Локальная LLM получает web search без передачи всего chat context поисковому сервису.
Search находит URL, другой слой загружает и индексирует содержимое.
Хороший agent-tool формирует короткий search query из задачи, а не пересылает search backend всю историю разговора.
SearXNG находит URL, Firecrawl извлекает полное содержимое
Установка SearXNG через официальный Compose template
mkdir -p ./searxng/core-config/
cd ./searxng/
curl -fsSL \
-O https://raw.githubusercontent.com/searxng/searxng/master/container/docker-compose.yml \
-O https://raw.githubusercontent.com/searxng/searxng/master/container/.env.example
cp .env.example .env
docker compose up -d
Current official Compose создаёт SearXNG core и Valkey.
Config хранится в core-config/.
Документация рекомендует Compose как основной containerized deployment path.
/etc/searxng
settings.yml, limiter.toml и другие настройки.
/var/cache/searxng
Persistent cache и связанные runtime data.
Нужен, если используется SearXNG bot limiter.
HTTPS, auth и корректные forwarded headers настраиваются отдельно.
Ограничьте Docker port binding loopback-интерфейсом или firewall/VPN. По умолчанию sample Compose может публиковать service наружу на host network.
JSON API существует из коробки, но формат JSON по умолчанию не включён
Current default search settings содержат только html.
Если agent запросит ?format=json, а формат не разрешён,
SearXNG вернёт 403 Forbidden.
Минимальный settings.yml для local agent
use_default_settings: true
general:
debug: false
instance_name: "Local AI Search"
search:
safe_search: 0
formats:
- html
- json
server:
secret_key: "CHANGE_TO_LONG_RANDOM_SECRET"
limiter: false
public_instance: false
image_proxy: false
Такой вариант логичен, если instance реально доступен только локально/VPN. Для public/shared instance limiter лучше включать и правильно настраивать через Valkey.
Проверка API
curl "http://127.0.0.1:8888/search?q=local+LLM&format=json"
Параметры search API
qSearch queryОбязательный текст запроса.
format=jsonJSON responseДолжен быть разрешён в settings.yml.
language=ruЯзыкПередаётся поддерживающим engines.
time_range=dayСвежестьday, month, year — если engine поддерживает.
categories=generalКатегорииМожно ограничивать тип поиска.
safesearch=0Safe search0/1/2 при поддержке соответствующего engine.
Pydantic AI + локальный SearXNG
import requests
from pydantic_ai import Agent
SEARXNG_URL = "http://127.0.0.1:8888"
agent = Agent(
"ollama:qwen3",
instructions=(
"Используй web_search для свежих фактов. "
"Не выдумывай источник, если поиск ничего не вернул."
),
)
@agent.tool_plain
def web_search(query: str) -> list[dict]:
response = requests.get(
f"{SEARXNG_URL}/search",
params={
"q": query,
"format": "json",
"language": "ru",
},
timeout=15,
)
response.raise_for_status()
data = response.json()
return [
{
"title": item.get("title"),
"url": item.get("url"),
"snippet": item.get("content"),
"engine": item.get("engine"),
}
for item in data.get("results", [])[:8]
]
result = agent.run_sync(
"Найди свежую информацию о новой версии интересующего проекта."
)
print(result.output)
Здесь local Ollama отвечает за reasoning, а SearXNG — только за search. Можно заменить model provider и оставить search tool без изменений.
Production research-agent должен после поиска открыть лучшие источники
Snippet может быть обрезанным, устаревшим или вырванным из контекста. Для существенного факта agent должен открыть страницу и проверить её содержимое.
Около 260 engines позволяют собрать поиск под конкретного агента
Текущая документация показывает около 260 поддерживаемых engines, из которых примерно 81 включён по умолчанию. Среди них есть общие поисковые системы и специализированные источники.
Несколько providers дают более устойчивую выдачу.
Удобно для coding/research agent.
Можно делать отдельную research category.
Отдельные engines поддерживают свои result types.
Можно добавлять собственный JSON engine
engines:
- name: internal-docs
engine: json_engine
paging: true
search_url: https://docs.example/api/search?q={query}&page={pageno}
results_query: documents
url_query: url
title_query: title
content_query: summary
То есть SearXNG способен стать не только internet metasearch, но и unified search layer поверх вашего внутреннего JSON-search endpoint.
Self-hosted SearXNG скрывает пользователя от upstream engine, но не делает сам поиск «невидимым»
SearXNG не хранит пользовательский профиль, не передаёт search-engine cookies и генерирует отдельный browser profile для requests. Внешний search provider обычно видит IP вашего SearXNG instance, а не IP локального пользователя.
Upstream видит instance как посредника, а не браузер пользователя.
Чтобы provider нашёл результаты, запрос всё равно должен уйти выбранному engine.
Нет необходимости доверять неизвестному оператору публичного instance.
Вы не знаете наверняка, логирует ли чужой server ваши запросы.
Upstream engines видят один и тот же IP вашего instance. Для дополнительного разделения SearXNG поддерживает outbound proxy и Tor.
SearXNG поддерживает HTTP/SOCKS proxy и Tor для исходящих search requests
outgoing:
request_timeout: 3.0
enable_http2: true
proxies:
all://:
- socks5h://127.0.0.1:9050
using_tor_proxy: true
extra_proxy_timeout: 10.0
Для Tor документация рекомендует socks5h://,
чтобы DNS resolution выполнялась через proxy, а не локально.
Некоторые поисковые системы чаще показывают CAPTCHA или блокируют Tor exits. Для AI-agent это означает больше timeout/error и менее стабильную выдачу.
Public instance подходит для теста, но хуже как постоянный backend агента
Список публичных instances публикуется на searx.space.
Но для AI integration есть важная проблема:
многие public instances отключают JSON/CSV/RSS форматы,
а также имеют rate limiting.
Быстро посмотреть качество поисковой выдачи без установки.
Контроль JSON API, engines, rate limit, logs, proxy и availability.
Оператор может изменить formats, лимиты, engines или отключить server; кроме того, вы должны доверять его logging policy.
Для local AI проще закрыть instance, чем пытаться защищать публичный metasearch
Не оставлять default ultrasecretkey.
Если search нужен только вашим agents, не публиковать instance в интернет.
Защищает upstream engines от чрезмерного bot traffic.
Limiter зависит от корректного определения реального client IP за reverse proxy.
Engine APIs часто меняются; rolling-release fixes выходят постоянно.
Command engine способен выполнять локальные shell commands и требует отдельной модели доверия.
Limiter
server:
limiter: true
valkey:
url: valkey://searxng-valkey:6379/0
Limiter нужен прежде всего shared/public instance: SearXNG сам выглядит для upstream search engines как bot, и неконтролируемый клиент способен быстро довести instance до CAPTCHA/ban.
Официальная документация прямо предупреждает: offline command engine запускает arbitrary shell command с подстановкой пользовательского query. На public instance такие engines нужно изолировать/защищать tokens или вообще не включать.
На момент проверки GitHub Security page SearXNG содержит SECURITY.md,
но не показывает опубликованных security advisories.
Это не означает отсутствия bugs — только отсутствие опубликованных advisories в этом feed.
Self-hosted metasearch не превращается автоматически в идеальный web search API
Parser или endpoint может сломаться после изменений поисковой системы.
Один instance IP генерирует много search traffic и может быть ограничен.
Больше источников не всегда означает лучше ranking.
Для серьёзного research нужно отдельно открыть найденный URL.
Limiter, reverse proxy, headers, monitoring и updates становятся вашей задачей.
Фиксы приходят быстро, но возможны regressions — обновления нужно контролировать.
Docker Compose + JSON format + loopback/VPN access обычно достаточны. Публичный multi-user search server — уже отдельная инфраструктурная задача.
Хорошая домашняя связка для локального AI
Локальная model inference.
Reasoning, tools и workflow.
Поиск свежих URL и snippets.
Full-text загрузка лучших результатов.
Tracing, token/cost/latency и evaluation.
SearXNG: search API, rolling releases, privacy и deployment
SearXNG использует rolling-release model: каждый merge/commit в master считается новой версией, поэтому здесь сознательно не указана одна «вечная stable 1.x» версия. Current docs на дату проверки собраны из ветки сентября 2026 года.
SearXNG — хороший search backend для локального AI, если отделить поиск от чтения страниц
Самая полезная архитектурная идея проста: SearXNG отвечает за discovery, другой инструмент — за загрузку full-text, а LLM — за reasoning и synthesis. Так каждый компонент делает то, для чего он предназначен.
Для домашнего private-agent достаточно собственного instance, JSON API и закрытого сетевого доступа. Публичный SearXNG уже требует limiter, Valkey, reverse proxy и регулярного обслуживания.
Частые вопросы про SearXNG и AI
Что такое SearXNG простыми словами?
Self-hosted metasearch engine, который отправляет ваш запрос нескольким поисковым сервисам, объединяет результаты и может отдавать их через JSON API.
Можно ли подключить SearXNG к локальной LLM?
Да. Обычно SearXNG оформляют как search tool: агент отправляет короткий query на /search?format=json, затем LLM анализирует результаты.
Почему format=json возвращает 403?
JSON должен быть явно добавлен в search.formats внутри settings.yml. По умолчанию current settings разрешают только HTML.
Заменяет ли SearXNG Firecrawl?
Нет. SearXNG ищет URL и возвращает snippets. Firecrawl загружает и очищает полный content страницы, делает crawl и structured extraction.
Нужен ли API key?
У собственного private SearXNG Search API нет обязательного commercial API key. Контроль доступа нужно обеспечивать сетевой изоляцией, reverse proxy/auth и limiter в зависимости от deployment.
Можно ли использовать публичный SearXNG instance?
Для теста — да. Для постоянного agent backend хуже: JSON часто отключён, есть rate limits, а оператор instance потенциально может логировать запросы.
SearXNG полностью скрывает запрос от Google/Bing?
Нет. Чтобы получить результат, search query уходит выбранному upstream engine. SearXNG уменьшает идентификацию конечного пользователя: upstream видит instance IP, а не напрямую пользователя, и не получает его обычные cookies.
Можно ли пустить поисковые запросы через Tor?
Да. SearXNG поддерживает proxies и using_tor_proxy. Для Tor предпочтителен socks5h://, чтобы DNS тоже разрешался через proxy.
Какая версия SearXNG актуальна?
SearXNG — rolling-release проект: каждый merge в master является новой версией. Поэтому корректнее обновляться по актуальному official container/master, а не искать редкий semver release.
Хотите, чтобы локальная модель сама искала свежую информацию, но search backend оставался под вашим контролем?
Практичная схема: SearXNG для поиска, Firecrawl для чтения страниц, локальная LLM для анализа и отдельный agent framework для tools/permissions.