Crie um aplicativo de pesquisa vetorial .NET AI
Neste início rápido, você cria um aplicativo de console .NET para executar a pesquisa semântica em um repositório de vetores para encontrar resultados relevantes para a consulta do usuário. Você aprende a gerar incorporações para prompts do usuário e usar essas incorporações para consultar o armazenamento de dados vetoriais. A funcionalidade de pesquisa vetorial também é um componente-chave para cenários de Geração Aumentada de Recuperação (RAG). O aplicativo usa as bibliotecas Microsoft.Extensions.AI e Microsoft.Extensions.VectorData.Abstractions para que você possa escrever código usando abstrações de IA em vez de um SDK específico. As abstrações de IA ajudam a criar código de acoplamento flexível que permite alterar o modelo de IA subjacente com alterações mínimas no aplicativo.
Pré-requisitos
- SDK do .NET 8.0 ou superior - Instale o SDK do .NET 8.0.
- Uma chave de API do OpenAI para que você possa executar este exemplo.
Pré-requisitos
- SDK do .NET 8.0 ou superior - Instale o SDK do .NET 8.
- Uma assinatura do Azure - Crie uma gratuitamente.
- Acesso ao serviço Azure OpenAI.
- CLI do Desenvolvedor do Azure (opcional) - Instalar ou atualizar a CLI do Desenvolvedor do Azure.
Clone o repositório de exemplo
Você pode criar seu próprio aplicativo usando as etapas nas seções à frente ou pode clonar o repositório GitHub que contém os aplicativos de exemplo concluídos para todos os inícios rápidos. Se você planeja usar o Azure OpenAI, o repositório de exemplo também é estruturado como um modelo de CLI do Desenvolvedor do Azure que pode provisionar um recurso do Azure OpenAI para você.
git clone https://github.com/dotnet/ai-samples.git
Interaja com seus dados usando repositórios vetoriais
Armazenamentos vetoriais ou bancos de dados vetoriais são essenciais para tarefas como pesquisa semântica, Geração Aumentada de Recuperação (RAG) e outros cenários que exigem o aterramento de respostas generativas de IA. Enquanto os bancos de dados relacionais e os bancos de dados de documentos são otimizados para dados estruturados e semiestruturados, os bancos de dados vetoriais são criados para armazenar, indexar e gerenciar com eficiência os dados representados como vetores de incorporação. Como resultado, os algoritmos de indexação e pesquisa usados por bancos de dados vetoriais são otimizados para recuperar dados de forma eficiente que podem ser usados downstream em seus aplicativos.
Explore Microsoft.Extensions.VectorData.Abstractions
Microsoft.Extensions.VectorData.Abstractions é uma biblioteca .NET desenvolvida em colaboração com o Semantic Kernel e o ecossistema .NET mais amplo para fornecer uma camada unificada de abstrações para interagir com repositórios vetoriais.
As abstrações em Microsoft.Extensions.VectorData.Abstractions
fornecem aos autores e desenvolvedores de bibliotecas a seguinte funcionalidade:
- Executar operações CRUD (Create-Read-Update-Delete) em repositórios vetoriais
- Usar pesquisa vetorial e de texto em repositórios vetoriais
Observação
A biblioteca Microsoft.Extensions.VectorData.Abstractions está atualmente em pré-visualização.
Criar a aplicação
Conclua as seguintes etapas para criar um aplicativo de console .NET que possa realizar o seguinte:
- Criar e preencher um repositório de vetores gerando incorporações para um conjunto de dados
- Gerar uma incorporação para o prompt do usuário
- Consultar o armazém de vetores usando a incorporação do prompt do utilizador.
- Exibe os resultados relevantes da pesquisa vetorial
Em um diretório vazio no computador, use o comando
dotnet new
para criar um novo aplicativo de console:dotnet new console -o VectorDataAI
Altere o diretório para a pasta do aplicativo:
cd VectorDataAI
Instale os pacotes necessários:
dotnet add package Azure.Identity dotnet add package Azure.AI.OpenAI dotnet add package Microsoft.Extensions.AI.OpenAI --prerelease dotnet add package Microsoft.Extensions.VectorData.Abstractions --prerelease dotnet add package Microsoft.SemanticKernel.Connectors.InMemory --prerelease dotnet add package Microsoft.Extensions.Configuration dotnet add package Microsoft.Extensions.Configuration.UserSecrets
A lista a seguir descreve para que cada pacote é usado no aplicativo
VectorDataAI
:-
Azure.Identity
fornece suporte à autenticação de tokenMicrosoft Entra ID
no SDK do Azure usando classes comoDefaultAzureCredential
. -
Azure.AI.OpenAI
é o pacote oficial para usar a biblioteca .NET do OpenAI com o Serviço OpenAI do Azure. -
Microsoft.SemanticKernel.Connectors.InMemory
fornece uma classe de armazenamento vetorial na memória para armazenar registros de dados vetoriais consultáveis. -
Microsoft.Extensions.VectorData.Abstractions
permite Create-Read-Update-Delete (CRUD) e operações de pesquisa em repositórios vetoriais. - Microsoft.Extensions.Configuration fornece a implementação da configuração baseada em par chave-valor.
-
Microsoft.Extensions.Configuration.UserSecrets
é uma implementação de provedor de configuração de segredos de usuário paraMicrosoft.Extensions.Configuration
.
dotnet add package Microsoft.Extensions.AI.OpenAI --prerelease dotnet add package Microsoft.Extensions.VectorData.Abstractions --prerelease dotnet add package Microsoft.SemanticKernel.Connectors.InMemory --prerelease dotnet add package Microsoft.Extensions.Configuration dotnet add package Microsoft.Extensions.Configuration.UserSecrets
A lista a seguir descreve para que cada pacote é usado no aplicativo
VectorDataAI
:-
Microsoft.Extensions.AI.OpenAI
fornece abstrações de IA para modelos ou endpoints compatíveis com OpenAI. Esta biblioteca também inclui a biblioteca oficial deOpenAI
para a API de serviço da OpenAI como dependência. -
Microsoft.SemanticKernel.Connectors.InMemory
fornece uma classe de armazenamento vetorial na memória para armazenar registros de dados vetoriais consultáveis. -
Microsoft.Extensions.VectorData.Abstractions
permite Create-Read-Update-Delete (CRUD) e operações de pesquisa em repositórios vetoriais. - Microsoft.Extensions.Configuration fornece a implementação da configuração baseada em par chave-valor.
-
Microsoft.Extensions.Configuration.UserSecrets
é uma implementação de provedor de configuração de segredos de usuário paraMicrosoft.Extensions.Configuration
.
-
Abra o aplicativo no Visual Studio Code (ou seu editor de escolha).
code .
Criar o serviço de IA
O repositório GitHub de exemplo é estruturado como um modelo de CLI (azd
) do Desenvolvedor do Azure, que azd
pode ser usado para provisionar o serviço e o modelo do Azure OpenAI para você.
Em um terminal ou prompt de comando, navegue até o
src\quickstarts\azure-openai
diretório do repositório de exemplo.Execute o
azd up
comando para provisionar os recursos do Azure OpenAI. Pode levar vários minutos para criar o serviço Azure OpenAI e implantar o modelo.azd up
azd
também configura os segredos de usuário necessários para o aplicativo de exemplo, como o ponto de extremidade do Azure OpenAI e o nome do modelo.
Configurar o aplicativo
Navegue até a raiz do seu projeto .NET a partir de um terminal ou prompt de comando.
Execute os seguintes comandos para configurar sua chave de API OpenAI como um segredo para o aplicativo de exemplo:
dotnet user-secrets init dotnet user-secrets set OpenAIKey <your-openai-key> dotnet user-secrets set ModelName <your-openai-model-name>
Observação
Para o valor
ModelName
, você precisa especificar um modelo de incorporação de texto OpenAI, comotext-embedding-3-small
outext-embedding-3-large
, para gerar incorporações para pesquisa vetorial nas seções a seguir.
Adicionar o código do aplicativo
Adicione uma nova classe chamada CloudService ao seu projeto com as seguintes propriedades:
using Microsoft.Extensions.VectorData; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace VectorDataAI { internal class CloudService { [VectorStoreRecordKey] public int Key { get; set; } [VectorStoreRecordData] public string Name { get; set; } [VectorStoreRecordData] public string Description { get; set; } [VectorStoreRecordVector(384, DistanceFunction.CosineSimilarity)] public ReadOnlyMemory<float> Vector { get; set; } } }
No código anterior:
- Os atributos C# fornecidos por
Microsoft.Extensions.VectorData
influenciam como cada propriedade é tratada quando usada em um repositório vetorial. - A propriedade Vetor armazena uma incorporação gerada que representa o significado semântico do Name e Description para pesquisas vetoriais.
- Os atributos C# fornecidos por
No arquivo Program.cs, adicione o seguinte código para criar um conjunto de dados que descreva uma coleção de serviços de nuvem:
var cloudServices = new List<CloudService>() { new CloudService { Key=0, Name="Azure App Service", Description="Host .NET, Java, Node.js, and Python web applications and APIs in a fully managed Azure service. You only need to deploy your code to Azure. Azure takes care of all the infrastructure management like high availability, load balancing, and autoscaling." }, new CloudService { Key=1, Name="Azure Service Bus", Description="A fully managed enterprise message broker supporting both point to point and publish-subscribe integrations. It's ideal for building decoupled applications, queue-based load leveling, or facilitating communication between microservices." }, new CloudService { Key=2, Name="Azure Blob Storage", Description="Azure Blob Storage allows your applications to store and retrieve files in the cloud. Azure Storage is highly scalable to store massive amounts of data and data is stored redundantly to ensure high availability." }, new CloudService { Key=3, Name="Microsoft Entra ID", Description="Manage user identities and control access to your apps, data, and resources.." }, new CloudService { Key=4, Name="Azure Key Vault", Description="Store and access application secrets like connection strings and API keys in an encrypted vault with restricted access to make sure your secrets and your application aren't compromised." }, new CloudService { Key=5, Name="Azure AI Search", Description="Information retrieval at scale for traditional and conversational search applications, with security and options for AI enrichment and vectorization." }
Crie e configure uma implementação de
IEmbeddingGenerator
para enviar solicitações para um modelo de IA incorporado:// Load the configuration values var config = new ConfigurationBuilder().AddUserSecrets<Program>().Build(); string endpoint = config["AZURE_OPENAI_ENDPOINT"]; string model = config["AZURE_OPENAI_GPT_NAME"]; // Create the embedding generator IEmbeddingGenerator<string, Embedding<float>> generator = new AzureOpenAIClient( new Uri(endpoint), new DefaultAzureCredential())
Observação
DefaultAzureCredential procura credenciais de autenticação a partir das suas ferramentas locais. Se você não estiver usando o modelo
azd
para provisionar o recurso do Azure OpenAI, precisará atribuir a funçãoAzure AI Developer
à conta usada para entrar no Visual Studio ou na CLI do Azure. Para obter mais informações, consulte Autenticar nos serviços de IA do Azure com .NET.// Load the configuration values var config = new ConfigurationBuilder().AddUserSecrets<Program>().Build(); string model = config["ModelName"]; string key = config["OpenAIKey"]; // Create the embedding generator IEmbeddingGenerator<string, Embedding<float>> generator = new OpenAIClient(new ApiKeyCredential(key)) .AsEmbeddingGenerator(modelId: model);
Crie e preencha um repositório vetorial com os dados do serviço de nuvem. Use a implementação
IEmbeddingGenerator
para criar e atribuir um vetor de incorporação para cada registro nos dados do serviço de nuvem:// Create and populate the vector store var vectorStore = new InMemoryVectorStore(); var cloudServicesStore = vectorStore.GetCollection<int, CloudService>("cloudServices"); await cloudServicesStore.CreateCollectionIfNotExistsAsync(); foreach (var service in cloudServices) { service.Vector = await generator.GenerateEmbeddingVectorAsync(service.Description); await cloudServicesStore.UpsertAsync(service); }
As incorporações são representações numéricas do significado semântico para cada registro de dados, o que as torna compatíveis com recursos de pesquisa vetorial.
Crie uma incorporação para uma consulta de pesquisa e use-a para executar uma pesquisa vetorial no repositório de vetores:
// Convert a search query to a vector and search the vector store var query = "Which Azure service should I use to store my Word documents?"; var queryEmbedding = await generator.GenerateEmbeddingVectorAsync(query); var results = await cloudServicesStore.VectorizedSearchAsync(queryEmbedding, new VectorSearchOptions() { Top = 1, VectorPropertyName = "Vector" }); await foreach (var result in results.Results) { Console.WriteLine($"Name: {result.Record.Name}"); Console.WriteLine($"Description: {result.Record.Description}"); Console.WriteLine($"Vector match score: {result.Score}"); Console.WriteLine(); }
Use o
dotnet run
comando para executar o aplicativo:dotnet run
O aplicativo imprime o resultado superior da pesquisa vetorial, que é o serviço de nuvem mais relevante para a consulta original. Você pode modificar a consulta para tentar diferentes cenários de pesquisa.
Clean up resources (Limpar recursos)
Quando você não precisar mais do aplicativo ou recursos de exemplo, remova a implantação correspondente e todos os recursos.
azd down