惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

S
Secure Thoughts
C
Cybersecurity and Infrastructure Security Agency CISA
T
Tenable Blog
Project Zero
Project Zero
T
The Exploit Database - CXSecurity.com
T
Threat Research - Cisco Blogs
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
Cyberwarzone
Cyberwarzone
PCI Perspectives
PCI Perspectives
G
GRAHAM CLULEY
H
Hacker News: Front Page
Cloudbric
Cloudbric
Latest news
Latest news
N
News and Events Feed by Topic
C
CERT Recently Published Vulnerability Notes
Attack and Defense Labs
Attack and Defense Labs
SecWiki News
SecWiki News
Security Latest
Security Latest
MyScale Blog
MyScale Blog
阮一峰的网络日志
阮一峰的网络日志
Vercel News
Vercel News
The GitHub Blog
The GitHub Blog
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
Security Archives - TechRepublic
Security Archives - TechRepublic
V2EX - 技术
V2EX - 技术
B
Blog RSS Feed
L
LINUX DO - 最新话题
人人都是产品经理
人人都是产品经理
Last Week in AI
Last Week in AI
IT之家
IT之家
Jina AI
Jina AI
Y
Y Combinator Blog
博客园 - 聂微东
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
V
Visual Studio Blog
P
Privacy International News Feed
B
Blog
S
Schneier on Security
Application and Cybersecurity Blog
Application and Cybersecurity Blog
D
Darknet – Hacking Tools, Hacker News & Cyber Security
Hacker News - Newest:
Hacker News - Newest: "LLM"
Help Net Security
Help Net Security
D
DataBreaches.Net
博客园_首页
G
Google Developers Blog
I
InfoQ
量子位
大猫的无限游戏
大猫的无限游戏
S
Security @ Cisco Blogs

DEV Community

Authentication Security Deep Dive: From Brute Force to Salted Hashing (With Java Examples) Why AI Systems Don’t Fail — They Drift Spilling beans for how i learn for exam😁"Reinforcement Learning Cheat Sheet" I Replaced Chrome with Safari for AI Browser Automation. Here's What Broke (and What Finally Worked) How Python Borrows Other People's Work The $40 Architecture: Processing 1 Billion API Requests with 99.99% Uptime Vibe Coding: A Workflow Guide (From Zero to SaaS) Most webhook security guides protect the wrong side. The scary part is delivery. Headless CMS for TanStack Start: Build a Blog with Cosmic EU Age Verification App "Hacked in 2 Minutes" — What Actually Happened Comfy Cloud’s delete function does not actually remove files Running AI Models on GPU Cloud Servers: A Beginner Guide Event-driven media intelligence with AWS Step Functions and Bedrock I scored 500 AI prompts across 8 quality dimensions — here's what broke How to Call Google Gemini API from Next.js (Free Tier, No Backend Needed) The Portal Protocol: Reclaiming Human Connection in the Age of AI How to Fix Your Team's Scattered Knowledge Problem With a Self-Hosted Forum Intro to tc Cloud Functors: A Graph-First Mental Model for the Modern Cloud Designing Multi-Tenant Backends With Both Ownership and Team Access I Built a Neumorphic CSS Library with 77+ Components — Here's What I Learned PostgreSQL Performance Optimization: Why Connection Pooling Is Critical at Scale Cómo construí un SaaS multi-rubro para gestionar expensas en Argentina con FastAPI + Vue 3 🚀 I Built an Ethical Hacking Scanner Tool – Open Source Project I Replaced /usage and /context in Claude Code With a Single Statusline A Pythonic Way to Handle Emails (IMAP/SMTP) with Auto-Discovery and AI-Ready Design I Collected 8.9 Million Polymarket Price Points — Here's What I Found About How Markets Really Move EcoTrack AI — Carbon Footprint Tracker & Dashboard Everyone's Using AI. No One Agrees How. 5 self-hosted ebook managers worth trying in 2026 Building Your First AI Agent with LangChain: From Chatbot to Autonomous Assistant Common SOC 2 Failures (Real World) Stop Vibe-Checking Your AI App: A Practical Guide to Evals How to Use SonarQube and SonarScanner Locally to Level Up Your Code Quality Your Next To-Do App Is Dead — I Replaced Mine with an OpenClaw AI Sign a Nostr event in 60 lines of Python using coincurve — no nostr-sdk, no nbxplorer, no rust toolchain ITGC Audit Explained Like You’re in Big 4 Patch Tuesday abril 2026: Microsoft parcha 163 vulnerabilidades y un zero-day en SharePoint Stop scraping everything: a better way to track competitor price changes Listing on MCPize + the Official MCP Registry while routing payments OUTSIDE the marketplace — how I kept 100% of my x402 revenue Building an AI-Powered Risk Intelligence System Using Serverless Architecture Why We Ripped Function Overloading Out of Our AI Toolchain Testing AI-Generated Code: How to Actually Know If It Works SaaS Churn Is Killing Your Business. Here Is What to Do About It (Without a Support Team) The Speed of AI Is No Longer Linear - And Self-Improving Models Are Why How to Implement RBAC for MCP Tools: A Practical Guide for Engineering Teams From Standard Quote to Persuasive Proposal: AI Automation for Arborists I built a CLI that scaffolds complete multi-tenant SaaS apps Axios CVE-2025–62718: The Silent SSRF Bug That Could Be Hiding in Your Node.js App Right Now The dashboard that ended our friendship Data Pipelines Explained Simply (and How to Build Them with Python) The Hidden Cost of AI Systems Nobody Talks About. undefined vs undeclared, and how typeof behaves Switching from file-based jobs to NATS/Kafka in Rust without changing code io_uring Adventures: Rust Servers That Love Syscalls Why Agentic AI is Killing the Traditional Database The POUR principles of web accessibility for developers and designers Quantum Neural Network 3D — A Deep Dive into Interactive WebGL Visualization How To Install Caveman In Codex On macOS And Windows Automation Pipeline Reliability: Why Your Workflow Breaks When Nobody Is Watching I Built an 'Open World' AI Coding Agent — It Works From ANY Folder From Freelancing to Product: A Tech Service Company's SaaS Transformation China's AI Giants: Adding Tencent Hunyuan & ByteDance Doubao to AI University (74 Providers) On the Vibe Coders and Their Lies clerk: Auto-Summarize Your Claude Code Sessions AI Weekly — 2026/04/10–04/17 | The Model Lockdown Is Here, but the Toolchain Is the Real Battleground AI 週報 — 2026/04/10–2026/04/17 模型封鎖潮來了,但工具鏈才是真戰場 Maybe this is how Open-Source apps are born... 🚀 Fine-Tune LLMs with LoRA and QLoRA: 2026 Guide tRPC v11 + Next.js App Router: End-to-End Type Safety Without the Boilerplate ShadCN UI in 2026: Why I Stopped Installing Component Libraries and Started Owning My Components SaaS Billing in React Server Components: Stripe + Supabase Without a Single `useEffect` Join our DEV Weekend Challenge — $1,000 in Prizes Across TEN winners! Submissions Due April 20 at 6:59 AM UTC. Implementing FSRS Spaced Repetition in Flutter + Supabase — Adding Memory Science to an AI Learning App "I Texted My Localhost From the Train — Claude Code Fixed the Bug Before I Got Home" I Built a Sales Prep AI and It Went Deeper Than Expected Design to Code #2: One JSON, Eleven Outputs Solving the 100M-Row Problem: A Summary Table Pattern for High-Volume Push Notification Logs Flutter Web With Wasm: What Actually Changes For Developers I Built 50 Royalty-Free Soundtracks for My Side Project in a Weekend Using AI Music Generation The Vibe Coding Security Checklist: 7 Things to Check Before You Ship Stop Letting Googlebot Guess Fix Your React App's SEO Right Desconstruindo o Streaming do LinkedIn: Como Criar um Engine de Extração de Vídeo de Alta Performance com HLS e FFmpeg (EDA Part-1) EDA (Exploratory Data Analysis) Explained With Real Life — Why Looking at Your Data Is the Most Important Step in Machine Learning Brand Relationship Management at Scale: Our 4-Touch Outreach System for 200+ Brands Why String.fromEnvironment() Might Return an Empty String in Dart JGuardrails 1.0.0 — Hardening Java LLM Apps Against Jailbreaks, Toxicity, and Prompt Injection Plan and Schedule a Full Week of Threads Content From One Claude Conversation Coding Cat Oran Ep3, Five Tables Changed Everything Updated: BFF Pattern I'm done watching freelancers get buried by 200 proposals. So I'm building the alternative. This is my first post BFS Algorithm in Java Step by Step Tutorial with Examples Tracking LLM Pricing Monthly: An Open Dataset for 22 AI Models How We Measure Content ROI on a Comparison Site: Revenue Attribution Without Perfect Data Introducing Nova AI Ops: The AI-Native Operating System for SRE Teams I built a free desktop video downloader for Windows — Grabbit How Talkie OCR Helps Vision-Impaired & Dyslexic Users Read the World Around Them VRCFaceTracking安装和iPhone面捕配置教程,有bug Even CrowdStrike Can't See Your Agents The Automation Gold Rush: What n8n Workflows and Claude Are Opening Up for Developers Right Now
Petits Modèles, Grands Outils : L'Ingénierie derrière un Agent IA Local en Production
Quentin Merle · 2026-06-16 · via DEV Community

Il y a un mythe persistant selon lequel pour construire un assistant de code digne de ce nom, il faut absolument utiliser GPT ou Claude. C'est faux. Vous n'avez pas besoin d'un modèle à 1 trillion de paramètres. Vous avez besoin d'un modèle local de taille réduite et d'une ingénierie extrêmement rigoureuse autour de lui.

C'est d'ailleurs le sens de l'histoire pour les entreprises. Comme l'évoquait Mark Zuckerberg, l'avenir n'est pas à un modèle omniscient unique, mais à "chaque entreprise avec sa propre IA spécialisée". Et cette spécialisation passe obligatoirement par le fine-tuning et le déploiement local (ou sur serveurs souverains) pour garantir la sécurité des données.

La thèse derrière la construction de Vibrisse Agent tient en une phrase : Small models, Great tools.

Dans cet article, je vais détailler la stack technique et les solutions d'ingénierie concrètes que j'ai mises en place pour dompter un modèle local et le rendre fiable en production : LangGraph, Ollama, FastAPI, React (sans build step, avec CSS custom embarqué), le tout tournant sur une machine avec 32 Go de RAM.

Pour les curieux qui souhaitent lancer l'agent sur leur machine dès maintenant :

// MacOs / Linux
curl -sSL https://agent.vibrisse-studio.dev/install.sh | bash

// Windows
irm https://agent.vibrisse-studio.dev/install.ps1 | iex


L'Architecture : Pourquoi une Machine à États (LangGraph) ?

Au début, quand on construit une application LLM, on a tendance à penser en chaîne séquentielle : Input -> Prompt -> Outil -> Output. Le problème, c'est que si un nœud échoue, toute la chaîne s'arrête sans qu'on puisse rattraper l'erreur ou comprendre le contexte du plantage.

C'est là qu'intervient LangGraph. L'architecture de Vibrisse n'est pas une chaîne, c'est une machine à états. Chaque nœud du graphe a une responsabilité très précise, partage un état global de la conversation, et utilise des transitions conditionnelles pour passer au nœud suivant.

J'ai implémenté le pattern Supervisor / Worker :

  • Le Supervisor analyse l'intention de l'utilisateur. Il ne fait rien d'autre que de router.
  • Il dispatche la tâche vers des Workers spécialisés (le Worker RAG, le Worker Search, le Ghost Worker...).
  • Si un Worker échoue ou a besoin de plus d'informations, il peut renvoyer l'état au Supervisor.

Le Vrai Combat : Dompter la "Paresse" des Petits Modèles

La partie la plus précieuse de ce projet — et celle que très peu de tutoriels documentent honnêtement — a été le combat contre la nature des petits LLM.

Le Choix des Armes : Les Modèles Vainqueurs

Si vous vous demandez quels modèles ont survécu à mes crash-tests : j'ai construit tout le cœur de l'agent autour de Gemma 4 (e4b). Pourquoi ? Parce qu'il intègre nativement la gestion de la vision et des "thoughts" (pensées), tout en offrant ce style de réponse très structuré à la Google. En revanche, pour tout ce qui est évaluation et métriques, j'ai dû basculer sur Llama 3 8B. Un trop petit modèle s'avère incapable d'évaluer ses propres réponses de façon fiable.

Contraintes et Pensée à Haute Voix

Sans contrainte stricte, un modèle local prendra toujours le chemin de la moindre résistance. Concrètement, si vous lui demandez de refactoriser un fichier complexe à 3h du matin sans directives fermes, il vous écrira fièrement : // ... rest of the code here.

La solution ? Des prompts système ultra-structurés, qui imposent un rôle, un format de sortie JSON strict, et surtout, l'obligation de "penser à haute voix". Imposer l'utilisation d'une balise <thought> avant de déclencher une action est primordial pour deux choses : déboguer pourquoi l'agent a pris une mauvaise décision de routage, et améliorer l'UX.

Le Triple-Layer Robust Parsing

Forcer un LLM à répondre en JSON n'est que la moitié du combat. Quand le modèle "fatigue" ou s'emmêle dans le contexte, il peut générer du JSON mal formaté. Pour que l'agent ne plante pas, j'ai dû concevoir un système de parsing à 3 couches :

  1. Couche 1 : Parsing JSON classique.
  2. Couche 2 : Fallback Regex pour extraire l'objet si le modèle a rajouté du texte autour.
  3. Couche 3 : Si le JSON est totalement cassé, un fallback par mots-clés devine l'intention pour une action de repli. Zéro plantage.

Anecdote : Cette approche est née d'un exercice de pensée vers la fin du projet : "Et si on devait faire tourner cet agent sur une machine très modeste avec un SLM (Small Language Model) très instable ?". Les contraintes forcées ont accouché de ces astuces de résilience que j'ai conservées. (Peut-être le point de départ d'un futur "Vibrisse-Lite" ? Affaire à suivre...)


Triple-Layer Retrieval : Un RAG Précis, pas Bruitant

Le RAG n'est pas fait pour gaver le modèle de contexte. Plus vous envoyez de texte à un petit modèle, plus il hallucine. Le contexte doit être ciblé et ultra-précis. L'agent Vibrisse utilise un Triple-Layer Retrieval :

  1. La Couche Déterministe (Ripgrep) : Pour les requêtes exactes (ex: "Où est définie la variable API_KEY ?"). C'est 100% précis, 0% d'hallucination.
  2. La Couche Sémantique (ChromaDB) : Pour comprendre l'intention (ex: "Montre-moi comment on gère les erreurs").
  3. La Couche Statistique (BM25) : Un filet de sécurité classique.

On ne choisit pas une méthode, on exécute les trois et on fusionne les résultats.


Les Muscles de l'Agent : MCP Hub, Web Search et Ghost Mode

Un LLM seul n'est qu'un "cerveau dans un bocal". Il faut bien se rendre compte que pour lui greffer des muscles, la moindre action doit être pensée et codée, ce qui casse vite le côté "magique". Vous voulez que votre agent fasse un simple grep ? Il faut coder l'outil, le tester seul, puis le tester après une action de Vision, puis après une recherche Web, pour s'assurer que LangGraph ne plante pas.

Ghost Mode

L'agent dispose d'outils locaux, mais aussi d'outils connectés comme la Recherche Web (Tavily API), vitale pour aller chercher la documentation la plus récente avant de répondre.

Le MCP Hub (Model Context Protocol)

Au lieu de réinventer la roue, j'ai intégré le standard MCP d'Anthropic. Vibrisse agit comme un MCP Client. Ajouter un outil revient simplement à brancher un Serveur externe. L'architecture est ainsi "future-proof", prête pour les évolutions comme le webMCP de Google.

Le Ghost Mode : In-File Directives

C'est la killer-feature du workflow. Le but d'un agent n'est pas de vous forcer à discuter dans un chat.

Ghost Mode Avant

Ghost Mode Après

Un WatcherService (basé sur la librairie Python watchdog) tourne en fond. Dès qu'il détecte le tag @vibrisse: dans un commentaire sauvegardé, il déclenche un Ghost Worker silencieux qui génère et injecte le code directement dans l'éditeur.


Le Mode Architecte : Human-in-the-Loop et Artefacts

Pour les tâches complexes, laisser un agent autonome exécuter des dizaines de commandes en boucle est un suicide architectural. Il faut un frein à main. J'ai donc implémenté un pattern Human-in-the-Loop avec LangGraph.

L'interruption de graphe (interrupt_after)

Lorsqu'une tâche structurelle est détectée, le routeur bascule sur un nœud dédié (planning_node). Ce nœud génère un plan d'action formaté en Markdown, enveloppé dans des balises XML strictes (<artifact id="plan">).
La subtilité LangGraph : le graphe est compilé avec l'instruction interrupt_after=["planning_node"]. Dès que le plan est généré, l'exécution s'arrête net côté backend et l'état est sauvegardé en base de données.

Rendu Frontend et Reprise d'État

Côté React, l'UI intercepte ces balises avec une expression régulière, masque le XML brut, et génère un composant interactif riche (un CodeDiff, un diagramme Mermaid, ou un TaskBoard). L'utilisateur a alors des boutons pour "Approuver" ou "Rejeter" la proposition.

Le plus gros piège technique de cette fonctionnalité ? La reprise d'état (Resume).
Quand l'utilisateur clique sur "Approuver", le frontend appelle une route qui relance le graphe LangGraph. Sauf que si on reprend la conversation sans rien dire, le petit LLM se retrouve avec son propre message (AIMessage) en fin d'historique de contexte et se met à halluciner la suite de la discussion.
La solution ingénieuse : Injecter silencieusement un HumanMessage ("Plan approuvé. Tu peux procéder à l'implémentation") dans l'état avant de relancer l'inférence. Le modèle a ainsi une directive claire et sait exactement ce qu'on attend de lui.


Persistance et Limites de Contexte

Guérir l'Amnésie

Un agent qui oublie les décisions prises 2 heures plus tôt est inutile. Vibrisse utilise SQLite pour la persistance complète des threads, couplé à la génération automatique d'un project_map.json à chaque lancement.

L'autre ennemi juré, c'est la limite de la fenêtre de contexte (souvent 8k tokens sur ces petits modèles). Si le RAG ramène trop de fichiers, le contexte explose. Pour gérer cela, Vibrisse surveille en permanence la consommation de tokens et l'affiche en direct dans la Sidebar de l'UI. Le développeur sait ainsi exactement quand le contexte est saturé et qu'il est temps de rafraîchir la conversation.

Sovereign Routing : Déléguer Intelligemment

L'agent analyse la complexité de chaque requête avant d'agir :

  • Requête simple -> Modèle local (Ollama). Résultat immédiat.
  • Requête complexe -> L'agent propose de basculer sur un modèle Cloud plus puissant, avec le consentement explicite de l'utilisateur.

Sovereign Routing


L'Éléphant dans la Pièce : Latence et RAM

Il faut être honnête sur le principal défaut de l'IA locale : la latence. Combiner une analyse de Vision avec la génération d'un composant React complexe peut prendre jusqu'à 3 minutes (voir plus) sur une machine grand public. C'est le prix à payer pour de la confidentialité totale et du local.

Pour rendre cela gérable, Vibrisse intègre un vrai suivi des ressources matérielles :

  • Un check de (V)RAM à l'installation pour configurer finement l'agent via le Wizard d'onboarding.
  • Une jauge de ressources dans la Sidebar pour surveiller la charge machine en direct.
  • La ThinkingConsole : Le streaming "live" des tokens de pensée. Même quand l'action locale est lente, voir le texte défiler réduit drastiquement la friction cognitive de l'attente. C'est du "Design de vitesse".

Onboarding Wizard


La Règle d'Or : Tester par Blocs

Chaque nouvelle feature ajoutée risque de casser une feature existante. Le routeur (qui lit les intentions) est le point le plus capricieux de toute l'architecture. Au moindre ajustement dans la description d'un outil, il peut dérailler. Tout repose sur la sémantique.

La règle absolue : tester, tester, et retester. Même quand on a la flemme. Mais comment tester un système dont les réponses sont aléatoires ?
J'ai mis en place le framework RAGAS (piloté par Llama 3 8B) pour évaluer la qualité et la pertinence du RAG de façon automatisée. À cela s'ajoutent des fichiers de scénarios (tests manuels rigoureux) et des scripts de tests Python légers pour s'assurer que les chaînes de routage ne cassent pas avant d'ajouter le bloc suivant.


Conclusion : L'Éloge du Petit Modèle

Vibrisse n'est pas "le meilleur agent du monde". Il y aura toujours des modèles Cloud plus performants. Mais Vibrisse est la preuve qu'une philosophie Small models, Great tools tient la route en production, à condition d'y mettre la rigueur d'ingénierie nécessaire.

L'outil est open-source. Le code est là.


À vous de jouer :

  • Vibrisse Agent sur GitHub
  • Le projet est pensé pour être "plug-and-play" avec des scripts d'installation (install.sh / .bat) pour Mac, Linux et Windows.
  • Le projet est ouvert aux contributions. Que ce soit pour ajouter un nouveau Worker (un outil MCP), optimiser le système de parsing, ou juste corriger un bug sur le Ghost Mode... Les Pull Requests sont plus que bienvenues ! Venez casser le code et le reconstruire avec moi.
  • Si vous deviez construire ou adapter une stack agentique aujourd'hui, quelle est la partie qui vous fait le plus peur à stabiliser ? Le Routing ? Le Parsing ? La gestion du contexte ?
  • Dites-le-moi en commentaire.

Fièrement développé à Beauce, au Québec 🇨🇦. Intéressé(e) par la souveraineté locale en IA ? Contactez-nous via Vibrisse Studio !