使用記錄定義來定義記憶體架構 (預覽)
警告
語意核心向量存放區功能處於預覽狀態,且需要重大變更的改善可能仍會在發行前有限的情況下發生。
概觀
語意核心向量存放區連接器會使用模型第一種方法來與資料庫互動,並允許批註數據模型,其中包含建立索引或將數據對應至資料庫架構所需的資訊。
提供這項資訊的另一種方式是透過記錄定義,可以分別定義和提供給數據模型。 這在多個案例中很有用:
- 在某些情況下,開發人員想要搭配多個組態使用相同的數據模型。
- 在某些情況下,開發人員想要使用非常不同的架構來儲存數據給模型,而且想要提供自定義對應程式,以在數據模型和記憶體架構之間轉換。
- 在某些情況下,開發人員想要使用內建類型,例如聽寫或數據框架等優化格式,但仍想要利用向量存放區功能。
以下是如何建立記錄定義的範例。
using Microsoft.Extensions.VectorData;
var hotelDefinition = new VectorStoreRecordDefinition
{
Properties = new List<VectorStoreRecordProperty>
{
new VectorStoreRecordKeyProperty("HotelId", typeof(ulong)),
new VectorStoreRecordDataProperty("HotelName", typeof(string)) { IsFilterable = true },
new VectorStoreRecordDataProperty("Description", typeof(string)) { IsFullTextSearchable = true },
new VectorStoreRecordVectorProperty("DescriptionEmbedding", typeof(float)) { Dimensions = 4, DistanceFunction = DistanceFunction.CosineDistance, IndexKind = IndexKind.Hnsw },
}
};
建立定義時,您一律必須提供架構中每個屬性的名稱和類型,因為這是建立索引和數據對應的必要專案。
若要使用定義,請將它傳遞至 GetCollection 方法。
var collection = vectorStore.GetCollection<ulong, Hotel>("skhotels", hotelDefinition);
Record 屬性組態類別
VectorStoreRecordKeyProperty
使用此類別指出您的屬性是記錄的索引鍵。
new VectorStoreRecordKeyProperty("HotelId", typeof(ulong)),
VectorStoreRecordKeyProperty 組態設定
參數 | 必要 | 描述 |
---|---|---|
DataModelPropertyName | Yes | 數據模型上屬性的名稱。 由內建對應器用來自動對應記憶體架構和數據模型,以及用來建立索引。 |
PropertyType | Yes | 數據模型上屬性的類型。 由內建對應器用來自動對應記憶體架構和數據模型,以及用來建立索引。 |
StoragePropertyName | No | 可用來提供資料庫中屬性的替代名稱。 請注意,所有連接器都不支援此參數,例如支援的替代 JsonPropertyNameAttribute 專案。 |
提示
如需哪些連接器支援 StoragePropertyName 以及有哪些替代方案的詳細資訊,請參閱 每個連接器的檔。
VectorStoreRecordDataProperty
使用這個類別表示您的屬性包含不是索引鍵或向量的一般數據。
new VectorStoreRecordDataProperty("HotelName", typeof(string)) { IsFilterable = true },
VectorStoreRecordDataProperty 組態設定
參數 | 必要 | 描述 |
---|---|---|
DataModelPropertyName | Yes | 數據模型上屬性的名稱。 由內建對應器用來自動對應記憶體架構和數據模型,以及用來建立索引。 |
PropertyType | Yes | 數據模型上屬性的類型。 由內建對應器用來自動對應記憶體架構和數據模型,以及用來建立索引。 |
IsFilterable | No | 指出當資料庫需要加入每個屬性的索引編製索引時,是否應該為屬性編製索引以進行篩選。 預設為 False。 |
IsFullTextSearchable | No | 指出是否應該針對支援全文搜索的資料庫,為全文搜索編製屬性的索引。 預設為 False。 |
StoragePropertyName | No | 可用來提供資料庫中屬性的替代名稱。 請注意,所有連接器都不支援此參數,例如支援的替代 JsonPropertyNameAttribute 專案。 |
提示
如需哪些連接器支援 StoragePropertyName 以及有哪些替代方案的詳細資訊,請參閱 每個連接器的檔。
VectorStoreRecordVectorProperty
使用此類別表示您的屬性包含向量。
new VectorStoreRecordVectorProperty("DescriptionEmbedding", typeof(float)) { Dimensions = 4, DistanceFunction = DistanceFunction.CosineDistance, IndexKind = IndexKind.Hnsw },
VectorStoreRecordVectorProperty 組態設定
參數 | 必要 | 描述 |
---|---|---|
DataModelPropertyName | Yes | 數據模型上屬性的名稱。 由內建對應器用來自動對應記憶體架構和數據模型,以及用來建立索引。 |
PropertyType | Yes | 數據模型上屬性的類型。 由內建對應器用來自動對應記憶體架構和數據模型,以及用來建立索引。 |
維度 | [是] 用於集合建立,否則為選擇性 | 向量擁有的維度數目。 建立集合的向量索引時,通常需要這樣做。 |
IndexKind | No | 要用來為向量編製索引的索引型別。 預設值會依向量存放區類型而有所不同。 |
DistanceFunction | No | 在此向量搜尋期間執行向量比較時所要使用的距離函式類型。 預設值會依向量存放區類型而有所不同。 |
StoragePropertyName | No | 可用來提供資料庫中屬性的替代名稱。 請注意,所有連接器都不支援此參數,例如支援的替代 JsonPropertyNameAttribute 專案。 |
提示
如需哪些連接器支援 StoragePropertyName 以及有哪些替代方案的詳細資訊,請參閱 每個連接器的檔。
以下是如何建立記錄定義的範例,以搭配 pandas DataFrame 使用。
注意
此處會使用與數據模型定義中相同的欄位,針對數據模型,它們會新增為批注,此處為具有名稱的聽寫。
有幾個重要事項要注意,其他則欄位定義本身。 第一個是 container_mode
參數。 當設定為 True 時,這表示數據模型是容器類型,例如 DataFrame,因此數據模型是記錄的容器,而不是單一的容器記錄,可以完全相同的方式使用容器記錄,主要差異在於 get
,而且 get_batch
會傳回相同的數據類型。 具有的單一記錄 get
,以及一或多個 的 get_batch
記錄。 當您想要執行 upsert, upsert
而且 upsert_batch
可以交替使用時,換句話說,將容器傳遞至 upsert
會導致多個 upsert,而不是單一插入。
第二個是 新增 to_dict
和 from_dict
方法,用來在數據模型與記憶體架構之間轉換。 在此情況下,方法 to_dict
會用來將 DataFrame 轉換成記錄清單,而 from_dict
方法會用來將記錄清單轉換成 DataFrame。 您也可以有 和 serialize
deserialize
方法(如下列範例所示),如需有關串行 化文件之間差異的詳細數據。
from semantic_kernel.data import (
VectorStoreRecordDataField,
VectorStoreRecordDefinition,
VectorStoreRecordKeyField,
VectorStoreRecordVectorField,
)
hotel_definition = VectorStoreRecordDefinition(
fields={
"hotel_id": VectorStoreRecordKeyField(property_type="str"),
"hotel_name": VectorStoreRecordDataField(property_type="str", is_filterable=True),
"description": VectorStoreRecordDataField(
property_type="str", has_embedding=True, embedding_property_name="description_embedding"
),
"description_embedding": VectorStoreRecordVectorField(property_type="list[float]"),
},
container_mode=True,
to_dict=lambda record, **_: record.to_dict(orient="records"),
from_dict=lambda records, **_: DataFrame(records),
)
建立定義時,您一律必須提供名稱(如聽寫中的 fields
索引鍵),以及架構中每個屬性的類型,因為這是建立索引和數據對應的必要專案。
若要使用定義,請將它傳遞給 GetCollection 方法或集合建構函式,以及數據模型類型。
collection = vector_store.get_collection(
collection_name="skhotels",
data_model_type=pd.DataFrame,
data_model_definition=hotel_definition,
)
以下是如何建立記錄定義的範例。
var hotelDefinition = VectorStoreRecordDefinition.fromFields(
Arrays.asList(
VectorStoreRecordKeyField.builder().withName("hotelId").withFieldType(String.class).build(),
VectorStoreRecordDataField.builder()
.withName("name")
.withFieldType(String.class)
.isFilterable(true).build(),
VectorStoreRecordDataField.builder()
.withName("description")
.withFieldType(String.class)
.isFullTextSearchable(true).build(),
VectorStoreRecordVectorField.builder().withName("descriptionEmbedding")
.withDimensions(4)
.withIndexKind(IndexKind.HNSW)
.withDistanceFunction(DistanceFunction.COSINE_DISTANCE)
.withFieldType(List.class).build()
)
);
建立定義時,您一律必須提供架構中每個欄位的名稱和類型,因為這是建立索引和數據對應的必要專案。
若要使用定義,請將它傳遞至 GetCollection 方法。
var collection = vectorStore.getCollection("skhotels",
JDBCVectorStoreRecordCollectionOptions.builder()
.withRecordDefinition(hotelDefinition)
.build()
);
記錄欄位組態類別
VectorStoreRecordKeyField
使用此類別指出您的欄位是記錄的索引鍵。
VectorStoreRecordKeyField.builder().withName("hotelId").withFieldType(String.class).build(),
VectorStoreRecordKeyField 組態設定
參數 | 必要 | 描述 |
---|---|---|
NAME | Yes | 數據模型上的功能變數名稱。 由內建對應器用來自動對應記憶體架構和數據模型,以及用來建立索引。 |
fieldType | Yes | 數據模型上的欄位類型。 由內建對應器用來自動對應記憶體架構和數據模型,以及用來建立索引。 |
storageName | No | 可用來提供資料庫中欄位的替代名稱。 請注意,所有連接器都不支援此參數,例如使用 Jackson 的位置,在此情況下,可以使用 Jackson 註釋來指定儲存名稱。 |
提示
如需哪些連接器支援 storageName 和哪些替代專案的詳細資訊,請參閱 每個連接器的檔。
VectorStoreRecordDataField
使用這個類別表示您的屬性包含不是索引鍵或向量的一般數據。
VectorStoreRecordDataField.builder()
.withName("name")
.withFieldType(String.class)
.isFilterable(true).build(),
VectorStoreRecordDataField 組態設定
參數 | 必要 | 描述 |
---|---|---|
NAME | Yes | 數據模型上的功能變數名稱。 由內建對應器用來自動對應記憶體架構和數據模型,以及用來建立索引。 |
fieldType | Yes | 數據模型上的欄位類型。 由內建對應器用來自動對應記憶體架構和數據模型,以及用來建立索引。 |
isFilterable | No | 指出當資料庫需要加入每個欄位的索引編製索引時,是否應該為欄位編製索引以進行篩選。 預設為 False。 |
isFullTextSearchable | No | 指出是否應該為支援全文搜索的資料庫編製全文搜索索引欄位。 預設為 False。 |
storageName | No | 可用來提供資料庫中欄位的替代名稱。 請注意,所有連接器都不支援此參數,例如使用 Jackson 的位置,在此情況下,可以使用 Jackson 註釋來指定儲存名稱。 |
提示
如需哪些連接器支援 storageName 和哪些替代專案的詳細資訊,請參閱 每個連接器的檔。
VectorStoreRecordVectorField
使用此類別指出您的欄位包含向量。
VectorStoreRecordVectorField.builder().withName("descriptionEmbedding")
.withDimensions(4)
.withIndexKind(IndexKind.HNSW)
.withDistanceFunction(DistanceFunction.COSINE_DISTANCE)
.withFieldType(List.class).build(),
VectorStoreRecordVectorField 組態設定
參數 | 必要 | 描述 |
---|---|---|
NAME | Yes | 數據模型上的功能變數名稱。 由內建對應器用來自動對應記憶體架構和數據模型,以及用來建立索引。 |
fieldType | Yes | 數據模型上的欄位類型。 由內建對應器用來自動對應記憶體架構和數據模型,以及用來建立索引。 |
尺寸 | [是] 用於集合建立,否則為選擇性 | 向量擁有的維度數目。 建立集合的向量索引時,通常需要這樣做。 |
indexKind | No | 要用來為向量編製索引的索引型別。 預設值會依向量存放區類型而有所不同。 |
distanceFunction | No | 在此向量搜尋期間執行向量比較時所要使用的距離函式類型。 預設值會依向量存放區類型而有所不同。 |
storageName | No | 可用來提供資料庫中欄位的替代名稱。 請注意,所有連接器都不支援此參數,例如使用 Jackson 的位置,在此情況下,可以使用 Jackson 註釋來指定儲存名稱。 |
提示
如需哪些連接器支援 storageName 和哪些替代專案的詳細資訊,請參閱 每個連接器的檔。