Compartilhar via


Bancos de dados vetoriais para aplicativos de IA .NET

Os bancos de dados vetoriais armazenam e gerenciam inserções de vetor. As inserções 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 inserçõ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 textos, 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:

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

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

A maioria dos produtos de banco de dados modernos dá suporte à pesquisa de vetor junto com a consulta tradicional; esse é o caso de SQL do Azure/SQL Server, Azure Cosmos DB, PostgreSQL e muitos outros produtos importantes. Como alternativa, existe uma ampla gama de produtos de banco de dados de vetores dedicados e especializados. Esses produtos são altamente otimizados para executar a pesquisa de vetor e normalmente são instalados junto com um banco de dados tradicional exclusivamente para lidar com cargas de trabalho de pesquisa de vetor.

Fluxos de trabalho de pesquisa vetor com .NET e OpenAI

Bancos de dados vetoriais e seus recursos de pesquisa são especialmente úteis em fluxos de trabalho no padrão RAG com Azure OpenAI. Esse padrão permite aumentar seu modelo de IA com conhecimento adicional semanticamente avançado de seus dados. Um fluxo de trabalho de IA comum usando bancos de dados vetoriais inclui estas etapas:

  1. Criar inserções para seus dados usando um modelo de inserção do OpenAI.
  2. Armazenar e indexar as inserções em um banco de dados vetorial ou serviço de pesquisa.
  3. Converter os prompts de usuário do seu aplicativo em inserções.
  4. Realize uma pesquisa vetorial em seus dados, comparando os embeddings do prompt do usuário com os embeddings em seu banco de dados.
  5. Use um modelo de linguagem como gpt-4o para montar um complemento amigável ao usuário a partir dos resultados da busca vetorial.

Para obter um exemplo prático desse fluxo, consulte o tutorial Implement Azure OpenAI com RAG usando a pesquisa de vetor em um aplicativo .NET tutorial.

Outros benefícios do padrão RAG incluem:

  • Gerar respostas contextualmente relevantes e precisas para prompts de usuários a partir de modelos de IA.
  • Superar os limites do token LLM – o trabalho pesado é feito por meio da pesquisa de vetor de banco de dados.
  • Reduzir os custos de ajustes frequentes em dados atualizados.

Microsoft.Extensions.VectorData library

Para usar a pesquisa de vetor de .NET, você pode usar seu driver de banco de dados ou SDK regular sem a necessidade de nenhuma biblioteca ou API adicional. Por exemplo, em SQL Server, a pesquisa de vetor pode ser executada no T-SQL ao usar o driver de .NET padrão, SqlClient. No entanto, acessar a pesquisa de vetor dessa maneira geralmente é de nível bastante baixo, requer uma cerimônia considerável para lidar com a serialização/desserialização e o código resultante não é portátil entre bancos de dados.

Como alternativa, o pacote 📦 Microsoft.Extensions.VectorData.Abstractions fornece uma camada unificada de abstrações para interagir com repositórios de vetores no .NET. Essas abstrações permitem que você escreva um código simples de alto nível em uma única API e troque o repositório de vetores subjacente por alterações mínimas em seu aplicativo.

A biblioteca fornece os seguintes recursos principais:

  • Seamless .NET type mapping: mapeie seu tipo de .NET diretamente para o banco de dados, semelhante a um mapeador de objeto/relacional.
  • Modelo de dadosunificado: defina seu modelo de dados uma vez usando atributos .NET e use-o em qualquer repositório de vetores com suporte.
  • Operações CRUD: criar, ler, atualizar e excluir registros em um repositório de vetores.
  • Pesquisa vetor e híbrida: consultar registros por similaridade semântica usando a pesquisa de vetor ou combinar pesquisa de vetor e texto para pesquisa híbrida.
  • Geração e gerenciamento de incorporações: configure o gerador de incorporações uma vez e deixe a biblioteca lidar com a geração de forma transparente.
  • Gerenciamento de coleções: criar, listar e excluir coleções (tabelas ou índices) em um repositório de vetores.

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

Microsoft.Extensions.VectorData e Entity Framework Core

Se você já estiver usando Entity Framework Core para acessar seu banco de dados, é provável que seu provedor de banco de dados já dê suporte à pesquisa de vetor, e as consultas LINQ poderão ser usadas para expressar essas pesquisas; Microsoft. Extensions.VectorData não é necessariamente necessário nesses aplicativos. No entanto, a maioria dos bancos de dados vetoriais dedicados não são suportados pelo EF Core, e o Microsoft.Extensions.VectorData pode fornecer uma boa experiência para trabalhar com essas ferramentas. Além disso, você também pode se encontrar usando eF e Microsoft. Extensions.VectorData no mesmo aplicativo, por exemplo, ao usar uma camada adicional, como Microsoft. Extensions.DataIngestion.

Abstrações de chave

Aqui está um exemplo mínimo de ponta a ponta que cria uma coleção, atualiza registros e executa uma pesquisa de vetor:

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; }
}

Provedores de repositório de vetores

O pacote Microsoft.Extensions.VectorData.Abstractions define as abstrações e os pacotes provider separados fornecem implementações para bancos de dados vetoriais específicos. Escolha o provedor que corresponde ao banco de dados vetor, por exemplo, Microsoft. SemanticKernel.Connectors.AzureAISearch.

Observação

Apesar da inclusão de "SemanticKernel" nos nomes dos pacotes, esses provedores não têm nada a ver com Kernel semântico e são utilizáveis em qualquer lugar em .NET, incluindo o Agent Framework.

Todos os provedores implementam as mesmas VectorStoreVectorStoreCollection<TKey,TRecord> classes abstratas, para que você possa alternar entre elas sem alterar a lógica do aplicativo.

Dica

Use o provedor na memória (Microsoft. SemanticKernel.Connectors.InMemory) durante o desenvolvimento/prototipagem inicial - ele não requer nenhum serviço externo ou configuração e você pode trocá-lo por um provedor de produção mais tarde. Evite usar o provedor InMemory para teste, pois pode haver diferenças importantes entre esse provedor e seu banco de dados de produção. Considere usar testcontainers para executar testes em seu sistema de banco de dados de produção.