You are currently viewing SearXNG : donner des yeux sur le web à ses agents IA 

SearXNG : donner des yeux sur le web à ses agents IA 

SearXNG : donner des yeux sur le web à ses agents IA open source

Les LLM auto-hébergés comme Ollama, vLLM, sont puissants, mais aveugles : ils ne voient que leur contexte d’entraînement ou les documents qu’on leur injecte via RAG. Pour leur permettre de chercher des informations fraîches sur le web, il faut un moteur de recherche. SearXNG est un méta-moteur de recherche open source, auto-hébergé, qui agrège les résultats de dizaines de sources (Google, Bing, DuckDuckGo, Wikipedia, Arxiv…) sans tracer les utilisateurs. Déployé sur Docker aux côtés de sa stack IA, il devient l’outil de recherche web que les agents peuvent interroger via une simple API JSON.

Pourquoi SearXNG pour une stack IA auto-hébergée

Les agents IA modernes, qu’ils soient orchestrés par n8n, LangChain, ou un MCP server, ont souvent besoin de rechercher des informations actualisées avant de répondre. Passer par les API commerciales de Google ou Bing implique des coûts, des quotas et une dépendance à des services tiers. SearXNG résout ce problème en offrant un point d’entrée unique, gratuit et sans limite, vers l’ensemble du web indexé. Son API JSON native retourne des résultats structurés (titre, URL, extrait) directement exploitables par un pipeline RAG ou un agent conversationnel.

Déploiement Docker en 5 minutes

SearXNG se déploie via une image Docker officielle. Un fichier docker-compose.yml minimal suffit :

services:
  searxng:
    image: searxng/searxng:latest
    container_name: searxng
    ports:
      - "8888:8080"
    volumes:
      - ./searxng:/etc/searxng
    environment:
      - SEARXNG_BASE_URL=https://search.mondomaine.fr
    restart: unless-stopped

Le dossier ./searxng contient deux fichiers de configuration : settings.yml (moteurs activés, langue par défaut, format de sortie) et limiter.toml (rate limiting). Pour activer l’API JSON, il faut s’assurer que le format json est listé dans search.formats du fichier settings.yml :

search:
  formats:
    - html
    - json

server:
  secret_key: "une-clé-aléatoire-longue"
  limiter: true

engines:
  - name: google
    engine: google
    shortcut: g
  - name: duckduckgo
    engine: duckduckgo
    shortcut: ddg
  - name: wikipedia
    engine: wikipedia
    shortcut: wp
  - name: arxiv
    engine: arxiv
    shortcut: ar

Interroger SearXNG depuis un agent IA

Une fois déployé, SearXNG expose une API JSON à l’adresse /search?q=ma+requête&format=json. Depuis Python, l’intégration est directe :

import requests

def search_web(query: str, num_results: int = 5) -> list[dict]:
    """Recherche web via SearXNG local."""
    resp = requests.get(
        "http://searxng:8080/search",
        params={"q": query, "format": "json", "pageno": 1},
        timeout=10,
    )
    resp.raise_for_status()
    results = resp.json().get("results", [])[:num_results]
    return [
        {"title": r["title"], "url": r["url"], "content": r.get("content", "")}
        for r in results
    ]

Cette fonction peut être exposée comme outil MCP (via FastMCP), comme fonction n8n (nœud HTTP Request), ou comme tool LangChain. L’agent dispose alors d’une capacité de recherche web en temps réel, entièrement auto-hébergée.

Intégration dans un pipeline RAG augmenté

Le cas d’usage le plus puissant consiste à combiner SearXNG avec un pipeline RAG existant. Le flux devient : l’utilisateur pose une question → l’agent interroge d’abord la base vectorielle Qdrant (connaissances internes) → si la confiance est insuffisante ou si la question porte sur l’actualité, l’agent lance une recherche SearXNG → les résultats web sont injectés dans le contexte du LLM (Ollama ou vLLM) → la réponse est générée avec des sources citées. Ce pattern, appelé « RAG avec fallback web », permet de couvrir à la fois les connaissances propriétaires et l’information publique à jour.

Exposer SearXNG comme serveur MCP

Pour les agents compatibles MCP (Claude, outils internes), SearXNG peut être encapsulé dans un serveur MCP avec FastMCP :

from fastmcp import FastMCP
import requests

mcp = FastMCP("searxng-search")

@mcp.tool()
def web_search(query: str, max_results: int = 5) -> list[dict]:
    """Recherche sur le web via SearXNG auto-hébergé."""
    resp = requests.get(
        "http://searxng:8080/search",
        params={"q": query, "format": "json"},
        timeout=10,
    )
    results = resp.json().get("results", [])[:max_results]
    return [
        {"title": r["title"], "url": r["url"], "snippet": r.get("content", "")}
        for r in results
    ]

Avec ce serveur MCP, n’importe quel agent IA du réseau interne peut appeler web_search comme un outil natif, sans connaître les détails de SearXNG.

Sécurisation et accès via Traefik et Keycloak

En production, SearXNG doit être protégé pour éviter les abus. Deux niveaux de sécurité se combinent : Traefik comme reverse proxy avec un middleware ForwardAuth vers Keycloak pour l’accès humain via navigateur, et le limiter.toml intégré de SearXNG pour contrôler le débit des requêtes API. Pour les appels machine-to-machine (agents IA), une approche courante consiste à restreindre l’accès au réseau Docker interne et à ne pas exposer le port sur l’interface publique.

Configuration avancée : moteurs et catégories

SearXNG supporte plus de 70 moteurs de recherche, organisés par catégories : general, images, news, science, it, files, social media. Pour une stack IA technique, les moteurs les plus utiles sont : Google et DuckDuckGo (résultats généraux), Arxiv et Semantic Scholar (articles scientifiques), GitHub (code et projets), Wikipedia (connaissances encyclopédiques), et StackOverflow (solutions techniques). Chaque moteur peut être activé, désactivé ou pondéré individuellement dans settings.yml. On peut aussi définir des catégories personnalisées pour que l’agent choisisse le périmètre de recherche adapté à chaque requête.

Positionnement dans la stack

Dans une architecture IA auto-hébergée complète, SearXNG occupe la couche « accès au web » : Ollama ou vLLM servent les modèles, Qdrant stocke les embeddings internes, Langfuse observe les traces, Open WebUI fournit l’interface utilisateur, n8n orchestre les workflows, et SearXNG donne aux agents la capacité de chercher sur le web en temps réel. C’est la brique qui transforme un LLM local en assistant véritablement connecté au monde, sans dépendance à une API commerciale de recherche.