Partager via


Recherche vectorielle

Remarque

La section ci-dessous décrit la prise en charge de la recherche vectorielle dans EF 10. EF 9 inclut une prise en charge expérimentale similaire avec un nommage de méthode légèrement différent.

Azure Cosmos DB offre désormais la prise en charge de la recherche de similarité vectorielle. La recherche vectorielle est une partie fondamentale de certains types d’applications, y compris l’IA, la recherche sémantique et d’autres. Azure Cosmos DB vous permet de stocker des vecteurs directement dans vos documents aux côtés de vos autres données, ce qui signifie que vous pouvez exécuter toutes vos requêtes contre une seule base de données. Cela peut considérablement simplifier votre architecture et éliminer le besoin d’une solution de base de données vectorielle dédiée supplémentaire dans votre pile. Pour en savoir plus sur la recherche par vecteurs dans Azure Cosmos DB, consultez la documentation.

La propriété Vector peut être configurée à l’intérieur OnModelCreating:

public class Blog
{
    ...

    public float[] Vector { get; set; }
}

public class BloggingContext
{
    ...

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Blog>(b =>
        {
            b.Property(b => b.Vector).IsVectorProperty(DistanceFunction.Cosine, dimensions: 1536);
            b.HasIndex(x => x.Vector).IsVectorIndex(VectorIndexType.Flat);
        });
    }
}

À ce stade, votre modèle est configuré. L'insertion de données vectorielles se fait comme n'importe quel autre type de données avec EF :

float[] vector = /* generate vector data from text, image, etc. */
context.Add(new Blog { Vector = vector });
await context.SaveChangesAsync();

Enfin, utilisez la fonction EF.Functions.VectorDistance() dans les requêtes LINQ pour effectuer une recherche de similarité vectorielle :

float[] anotherVector = /* generate vector data from text, image, etc. */
var blogs = await context.Blogs
    .OrderBy(s => EF.Functions.VectorDistance(s.Vector, anotherVector))
    .Take(5)
    .ToListAsync();

Vous obtiendrez ainsi les cinq premiers blogs, en fonction de la similarité de leur propriété Vector et des données anotherVector fournies par l'extérieur.

La recherche de similarité vectorielle peut être utilisée avec la recherche en texte intégral dans la même requête (c’est-à-dire la recherche hybride), en combinant les résultats des fonctions VectorDistance et FullTextScore à l’aide de la fonction RRF (fusion de classement réciproque).

Consultez la documentation pour savoir comment activer la prise en charge de la recherche en texte intégral dans le modèle EF et comment utiliser la recherche hybride dans les requêtes.