Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В этом кратком руководстве вы создадите консольное приложение .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; 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 добавьте следующий код, чтобы создать набор данных, описывающий коллекцию облачных служб:
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." } ];
Создайте и настройте реализацию
IEmbeddingGenerator
для отправки запросов в модель внедрения ИИ:// 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();
Примечание.
DefaultAzureCredential выполняет поиск аутентификационных данных из локального инструментария. Если вы не используете шаблон
azd
для подготовки ресурса Azure OpenAI, вам потребуется назначить рольAzure AI Developer
учетной записи, которую вы использовали для входа в Visual Studio или Azure CLI. Дополнительные сведения см. в статье Аутентификация в службах Azure AI с использованием.NET.IEmbeddingGenerator<string, Embedding<float>> generator = new OpenAIClient(new ApiKeyCredential(key)) .GetEmbeddingClient(model: model) .AsIEmbeddingGenerator(); // Create and populate the vector store. var vectorStore = new InMemoryVectorStore(); IVectorStoreRecordCollection<int, CloudService> cloudServicesStore = vectorStore.GetCollection<int, CloudService>("cloudServices"); await cloudServicesStore.CreateCollectionIfNotExistsAsync();
Создайте и заполните векторное хранилище данными облачной службы. Используйте реализацию
IEmbeddingGenerator
для создания и назначения вектора внедрения для каждой записи в данных облачной службы:// Create and populate the vector store var vectorStore = new InMemoryVectorStore(); IVectorStoreRecordCollection<int, CloudService> cloudServicesStore = vectorStore.GetCollection<int, CloudService>("cloudServices"); await cloudServicesStore.CreateCollectionIfNotExistsAsync(); foreach (CloudService 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 string query = "Which Azure service should I use to store my Word documents?"; ReadOnlyMemory<float> queryEmbedding = await generator.GenerateEmbeddingVectorAsync(query); VectorSearchResults<CloudService> results = await cloudServicesStore.VectorizedSearchAsync(queryEmbedding, new VectorSearchOptions<CloudService>() { Top = 1 }); await foreach (VectorSearchResult<CloudService> 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