Partager via


Recherche vectorielle dans le fournisseur EF Core SQL Server

Note

La prise en charge des vecteurs a été introduite dans EF Core 10.0 et est prise en charge uniquement avec SQL Server 2025 et versions ultérieures.

Le type de données vectorielles SQL Server permet de stocker des incorporations, qui sont une représentation de signification qui peut être recherchée efficacement sur la similarité, ce qui alimente les charges de travail IA telles que la recherche sémantique et la génération d’augmentation de la récupération (RAG).

Pour utiliser le vector type de données, ajoutez simplement une propriété .NET de type SqlVector<float> à votre type d’entité, en spécifiant les dimensions comme suit :

public class Blog
{
    // ...

    [Column(TypeName = "vector(1536)")]
    public SqlVector<float> Embedding { get; set; }
}

Une fois votre propriété ajoutée et la colonne correspondante créée dans la base de données, vous pouvez commencer à insérer des incorporations. La génération d’incorporation est effectuée en dehors de la base de données, généralement par le biais d’un service, et les détails pour ce faire sont hors de portée pour cette documentation. Toutefois, les bibliothèques de Microsoft.Extensions.AI .NET contiennent IEmbeddingGeneratorune abstraction sur les générateurs d’incorporation qui ont des implémentations pour les principaux fournisseurs.

Une fois que vous avez choisi votre générateur d’incorporation et configuré, utilisez-le pour générer des incorporations et les insérer comme suit :

IEmbeddingGenerator<string, Embedding<float>> embeddingGenerator = /* Set up your preferred embedding generator */;

var embedding = await embeddingGenerator.GenerateVectorAsync("Some text to be vectorized");
context.Blogs.Add(new Blog
{
    Name = "Some blog",
    Embedding = new SqlVector<float>(embedding)
});
await context.SaveChangesAsync();

Enfin, utilisez la EF.Functions.VectorDistance() fonction pour effectuer une recherche de similarité pour une requête utilisateur donnée :

var sqlVector = new SqlVector<float>(await embeddingGenerator.GenerateVectorAsync("Some user query to be vectorized"));
var topSimilarBlogs = context.Blogs
    .OrderBy(b => EF.Functions.VectorDistance("cosine", b.Embedding, sqlVector))
    .Take(3)
    .ToListAsync();

Note

La prise en charge intégrée d’EF 10 remplace l’extension EFCore.SqlServer.VectorSearch précédente, qui a permis d’effectuer une recherche vectorielle avant l’introduction du vector type de données. Dans le cadre de la mise à niveau vers EF 10, supprimez l’extension de vos projets.

La VECTOR_SEARCH() fonction (en préversion) pour une recherche approximative avec DiskANN n’est actuellement pas prise en charge.