Векторные базы данных для приложений ИИ .NET

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

Например, можно использовать векторную базу данных для:

  • Определите похожие изображения, документы и песни на основе их содержимого, тем, тональности и стилей.
  • Определите аналогичные продукты на основе их характеристик, функций и групп пользователей.
  • Рекомендуем содержимое, продукты или службы на основе пользовательских настроек.
  • Определите лучшие потенциальные варианты из большого пула вариантов для удовлетворения сложных требований.
  • Определите аномалии данных или мошеннические действия, которые отличаются от преобладающих или нормальных шаблонов.

Векторные базы данных предоставляют возможности поиска векторов для поиска похожих элементов на основе их характеристик данных, а не по точным совпадениям в поле свойства. Поиск векторов работает путем анализа векторных представлений данных, созданных с помощью модели встраивания ИИ, например, модели встраивания Azure OpenAI. Процесс поиска измеряет расстояние между векторами данных и вектором запроса. Векторы данных, ближайшие к вектору запросов, являются наиболее похожими семантикой.

Большинство современных продуктов базы данных поддерживают векторный поиск наряду с традиционным запросом; Это относится к Azure SQL/SQL Server, Azure Cosmos DB, PostgreSQL и многим другим основным продуктам. В качестве альтернативы существует широкий спектр специализированных продуктов векторной базы данных. Эти продукты оптимизированы для выполнения векторного поиска и обычно устанавливаются вместе с традиционной базой данных исключительно для обработки рабочих нагрузок векторного поиска.

Рабочие процессы поиска векторов с .NET и OpenAI

Векторные базы данных и их функции поиска особенно полезны в рабочих процессах по шаблону RAG во взаимодействии с Azure OpenAI. Этот шаблон позволяет расширить модель ИИ с помощью дополнительных семантически богатых знаний о данных. Общий рабочий процесс ИИ с использованием векторных баз данных включает следующие действия.

  1. Создайте эмбеддинги для ваших данных с помощью модели OpenAI.
  2. Храните и индексируйте векторные представления в векторных базах данных или в службе поиска.
  3. Преобразуйте запросы пользователей из приложения в эмбеддинги.
  4. Выполните векторный поиск по вашим данным, сравнивая эмбеддинг пользовательского запроса с эмбеддингами в вашей базе данных.
  5. Используйте языковую модель, например gpt-4o, чтобы собрать понятное завершение из результатов векторного поиска.

Для практического примера этого потока см. руководство Реализация Azure OpenAI с RAG с использованием векторного поиска в приложении .NET.

К другим преимуществам шаблона RAG относятся следующие:

  • Создавайте контекстно релевантные и точные ответы на запросы пользователей из моделей ИИ.
  • Преодолеть ограничения токенов LLM — основная работа выполняется с помощью векторного поиска в базе данных.
  • Уменьшите затраты на частое уточнение обновленных данных.

Библиотека Майкрософт.Extensions.VectorData

Чтобы использовать векторный поиск из .NET, вы можете использовать обычный драйвер базы данных или пакет SDK, не требуя дополнительной библиотеки или API. Например, в SQL Server поиск векторов можно выполнять в T-SQL при использовании стандартного драйвера .NET SqlClient. Однако доступ к векторному поиску таким образом часто довольно низкоуровневый, требует значительной церемонии для обработки сериализации и десериализации, и результирующий код не переносится в разных базах данных.

В качестве альтернативы пакет 📦 Майкрософт.Extensions.VectorData.Abstractions предоставляет единый слой абстракций для взаимодействия с хранилищами векторов в .NET. Эти абстракции позволяют создавать простой, высокоуровневый код для одного API и переключать базовое хранилище векторов с минимальными изменениями в приложении.

Библиотека предоставляет следующие ключевые возможности:

  • Бесшовное сопоставление типов .NET: Отображение типа .NET напрямую в базу данных, аналогично объектно-реляционному мапперу.
  • Unified data model: определите модель данных после использования атрибутов .NET и используйте ее в любом поддерживаемом хранилище векторов.
  • Операции CRUD: создание, чтение, обновление и удаление записей в векторном хранилище.
  • Векторный и гибридный поиск: запрос записей по семантическому сходству с помощью векторного поиска или объединения векторного и текстового поиска для гибридного поиска.
  • Управление генерацией встраиваний: Один раз настройте генератор встраивания и позвольте библиотеке прозрачно обрабатывать процесс генерации.
  • Управление коллекциями: создание, перечисление и удаление коллекций (таблиц или индексов) в векторном хранилище.

Майкрософт.Extensions.VectorData также является основным элементом для дополнительных, более высоких уровней, которые должны взаимодействовать с векторной базой данных. Например, Майкрософт. Extensions.DataIngestion.

Майкрософт.Extensions.VectorData и Entity Framework Core

Если вы уже используете Entity Framework Core для доступа к базе данных, скорее всего, поставщик базы данных уже поддерживает векторный поиск, а запросы LINQ можно использовать для выражения таких поисковых запросов; Майкрософт. Extensions.VectorData не обязательно требуется в таких приложениях. Однако большинство выделенных векторных баз данных не поддерживаются EF Core и Майкрософт. Extensions.VectorData может обеспечить хороший опыт работы с ними. Кроме того, вы также можете использовать EF и Майкрософт.Extensions.VectorData в одном и том же приложении, например, при использовании дополнительного слоя, такого как Майкрософт.Extensions.DataIngestion.

Ключевые абстракции

Вот минимальный сквозной пример, который создает коллекцию, добавляет или обновляет записи и выполняет векторный поиск.

using Microsoft.Extensions.AI;
using Microsoft.Extensions.VectorData;
using Microsoft.SemanticKernel.Connectors.InMemory;

// Configure an embedding generator to transform text to embeddings
IEmbeddingGenerator<string, Embedding<float>> embeddingGenerator = ...;

// Create a vector store and get a collection with the embedding generator
var vectorStore = new InMemoryVectorStore(new() { EmbeddingGenerator = embeddingGenerator });
var collection = vectorStore.GetCollection<int, Movie>("movies");
await collection.EnsureCollectionExistsAsync();

// Upsert some records
await collection.UpsertAsync(new Movie { Key = 1, Title = "The Lion King", Description = "An animated film about a young lion prince" });
await collection.UpsertAsync(new Movie { Key = 2, Title = "Inception", Description = "A thief who steals corporate secrets through dream-sharing technology" });
await collection.UpsertAsync(new Movie { Key = 3, Title = "Finding Nemo", Description = "A fish searches the ocean for his lost son" });

// Search for movies similar to the query text
await foreach (var result in collection.SearchAsync("animals in the wild", top: 2))
{
    Console.WriteLine($"{result.Record.Title} (score: {result.Score})");
}

// Define the data model
class Movie
{
    [VectorStoreKey]
    public int Key { get; set; }

    [VectorStoreData]
    public string Title { get; set; }

    [VectorStoreVector(Dimensions: 1536)]
    public string Description { get; set; }
}

Поставщики хранилища векторов

Пакет Майкрософт.Extensions.VectorData.Abstractions определяет абстракции и отдельные пакеты провидер предоставляют реализации для конкретных векторных баз данных. Выберите поставщик, соответствующий векторной базе данных, например Майкрософт. SemanticKernel.Connectors.AzureAISearch.

Замечание

Несмотря на включение "SemanticKernel" в имена пакетов, эти поставщики не имеют ничего общего с Semantic Kernel и доступны в любом месте .NET, включая Agent Framework.

Все поставщики реализуют одинаковые VectorStore и VectorStoreCollection<TKey,TRecord> абстрактные классы, поэтому вы можете переключаться между ними, не изменяя логику приложения.

Подсказка

Используйте поставщик в памяти (Майкрософт. SemanticKernel.Connectors.InMemory) во время первоначальной разработки или прототипа — он не требует какой-либо внешней службы или конфигурации, и его можно переключить на поставщика рабочей среды позже. Избегайте использования поставщика InMemory для тестирования, так как между этим поставщиком и рабочей базой данных могут быть важны различия. Рекомендуется использовать testcontainers для выполнения тестов в рабочей системе базы данных.