提示
我們建議使用向量存放區抽象概念,而不是舊版記憶體存放區。 如需如何使用向量存放區抽象概念的詳細資訊,請從這裡開始。
語意核心提供一組記憶體存放區抽象概念,其中主要介面為 Microsoft.SemanticKernel.Memory.IMemoryStore。
記憶體存放區與向量存放區抽象概念
為了努力演進和擴充語意核心的向量儲存和搜尋功能,我們發行了一組新的抽象概念,以取代記憶體存放區抽象概念。 我們將取代的抽象概念稱為向量存儲抽象。 兩者的目的都類似,但其介面不同,而向量存放區抽象概念則提供擴充的功能。
| 特性 | 遺留記憶體存放區 | 向量存放區 |
|---|---|---|
| 主要介面 | IMemoryStore | VectorStore |
| 抽象 NuGet 套件 | Microsoft.SemanticKernel.Abstractions | Microsoft.Extensions.VectorData.Abstractions |
| 命名規範 | {Provider}MemoryStore,例如 RedisMemoryStore | {Provider}VectorStore,例如 RedisVectorStore |
| 支援記錄更新插入、取得和刪除功能 | 是的 | 是的 |
| 支援集合建立和刪除 | 是的 | 是的 |
| 支援向量搜尋 | 是的 | 是的 |
| 支援選擇您慣用的向量搜尋索引和距離函式 | 不 | 是的 |
| 每個記錄支援多個向量 | 不 | 是的 |
| 支援自定義架構 | 不 | 是的 |
| 支援多個向量類型 | 不 | 是的 |
| 支援向量搜尋的元數據預先篩選 | 不 | 是的 |
| 支援非向量資料庫的向量搜尋,方法是將整個數據集下載到用戶端,並執行本機向量搜尋 | 是的 | 不 |
可用的記憶體存放區連接器
語意核心提供數個記憶體存放區連接器給向量資料庫,讓您可用來儲存和擷取資訊。 包括:
| 服務 | 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 資料庫 | C# | |
| 色度 | C# | Python(編程語言) |
| DuckDB | C# | |
| Milvus | C# | Python(編程語言) |
| MongoDB Atlas 向量搜尋 | C# | Python(編程語言) |
| 松果 | C# | Python(編程語言) |
| Postgres | C# | Python(編程語言) |
| Qdrant | C# | Python(編程語言) |
| Redis | C# | Python(編程語言) |
| Sqlite | C# | |
| Weaviate | C# | Python(編程語言) |
從記憶體存放區移轉至向量存放區
如果您想要從使用記憶體存放區抽象概念移轉至向量存放區抽象概念,您可以使用各種方式來執行這項作。
現有的集合與向量存儲抽象一起使用
在許多情況下,最簡單的方式就是只使用向量存放區抽象概念來存取使用記憶體存放區抽象概念所建立的集合。 在許多情況下,這是可能的,因為向量存放區抽象概念可讓您選擇您想要使用的架構。 主要需求是建立符合舊版記憶體存放區實作所使用架構的數據模型。
例如,若要存取 Azure AI 搜尋服務記憶體存放區所建立的集合,您可以使用下列向量存放區數據模型。
using Microsoft.Extensions.VectorData;
class VectorStoreRecord
{
[VectorStoreKey]
public string Id { get; set; }
[VectorStoreData]
public string Description { get; set; }
[VectorStoreData]
public string Text { get; set; }
[VectorStoreData]
public bool IsReference { get; set; }
[VectorStoreData]
public string ExternalSourceName { get; set; }
[VectorStoreData]
public string AdditionalMetadata { get; set; }
[VectorStoreVector(VectorSize)]
public ReadOnlyMemory<float> Embedding { get; set; }
}
提示
如需如何使用向量存放區抽象概念存取使用記憶體存放區所建立之集合的詳細範例,請參閱 這裡。
建立新的集合
在某些情況下,移轉至新集合可能比直接使用現有的集合更理想。 記憶體存放區選擇的架構可能不符合您的需求,特別是與篩選有關。
例如 Redis 記憶體存放區會使用具有三個字段的架構:
- 字串元數據
- 長時間戳記
- float[] 內嵌
內嵌或時間戳以外的所有數據都會儲存為元數據欄位中的串行化 JSON 字串。 這表示無法編製個別值的索引,並篩選這些值。 例如,您可能想要使用 ExternalSourceName 進行篩選,但在 JSON 字串內時,這是不可能的。
在此情況下,最好將數據遷移至具有一般架構的新集合。 這裡有兩個選項。 您可以從來源資料創建新的集合,或者將舊資料映射並複製到新的集合中。 第一個選項的成本可能更高,因為您需要從源數據重新產生內嵌。
提示
如需使用 Redis 的範例,示範如何將使用記憶體存放區抽象概念建立的集合中的數據複製到使用向量存放區抽象概念建立的集合,請參閱 這裡。