Recherche vectorielle
Avertissement
La recherche vectorielle avec Azure Cosmos DB est actuellement en avant-première. Par conséquent, l'utilisation des API de recherche vectorielle d'EF génère un avertissement « API expérimentale » (EF9103
) qui doit être supprimé. Les API et les capacités peuvent être modifiées à l'avenir.
Azure Cosmos DB offre maintenant un support en avant-première pour 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.
Pour utiliser la recherche vectorielle, vous devez d'abord vous inscrire à la fonctionnalité d'évaluation. Ensuite, définissez des politiques de vecteur sur votre conteneur pour identifier quelles propriétés JSON dans vos documents contiennent des vecteurs et des informations liées aux vecteurs pour ces propriétés (dimensions, type de données, fonction de distance).
Une fois que votre conteneur est correctement configuré, ajoutez une propriété vectorielle à votre modèle dans le chemin que vous avez défini dans la stratégie du conteneur, et configurez-la avec EF en tant que vecteur :
public class Blog
{
...
public float[] Vector { get; set; }
}
public class BloggingContext
{
...
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Blog>()
.Property(b => b.Embeddings)
.IsVector(DistanceFunction.Cosine, dimensions: 1536);
}
}
À 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.