Dela via


Vektordatabaser för .NET AI-appar

Vektordatabaser lagrar och hanterar inbäddningar av vektorer. Inbäddningar är numeriska representationer av data som bevarar semantisk betydelse. Ord, dokument, bilder, ljud och andra typer av data kan alla vektoriseras. Du kan använda inbäddningar för att hjälpa en AI-modell att förstå innebörden av indata så att den kan utföra jämförelser och transformeringar, till exempel sammanfatta text, hitta kontextuellt relaterade data eller skapa bilder från textbeskrivningar.

Du kan till exempel använda en vektordatabas för att:

  • Identifiera liknande bilder, dokument och låtar baserat på deras innehåll, teman, känslor och format.
  • Identifiera liknande produkter baserat på deras egenskaper, funktioner och användargrupper.
  • Rekommendera innehåll, produkter eller tjänster baserat på användarinställningar.
  • Identifiera de bästa möjliga alternativen från en stor pool med alternativ för att uppfylla komplexa krav.
  • Identifiera dataavvikelser eller bedrägliga aktiviteter som skiljer sig från dominerande eller normala mönster.

Vektordatabaser ger vektorsökningsfunktioner för att hitta liknande objekt baserat på deras dataegenskaper i stället för exakta matchningar i ett egenskapsfält. Vektorsökning fungerar genom att analysera vektorrepresentationerna av dina data som du skapade med hjälp av en AI-inbäddningsmodell, till exempel Azure OpenAI-inbäddningsmodeller. Sökprocessen mäter avståndet mellan datavektorerna och frågevektorn. De datavektorer som är närmast din frågevektor är de som är mest lika semantiskt.

De flesta moderna databasprodukter stöder vektorsökning vid sidan av traditionell frågekörning. Detta är fallet med Azure SQL/SQL Server, Azure Cosmos DB, PostgreSQL och många andra viktiga produkter. Som ett alternativ finns det ett brett utbud av dedikerade, specialiserade vektordatabasprodukter. Dessa produkter är mycket optimerade för att utföra vektorsökning och installeras vanligtvis tillsammans med en traditionell databas uteslutande för att hantera vektorsökningsarbetsbelastningar.

Arbetsflöden för vektorsökning med .NET och OpenAI

Vektordatabaser och deras sökfunktioner är särskilt användbara i RAG-mönster arbetsflöden med Azure OpenAI. Med det här mönstret kan du utöka DIN AI-modell med ytterligare semantiskt omfattande kunskaper om dina data. Ett vanligt AI-arbetsflöde med hjälp av vektordatabaser innehåller följande steg:

  1. Skapa inbäddningar för dina data med en OpenAI-inbäddningsmodell.
  2. Lagra och indexera inbäddningarna i en vektordatabas eller söktjänst.
  3. Konvertera användarprompter från ditt program till inbäddningar.
  4. Kör en vektorsökning mellan dina data och jämför inbäddningen av användarprompten med inbäddningarna i databasen.
  5. Använd en språkmodell som gpt-4o för att sammanställa ett användarvänligt slutförande från vektorsökningsresultatet.

Ett praktiskt exempel på det här flödet finns i självstudien Implement Azure OpenAI med RAG med hjälp av vektorsökning i en .NET-app.

Andra fördelar med RAG-mönstret är:

  • Generera kontextuellt relevanta och korrekta svar på användarfrågor från AI-modeller.
  • Överkomma LLM-tokengränser – det tunga arbetet görs genom databasvektorsökning.
  • Minska kostnaderna från frekvent finjustering av uppdaterade data.

Microsoft. Extensions.VectorData-bibliotek

Om du vill använda vektorsökning från .NET kan du använda din vanliga databasdrivrutin eller SDK utan att behöva något ytterligare bibliotek eller API. På SQL Server kan till exempel vektorsökning utföras i T-SQL när du använder standarddrivrutinen för .NET, SqlClient. Men att komma åt vektorsökning på det här sättet är ofta ganska låg-nivå, kräver omfattande arbete för att hantera serialisering/deserialisering, och den resulterande koden är inte överförbar mellan databaser.

Alternativt 📦 Microsoft. Extensions.VectorData.Abstractions-paketet ger ett enhetligt lager av abstraktioner för interaktion med vektorlager i .NET. Med dessa abstraktioner kan du skriva enkel kod på hög nivå mot ett enda API och växla ut det underliggande vektorarkivet med minimala ändringar i ditt program.

Biblioteket innehåller följande viktiga funktioner:

  • Seamless .NET type mapping: Mappa din .NET-typ direkt till databasen, likt en objekt-/relations-mappare.
  • Unified data model: Definiera din datamodell en gång med hjälp av .NET attribut och använd den i alla vektorlager som stöds.
  • CRUD-åtgärder: Skapa, läsa, uppdatera och ta bort poster i ett vektorlager.
  • Vektor- och hybridsökning: Fråga efter semantisk likhet med hjälp av vektorsökning eller kombinera vektor- och textsökning för hybridsökning.
  • Hantering av inbäddningsgenerering: Konfigurera inbäddningsgeneratorn en gång och låt biblioteket hantera genereringen transparent.
  • Samlingshantering: Skapa, lista och ta bort samlingar (tabeller eller index) i ett vektorarkiv.

Microsoft. Extensions.VectorData är också byggblocket för ytterligare lager på högre nivå som behöver interagera med vektordatabasen. Till exempel Microsoft. Extensions.DataIngestion.

Microsoft.Extensions.VectorData och Entity Framework Core

Om du redan använder Entity Framework Core för att komma åt databasen är det troligt att databasleverantören redan stöder vektorsökning, och LINQ-frågor kan användas för att uttrycka sådana sökningar. Microsoft. Extensions.VectorData behövs inte nödvändigtvis i sådana program. De flesta dedikerade vektordatabaser stöds dock inte av EF Core och Microsoft. Extensions.VectorData kan ge en bra upplevelse för att arbeta med dem. Dessutom kan du också använda både EF och Microsoft. Extensions.VectorData i samma program, t.ex. när du använder ett ytterligare lager, till exempel Microsoft. Extensions.DataIngestion.

Viktiga abstraktioner

Här är ett minimalt exempel som täcker hela processen, skapar en samling, uppdaterar eller infogar poster och utför en vektorsökning.

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; }
}

Leverantörer av vektorlager

Paketet Microsoft.Extensions.VectorData.Abstractions definierar abstraktionerna och separata provider-paket tillhandahålla implementeringar för specifika vektordatabaser. Välj den provider som matchar din vektordatabas, till exempel Microsoft. SemanticKernel.Connectors.AzureAISearch.

Anmärkning

Trots att "SemanticKernel" ingår i paketnamnen har dessa leverantörer inget att göra med Semantic Kernel och kan användas var som helst i .NET, inklusive Agent Framework.

Alla leverantörer implementerar samma VectorStore och VectorStoreCollection<TKey,TRecord> abstrakta klasser, så att du kan växla mellan dem utan att ändra programlogik.

Tips/Råd

Använd den minnesinterna providern (Microsoft. SemanticKernel.Connectors.InMemory) under inledande utveckling/prototyper – det kräver ingen extern tjänst eller konfiguration, och du kan byta ut den mot en produktionsleverantör senare. Undvik att använda InMemory-providern för testning eftersom det kan finnas viktiga skillnader mellan den här providern och din produktionsdatabas. Överväg att använda testcontainers för att köra tester mot ditt produktionsdatabassystem.