Il provider Chroma per Microsoft.Extensions.VectorData è entrato nell'AI Community Toolkit, il progetto della .NET Foundation che raccoglie i provider per le astrazioni vettoriali di .NET. Il pacchetto si chiama CommunityToolkit.VectorData.Chroma, in versione 1.0.0-preview.
L'ho scritto in ChromaDotNet.VectorData e proposto al toolkit, dove è stato accolto dopo la review. Dal 9 ottobre si sviluppa lì.
Cos'è l'AI Community Toolkit
L'AI Community Toolkit è il progetto della .NET Foundation dove vivono i provider di Microsoft.Extensions.VectorData, le astrazioni di .NET per i vector store usate da Semantic Kernel e Microsoft Agent Framework. Con queste astrazioni lo stesso codice salva e cerca i record su database diversi: per cambiare database si cambia il provider.
I provider erano dentro Semantic Kernel. Sono stati spostati nel toolkit per dargli una casa neutrale, non legata a un singolo prodotto. Nel toolkit ci sono Qdrant, Redis, PostgreSQL, SQL Server, Azure AI Search, Cosmos DB e gli altri. Le review e le release le fanno i maintainer di Microsoft che curano Microsoft.Extensions.VectorData.
Adesso c'è anche Chroma.
Come si usa
Serve Docker per avviare Chroma:
docker run -p 8000:8000 chromadb/chroma:1.5.9
Poi il pacchetto:
dotnet add package CommunityToolkit.VectorData.Chroma
Un modello, una collezione, una ricerca con un filtro:
using ChromaDB.Client;
using CommunityToolkit.VectorData.Chroma;
using Microsoft.Extensions.VectorData;
using var httpClient = new HttpClient();
var client = new ChromaClient(new ChromaConfigurationOptions("http://localhost:8000"), httpClient);
using var vectorStore = new ChromaVectorStore(client, ownsClient: false);
var hotels = vectorStore.GetCollection<string, Hotel>("hotels");
await hotels.EnsureCollectionExistsAsync();
await hotels.UpsertAsync(new Hotel { Id = "h1", Name = "Grand", Rating = 5, Embedding = new float[] { 0.1f, 0.2f, 0.3f, 0.4f } });
await foreach (var result in hotels.SearchAsync(new float[] { 0.1f, 0.2f, 0.3f, 0.4f }, top: 3, new() { Filter = h => h.Rating >= 4 }))
{
Console.WriteLine($"{result.Record.Name}: {result.Score}");
}
public sealed class Hotel
{
[VectorStoreKey]
public string Id { get; set; } = "";
[VectorStoreData(IsFullTextIndexed = true)]
public string? Name { get; set; }
[VectorStoreData]
public int Rating { get; set; }
[VectorStoreVector(4)]
public ReadOnlyMemory<float> Embedding { get; set; }
}
Gli embedding sono scritti a mano per tenere l'esempio corto. In un progetto vero arrivano da un modello, per esempio con Microsoft.Extensions.AI.
Con la dependency injection basta una riga:
services.AddChromaVectorStore("http://localhost:8000");
Cosa c'è sotto
Il provider è costruito su ChromaDotNet.Client, un client per tutta l'API v2 di Chroma, Chroma Cloud compreso. Il client è provato su nove versioni di Chroma, dalla 0.4.10 alla 1.5.9, e i difetti noti dei server sono documentati nella tabella di compatibilità.
Su Chroma Cloud il provider fa anche la ricerca ibrida, vettori e parole chiave insieme, con HybridSearchAsync.
Nella CI del toolkit il provider fa girare i test di conformità di Microsoft.Extensions.VectorData contro un Chroma vero, come gli altri provider.
Il client e le altre librerie di ChromaDotNet sono presentati in un articolo precedente.
Grazie
- Adam Sitnik, per la review e per aver accolto il provider nel toolkit.
- Jiri Cincura, Nedeljko Savic, Rich Lander e Hamed Hasani, autori di ChromaDB.Client, il client da cui ChromaDotNet è ripartito.
- Luis Quintanilla, che con Jiri Cincura ha presentato ChromaDB.Client sul blog .NET nel 2025.
- Shay Rojansky, per Microsoft.Extensions.VectorData e i suoi test di conformità, che il provider fa girare.
- Gli autori del provider Qdrant, da cui il provider Chroma ha preso la struttura.
- Anisa Haxhialushi, per aver creduto in me e avermi supportato in questo progetto.
Link
- Pacchetto: CommunityToolkit.VectorData.Chroma
- Codice: CommunityToolkit/AI
- Pull request: CommunityToolkit/AI#58
- Client: chromadotnet.org