Compartilhar via


Pesquisa de vetor no provedor EF Core do SQL Server

Observação

O suporte ao vetor foi introduzido no EF Core 10.0 e só tem suporte com o SQL Server 2025 e superior.

O tipo de dados de vetor do SQL Server permite armazenar inserções, que são representações de significado que podem ser pesquisadas com eficiência quanto à similaridade, alimentando cargas de trabalho de IA, como RAG (pesquisa semântica e geração aumentada por recuperação).

Para usar o vector tipo de dados, basta adicionar uma propriedade .NET do tipo SqlVector<float> ao tipo de entidade, especificando as dimensões da seguinte maneira:

public class Blog
{
    // ...

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

Depois que sua propriedade for adicionada e a coluna correspondente criada no banco de dados, você poderá começar a inserir inserções. A geração de inserção é feita fora do banco de dados, geralmente por meio de um serviço, e os detalhes para fazer isso estão fora do escopo desta documentação. No entanto, as bibliotecas de Microsoft.Extensions.AI do .NET contêm IEmbeddingGenerator, que é uma abstração sobre geradores de inserção que tem implementações para os principais provedores.

Depois de escolher o gerador de inserção e configurá-lo, use-o para gerar inserções e inseri-las da seguinte maneira

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 fim, use a EF.Functions.VectorDistance() função para executar a pesquisa de similaridade para uma determinada consulta de usuário:

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

Observação

O suporte interno no EF 10 substitui a extensão EFCore.SqlServer.VectorSearch anterior, que permitia a execução da pesquisa de vetor antes da introdução do vector tipo de dados. Como parte da atualização para o EF 10, remova a extensão de seus projetos.

A VECTOR_SEARCH() função (em versão prévia) para pesquisa aproximada com DiskANN não tem suporte no momento.