Compartir a través de


Creación de una aplicación de vector de búsqueda .NET AI

En este inicio rápido, creará una aplicación de consola de .NET para realizar búsquedas semánticas en un almacén de vectores para buscar resultados relevantes para la consulta del usuario. Aprenderá a generar incrustaciones para solicitudes de usuario y a usar esas incrustaciones para consultar el almacén de datos vectoriales. La funcionalidad de búsqueda vectorial también es un componente clave para escenarios de generación aumentada de recuperación (RAG). La aplicación usa las bibliotecas de Microsoft.Extensions.AI y Microsoft.Extensions.VectorData.Abstractions para que pueda escribir código mediante abstracciones de IA en lugar de un SDK específico. Las abstracciones de IA ayudan a crear código acoplado flexiblemente que le permite cambiar el modelo de IA subyacente con cambios mínimos en la aplicación.

Requisitos previos

Requisitos previos

Clonación del repositorio de ejemplo

Puede crear su propia aplicación siguiendo los pasos descritos en las secciones siguientes, o bien puede clonar el repositorio de GitHub que contiene las aplicaciones de ejemplo completadas para todas las guías de inicio rápido. Si planea usar Azure OpenAI, el repositorio de ejemplo también se estructura como una plantilla de la CLI para desarrolladores de Azure que puede aprovisionar un recurso de Azure OpenAI automáticamente.

git clone https://github.com/dotnet/ai-samples.git

Interacción con los datos mediante almacenes de vectores

Los almacenes de vectores o las bases de datos vectoriales son esenciales para tareas como la búsqueda semántica, la generación aumentada de recuperación (RAG) y otros escenarios que requieren respuestas de IA generativas de base. Aunque las bases de datos relacionales y las bases de datos de documentos están optimizadas para datos estructurados y semiestructurados, las bases de datos vectoriales se crean para almacenar, indexar y administrar de forma eficaz los datos representados como vectores de inserción. Como resultado, los algoritmos de indexación y búsqueda utilizados por las bases de datos vectoriales están optimizados para recuperar de forma eficaz los datos que se pueden usar de bajada en las aplicaciones.

Explorar Microsoft.Extensions.VectorData.Abstractions

Microsoft.Extensions.VectorData.Abstractions es una biblioteca de .NET desarrollada en colaboración con Semantic Kernel y el ecosistema más amplio de .NET para ofrecer una capa unificada de abstracciones para interactuar con los almacenes de vectores.

Las abstracciones de Microsoft.Extensions.VectorData.Abstractions proporcionan a los autores y desarrolladores de bibliotecas la funcionalidad siguiente:

  • Realizar operaciones de Create-Read-Update-Delete (CRUD) en almacenes de vectores
  • Uso de la búsqueda de vectores y texto en almacenes de vectores

Nota:

La biblioteca Microsoft.Extensions.VectorData.Abstractions está actualmente en versión preliminar.

Creación de la aplicación

Complete los pasos siguientes para crear una aplicación de consola de .NET que pueda realizar lo siguiente:

  • Crear y rellenar un almacén de vectores mediante la generación de incrustaciones para un conjunto de datos
  • Generar una incrustación para la solicitud del usuario
  • Consultar el almacén de vectores utilizando la incrustación de solicitud de usuario
  • Muestra los resultados pertinentes de la búsqueda de vectores.
  1. En un directorio vacío del equipo, use el comando dotnet new para crear una nueva aplicación de consola:

    dotnet new console -o VectorDataAI
    
  2. Cambie el directorio a la carpeta de la aplicación:

    cd VectorDataAI
    
  3. Instale los paquetes necesarios:

    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
    

    En la lista siguiente se describe para qué se usa cada paquete en la aplicación 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
    

    En la lista siguiente se describe para qué se usa cada paquete en la aplicación VectorDataAI:

  4. Abra la aplicación en Visual Studio Code (o en el editor que prefiera).

    code .
    

Creación del servicio de IA

El repositorio de GitHub de ejemplo se estructura como una plantilla de Azure Developer CLI (azd), que azd puede usar para aprovisionar automáticamente el servicio y el modelo de Azure OpenAI.

  1. Desde un terminal o símbolo del sistema, vaya al src\quickstarts\azure-openai directorio del repositorio de ejemplo.

  2. Ejecute el comando azd up para aprovisionar los recursos de Azure OpenAI. Puede tardar varios minutos en crear el servicio Azure OpenAI e implementar el modelo.

    azd up
    

    azd también configura los secretos de usuario necesarios para la aplicación de ejemplo, como el punto de conexión de Azure OpenAI y el nombre del modelo.

Configuración de la aplicación

  1. Vaya a la raíz del proyecto de .NET desde un terminal o símbolo del sistema.

  2. Ejecute los siguientes comandos para configurar la clave de API de OpenAI como un secreto para la aplicación de ejemplo:

    dotnet user-secrets init
    dotnet user-secrets set OpenAIKey <your-openai-key>
    dotnet user-secrets set ModelName <your-openai-model-name>
    

    Nota:

    Para el valor de ModelName, debe especificar un modelo de inserción de texto de OpenAI, como text-embedding-3-small o text-embedding-3-large para generar incrustaciones para la búsqueda de vectores en las secciones siguientes.

Adición del código de la aplicación

  1. Agregue una nueva clase denominada CloudService al proyecto con las siguientes propiedades:

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

    En el código anterior:

    • Los atributos de C# proporcionados por Microsoft.Extensions.VectorData influyen en cómo se gestiona cada propiedad cuando se usa en un almacenamiento vectorial.
    • La propiedad Vector almacena una inserción generada que representa el significado semántico del Nombre y Descripción para las búsquedas vectoriales.
  2. En el archivo Program.cs, agregue el código siguiente para crear un conjunto de datos que describa una colección de servicios en la nube:

    
    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."
            }
    
  3. Cree y configure una implementación de IEmbeddingGenerator para enviar solicitudes a un modelo de inteligencia artificial de inserción:

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

    Nota:

    DefaultAzureCredential busca credenciales de autenticación desde las herramientas locales. Si no usa la plantilla de azd para aprovisionar el recurso de Azure OpenAI, deberá asignar el rol de Azure AI Developer a la cuenta que usó para iniciar sesión en Visual Studio o en la CLI de Azure. Para obtener más información, consulte Autenticación de Servicios de Azure AI con .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);
    
  4. Cree y rellene un almacén de vectores con los datos del servicio en la nube. Use la implementación de IEmbeddingGenerator para crear y asignar un vector de inserción para cada registro de los datos del servicio en la nube:

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

    Las incrustaciones son representaciones numéricas del significado semántico de cada registro de datos, lo que hace que sean compatibles con las características de búsqueda vectorial.

  5. Cree una inserción para una consulta de búsqueda y úsela para realizar una búsqueda vectorial en el almacén de vectores:

    // 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();
    }
    
  6. Use el comando dotnet run para ejecutar la aplicación:

    dotnet run
    

    La aplicación imprime el resultado superior de la búsqueda de vectores, que es el servicio en la nube más relevante para la consulta original. Puede modificar la consulta para probar diferentes escenarios de búsqueda.

Limpieza de recursos

Cuando ya no necesite la aplicación o los recursos de ejemplo, quite la implementación correspondiente y todos los recursos.

azd down

Pasos siguientes