Chroma è uno dei database vettoriali open source più usati per la ricerca semantica e per la RAG, cioè per dare a un modello linguistico i documenti giusti da cui rispondere. Da Python si usa in due righe.
Per .NET, a febbraio 2025 Microsoft aveva presentato sul blog .NET la libreria della community ChromaDB.Client (copia d'archivio, versione cinese). Oggi quell'articolo non è più sul blog in inglese, e la libreria si è fermata: è rimasta all'API v1, che Chroma 1.x non serve più.
ChromaDotNet nasce per questo: riprende quel lavoro dove si era fermato e lo porta avanti, con il codice originale e i suoi autori nella storia del progetto:
Cosa c'è dentro
- ChromaDotNet.Client: un client per tutta l'API v2 di Chroma, Chroma Cloud compreso, provato da Chroma 0.4.10 a 1.5.9. Gira su .NET 8 e successivi, .NET 10 compreso, su .NET Framework 4.6.2 e sulle piattaforme .NET Standard 2.0, con tracce e metriche OpenTelemetry.
- ChromaDotNet.VectorData: un provider per Microsoft.Extensions.VectorData, le astrazioni che usano Semantic Kernel e Microsoft Agent Framework. Con Chroma come vector store, il codice dell'applicazione resta quello di sempre.
- ChromaDotNet.Testcontainers: un modulo per Testcontainers for .NET, per avviare un Chroma usa e getta nei test.
- ChromaDotNet.Aspire.Hosting e ChromaDotNet.Aspire.Client: le integrazioni per Aspire, con Chroma nell'app host e il client nei servizi.
- Due repo di esempi, per Semantic Kernel, con Azure OpenAI, e per Agent Framework, con Microsoft Foundry; gli esempi di chat girano anche in locale con Ollama.
Provarlo in due minuti
Serve Docker per avviare Chroma:
docker run -p 8000:8000 chromadb/chroma:1.5.9
Poi, in una console .NET:
dotnet add package ChromaDotNet.Client
using ChromaDB.Client;
using var client = new ChromaClient("http://localhost:8000");
var collection = await client.GetOrCreateCollectionAsync("docs");
var docs = client.GetCollectionClient(collection);
await docs.AddAsync(["doc-1"],
embeddings: [new([0.1f, 0.4f, 0.2f])],
documents: ["Chroma from .NET"]);
var results = await docs.QueryAsync(
new ReadOnlyMemory<float>([0.1f, 0.4f, 0.2f]), nResults: 1);
Console.WriteLine(results[0].Document);
Gli embedding qui sono scritti a mano per tenere l'esempio corto: in un progetto vero arrivano da un modello, per esempio con Microsoft.Extensions.AI.
Perché
Sempre più applicazioni .NET hanno una parte di AI, e quasi tutte hanno bisogno di un vector store. Chroma si avvia in locale con un container e scala su Chroma Cloud, ma senza un client aggiornato da .NET restava fuori portata. Ogni libreria è provata nella CI contro versioni reali di Chroma, e il provider fa girare i test di conformità di Microsoft.Extensions.VectorData.
È un progetto della community, con licenza MIT, non affiliato con Chroma. Se lo provi e trovi qualcosa che non va, apri una issue su GitHub.