Wektorowe bazy danych dla aplikacji sztucznej inteligencji .NET

Wektorowe bazy danych przechowują i zarządzają wektorami osadzeń. Osadzanie to liczbowe reprezentacje danych, które zachowują znaczenie semantyczne. Słowa, dokumenty, obrazy, dźwięk i inne typy danych mogą być wektoryzowane. Za pomocą osadzania można pomóc modelowi sztucznej inteligencji zrozumieć znaczenie danych wejściowych, dzięki czemu może wykonywać porównania i przekształcenia, takie jak podsumowywanie tekstu, znajdowanie danych powiązanych kontekstowo lub tworzenie obrazów na podstawie opisów tekstu.

Na przykład można użyć wektorowej bazy danych do:

  • Identyfikowanie podobnych obrazów, dokumentów i piosenek na podstawie ich zawartości, motywów, tonacji i stylów.
  • Zidentyfikuj podobne produkty na podstawie ich cech, funkcji i grup użytkowników.
  • Zalecanie zawartości, produktów lub usług na podstawie preferencji użytkownika.
  • Zidentyfikuj najlepsze potencjalne opcje z dużej puli wyborów, aby spełnić złożone wymagania.
  • Identyfikowanie anomalii danych lub fałszywych działań, które różnią się od dominujących lub normalnych wzorców.

Bazy danych wektorów umożliwiają wyszukiwanie wektorów w celu znalezienia podobnych elementów na podstawie ich cech danych, a nie dokładnych dopasowań w polu właściwości. Wyszukiwanie wektorowe działa poprzez analizę wektorowych reprezentacji danych utworzonych przy użyciu modelu osadzającego sztuczną inteligencję, takiego jak modele osadzające Azure OpenAI. Proces wyszukiwania mierzy odległość między wektorami danych a wektorem zapytania. Wektory danych znajdujące się najbliżej wektora zapytania to te, które są najbardziej podobne semantycznie.

Większość nowoczesnych produktów baz danych obsługuje wyszukiwanie wektorów obok tradycyjnych zapytań; dotyczy to Azure SQL/SQL Server, Azure Cosmos DB, PostgreSQL i wielu innych głównych produktów. Alternatywnie istnieje szeroka gama dedykowanych, wyspecjalizowanych produktów baz danych wektorowych. Te produkty są wysoce zoptymalizowane pod kątem przeprowadzania wyszukiwania wektorów i są zwykle instalowane razem z tradycyjną bazą danych wyłącznie do obsługi obciążeń wyszukiwania wektorowego.

Przepływy pracy wyszukiwania wektorowego z .NET i OpenAI

Wektorowe bazy danych i ich funkcje wyszukiwania są szczególnie przydatne w schematach RAG przepływów pracy z Azure OpenAI. Ten wzorzec umożliwia rozszerzenie modelu sztucznej inteligencji o dodatkową bogatą wiedzę na temat danych. Typowy przepływ pracy sztucznej inteligencji korzystający z baz danych wektorów obejmuje następujące kroki:

  1. Utwórz osadzanie dla danych przy użyciu modelu osadzania OpenAI.
  2. Zapisz i zaindeksuj osadzanie w wektorowej bazie danych lub usłudze wyszukiwania.
  3. Przekonwertuj monity użytkownika z aplikacji na osadzanie.
  4. Uruchom wyszukiwanie wektorowe w danych, porównując osadzenie zapytania użytkownika z osadzeniami w bazie danych.
  5. Użyj modelu językowego, takiego jak gpt-4o, aby utworzyć przyjazne dla użytkownika uzupełnianie z wyników wyszukiwania wektorowego.

Aby zapoznać się z praktycznym przykładem tego przepływu, zobacz samouczek Implement Azure OpenAI with RAG using vector search in a .NET app.

Inne zalety wzorca RAG obejmują:

  • Twórz kontekstowo odpowiednie i dokładne odpowiedzi na zapytania użytkownika z modeli sztucznej inteligencji.
  • Pokonaj limity tokenów LLM — ciężka praca odbywa się za pośrednictwem wyszukiwania wektorowego w bazie danych.
  • Zmniejsz koszty częstego dostrajania w przypadku zaktualizowanych danych.

Microsoft.Extensions.VectorData

Aby użyć wyszukiwania wektorowego z .NET, możesz użyć zwykłego sterownika bazy danych lub zestawu SDK bez konieczności dodatkowej biblioteki ani interfejsu API. Na przykład w SQL Server wyszukiwanie wektorów można wykonywać w języku T-SQL przy użyciu standardowego sterownika .NET SqlClient. Jednak uzyskiwanie dostępu do wyszukiwania wektorów w ten sposób jest często dość niskopoziomowe, wymaga znacznych skomplikowanych działań przy obsłudze serializacji/deserializacji, a wynikowy kod nie jest przenoszalny między bazami danych.

Alternatywnie, pakiet 📦 Microsoft.Extensions.VectorData.Abstractions zapewnia spójną warstwę abstrakcji do obsługi magazynów wektorowych w .NET. Te abstrakcyjne mechanizmy pozwalają na pisanie prostego, kodu wysokiego poziomu dla pojedynczego interfejsu API i wymianę podstawowego magazynu wektorowego przy minimalnych zmianach w aplikacji.

Biblioteka zapewnia następujące kluczowe możliwości:

  • Bezproblemowe mapowanie typów .NET: Mapuj typ .NET bezpośrednio do bazy danych, podobnie jak maper obiektowo-relacyjny.
  • Unified data model: Zdefiniuj model danych raz przy użyciu atrybutów .NET i użyj go w dowolnym obsługiwanym magazynie wektorów.
  • Operacje CRUD: tworzenie, odczytywanie, aktualizowanie i usuwanie rekordów w magazynie wektorów.
  • Wyszukiwanie wektorowe i hybrydowe: wykonywanie zapytań o rekordy według podobieństwa semantycznego przy użyciu wyszukiwania wektorowego lub łączenie wyszukiwania wektorów i tekstu na potrzeby wyszukiwania hybrydowego.
  • Zarządzanie generowaniem osadów: skonfiguruj generator osadów raz i pozwól bibliotece automatycznie obsługiwać generowanie.
  • Zarządzanie kolekcjami: tworzenie, wyświetlanie listy i usuwanie kolekcji (tabel lub indeksów) w magazynie wektorów.

Microsoft. Extensions.VectorData jest również blokiem konstrukcyjnym dodatkowych warstw wyższego poziomu, które muszą współdziałać z bazą danych wektorów. Na przykład Microsoft. Extensions.DataIngestion.

Microsoft.Extensions.VectorData i Entity Framework Core

Jeśli do uzyskiwania dostępu do bazy danych używasz już Entity Framework Core, prawdopodobnie dostawca bazy danych obsługuje już wyszukiwanie wektorowe, a zapytania LINQ mogą służyć do wyrażania takich wyszukiwań; Microsoft. Extensions.VectorData nie musi być wymagana w takich aplikacjach. Jednak większość dedykowanych baz danych wektorów nie jest obsługiwana przez program EF Core i Microsoft. Extensions.VectorData może zapewnić dobre środowisko pracy z tymi elementami. Ponadto możesz również znaleźć się w sytuacji, w której używasz EF i Microsoft.Extensions.VectorData w tej samej aplikacji, np. gdy używasz dodatkowej warstwy, takiej jak Microsoft.Extensions.DataIngestion.

Kluczowe abstrakcje

Oto minimalny przykład end-to-end, który tworzy kolekcję, aktualizuje lub wstawia rekordy i wykonuje wyszukiwanie wektorowe:

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

Dostawcy przechowywania wektorów

Pakiet Microsoft.Extensions.VectorData.Abstractions definiuje abstrakcję i oddzielne pakiety provider zapewniają implementacje dla określonych baz danych wektorów. Wybierz dostawcę pasujący do bazy danych wektorów, na przykład Microsoft. SemanticKernel.Connectors.AzureAISearch.

Uwaga / Notatka

Pomimo włączenia "SemanticKernel" w nazwach pakietów, ci dostawcy nie mają nic wspólnego z Semantic Kernel i mogą być używani w dowolnym miejscu w .NET, w tym w ramach Agent Framework.

Wszyscy dostawcy implementują te same VectorStore i VectorStoreCollection<TKey,TRecord> abstrakcyjne klasy, dzięki czemu można przełączać się między nimi bez zmiany logiki aplikacji.

Wskazówka

Użyj dostawcy pamięci wewnętrznej (Microsoft.SemanticKernel.Connectors.InMemory) podczas początkowego tworzenia prototypów — nie wymaga żadnych zewnętrznych usług ani konfiguracji, i możesz później wymienić na dostawcę produkcyjnego. Unikaj używania dostawcy InMemory do testowania, ponieważ mogą istnieć ważne różnice między tym dostawcą a produkcyjną bazą danych. Rozważ użycie narzędzi testcontainers do uruchamiania testów względem produkcyjnego systemu bazy danych.