Partilhar via


Bases de dados vetoriais para aplicações de IA .NET

As bases de dados vetoriais armazenam e gerem embeddings vetoriais. Os embeddings são representações numéricas de dados que preservam o significado semântico. Palavras, documentos, imagens, áudio e outros tipos de dados podem ser vetorizados. Você pode usar incorporações para ajudar um modelo de IA a entender o significado das entradas para que ele possa realizar comparações e transformações, como resumir texto, encontrar dados contextualmente relacionados ou criar imagens a partir de descrições de texto.

Por exemplo, você pode usar um banco de dados vetorial para:

  • Identifique imagens, documentos e músicas semelhantes com base em seus conteúdos, temas, sentimentos e estilos.
  • Identifique produtos semelhantes com base em suas características, recursos e grupos de usuários.
  • Recomende conteúdos, produtos ou serviços com base nas preferências do utilizador.
  • Identifique as melhores opções potenciais a partir de um grande conjunto de opções para atender a requisitos complexos.
  • Identificar anomalias de dados ou atividades fraudulentas diferentes dos padrões predominantes ou normais.

Os bancos de dados vetoriais fornecem recursos de pesquisa vetorial para encontrar itens semelhantes com base em suas características de dados, em vez de correspondências exatas em um campo de propriedade. A pesquisa vetorial funciona analisando as representações vetoriais dos seus dados que criou usando um modelo de embedding de IA, como os modelos de embedding Azure OpenAI. O processo de pesquisa mede a distância entre os vetores de dados e o vetor de consulta. Os vetores de dados mais próximos do seu vetor de consulta são os mais semelhantes semanticamente.

A maioria dos produtos modernos de bases de dados suporta pesquisa vetorial juntamente com consultas tradicionais; este é o caso de SQL do Azure/SQL Server, Azure Cosmos DB, PostgreSQL, e muitos outros produtos importantes. Como alternativa, existe uma vasta gama de produtos dedicados e especializados para bases de dados vetoriais. Estes produtos estão altamente otimizados para realizar pesquisa vetorial e são normalmente instalados ao lado de uma base de dados tradicional exclusivamente para lidar com cargas de trabalho de pesquisa vetorial.

Fluxos de trabalho de pesquisa vetorial com .NET e OpenAI

As bases de dados vetoriais e as suas funcionalidades de pesquisa são especialmente úteis em fluxos de trabalho RAG pattern com Azure OpenAI. Este padrão permite-lhe complementar o seu modelo de IA com conhecimento semanticamente rico adicional dos seus dados. Um fluxo de trabalho comum de IA que utiliza bases de dados vetoriais inclui estes passos:

  1. Crie incorporações para seus dados usando um modelo de incorporação OpenAI.
  2. Armazene e indexe as incorporações em um banco de dados vetorial ou serviço de pesquisa.
  3. Converta solicitações de usuário do seu aplicativo em incorporações.
  4. Execute uma pesquisa vetorial pelos seus dados, comparando o embedding do prompt do utilizador com os embeddings na sua base de dados.
  5. Use um modelo de linguagem como o gpt-4o para montar uma conclusão fácil de usar a partir dos resultados da pesquisa vetorial.

Para um exemplo prático deste fluxo, veja o tutorial Implemente Azure OpenAI com RAG usando pesquisa vetorial numa aplicação .NET.

Outros benefícios do padrão RAG incluem:

  • Gere respostas contextualmente relevantes e precisas às solicitações do usuário a partir de modelos de IA.
  • Superar os limites dos tokens LLM — o trabalho mais exigente é realizado através da pesquisa vetorial na base de dados.
  • Reduza os custos de frequentes ajustes finos a dados atualizados.

Microsoft.Extensions.VectorData library

Para usar pesquisa vetorial a partir de .NET, pode usar o seu driver ou SDK de base de dados normal sem necessidade de qualquer biblioteca ou API adicional. Por exemplo, no SQL Server, a pesquisa vetorial pode ser realizada no T-SQL ao utilizar o driver .NET padrão, o SqlClient. No entanto, aceder à pesquisa vetorial desta forma é frequentemente de baixo nível, requer considerável cerimónia para gerir a serialização/desserialização, e o código resultante não é portátil entre bases de dados.

Em alternativa, o pacote 📦 Microsoft.Extensions.VectorData.Abstractions fornece uma camada unificada de abstrações para interagir com armazenamentos vetoriais em .NET. Estas abstrações permitem-lhe escrever código simples e de alto nível contra uma única API, e trocar a loja vetorial subjacente com alterações mínimas à sua aplicação.

A biblioteca oferece as seguintes funcionalidades chave:

  • Mapeamento de tipos .NET sem interrupções: Mapeie o seu tipo .NET diretamente para a base de dados, semelhante a um mapeador objeto-relacional.
  • Modelo unificado de dados: Defina o seu modelo de dados uma vez usando .NET atributos e utilize-o em qualquer armazenamento vetorial suportado.
  • Operações CRUD: Criar, ler, atualizar e eliminar registos numa loja vetorial.
  • Pesquisa vetorial e híbrida: Consultar registos por similaridade semântica usando pesquisa vetorial, ou combinar pesquisa vetorial e de texto para pesquisa híbrida.
  • Gestão de geração de embedding: Configure o seu gerador de embedding uma vez e deixe a biblioteca gerir a geração de forma transparente.
  • Gestão de coleções: Criar, listar e eliminar coleções (tabelas ou índices) numa loja vetorial.

Microsoft. Extensions.VectorData é também o bloco de construção para camadas adicionais de nível superior que precisam de interagir com bases de dados vetoriais. Por exemplo, o Microsoft.Extensions.DataIngestion.

Microsoft. Extensões.VectorData e Entity Framework Core

Se já está a usar o Entity Framework Core para aceder à sua base de dados, é provável que o seu fornecedor de base de dados já suporte pesquisa vetorial, e as consultas LINQ possam ser usadas para expressar essas pesquisas; Microsoft. Extensions.VectorData não é necessariamente necessário nessas aplicações. No entanto, a maioria das bases de dados vetoriais dedicadas não é suportada pelo EF Core e pela Microsoft. Extensions.VectorData pode proporcionar uma boa experiência para trabalhar com esses. Além disso, pode também acabar por usar tanto o EF como a Microsoft. Extensions.VectorData na mesma aplicação, por exemplo, quando se utiliza uma camada adicional como a Microsoft. Extensões.DataIngestion.

Abstrações chave

Aqui está um exemplo mínimo de ponta a ponta que cria uma coleção, atualiza os registos e realiza uma pesquisa vetorial:

using Microsoft.Extensions.AI;
using Microsoft.Extensions.VectorData;
using Microsoft.SemanticKernel.Connectors.InMemory;

// Configure an embedding generator to transform text to embeddings
IEmbeddingGenerator<string, Embedding<float>> embeddingGenerator = ...;

// Create a vector store and get a collection with the embedding generator
var vectorStore = new InMemoryVectorStore(new() { EmbeddingGenerator = embeddingGenerator });
var collection = vectorStore.GetCollection<int, Movie>("movies");
await collection.EnsureCollectionExistsAsync();

// Upsert some records
await collection.UpsertAsync(new Movie { Key = 1, Title = "The Lion King", Description = "An animated film about a young lion prince" });
await collection.UpsertAsync(new Movie { Key = 2, Title = "Inception", Description = "A thief who steals corporate secrets through dream-sharing technology" });
await collection.UpsertAsync(new Movie { Key = 3, Title = "Finding Nemo", Description = "A fish searches the ocean for his lost son" });

// Search for movies similar to the query text
await foreach (var result in collection.SearchAsync("animals in the wild", top: 2))
{
    Console.WriteLine($"{result.Record.Title} (score: {result.Score})");
}

// Define the data model
class Movie
{
    [VectorStoreKey]
    public int Key { get; set; }

    [VectorStoreData]
    public string Title { get; set; }

    [VectorStoreVector(Dimensions: 1536)]
    public string Description { get; set; }
}

Fornecedores de armazenamento vetorial

O pacote Microsoft.Extensions.VectorData.Abstractions define as abstrações, e pacotes separados provider fornecem implementações para bases de dados vetoriais específicas. Escolha o fornecedor que corresponde à sua base de dados de vetores, por exemplo, Microsoft. SemanticKernel.Connectors.AzureAISearch.

Observação

Apesar da inclusão de "SemanticKernel" nos nomes dos pacotes, estes fornecedores nada têm a ver com o Kernel Semântico e são utilizáveis em qualquer parte do .NET, incluindo o Agent Framework.

Todos os fornecedores implementam as mesmas VectorStore classes abstratas VectorStoreCollection<TKey,TRecord> , por isso podes alternar entre elas sem alterar a lógica da tua aplicação.

Sugestão

Utilize o fornecedor em memória (Microsoft.SemanticKernel.Connectors.InMemory) durante o desenvolvimento/prototipagem inicial – não requer qualquer serviço ou configuração externa, e pode trocá-lo por um fornecedor de produção mais tarde. Evite usar o fornecedor InMemory para testes, pois podem existir diferenças importantes entre este fornecedor e a sua base de dados de produção. Considere usar testcontainers para executar testes no seu sistema de base de dados de produção.