Создание AI-приложения для векторного поиска на платформе .NET
В этом кратком руководстве вы создадите консольное приложение .NET для выполнения семантического поиска в хранилище векторов, чтобы найти соответствующие результаты для запроса пользователя. Вы узнаете, как создавать внедрения для запросов пользователей и использовать их для запроса к хранилищу векторных данных. Функции поиска векторов также являются ключевым компонентом для сценариев извлечения дополненного поколения (RAG). Приложение использует библиотеки Microsoft.Extensions.AI и Microsoft.Extensions.VectorData.Abstractions, чтобы можно было писать код с помощью абстракций ИИ, а не конкретного пакета SDK. Абстракции искусственного интеллекта помогают создавать слабо связанные коды, которые позволяют изменять базовую модель ИИ с минимальными изменениями в приложении.
Необходимые компоненты
- SDK для .NET 8.0 или более поздней версии — Установите SDK для .NET 8.0.
- Ключ API из OpenAI, чтобы можно было запустить этот пример.
Необходимые компоненты
- Пакет SDK для .NET 8.0 или более поздней версии— установить пакет SDK для .NET 8.
- Подписка Azure — создайте бесплатную учетную запись.
- Доступ к службе Azure OpenAI.
- Интерфейс командной строки разработчика Azure (необязательно) — установить или обновитьинтерфейса командной строки разработчика Azure.
Клонирование примера репозитория
Вы можете создать собственное приложение, выполнив действия, описанные в разделах, или клонировать репозиторий 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, которое может выполнить следующие действия:
- Создать и заполнить векторное хранилище, создавая встраивания для набора данных
- Сгенерировать встраивание для запроса пользователя
- Запрос хранилища векторов с помощью внедрения запроса пользователя
- Отображает соответствующие результаты из векторного поиска
В пустом каталоге на компьютере используйте команду
dotnet new
для создания нового консольного приложения:dotnet new console -o VectorDataAI
Измените каталог в папку приложения:
cd VectorDataAI
Установите необходимые пакеты:
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
.
-
Откройте приложение в Visual Studio Code (или выбранный редактор).
code .
Создание службы ИИ
Пример репозитория GitHub структурирован как шаблон интерфейса командной строки разработчика Azure (azd
), который azd
можно использовать для подготовки службы и модели Azure OpenAI.
В терминале или командной строке перейдите в
src\quickstarts\azure-openai
каталог примера репозитория.azd up
Выполните команду, чтобы подготовить ресурсы Azure OpenAI. Для создания службы Azure OpenAI и развертывания модели может потребоваться несколько минут.azd up
azd
также настраивает необходимые секреты пользователей для примера приложения, например конечную точку Azure OpenAI и имя модели.
Настройка приложения
Перейдите в корневой каталог проекта .NET из терминала или командной строки.
Выполните следующие команды, чтобы настроить ключ 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
, чтобы создать внедрения для поиска векторов в следующих разделах.
Добавление кода приложения
Добавьте новый класс с именем 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 хранит векторное представление, которое отображает семантическое значение имени и описания для поиска по вектору.
- Атрибуты C#, предоставляемые
В файле 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." }
Создайте и настройте реализацию
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);
Создайте и заполните векторное хранилище данными облачной службы. Используйте реализацию
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); }
Внедрение — это числовые представления семантического значения для каждой записи данных, что делает их совместимыми с функциями векторного поиска.
Создайте внедрение для поискового запроса и используйте его для выполнения векторного поиска в хранилище векторов:
// 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(); }
dotnet run
Используйте команду для запуска приложения:dotnet run
Приложение выводит верхний результат векторного поиска, который является облачной службой, которая наиболее актуальна для исходного запроса. Вы можете изменить запрос, чтобы попробовать различные сценарии поиска.
Очистка ресурсов
Если вам больше не нужен пример приложения или ресурсов, удалите соответствующее развертывание и все ресурсы.
azd down