e-naxosMAF COURSE / COURS
English

MICROSOFT AGENT FRAMEWORK · 0.16.0-rc.1

Demo220 — Business Retrieval

Contrôler le fait produit et la procédure avant le top-K hybride.

Objectifs

Préparer la démo

Depuis la racine de la distribution complète compilée en Release. Les projets partagés Maf.Rag et Maf.DemoConnection sont nécessaires. Le stockage SQLite est local. rebuild/probe/compare demandent les embeddings réels ; answer demande en plus le chat si des preuves restent admissibles. audit seul ne demande aucun modèle. Le profil livré sépare embeddinggemma:300m et granite4:3b.

Projects
ProjectRole
demos/Demo220_BusinessRetrieval/Demo220.App.csprojApp
shared/Maf.Rag/Maf.Rag.csprojShared implementation
shared/Maf.DemoConnection/Maf.DemoConnection.csprojConnection

Lancer depuis la racine

Créer la racine une seule fois pour la série RAG ; si Demo180 a déjà ingéré le corpus, garder sa valeur existante et ne pas exécuter à nouveau l’affectation ci-dessous. Sans index compatible, rebuild est requis explicitement.

$env:MAF_STATE_ROOT = Join-Path $env:TEMP ('maf-rag-' + [guid]::NewGuid().ToString('N'))
dotnet run --project demos/Demo220_BusinessRetrieval/Demo220.App.csproj -c Release --no-build -- --Rag:AsOf 2026-10-23

Modes et manipulation

Après ingestion : compare, puis Which quality control procedure applies to GX-900 gears after heat treatment? Refaire pour GX-999 et une question de recette de cuisine.

public static SearchHit[] Rank(string question, IEnumerable<SearchHit> candidates, float minCosine = MinCosine)
{
    if (!float.IsFinite(minCosine) || minCosine < -1 || minCosine > 1)
        throw new ArgumentOutOfRangeException(nameof(minCosine));
    var all = candidates.OrderByDescending(h => h.Cosine).ThenBy(h => h.Chunk.Id, StringComparer.Ordinal).ToArray();
    var terms = Terms(question);
    var lexical = all.Select(h => (h.Chunk.Id, Overlap: Terms(h.Chunk.Source.Title + " " + h.Chunk.Text).Intersect(terms).Count()))
        .Where(h => h.Overlap > 0).OrderByDescending(h => h.Overlap).ThenBy(h => h.Id, StringComparer.Ordinal)
        .Select((h, i) => (h.Id, Rank: i + 1)).ToDictionary(h => h.Id, h => h.Rank);
    return all.Select((h, i) => h with { Rank = 1.0 / (60 + i + 1)
            + (lexical.TryGetValue(h.Chunk.Id, out int rank) ? 1.0 / (60 + rank) : 0) })
        .Where(h => h.Cosine >= minCosine && lexical.ContainsKey(h.Chunk.Id))
        .OrderByDescending(h => h.Rank).ThenBy(h => h.Chunk.Id, StringComparer.Ordinal).Take(3).ToArray();

shared/Maf.Rag/RetrievalPolicy.cs · L12–L24 · 9a895c94534c

Code source · Maf.Rag · Dossier

Résultats et échecs utiles

Contrôler le fait produit et la procédure avant le top-K hybride. Un produit absent ou retiré donne zéro contexte exploitable. Les faits structurés sont dans RagProducts, pas déduits d’une note sémantiquement proche.

Ces observations sont attendues par lecture du code à la révision publique liée. Le lot du site rejoue séparément les tests déterministes : il ne présente pas une réponse générée ou un score de fournisseur non mesuré comme une sortie observée.

Persistance et limites

L’index est partagé dans la racine sélectionnée ; le démarrage ne le réinitialise pas. rebuild remplace les tables RAG volontairement et une incompatibilité de modèle d’embeddings, dimension, corpus ou découpage échoue explicitement. Changer le chat seul ne modifie pas les vecteurs. Pas d’effacement universel, de qualification générale du modèle ni de garantie de production.

dotnet test tests/Maf.Rag.Tests/Maf.Rag.Tests.csproj -m:1 -c Release --no-build --no-restore

Poursuivre et vérifier

Prérequis

Pour poursuivre

Dossier complet de la démo · README

lot008-memory-rag-1 · 2026-10-24 · 9a895c94534cd5fc6f3da883e37e5f7856e588c1