Bases de données vectorielles pour les applications IA .NET

Les bases de données vectorielles stockent et gèrent les incorporations vectorielles. Les incorporations sont des représentations numériques des données qui conservent la signification sémantique. Les mots, documents, images, audio et autres types de données peuvent tous être vectorisés. Vous pouvez utiliser des incorporations pour aider un modèle IA à comprendre la signification des entrées afin qu’il puisse effectuer des comparaisons et des transformations, telles que la synthèse de texte, la recherche de données contextuelles ou la création d’images à partir de descriptions de texte.

Par exemple, vous pouvez utiliser une base de données vectorielle pour :

  • Identifier des images, des documents et des chansons similaires en fonction de leur contenu, de leurs thèmes, sentiments et styles.
  • Identifier des produits similaires en fonction de leurs caractéristiques, fonctionnalités et groupes d’utilisateurs.
  • Recommander du contenu, des produits ou des services en fonction des préférences de l’utilisateur.
  • Identifier les meilleures options potentielles dans un grand pool de choix pour répondre à des exigences complexes.
  • Identifier les anomalies de données ou les activités frauduleuses qui dévient des modèles prédominants ou normaux.

Les bases de données vectorielles fournissent des fonctionnalités de recherche vectorielle pour rechercher des éléments similaires en fonction de leurs caractéristiques de données plutôt que par des correspondances exactes sur un champ de propriété. La recherche vectorielle fonctionne en analysant les représentations vectorielles de vos données que vous avez créées à l’aide d’un modèle d’incorporation d’IA, tel que les modèles d’incorporation Azure OpenAI. Le processus de recherche mesure la distance entre les vecteurs de données et votre vecteur de requête. Les vecteurs de données les plus proches de votre vecteur de requête sont ceux qui sont sémantiquement les plus similaires.

La plupart des produits de base de données modernes prennent en charge la recherche vectorielle en même temps que les requêtes traditionnelles ; c’est le cas avec Azure SQL/SQL Server, Azure Cosmos DB, PostgreSQL et de nombreux autres principaux produits. En guise d’alternative, il existe un large éventail de produits de base de données vectorielles dédiés et spécialisés. Ces produits sont hautement optimisés pour effectuer une recherche vectorielle et sont généralement installés en même temps qu’une base de données traditionnelle pour gérer les charges de travail de recherche vectorielle.

Flux de travail de recherche vectorielle avec .NET et OpenAI

Les bases de données vectorielles et leurs fonctionnalités de recherche sont particulièrement utiles dans les flux de travail en utilisant le schéma RAG avec Azure OpenAI. Ce modèle vous permet d’augmenter votre modèle IA avec des connaissances sémantiquement enrichies de vos données. Un flux de travail IA courant à l’aide de bases de données vectorielles comprend les étapes suivantes :

  1. Créer des incorporations pour vos données à l’aide d’un modèle d’incorporation OpenAI.
  2. Stocker et indexer les incorporations dans une base de données vectorielle ou un service de recherche.
  3. Convertissez les requêtes de l'utilisateur de votre application en éléments intégrés.
  4. Exécutez une recherche vectorielle sur vos données en comparant l'insertion de l'invite de l'utilisateur avec les insertions dans votre base de données.
  5. Utilisez un modèle de langage tel que gpt-4o pour assembler une saisie semi-conviviale à partir des résultats de la recherche vectorielle.

Pour obtenir un exemple pratique de ce flux, consultez le didacticiel Implement Azure OpenAI avec RAG à l’aide de la recherche vectorielle dans une application .NET.

Voici d’autres avantages du modèle RAG :

  • Générez des réponses contextuellement pertinentes et précises aux invites utilisateur à partir de modèles IA.
  • Surmonter les limites des jetons LLM : le travail lourd est effectué par le biais de la recherche vectorielle de base de données.
  • Réduisez les coûts du réglage précis fréquent des données mises à jour.

La bibliothèque Microsoft.Extensions.VectorData

Pour utiliser la recherche vectorielle à partir de .NET, vous pouvez utiliser votre pilote de base de données ou sdk standard sans nécessiter de bibliothèque ou d’API supplémentaire. Par exemple, sur SQL Server, la recherche vectorielle peut être effectuée dans T-SQL lors de l’utilisation du pilote de .NET standard, SqlClient. Toutefois, l’accès à la recherche vectorielle de cette façon est souvent de bas niveau, nécessite un effort considérable pour gérer la sérialisation/désérialisation, et le code résultant n’est pas portable entre différentes bases de données.

En guise d’alternative, le package 📦 Microsoft.Extensions.VectorData.Abstractions fournit une couche unifiée d’abstractions pour interagir avec les magasins de données vectorielles dans .NET. Ces abstractions vous permettent d’écrire du code simple et de haut niveau sur une SEULE API et de permuter le magasin vectoriel sous-jacent avec des modifications minimales apportées à votre application.

La bibliothèque fournit les fonctionnalités clés suivantes :

  • Seamless .NET type mapping : Associez directement votre type .NET à la base de données, similaire à un mapper objet-relationnel.
  • Modèle de donnéesunifié : définissez votre modèle de données une fois à l’aide d’attributs .NET et utilisez-le dans n’importe quel magasin de vecteurs pris en charge.
  • Opérations CRUD : Créer, lire, mettre à jour et supprimer des enregistrements dans un magasin vectoriel.
  • Recherche vectorielle et hybride : Interrogez les enregistrements par similarité sémantique à l’aide de la recherche vectorielle ou combinez la recherche de vecteur et de texte pour la recherche hybride.
  • Gestion de la génération d’incorporation : configurez votre générateur d’incorporation une seule fois et laissez la bibliothèque gérer de manière transparente la génération.
  • Gestion des collections : créer, répertorier et supprimer des collections (tables ou index) dans un magasin vectoriel.

Microsoft. Extensions.VectorData est également le bloc de construction pour des couches de niveau supérieur supplémentaires qui doivent interagir avec la base de données vectorielle. Par exemple, le Microsoft. Extensions.DataIngestion.

Microsoft. Extensions.VectorData et Entity Framework Core

Si vous utilisez déjà Entity Framework Core pour accéder à votre base de données, il est probable que votre fournisseur de base de données prenne déjà en charge la recherche vectorielle et que les requêtes LINQ peuvent être utilisées pour exprimer ces recherches ; Microsoft. Extensions.VectorData n'est pas nécessairement nécessaire dans ces applications. Toutefois, la plupart des bases de données vectorielles dédiées ne sont pas prises en charge par EF Core et Microsoft. Extensions.VectorData peut offrir une bonne expérience pour les utiliser. En outre, vous pourriez aussi utiliser EF et Microsoft.Extensions.VectorData dans la même application, par exemple en utilisant une couche supplémentaire telle que Microsoft.Extensions.DataIngestion.

Abstractions clés

Voici un exemple minimal intégral qui crée une collection, réalise des upserts d’enregistrements et effectue une recherche vectorielle :

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

Fournisseurs d'entrepôts de vecteurs

Le package Microsoft.Extensions.VectorData.Abstractions définit les abstractions et les packages provider distincts fournissent des implémentations pour des bases de données vectorielles spécifiques. Choisissez le fournisseur qui correspond à votre base de données vectorielle, par exemple, Microsoft. SemanticKernel.Connectors.AzureAISearch.

Note

Malgré l’inclusion de « SemanticKernel » dans les noms de package, ces fournisseurs n’ont rien à voir avec Noyau sémantique et sont utilisables n’importe où dans .NET, y compris Agent Framework.

Tous les fournisseurs implémentent les mêmes VectorStore classes abstraites et VectorStoreCollection<TKey,TRecord> identiques. Vous pouvez donc basculer entre eux sans modifier votre logique d’application.

Conseil / Astuce

Utilisez le fournisseur en mémoire (Microsoft. SemanticKernel.Connectors.InMemory) pendant le développement/prototypage initial : il ne nécessite aucun service externe ni configuration, et vous pouvez le remplacer par un fournisseur de production ultérieurement. Évitez d’utiliser le fournisseur InMemory pour les tests, car il peut y avoir des différences importantes entre ce fournisseur et votre base de données de production. Envisagez d’utiliser des testcontainers pour exécuter des tests sur votre système de base de données de production.