Vectordatabases voor .NET AI-apps

Vectordatabases slaan vector-insluitingen op en beheren. Insluitingen zijn numerieke weergaven van gegevens die semantische betekenis behouden. Woorden, documenten, afbeeldingen, audio en andere typen gegevens kunnen allemaal worden gevectoriseerd. U kunt insluitingen gebruiken om een AI-model te helpen de betekenis van invoer te begrijpen, zodat deze vergelijkingen en transformaties kan uitvoeren, zoals het samenvatten van tekst, het vinden van contextgerelateerde gegevens of het maken van afbeeldingen op basis van tekstbeschrijvingen.

U kunt bijvoorbeeld een vectordatabase gebruiken om het volgende te doen:

  • Identificeer vergelijkbare afbeeldingen, documenten en nummers op basis van hun inhoud, thema's, sentimenten en stijlen.
  • Identificeer vergelijkbare producten op basis van hun kenmerken, functies en gebruikersgroepen.
  • Inhoud, producten of services aanbevelen op basis van gebruikersvoorkeuren.
  • Identificeer de beste mogelijke opties uit een grote groep keuzes om te voldoen aan complexe vereisten.
  • Identificeer gegevensafwijkingen of frauduleuze activiteiten die niet hetzelfde zijn als overheersende of normale patronen.

Vectordatabases bieden vectorzoekmogelijkheden om vergelijkbare items te vinden op basis van hun gegevenskenmerken in plaats van door exacte overeenkomsten in een eigenschappenveld. Vectorzoekopdrachten werken door de vectorweergaven van uw gegevens te analyseren die u hebt gemaakt met behulp van een AI-insluitmodel, zoals de Azure OpenAI-insluitingsmodellen. Het zoekproces meet de afstand tussen de gegevensvectoren en uw queryvector. De gegevensvectoren die zich het dichtst bij uw queryvector bevinden, zijn semantisch het meest vergelijkbaar.

De meeste moderne databaseproducten ondersteunen vectorzoekopdrachten naast traditionele query's; Dit is het geval bij Azure SQL/SQL Server, Azure Cosmos DB, PostgreSQL en veel andere belangrijke producten. Als alternatief bestaat er een breed scala aan speciale vectordatabaseproducten. Deze producten zijn zeer geoptimaliseerd om vectorzoekopdrachten uit te voeren en worden doorgaans naast een traditionele database uitsluitend geïnstalleerd om vectorzoekworkloads te verwerken.

Vectorzoekwerkstromen met .NET en OpenAI

Vectordatabases en de bijbehorende zoekfuncties zijn vooral handig in RAG-patroon werkstromen met Azure OpenAI. Met dit patroon kunt u uw AI-model uitbreiden met aanvullende semantisch rijke kennis van uw gegevens. Een algemene AI-werkstroom met behulp van vectordatabases omvat de volgende stappen:

  1. Maak insluitingen voor uw gegevens met behulp van een OpenAI-insluitmodel.
  2. Sla de insluitingen op en indexeer deze in een vectordatabase of zoekservice.
  3. Converteer gebruikersprompts van uw toepassing naar insluitingen.
  4. Voer een vectorzoekopdracht uit op uw gegevens, waarbij de embedding van de gebruikersprompt wordt vergeleken met de embeddings in uw database.
  5. Gebruik een taalmodel zoals gpt-4o om een gebruiksvriendelijke voltooiing van de vectorzoekresultaten samen te stellen.

Zie de zelfstudie Implement Azure OpenAI met RAG en vectorzoekopdrachten in een .NET-app voor een praktijkvoorbeeld van deze workflow.

Andere voordelen van het RAG-patroon zijn:

  • Contextafhankelijk relevante en nauwkeurige antwoorden genereren op gebruikersprompts van AI-modellen.
  • Limieten voor LLM-token overwinnen: het zware werk wordt uitgevoerd via de vectorzoekopdracht in de database.
  • Verlaag de kosten door regelmatig af te stemmen op bijgewerkte gegevens.

Microsoft. Extensions.VectorData-bibliotheek

Als u vectorzoekopdrachten wilt gebruiken vanuit .NET, kunt u uw reguliere databasestuurprogramma of SDK gebruiken zonder dat hiervoor extra bibliotheek of API nodig is. Op SQL Server kan bijvoorbeeld vectorzoekopdrachten worden uitgevoerd in T-SQL wanneer u het standaardstuurprogramma voor .NET, SqlClient, gebruikt. Het op deze manier benaderen van vectorzoekopdrachten is echter vaak op een laag niveau, vereist nogal wat handelingen voor de afhandeling van serialisatie/deserialisatie en de resulterende code is niet draagbaar tussen databases.

Als alternatief is de Microsoft. Extensions.VectorData library biedt een uniforme laag abstracties voor interactie met vectorarchieven in .NET.

Sleutelabstracties

Hier is een minimaal end-to-end voorbeeld dat een verzameling maakt, records upsert en een vectorzoekopdracht uitvoert.

using Microsoft.Extensions.AI;
using Microsoft.Extensions.VectorData;
using Microsoft.SemanticKernel.Connectors.InMemory;

// Configure an embedding generator to transform text to embeddings
IEmbeddingGenerator<string, Embedding<float>> embeddingGenerator = ...;

// Create a vector store and get a collection with the embedding generator
var vectorStore = new InMemoryVectorStore(new() { EmbeddingGenerator = embeddingGenerator });
var collection = vectorStore.GetCollection<int, Movie>("movies");
await collection.EnsureCollectionExistsAsync();

// Upsert some records
await collection.UpsertAsync(new Movie { Key = 1, Title = "The Lion King", Description = "An animated film about a young lion prince" });
await collection.UpsertAsync(new Movie { Key = 2, Title = "Inception", Description = "A thief who steals corporate secrets through dream-sharing technology" });
await collection.UpsertAsync(new Movie { Key = 3, Title = "Finding Nemo", Description = "A fish searches the ocean for his lost son" });

// Search for movies similar to the query text
await foreach (var result in collection.SearchAsync("animals in the wild", top: 2))
{
    Console.WriteLine($"{result.Record.Title} (score: {result.Score})");
}

// Define the data model
class Movie
{
    [VectorStoreKey]
    public int Key { get; set; }

    [VectorStoreData]
    public string Title { get; set; }

    [VectorStoreVector(Dimensions: 1536)]
    public string Description { get; set; }
}

Vectoropslagproviders

Het Microsoft.Extensions.VectorData.Abstractions-pakket definieert de abstracties en afzonderlijke providerpakketten bieden implementaties voor specifieke vectordatabases. Kies de provider die overeenkomt met uw vectordatabase, bijvoorbeeld Microsoft. SemanticKernel.Connectors.AzureAISearch.

Opmerking

Ondanks de opname van 'SemanticKernel' in de pakketnamen, hebben deze providers niets te maken met Semantic Kernel en zijn ze overal in .NET bruikbaar, waaronder Agent Framework.

Alle providers implementeren dezelfde VectorStore en VectorStoreCollection<TKey,TRecord> abstracte klassen, zodat u ertussen kunt schakelen zonder de toepassingslogica te wijzigen.

Aanbeveling

Gebruik de provider in het geheugen (Microsoft. SemanticKernel.Connectors.InMemory) tijdens de eerste ontwikkeling/prototypen: er is geen externe service of configuratie vereist en u kunt deze later verwisselen voor een productieprovider. Vermijd het gebruik van de InMemory-provider voor testen, omdat er belangrijke verschillen kunnen zijn tussen deze provider en uw productiedatabase. Overweeg om testcontainers te gebruiken om tests uit te voeren op uw productiedatabasesysteem.