旧语义内核内存存储

提示

建议使用矢量存储抽象而不是旧内存存储。 有关如何使用矢量存储抽象的详细信息,请从此处开始

语义内核提供一组内存存储抽象,其中主接口为 Microsoft.SemanticKernel.Memory.IMemoryStore

内存存储与矢量存储抽象

为了改进和扩展语义内核的矢量存储和搜索上限,我们发布了一组新的抽象来替换内存存储抽象。 我们调用替换抽象向量存储抽象。 两者的目的都是相似的,但它们的接口不同,矢量存储抽象提供了扩展的功能。

特征 旧内存存储 矢量存储
主接口 IMemoryStore IVectorStore
抽象 nuget 包 Microsoft.SemanticKernel.Abstractions Microsoft.Extensions.VectorData.Abstractions
命名约定 {Provider}MemoryStore,例如 RedisMemoryStore {Provider}VectorStore,例如 RedisVectorStore
支持记录更新插入、获取和删除
支持集合创建和删除
支持矢量搜索
支持选择首选矢量搜索索引和距离函数
支持每个记录的多个向量
支持自定义架构
支持矢量搜索的元数据预筛选
通过将整个数据集下载到客户端并执行本地矢量搜索,支持对非向量数据库进行矢量搜索

可用内存存储连接器

语义内核提供了多个内存存储连接器,用于向量数据库,可用于存储和检索信息。 这些设置包括:

服务 C# Python
Azure Cosmos DB for NoSQL 中的矢量数据库 C# Python
基于 vCore 的 Azure Cosmos DB for MongoDB 中的矢量数据库 C# Python
Azure AI 搜索 C# Python
Azure PostgreSQL 服务器 C#
Azure SQL 数据库 C#
Chroma C# Python
DuckDB C#
Milvus C# Python
MongoDB Atlas 矢量搜索 C# Python
Pinecone C# Python
Postgres C# Python
Qdrant C#
Redis C#
Sqlite C#
Weaviate C# Python

从内存存储迁移到向量存储

如果要从使用内存存储抽象迁移到向量存储中止,可通过多种方式执行此操作。

将现有集合与矢量存储抽象配合使用

在许多情况下,最简单的方法是仅使用向量存储抽象访问使用内存存储抽象创建的集合。 在许多情况下,这是可能的,因为矢量存储抽象允许你选择要使用的架构。 主要要求是创建与旧版内存存储实现使用的架构匹配的数据模型。

例如,若要访问由 Azure AI 搜索内存存储创建的集合,可以使用以下矢量存储数据模型。

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

提示

有关如何使用矢量存储抽象访问使用内存存储创建的集合的更详细示例,请参阅 此处

创建新集合

在某些情况下,迁移到新集合可能比直接使用现有集合更好。 内存存储选择的架构可能与要求不匹配,尤其是在筛选方面。

例如,Redis 内存存储使用具有三个字段的架构:

  • 字符串元数据
  • long timestamp
  • float[] 嵌入

嵌入或时间戳以外的所有数据都存储为元数据字段中的序列化 json 字符串。 这意味着无法为各个值编制索引并对其进行筛选。 例如,你可能想要使用 ExternalSourceName 进行筛选,但在 JSON 字符串内部时,这是不可能的。

在这种情况下,最好将数据迁移到具有平面架构的新集合。 此处有两个选项。 可以从源数据创建新集合,或者只需映射数据,然后将旧数据复制到新集合。 第一个选项的成本可能更高,因为需要从源数据重新生成嵌入内容。

提示

有关使用 Redis 的示例,演示如何将数据从使用内存存储抽象创建的集合复制到使用矢量存储抽象创建的集合,请参阅 此处