Chargement...
Chargement...
VouchComment un éditeur SaaS peut répondre à 200 questions de sécurité par prospect, en gardant zéro hallucination et 100 % de traçabilité, sans embaucher un RSSI à temps plein ?
Vouch est le projet enterprise que j'ai construit pour démontrer trois choses qu'un recruteur enterprise veut voir avant un entretien : DDD strict en .NET, GenAI native (pas de Python à côté), et un produit qui résout un vrai workflow B2B. Le pipeline est linéaire et lisible : upload de politiques → parsing (PdfPig / OOXML / Markdown) → chunking token-aware avec overlap → embedding (OpenAI ou fallback déterministe offline) → stockage pgvector. À l'arrivée d'un questionnaire XLSX, l'importer heuristique reconnaît les colonnes CAIQ / SIG / vendor-templates, classifie chaque question (type + framework via ML.NET heuristique), récupère les top-K chunks pertinents et appelle l'LLM (OpenAI ou Anthropic, via MEAI) pour générer une réponse JSON avec citations. L'invariant le plus important est codé dans l'agrégat Answer : pas de citation = pas de haute confiance. Impossible de bypasser. Multi-tenant via query filter automatique dans VouchDbContext. Audit log append-only co-commit pour les preuves SOC 2. Fallbacks pragmatiques : la démo tourne sans Postgres, sans clé API.
Mon portfolio penchait gaming / simulation. Il manquait un projet qui crie 'enterprise B2B SaaS avec compliance + GenAI' au premier coup d'œil. J'ai construit Vouch en quelques jours pour combler ce trou, et au passage prouver que GenAI native en .NET (MEAI + pgvector + Semantic Kernel optionnel) est mature.
Layering DDD strict : Vouch.Domain (pur C#, zéro dépendance) → Application (use cases + ports) → Infrastructure (EF Core + pgvector + parsers + MEAI). Vouch.Web et Vouch.Cli sont des hôtes qui composent la racine DI. Multi-tenant query filter inline (compatible InMemory + Npgsql) avec bypass `!_tenantContext.IsSet`. Embeddings via pgvector + index HNSW cosine_ops. Domain events dispatchés après commit via ScopedDomainEventDispatcher.
tests verts (31 domain invariants, 3 handlers, 26 infra + E2E pipeline)
setup requis pour la démo (offline, sans clé API)
des réponses citées ou rejetées (invariant domaine)
commande pour la démo end-to-end : `dotnet run --project src/Vouch.Cli -- demo`
Le pattern Result<T>/Error éliminé 100 % des exceptions de validation business. Le query filter multi-tenant + bypass !IsSet rend l'isolation impossible à oublier. Et surtout : prouver qu'on peut faire de la GenAI native en .NET (MEAI + pgvector + Polly) sans aucun sidecar Python change le narratif pour les architectures hybrides.