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


Устаревшие хранилища памяти семантического ядра

Совет

Рекомендуется использовать абстракции векторного хранилища вместо устаревших хранилищ памяти. Дополнительные сведения об использовании абстракций векторного хранилища см . здесь.

Семантический ядро предоставляет набор абстракций хранилища памяти, где основной интерфейс .Microsoft.SemanticKernel.Memory.IMemoryStore

Хранилище памяти и абстракции векторного хранилища

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

Characteristic Устаревшие хранилища памяти Векторные хранилища
Основной интерфейс IMemoryStore IVectorStore
Пакет nuget абстракций Microsoft.SemanticKernel.Abstractions Microsoft.Extensions.VectorData.Abstractions
Соглашение об именовании {Provider}MemoryStore, например RedisMemoryStore {Provider}VectorStore, например RedisVectorStore
Поддерживает upsert, get and delete Да Да
Поддерживает создание и удаление коллекции Да Да
Поддерживает векторный поиск Да Да
Поддерживает выбор предпочтительного векторного индекса и функции расстояния No Да
Поддерживает несколько векторов на запись No Да
Поддерживает пользовательские схемы No Да
Поддерживает предварительную фильтрацию метаданных для поиска векторов No Да
Поддерживает векторный поиск в невекторных базах данных, скачивая весь набор данных на клиент и выполняя локальный векторный поиск Да Нет

Доступные соединители хранилища памяти

Семантический ядро предлагает несколько соединителей хранилища памяти для векторных баз данных, которые можно использовать для хранения и извлечения информации. Например:

Service C# Python
Векторная база данных в Azure Cosmos DB для NoSQL C# Python
Векторная база данных на основе виртуальных ядер Azure Cosmos DB для MongoDB C# Python
Поиск с использованием ИИ Azure C# Python
Сервер Azure PostgreSQL C#
База данных SQL Azure C#
Цветность C# Python
DuckDB C#
Милвус C# Python
Поиск вектора MongoDB Atlas C# Python
Pinecone C# Python
Postgres C# Python
Qdrant C#
Redis C#
Sqlite C#
Weaviate C# Python

Перенос из хранилищ памяти в векторные хранилища

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

Использование существующей коллекции с абстракциями векторного хранилища

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

Например, для доступа к коллекции, созданной Хранилищем памяти поиска ИИ Azure, можно использовать следующую модель данных векторного хранилища.

using Microsoft.Extensions.VectorData;

class VectorStoreRecord
{
    [VectorStoreRecordKey]
    public string Id { get; set; }

    [VectorStoreRecordData]
    public string Description { get; set; }

    [VectorStoreRecordData]
    public string Text { get; set; }

    [VectorStoreRecordData]
    public bool IsReference { get; set; }

    [VectorStoreRecordData]
    public string ExternalSourceName { get; set; }

    [VectorStoreRecordData]
    public string AdditionalMetadata { get; set; }

    [VectorStoreRecordVector(VectorSize)]
    public ReadOnlyMemory<float> Embedding { get; set; }
}

Совет

Более подробные примеры использования абстракций Vector Store для доступа к коллекциям, созданным с помощью хранилища памяти, см . здесь.

Создать коллекцию

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

Например, хранилище памяти Redis использует схему с тремя полями:

  • строковые метаданные
  • длинная метка времени
  • float[] внедрение

Все данные, отличные от внедренных или меток времени, хранятся в виде сериализованной строки JSON в поле метаданных. Это означает, что индексировать отдельные значения и фильтровать их нельзя. Например, может потребоваться фильтровать с помощью ExternalSourceName, но это невозможно, пока он находится внутри строки JSON.

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

Совет

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