Vektorové databáze pro aplikace .NET AI

Vektorové databáze ukládají a spravují vkládání vektorů. Vkládání jsou číselná reprezentace dat, která zachová sémantický význam. Slova, dokumenty, obrázky, zvuk a další typy dat mohou být vektorizovány. Vkládání můžete použít k tomu, aby model umělé inteligence porozuměl významu vstupů, aby mohl provádět porovnání a transformace, například sumarizaci textu, hledání kontextových dat nebo vytváření obrázků z popisů textu.

Vektorovou databázi můžete použít například k:

  • Identifikujte podobné obrázky, dokumenty a skladby na základě jejich obsahu, motivů, mínění a stylů.
  • Identifikujte podobné produkty na základě jejich charakteristik, funkcí a skupin uživatelů.
  • Doporučte obsah, produkty nebo služby na základě uživatelských předvoleb.
  • Identifikujte nejlepší potenciální možnosti z velkého souboru možností, abyste splnili složité požadavky.
  • Identifikujte datové anomálie nebo podvodné aktivity, které se liší od převládajících nebo normálních vzorů.

Vektorové databáze poskytují možnosti vektorového vyhledávání k vyhledání podobných položek na základě jejich charakteristik dat, nikoli přesných shod v poli vlastnosti. Vektorové vyhledávání funguje tím, že analyzuje vektorové reprezentace dat, které jste vytvořili pomocí AI modelu pro vkládání, jako jsou modely pro vkládání Azure OpenAI. Proces hledání měří vzdálenost mezi datovými vektory a vektorem dotazu. Datové vektory, které jsou nejblíže vektoru dotazu, jsou ty, které jsou nejvíce podobné sémanticky.

Většina moderních databázových produktů podporuje vektorové vyhledávání společně s tradičním dotazováním; to je případ Azure SQL/SQL Server, Azure Cosmos DB, PostgreSQL a mnoha dalších hlavních produktů. Jako alternativu existuje široká škála vyhrazených specializovaných databázových produktů vektorů. Tyto produkty jsou vysoce optimalizované pro provádění vektorového vyhledávání a obvykle se instalují společně s tradiční databází výhradně pro zpracování úloh vektorového vyhledávání.

Pracovní postupy vektorového vyhledávání s .NET a OpenAI

Vektorové databáze a jejich vyhledávací funkce jsou obzvláště užitečné v pracovních postupech RAG pattern s Azure OpenAI. Tento model umožňuje rozšířit model AI o další sémanticky bohaté znalosti vašich dat. Běžný pracovní postup AI využívající vektorové databáze zahrnuje tyto kroky:

  1. Vytvořte vestavěné vektory pro svá data pomocí modelu OpenAI pro vkládání.
  2. Uložte a indexujte embeddings do vektorové databáze nebo vyhledávací služby.
  3. Převeďte výzvy uživatelů z vaší aplikace na vkládání.
  4. Spusťte vektorové vyhledávání v rámci svých dat a porovnejte vkládání uživatelského dotazu s vkládáními v databázi.
  5. Pomocí jazykového modelu, jako je gpt-4o, můžete sestavit uživatelsky přívětivé dokončování z výsledků hledání vektorů.

Praktický příklad tohoto toku najdete v kurzu Implement Azure OpenAI with RAG pomocí vektorového vyhledávání v aplikaci .NET.

Mezi další výhody modelu RAG patří:

  • Vygenerujte kontextově relevantní a přesné odpovědi na výzvy uživatelů z modelů AI.
  • Překonejte limity tokenů LLM – hlavní zpracování se provádí prostřednictvím databázového vektorového vyhledávání.
  • Snižte náklady na časté vyladění aktualizovaných dat.

Knihovna Microsoft.Extensions.VectorData

Pokud chcete použít vektorové vyhledávání z .NET, můžete použít běžný ovladač databáze nebo sadu SDK bez nutnosti jakékoli další knihovny nebo rozhraní API. Například při SQL Server lze vektorové vyhledávání provádět v jazyce T-SQL při použití standardního ovladače .NET SqlClient. Přístup k vektorovým vyhledáváním tímto způsobem je však často poměrně nízký, vyžaduje značný obřad pro zpracování serializace/deserializace a výsledný kód není přenositelný napříč databázemi.

Alternativou je balíček 📦 Microsoft.Extensions.VectorData.Abstractions, který poskytuje jednotnou vrstvu abstrakcí pro interakci s vektorovými úložišti v .NET. Tyto abstrakce umožňují psát jednoduchý, vysokoúrovňový kód pomocí jediného rozhraní API a zaměnit použité úložiště vektorů s minimálními změnami aplikace.

Knihovna poskytuje následující klíčové funkce:

  • Plynulé mapování typů .NET: Mapujte typ .NET přímo na databázi, podobně jako u objektově-relačního mapovače.
  • Unified data model: Definujte datový model jednou pomocí atributů .NET a použijte ho v libovolném podporovaném úložišti vektorů.
  • Operace CRUD: Vytvoření, čtení, aktualizace a odstranění záznamů v úložišti vektorů
  • Vektorové a hybridní vyhledávání: Dotazování záznamů pomocí sémantické podobnosti pomocí vektorové vyhledávání nebo kombinování vektoru a hledání textu pro hybridní vyhledávání.
  • Správa generování vkládání: Nakonfigurujte generátor vkládání jednou a nechte knihovnu transparentně zpracovávat generování.
  • Správa kolekcí: Vytváření, výpis a odstraňování kolekcí (tabulek nebo indexů) v úložišti vektorů.

Microsoft. Extensions.VectorData je také stavební blok pro další vrstvy vyšší úrovně, které potřebují pracovat s vektorovou databází. Například Microsoft. Extensions.DataIngestion.

Microsoft.Extensions.VectorData a Entity Framework Core

Pokud už pro přístup k databázi používáte Entity Framework Core, je pravděpodobné, že váš poskytovatel databáze již podporuje vektorové vyhledávání a dotazy LINQ je možné použít k vyjádření těchto hledání; Microsoft. Rozšíření.VectorData nemusí být v takových aplikacích nutně potřeba. Ef Core ale nepodporuje většinu vyhrazených vektorových databází a Microsoft. Extensions.VectorData může poskytnout dobré prostředí pro práci s těmito daty. Kromě toho můžete také zjistit, že používáte EF i Microsoft. Extensions.VectorData ve stejné aplikaci, například při použití další vrstvy, například Microsoft. Extensions.DataIngestion.

Klíčové abstrakce

Tady je jednoduchý plně funkční příklad, který vytvoří kolekci, aktualizuje nebo vloží záznamy a provádí vektorové vyhledávání.

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

Zprostředkovatelé vektorových úložiště

Balíček Microsoft.Extensions.VectorData.Abstractions definuje abstrakce a samostatné balíčky provider poskytují implementace pro konkrétní vektorové databáze. Zvolte poskytovatele, který odpovídá vaší vektorové databázi, například Microsoft. SemanticKernel.Connectors.AzureAISearch.

Poznámka:

Navzdory zahrnutí "SemanticKernel" do názvů balíčků nemají tito poskytovatelé nic společného s Sémantické jádro a jsou použitelné kdekoli v .NET, včetně Agent Framework.

Všichni poskytovatelé implementují stejné VectorStore a VectorStoreCollection<TKey,TRecord> abstraktní třídy, takže mezi nimi můžete přepínat beze změny logiky aplikace.

Návod

Použijte zprostředkovatele v paměti (Microsoft. SémanticKernel.Connectors.InMemory) během počátečního vývoje nebo vytváření prototypů – nevyžaduje žádnou externí službu ani konfiguraci a později ji můžete vyměnit za poskytovatele produkčního prostředí. Nepoužívejte zprostředkovatele InMemory k testování, protože mezi tímto poskytovatelem a produkční databází můžou být důležité rozdíly. Zvažte použití testcontainerů ke spouštění testů v produkčním databázovém systému.