Поделиться через


Создание AI-приложения для векторного поиска на платформе .NET

В этом кратком руководстве вы создадите консольное приложение .NET для выполнения семантического поиска в хранилище векторов, чтобы найти соответствующие результаты для запроса пользователя. Вы узнаете, как создавать внедрения для запросов пользователей и использовать их для запроса к хранилищу векторных данных. Функции поиска векторов также являются ключевым компонентом для сценариев извлечения дополненного поколения (RAG). Приложение использует библиотеки Microsoft.Extensions.AI и Microsoft.Extensions.VectorData.Abstractions, чтобы можно было писать код с помощью абстракций ИИ, а не конкретного пакета SDK. Абстракции искусственного интеллекта помогают создавать слабо связанные коды, которые позволяют изменять базовую модель ИИ с минимальными изменениями в приложении.

Необходимые компоненты

Необходимые компоненты

Клонирование примера репозитория

Вы можете создать собственное приложение, выполнив действия, описанные в разделах, или клонировать репозиторий GitHub, содержащий готовые примеры приложений для всех кратких руководств. Если вы планируете использовать Azure OpenAI, пример репозитория также структурирован как шаблон интерфейса командной строки разработчика Azure, который может подготовить ресурс Azure OpenAI для вас.

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

Взаимодействие с данными с помощью векторных хранилищ

Хранилища векторов или векторные базы данных важны для таких задач, как семантический поиск, Retrieval Augmented Generation (RAG) и другие сценарии, требующие обоснования ответов генеративного искусственного интеллекта. Хотя реляционные базы данных и базы данных документов оптимизированы для структурированных и полуструктурированных данных, векторные базы данных создаются для эффективного хранения, индексирования и управления данными, представленными как векторы внедрения. В результате алгоритмы индексирования и поиска, используемые векторными базами данных, оптимизированы для эффективного извлечения данных, которые можно использовать ниже в приложениях.

Изучите Microsoft.Extensions.VectorData.Abstractions

Microsoft.Extensions.VectorData.Abstractions — это библиотека .NET, разработанная в сотрудничестве с семантической ядром и более широкой экосистемой .NET для обеспечения единого слоя абстракций для взаимодействия с векторными хранилищами.

Абстракции в Microsoft.Extensions.VectorData.Abstractions предоставляют авторам библиотек и разработчикам следующие функции:

  • Выполнение операций create-Read-Update-Delete (CRUD) в хранилищах векторов
  • Использование векторного и текстового поиска в хранилищах векторов

Заметка

Библиотека Microsoft.Extensions.VectorData.Abstractions в настоящее время находится в предварительной версии.

Создание приложения

Выполните следующие действия, чтобы создать консольное приложение .NET, которое может выполнить следующие действия:

  • Создать и заполнить векторное хранилище, создавая встраивания для набора данных
  • Сгенерировать встраивание для запроса пользователя
  • Запрос хранилища векторов с помощью внедрения запроса пользователя
  • Отображает соответствующие результаты из векторного поиска
  1. В пустом каталоге на компьютере используйте команду dotnet new для создания нового консольного приложения:

    dotnet new console -o VectorDataAI
    
  2. Измените каталог в папку приложения:

    cd VectorDataAI
    
  3. Установите необходимые пакеты:

    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
    

    В следующем списке описывается, для чего используется каждый пакет в приложении VectorDataAI:

    • Azure.Identity предоставляет поддержку аутентификации токенов Microsoft Entra ID в Azure SDK с помощью таких классов, как DefaultAzureCredential.
    • Azure.AI.OpenAI является официальным пакетом для использования библиотеки .NET OpenAI со службой Azure OpenAI.
    • Microsoft.SemanticKernel.Connectors.InMemory предоставляет класс векторного хранилища в памяти для хранения запрашиваемых записей векторных данных.
    • Microsoft.Extensions.VectorData.Abstractions включает операции создания, чтенияUpdate-Delete (CRUD) и поиска в хранилищах векторов.
    • Microsoft.Extensions.Configuration предоставляет реализацию конфигурации на основе пар "ключ-значение".
    • Microsoft.Extensions.Configuration.UserSecrets — это реализация поставщика конфигурации пользовательских секретов для Microsoft.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
    

    В следующем списке описывается, для чего используется каждый пакет в приложении VectorDataAI:

    • Microsoft.Extensions.AI.OpenAI предоставляет абстракции ИИ для моделей или конечных точек, совместимых с OpenAI. Эта библиотека также включает официальную библиотеку OpenAI для API службы OpenAI в качестве зависимости.
    • Microsoft.SemanticKernel.Connectors.InMemory предоставляет класс векторного хранилища в памяти для хранения запрашиваемых записей векторных данных.
    • Microsoft.Extensions.VectorData.Abstractions включает операции создания, чтенияUpdate-Delete (CRUD) и поиска в хранилищах векторов.
    • Microsoft.Extensions.Configuration предоставляет реализацию конфигурации на основе пар "ключ-значение".
    • Microsoft.Extensions.Configuration.UserSecrets — это реализация поставщика конфигурации пользовательских секретов для Microsoft.Extensions.Configuration.
  4. Откройте приложение в Visual Studio Code (или выбранный редактор).

    code .
    

Создание службы ИИ

Пример репозитория GitHub структурирован как шаблон интерфейса командной строки разработчика Azure (azd), который azd можно использовать для подготовки службы и модели Azure OpenAI.

  1. В терминале или командной строке перейдите в src\quickstarts\azure-openai каталог примера репозитория.

  2. azd up Выполните команду, чтобы подготовить ресурсы Azure OpenAI. Для создания службы Azure OpenAI и развертывания модели может потребоваться несколько минут.

    azd up
    

    azd также настраивает необходимые секреты пользователей для примера приложения, например конечную точку Azure OpenAI и имя модели.

Настройка приложения

  1. Перейдите в корневой каталог проекта .NET из терминала или командной строки.

  2. Выполните следующие команды, чтобы настроить ключ API OpenAI в качестве секрета для примера приложения:

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

    Заметка

    Для значения ModelName необходимо указать модель внедрения текста OpenAI, например text-embedding-3-small или text-embedding-3-large, чтобы создать внедрения для поиска векторов в следующих разделах.

Добавление кода приложения

  1. Добавьте новый класс с именем CloudService в проект со следующими свойствами:

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

    В приведенном выше коде:

    • Атрибуты C#, предоставляемые Microsoft.Extensions.VectorData влияют на то, как каждое свойство обрабатывается при использовании в хранилище векторов.
    • Свойство Vector хранит векторное представление, которое отображает семантическое значение имени и описания для поиска по вектору.
  2. В файле Program.cs добавьте следующий код, чтобы создать набор данных, описывающий коллекцию облачных служб:

    
    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. Создайте и настройте реализацию IEmbeddingGenerator для отправки запросов в модель внедрения ИИ:

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

    Заметка

    DefaultAzureCredential выполняет поиск аутентификационных данных из локального инструментария. Если вы не используете шаблон azd для подготовки ресурса Azure OpenAI, вам потребуется назначить роль Azure AI Developer учетной записи, которую вы использовали для входа в Visual Studio или Azure CLI. Дополнительные сведения см. в статье Аутентификация в службах ИИ Azure с помощью.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. Создайте и заполните векторное хранилище данными облачной службы. Используйте реализацию IEmbeddingGenerator для создания и назначения вектора внедрения для каждой записи в данных облачной службы:

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

    Внедрение — это числовые представления семантического значения для каждой записи данных, что делает их совместимыми с функциями векторного поиска.

  5. Создайте внедрение для поискового запроса и используйте его для выполнения векторного поиска в хранилище векторов:

    // 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. dotnet run Используйте команду для запуска приложения:

    dotnet run
    

    Приложение выводит верхний результат векторного поиска, который является облачной службой, которая наиболее актуальна для исходного запроса. Вы можете изменить запрос, чтобы попробовать различные сценарии поиска.

Очистка ресурсов

Если вам больше не нужен пример приложения или ресурсов, удалите соответствующее развертывание и все ресурсы.

azd down

Следующие шаги