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

Link