AI

Costruire un’app di conferenza AI con lo stack composable di .NET

Dario Fadda Maggio 4, 2026

Integrare funzionalità AI nelle applicazioni .NET ha significato, fino a poco tempo fa, dover assemblare manualmente modelli, database vettoriali, pipeline di ingestione e framework per agenti provenienti da ecosistemi diversi — ognuno con le proprie API, le proprie librerie client e il proprio ciclo di breaking change. Il team .NET di Microsoft ha lavorato a un set di blocchi costruttivi componibili e modulari pensati per offrire astrazioni stabili su tutti questi aspetti. In questo articolo vediamo come questi componenti funzionano insieme attraverso ConferencePulse, un’app di conferenza interattiva costruita con .NET 10, Blazor Server e Aspire.

Il problema: frammentazione dell’ecosistema AI

Ogni provider AI espone API diverse. Ogni vector store ha il suo client. Ogni pipeline di ingestione è un progetto a sé. Il risultato è codice fortemente accoppiato a provider specifici, difficile da testare e quasi impossibile da migrare quando esce una nuova versione di un componente.

La risposta del team .NET è uno stack di astrazioni modulari: Microsoft.Extensions.AI, Microsoft.Extensions.DataIngestion, Microsoft.Extensions.VectorData, il Model Context Protocol (MCP) e il Microsoft Agent Framework. Nessun lock-in, nessun accoppiamento diretto.

ConferencePulse: l’app di riferimento

ConferencePulse è una Blazor Server app pensata per sessioni di conferenza live. Gli spettatori scansionano un QR code, entrano nella sessione e interagiscono con il presentatore tramite sondaggi e domande in tempo reale. Dietro le quinte, l’AI gestisce:

  • Sondaggi live generati automaticamente in base al contenuto della sessione
  • Q&A intelligente tramite pipeline RAG che attinge da una knowledge base, Microsoft Learn e wiki GitHub
  • Insight automatici sui pattern di voto e sulle domande del pubblico
  • Riepilogo finale prodotto da più agenti AI che analizzano i dati in parallelo

La struttura del progetto:

src/
├── ConferenceAssistant.Web/       ← Blazor Server (UI + orchestrazione)
├── ConferenceAssistant.Core/      ← Modelli, interfacce, stato sessione
├── ConferenceAssistant.Ingestion/ ← Pipeline di ingestione + ricerca vettoriale
├── ConferenceAssistant.Agents/    ← Agenti AI, workflow, tool
├── ConferenceAssistant.Mcp/       ← MCP server + client
└── ConferenceAssistant.AppHost/   ← .NET Aspire (Qdrant, PostgreSQL, Azure OpenAI)

Microsoft.Extensions.AI: un’interfaccia, qualsiasi provider

Microsoft.Extensions.AI introduce IChatClient, un’astrazione unificata compatibile con Azure OpenAI, OpenAI, Ollama, Foundry Local e altri provider. Ogni chiamata AI nell’app passa attraverso un’unica pipeline middleware:

var openaiBuilder = builder.AddAzureOpenAIClient("openai");

openaiBuilder.AddChatClient("chat")
    .UseFunctionInvocation()
    .UseOpenTelemetry()
    .UseLogging();

openaiBuilder.AddEmbeddingGenerator("embedding");

Il pattern dovrebbe risultare familiare a chi conosce il middleware di ASP.NET Core. Ogni .Use*() avvolge il client interno con comportamento aggiuntivo: UseFunctionInvocation() gestisce i tool call loop, UseOpenTelemetry() tracing ogni chiamata, UseLogging() cattura coppie request/response. Per passare da Azure OpenAI a Ollama basta cambiare il client interno — il middleware rimane invariato.

DataIngestion + VectorData: il livello di conoscenza

Prima di poter rispondere in modo utile, il modello ha bisogno di contesto. Microsoft.Extensions.DataIngestion offre una pipeline per processare documenti in chunk ricercabili. Microsoft.Extensions.VectorData astrae i vector store.

Quando ConferencePulse importa contenuto da un repository GitHub, lo passa attraverso questa pipeline:

IngestionDocumentReader reader = new MarkdownReader();
var tokenizer = TiktokenTokenizer.CreateForModel("gpt-4o");

var chunkerOptions = new IngestionChunkerOptions(tokenizer)
{
    MaxTokensPerChunk = 500,
    OverlapTokens = 50
};
IngestionChunker<string> chunker = new HeaderChunker(chunkerOptions);

var enricherOptions = new EnricherOptions(_chatClient) { LoggerFactory = _loggerFactory };

using var writer = new VectorStoreWriter<string>(
    _searchService.VectorStore,
    dimensionCount: 1536,
    new VectorStoreWriterOptions
    {
        CollectionName = "conference_knowledge",
        IncrementalIngestion = true
    });

using IngestionPipeline<string> pipeline = new(
    reader, chunker, writer,
    new IngestionPipelineOptions(), _loggerFactory)
{
    ChunkProcessors = {
        new SummaryEnricher(enricherOptions),
        new KeywordEnricher(enricherOptions, ReadOnlySpan<string>.Empty),
        frontMatterProcessor
    }
};

La pipeline legge il markdown, lo divide per intestazioni, arricchisce ogni chunk con sommari e parole chiave generate dall’AI, quindi produce embedding e li salva su Qdrant. Ogni componente è intercambiabile: MarkdownReader può diventare un lettore PDF, HeaderChunker può essere sostituito con un chunker a dimensione fissa, Qdrant può cedere il posto ad Azure AI Search — la composizione della pipeline rimane identica.

Nota importante: SummaryEnricher e KeywordEnricher utilizzano entrambi lo stesso IChatClient registrato nella sezione precedente. L’AI arricchisce il proprio contesto: il summarizer genera una descrizione concisa di ogni chunk, il keyword enricher estrae termini ricercabili. Entrambi migliorano la qualità del retrieval successivo.

Durante la sessione, l’app ingesta dati in tempo reale: risposte ai sondaggi, domande del pubblico, coppie Q&A e insight AI vengono tutti aggiunti alla knowledge base. Al termine di una sessione, la base di conoscenza contiene l’intero storico della conferenza.

IChatClient con tool: scegliere il giusto livello di complessità

Uno dei principi guida del progetto: usare l’approccio più semplice che risolve il problema. IChatClient con tool gestisce molti scenari prima che sia necessario un framework di agenti dedicato.

ConferencePulse include tre funzionalità AI a diversi livelli di complessità, tutte basate sullo stesso IChatClient:

  • Generazione insight — una singola chiamata GetResponseAsync quando un sondaggio si chiude
  • Q&A con RAG — una chiamata con tool che esegue la ricerca vettoriale quando necessario
  • Riepilogo multi-agente — workflow con Microsoft Agent Framework che fa girare più agenti in parallelo, poi consolida i risultati

Model Context Protocol (MCP): strumenti modulari per gli agenti

ConferencePulse include un server MCP che espone gli strumenti della sessione come tool AI. Questo permette a qualsiasi client MCP-compatibile di interagire con l’app: interrogare la knowledge base, leggere i risultati dei sondaggi, accedere agli insight. Il protocollo standardizzato significa che gli agenti possono essere composti con tool provenienti da fonti diverse senza integrazioni ad hoc.

Microsoft Agent Framework: orchestrazione multi-agente

Per la funzionalità di riepilogo finale, quando la complessità di orchestrazione supera ciò che IChatClient gestisce agevolmente, entra in gioco il Microsoft Agent Framework. Più agenti analizzano poll, domande e insight in concorrenza, poi consolidano i risultati in un riepilogo unificato. Il framework gestisce la comunicazione tra agenti, le dipendenze e la sincronizzazione — il codice applicativo rimane dichiarativo.

Perché questo approccio conta

Lo stack composable di .NET risolve problemi reali:

  • Nessun vendor lock-in: ogni componente ha un’astrazione provider-agnostica
  • Testabilità: le interfacce sono facilmente mockabili
  • Osservabilità integrata: OpenTelemetry è una riga di middleware
  • Scalabilità progressiva: si inizia con IChatClient semplice e si aggiunge complessità solo dove serve
  • Integrazione con DI e Aspire: tutto segue i pattern ASP.NET Core già noti

La combinazione di Microsoft.Extensions.AI, DataIngestion, VectorData, MCP e Agent Framework rappresenta la visione del team .NET per costruire applicazioni AI-powered in modo sostenibile: astrazioni stabili che sopravvivono ai cambiamenti dei provider, composizione familiare, e un percorso chiaro da scenari semplici a pipeline multi-agente complesse.


Fonte: Building an AI-Powered Conference App with .NET’s Composable AI Stack — Luis Quintanilla, .NET Blog (30 aprile 2026)

💬 Unisciti alla discussione!


Questo è un blog del Fediverso: puoi trovare quindi questo articolo ovunque con @blog@spcnet.it e ogni commento/risposta apparirà qui sotto.

Se vuoi commentare su Costruire un’app di conferenza AI con lo stack composable di .NET, utilizza la discussione sul Forum.
Condividi la tua esperienza, confrontati con altri professionisti e approfondisci i dettagli tecnici nel nostro 👉 forum community