Compartir a través de


Búsqueda de vectores en el proveedor de SQL Server EF Core

Nota:

La compatibilidad con vectores se introdujo en EF Core 10.0 y solo se admite con SQL Server 2025 y versiones posteriores.

El tipo de datos vectorial de SQL Server permite almacenar incrustaciones, que son una representación de significado que se puede buscar eficazmente en busca de similitud, potenciando las cargas de trabajo de INTELIGENCIA ARTIFICIAL, como la búsqueda semántica y la generación aumentada de recuperación (RAG).

Para usar el vector tipo de datos, basta con agregar una propiedad .NET de tipo al tipo SqlVector<float> de entidad, especificando las dimensiones como se indica a continuación:

public class Blog
{
    // ...

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

Una vez agregada la propiedad y la columna correspondiente creada en la base de datos, puede empezar a insertar incrustaciones. La generación de inserción se realiza fuera de la base de datos, normalmente a través de un servicio, y los detalles para hacerlo están fuera del ámbito de esta documentación. Sin embargo, las bibliotecas de Microsoft.Extensions.AI de .NET contienen IEmbeddingGenerator, que es una abstracción sobre los generadores de inserción que tiene implementaciones para los principales proveedores.

Una vez que haya elegido el generador de inserción y lo haya configurado, úselo para generar inserciones e insertarlas como se indica a continuación.

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();

Por último, use la EF.Functions.VectorDistance() función para realizar búsquedas de similitud para una consulta de usuario determinada:

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();

Nota:

La compatibilidad integrada en EF 10 reemplaza a la extensión EFCore.SqlServer.VectorSearch anterior, que permitía realizar la búsqueda de vectores antes de que se introdujera el vector tipo de datos. Como parte de la actualización a EF 10, quite la extensión de los proyectos.

La VECTOR_SEARCH() función (en versión preliminar) para la búsqueda aproximada con DiskANN no se admite actualmente.