Pour commencer, Ollama et Open WebUI
Depuis quelques temps, j’essaie de me former à la manipulation et l’utilisation des IA, surtout en mode local. L’intérêt premier est la gouvernance de ses données. On sait où sont nos données et avec qui on les partage.
J’ai donc installé le célèbre Ollama pour avoir un outil qui me permet de charger et d’exploiter des modèles en local. Évidemment la machine est équipée de GPUs. De ce coté j’ai cherché à avoir le meilleur compromis prix/mémoire, et je me retrouve avec 2 nVidia RTX 3060 12 GB VRAM. Mais ça fonctionne très bien avec moins de mémoire (c’est plus important encore que la puissance de calcul).
Alors, ollama, c’est très sympa, mais… l’interface n’est pas forcément la plus pratique. C’est là qu’intervient Open WebUI. C’est une interface “à la” ChatGPT qui permet de converser avec son IA. Avec quelques fonctionnalités bien pratiques, comme l’historique de ses discussions, la facilité de pouvoir passer d’un modèle (préalablement installé) à un autre (également préalablement installé). C’est très sympa, ça marche bien, et il y a plein de fonctionnalités dont je ne parlerai pas dans cet article.
Où est le problème ?
Quand on va converser avec un moteur d’IA, quel qu’il soit, ce dernier va aller chercher à compléter ce qu’on a écrit de façon logique à partir des informations qu’il a rencontrées pendant son entrainement. Au début des applications comme ChatGPT/LeChat ou autre, on rencontrait également fortement ce problème. Pour le corriger, il y a plusieurs techniques:
- Préciser dans le prompt système de ne pas inventer de réponse si on ne sait pas.
- Avoir un modèle plus gros, qui donc a plus de chances d’avoir rencontré le sujet de notre discussion.
- Compléter la demande de l’utilisateur avec une recherche Internet.
Évidemment, les applications commerciales utilisent l’ensemble de ces techniques pour limiter les hallucinations, qui sont devenues assez raisonnables aujourd’hui.
Mets un plus gros modèle alors
Ça serait avec plaisir, mais il faut beaucoup de mémoire, et beaucoup plus que mon budget me permet d’avoir… Avec 2x12 GB de VRAM, il y a déjà de quoi s’amuser mais on est loin d’un modèle omniscient. C’est pas mal pour avoir une ou deux infos, mais pour aller plus loin… c’est vite limité.
La technique du prompt système doit bien fonctionner non ?
Alors, pour la technique du prompt système, ça marche en effet très bien. Pour “rappel”, le prompt système est envoyé par le… système, à chaque fois qu’on envoie un message. Ça permet de forcer le modèle à suivre des indications assez précise de façon importante. Dans Open WebUI, on peut évidemment personnaliser et créer son propre prompt système. Et la technique fonctionne vraiment pas mal, même si c’est loin d’être parfait. Mais c’est très frustrant d’avoir son IA qui répond “je ne sais pas te répondre” une fois sur deux…
Et la recherche, ça fonctionne bien ?
La recherche, parlons-en ! Certains modèles (mais pas tous) peuvent appeler des agents. C’est à dire que en fonction de l’analyse de la question de l’utilisateur, il va pouvoir “faire appel à un ami”, c’est à dire appeler un outil/agent pour lui donner des informations complémentaires. On en trouve pour des calculs, par exemple, et bien entendu, avec Open WebUI, l’analyse de la question par le modèle, comme GPT-OSS:20b, peut se dire “hum, ça serait bien que je fasse une recherche web !”.
MAIS
ben oui, car y’a toujours un mais. Comment je la fais ma recherche ? Je vais sur Google ou DuckDuckGo et je lui pose la question ? C’est ce que je pensais. Mais malheureusement, ces moteurs là bloquent alors la recherche car elle n’est pas réalisée par un humain. Sans compter que ça contrevient aux conditions d’utilisations.
Comment faire une recherche depuis Open WebUI ?
L’idée va donc être de passer par des API. Il en existe des tonnes, mais il y en a assez peu qui sont gratuites. Je compte commencer au moins par une offre gratuite, vu l’usage très ponctuel que je fais de ces recherches. J’ai pu repérer
- SERPER qui offre 2500 crédits gratuits. Mais je ne sais pas ce que ça peut représenter en terme de recherches, et c’est à usage unique. Après, il faut payer, premier prix 50 USD
- ZenSERP qui propose 50 recherches gratuites par mois. Ça me semble vraiment peu pour mon usage
- SERPStack pour 100 recherches par mois
- Brave Search API qui propose une offre gratuite pour alimenter une IA, limitée à 2000 requêtes par mois avec un cap de 1 requête par seconde.
J’ai choisi cette dernière option, car je ne suis pas tout à fait sûr que les autres autorisent l’utilisation des résultat dans une IA.
1. Récupérer la clé d’API pour Brave Search API
Je vous passerai les détails pour se créer un compte sur Brave Search API, mais évidemment il va en falloir un.
On se rend sur le dashboard, et on demande une clé pour la recherche IA
Il nous suffit de faire Add API key et de précieusement la noter.
2. Utiliser un “proxy” de recherches
Ma première idée a été de mettre la clé d’API directement dans Open WebUI, mais ce dernier n’implémente pas de limite en requêtes par secondes. En plus, il lance plusieurs requêtes en parallèle, alors on se prend un message d’erreur. Je me suis alors dit qu’il suffisait d’utiliser le méta-moteur de recherches Searx-ng qui lui pourra faire une limitation de la vitesse des requêtes (et en plus il va rechercher sur d’autres moteurs également).
3. Mettre tout ensemble
Envie de voir ça en live ?
Je parle et j'expérimente sur des sujets tech sur ma chaîne Twitch. Si vous voulez poser vos questions, voir les coulisses de mes configurations ou simplement parler architecture système, opensource, SDR et IA, rejoignez-moi sur Twitch ! On y défriche ce genre de sujets le Vendredi et le Dimanche à 21h.
Pour avoir un système facilement déployable, j’ai fait une petite stack docker compose.
On va donc partir, dans un dossier créé à l’occasion, du fichier compose.yml
services:
openwebui:
image: ghcr.io/open-webui/open-webui:latest
container_name: openwebui
ports:
- "3000:8080"
volumes:
- open-webui:/app/backend/data
environment:
- WEBUI_NAME=OpenWebUI
restart: unless-stopped
depends_on:
- searxng
searxng:
image: searxng/searxng:latest
container_name: searxng
volumes:
- ./searxng/settings.yml:/etc/searxng/settings.yml
restart: unless-stopped
On crée un dossier searxng et on pose notre fichier de configuration adapté searxng/settings.yml.
En tâtonnant un peu je suis arrivé à ce fichier minimaliste, mais je suis preneur d’améliorations (notamment, il fait des recherches sur d’autres moteurs en complément de Brave). Pensez à générer une chaîne aléatoire complexe pour la secret_key si vous exposez ce port sur un réseau partagé:
use_default_settings: true
server:
bind_address: 0.0.0.0
port: 8080
limiter: false
secret_key: "clesecretepouraccederasearxng"
general:
api_enabled: true
botdetection:
enabled: false
search:
formats:
- html
- json
engines:
- name: brave
engine: brave
shortcut: br
categories:
- general
key: "COLLER ICI LA CLEF BRAVE API"
timeout: 3.0
rate_limit:
limit: 1
window: 1.0
L’utilisation de docker est un point pratique pour moi, mais vous avez les éléments pour faire un déploiement en natif sur une ou plusieurs machines avec ces informations.
4. Configuration de Open WebUI
4.1 démarrage de la stack
Première étape, évidemment, on démarre nos services. Dans le cas de docker, et dans le dossier du fichier compose.yml:
yves@desk:~/marvin/openwebui$ docker compose up
[+] Running 2/2
✔ Container searxng Recreated 0.3s
✔ Container openwebui Recreated 2.1s
Attaching to openwebui, searxng
searxng | SearXNG 2026.1.11-cf74e1d9e
[...]
Je vous laisserai créer un compte dans Open WebUI, il n’y a rien de particulier à signaler là dessus.
4.2 Configuration du moteur IA
Open WebUI permet d’utiliser le moteur IA de notre choix. Je vais donner ici l’exemple d’un serveur local compatible OpenAI, mais ça peut être celui que vous voulez.
En haut à droite, on va aller sur notre “logo” d’utilisateur, et choisir “Panneau d’administration”.!
Ensuite on va sur réglages
et connexions:

Pour un serveur vLLM local j’ai ce réglage là, mais évidement vous devez le personnaliser. Il existe l’option Ollama également, comme ça, il y a le choix !

Normalement, vous devriez pouvoir effectuer vos premières interrogations sur le modèle, mais sans recherche Internet.
4.3 Ajout du moteur de recherches
Toujours dans le panneau d’administration, et dans la section réglage, on va activer la recherche web, et donner les paramètres de recherche.

Si on retourne sur le moteur, on doit voir apparaître une option “Recherche Web”.

On va l’activer et voir si ça fonctionne…!

On notera qu’il est possible de cocher l’option
Ignorer l'Embedding et le Retrieval. Si vous cochez cette case, le texte brut des pages web trouvées est injecté directement dans le prompt (attention à la limite de contexte du modèle !). Si vous la décochez, Open WebUI va d’abord “lire” les pages, les vectoriser, et ne garder que les passages pertinents (RAG) pour les envoyer au modèle. La deuxième méthode est plus économe en mémoire mais parfois moins précise pour des questions globales.
Pour conclure
Il y a sans doute des améliorations à réaliser dans notre configuration, mais c’est un bon point de départ. J’ai vu, en écrivant l’article, que j’avais des erreurs dans SearXng pour des requêtes vers DuckDuck Go. On peut tweaker le fichier settings.yml pour l’exclure de la recherche. Mais comme les résultats sont corrects… je suis resté comme ça !
Besoin de déployer ce type d'IA dans votre entreprise ?
L'IA locale offre une souveraineté des données indispensable pour les professionnels. Si vous souhaitez mettre en place une architecture RAG robuste, sécurisée et connectée à vos outils internes (ou au web) sans faire fuiter vos données, je peux vous accompagner.