Partilhar via


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 embeddings para prompts do usuário e usar esses embeddings para consultar o repositório vetorial de dados.

Os armazenadores vetoriais, ou bancos de dados vetoriais, são essenciais para tarefas como pesquisa semântica, geração baseada em recuperação (RAG) e outros cenários que exigem a contextualização 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.

Sobre as bibliotecas

O aplicativo usa as Microsoft.Extensions.AI bibliotecas e Microsoft.Extensions.VectorData 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.

📦 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:

  • Realizar operações create-read-update-delete (CRUD) em armazenamentos de vetores.
  • Use a pesquisa vetorial e de texto em repositórios de vetores.

Observação

A biblioteca Microsoft.Extensions.VectorData.Abstractions está atualmente em pré-visualização.

Pré-requisitos

Pré-requisitos

Criar a aplicação

Conclua as seguintes etapas para criar um aplicativo de console .NET que possa:

  • Crie e preencha um repositório de vetores gerando incorporações para um conjunto de dados.
  • Gere uma incorporação para o prompt do usuário.
  • Consulte o repositório de vetores usando a incorporação do prompt do usuário.
  • Exiba os resultados relevantes da pesquisa vetorial.
  1. Em um diretório vazio no computador, use o comando dotnet new para criar um novo aplicativo de console:

    dotnet new console -o VectorDataAI
    
  2. Altere o diretório para a pasta do aplicativo:

    cd VectorDataAI
    
  3. 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
    dotnet add package System.Linq.AsyncEnumerable
    

    A seguinte lista descreve cada pacote na aplicação VectorDataAI.

    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
    dotnet add package System.Linq.AsyncEnumerable
    

    A seguinte lista descreve cada pacote na aplicação VectorDataAI.

  4. Abra o aplicativo no Visual Studio Code (ou seu editor de escolha).

    code .
    

Criar o serviço de IA

  1. Para provisionar um serviço e um modelo do Azure OpenAI, conclua as etapas no artigo Criar e implantar um recurso do Serviço OpenAI do Azure .

  2. Em um terminal ou prompt de comando, navegue até a raiz do diretório do projeto.

  3. Execute os seguintes comandos para configurar o endpoint do Azure OpenAI e o nome do modelo para a aplicação de exemplo:

    dotnet user-secrets init
    dotnet user-secrets set AZURE_OPENAI_ENDPOINT <your-Azure-OpenAI-endpoint>
    dotnet user-secrets set AZURE_OPENAI_GPT_NAME <your-Azure-OpenAI-model-name>
    

Configurar o aplicativo

  1. Navegue até a raiz do seu projeto .NET a partir de um terminal ou prompt de comando.

  2. 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 nome do modelo, você precisa especificar um modelo de incorporação de texto, como text-embedding-3-small ou text-embedding-3-large para gerar incorporações para pesquisa vetorial nas seções a seguir. Para obter mais informações sobre a incorporação de modelos, consulte Incorporações.

Adicionar o código do aplicativo

  1. Adicione uma nova classe nomeada CloudService ao seu projeto com as seguintes propriedades:

    using Microsoft.Extensions.VectorData;
    
    namespace VectorDataAI;
    
    internal class CloudService
    {
        [VectorStoreKey]
        public int Key { get; set; }
    
        [VectorStoreData]
        public string Name { get; set; }
    
        [VectorStoreData]
        public string Description { get; set; }
    
        [VectorStoreVector(
            Dimensions: 384,
            DistanceFunction = DistanceFunction.CosineSimilarity)]
        public ReadOnlyMemory<float> Vector { get; set; }
    }
    

    Os Microsoft.Extensions.VectorData atributos, como VectorStoreKeyAttribute, influenciam como cada propriedade é manipulada quando usada em um repositório de vetores. A Vector propriedade armazena uma incorporação gerada que representa o significado semântico Description do valor para pesquisas vetoriais.

  2. Program.cs No arquivo, adicione o seguinte código para criar um conjunto de dados que descreva uma coleção de serviços de nuvem:

    List<CloudService> cloudServices =
    [
        new() {
                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() {
                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() {
                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() {
                Key = 3,
                Name = "Microsoft Entra ID",
                Description = "Manage user identities and control access to your apps, data, and resources."
        },
        new() {
                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() {
                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."
        }
    ];
    
  3. Crie e configure uma implementação de IEmbeddingGenerator para enviar solicitações para um modelo de IA incorporado:

    // Load the configuration values.
    IConfigurationRoot 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())
            .GetEmbeddingClient(deploymentName: model)
            .AsIEmbeddingGenerator();
    

    Observação

    DefaultAzureCredential procura credenciais de autenticação a partir das suas ferramentas locais. Você precisará atribuir a Azure AI Developer função à conta usada para entrar no Visual Studio ou na CLI do Azure. Para mais informações, consulte Autenticar nos serviços de IA do Azure com o .NET.

    // Load the configuration values.
    IConfigurationRoot 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))
          .GetEmbeddingClient(model: model)
          .AsIEmbeddingGenerator();
    
  4. 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();
    VectorStoreCollection<int, CloudService> cloudServicesStore =
        vectorStore.GetCollection<int, CloudService>("cloudServices");
    await cloudServicesStore.EnsureCollectionExistsAsync();
    
    foreach (CloudService service in cloudServices)
    {
        service.Vector = await generator.GenerateVectorAsync(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.

  5. 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.
    string query = "Which Azure service should I use to store my Word documents?";
    ReadOnlyMemory<float> queryEmbedding = await generator.GenerateVectorAsync(query);
    
    IAsyncEnumerable<VectorSearchResult<CloudService>> results =
        cloudServicesStore.SearchAsync(queryEmbedding, top: 1);
    
    await foreach (VectorSearchResult<CloudService> result in results)
    {
        Console.WriteLine($"Name: {result.Record.Name}");
        Console.WriteLine($"Description: {result.Record.Description}");
        Console.WriteLine($"Vector match score: {result.Score}");
    }
    
  6. 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.

Limpar recursos

Se você não precisar mais deles, exclua o recurso e a implantação do modelo do Azure OpenAI.

  1. No Portal Azure, acesse o recurso OpenAI do Azure.
  2. Selecione o recurso Azure OpenAI e, em seguida, selecione Excluir.

Próximos passos