共用方式為


舊版語意核心記憶體存放區

提示

我們建議使用向量存放區抽象概念,而不是舊版記憶體存放區。 如需如何使用向量存放區抽象概念的詳細資訊,請從這裡開始

語意核心提供一組記憶體存放區抽象概念,其中主要介面為 Microsoft.SemanticKernel.Memory.IMemoryStore

記憶體存放區與向量存放區抽象概念

為了努力演進和擴充語意核心的向量儲存和搜尋上限,我們發行了一組新的抽象概念,以取代記憶體存放區抽象概念。 我們呼叫取代抽象概念向量存放區抽象概念。 兩者的目的都類似,但其介面不同,而向量存放區抽象概念則提供擴充的功能。

特性 舊版記憶體存放區 向量存放區
主要介面 IMemoryStore IVectorStore
抽象概念 nuget 套件 Microsoft.SemanticKernel.Abstractions Microsoft.Extensions.VectorData.Abstractions
命名規範 {Provider}MemoryStore,例如 RedisMemoryStore {Provider}VectorStore,例如 RedisVectorStore
支援記錄 upsert、取得和刪除 Yes Yes
支援集合建立和刪除 Yes Yes
支援向量搜尋 Yes Yes
支援選擇您慣用的向量搜尋索引和距離函式 No Yes
支援每個記錄的多個向量 No Yes
支援自定義架構 No Yes
支援向量搜尋的元數據預先篩選 No Yes
支援非向量資料庫的向量搜尋,方法是將整個數據集下載到用戶端,並執行本機向量搜尋 No

可用的記憶體存放區連接器

語意核心提供數個記憶體存放區連接器給向量資料庫,讓您可用來儲存和擷取資訊。 包括:

服務 C# Python
Azure Cosmos DB for NoSQL 中的向量資料庫 C# Python
以虛擬核心為基礎的 Azure Cosmos DB for MongoDB 中的向量資料庫 C# Python
Azure AI 搜尋服務 C# Python
Azure PostgreSQL 伺服器 C#
Azure SQL Database 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 的範例,示範如何將使用記憶體存放區抽象概念建立的集合中的數據複製到使用向量存放區抽象概念建立的集合,請參閱 這裡