共用方式為


將資料模型串行化到不同存放區或從不同存放區進行串行化 (預覽)

為了讓數據模型儲存在資料庫中,它必須轉換成資料庫可以理解的格式。 不同的資料庫需要不同的記憶體架構和格式。 有些有一些需要遵守的嚴格架構,有些則允許使用者定義架構。

Semantic Kernel 提供的向量資料庫連接器具有內建對應器,能將您的數據模型與資料庫架構之間進行對應。 如需取得關於內建映射器如何映射每個資料庫資料的資訊,請參閱每個連接器的頁面

為了讓您的數據模型定義為 類別定義 能夠儲存到資料庫中,必須將其序列化為資料庫可以理解的格式。

有兩種方式可以完成,使用語意核心所提供的內建串行化,或提供您自己的串行化邏輯。

下列兩個圖表顯示數據模型與存放區模型之間的串行化和反序列化流程。

串行化流程(用於 Upsert)

串行化流程

反序列化流程

標示為 * 的步驟是由特定連接器的開發人員所實作,而且每個商店都不同。 標示為 ** 的步驟(在兩個圖表中)會以記錄上的方法或記錄定義的一部分提供,這一律由使用者提供,如需詳細資訊,請參閱 直接串行化

(反)序列化方法

直接序列化(從資料模型到存儲模型)

直接串行化是確保完整控制模型如何串行化及優化效能的最佳方式。 缺點是,它是數據存放區特有的,因此使用這個數據存放區時,在具有相同數據模型的不同存放區之間切換並不容易。

您可以在數據模型中實作遵循 SerializeMethodProtocol 通訊協定的方法,或是將遵循 SerializeFunctionProtocol 的函式新增至記錄定義,這兩種方法都可以在 semantic_kernel/data/vector_store_model_protocols.py中找到。

當其中一個函式存在時,它會用來將數據模型直接串行化至存放區模型。

您甚至可以只實作其中一個,並針對另一個方向使用內建的序列化/反序列化。這在處理一個非您所控制的集合時可能很有用,尤其當您需要對反序列化的方式進行一些自定義時(而且無法執行更新插入操作)。

內建的序列化與反序列化(數據模型到字典及字典到儲存模型,反之亦然)

內建串行化會先將數據模型轉換成字典,然後將它串行化為儲存瞭解的每個存放區,並定義為內建連接器的一部分。 還原串行化是以反向順序完成。

序列化步驟 1:資料模型轉換為字典。

視您擁有的數據模型類型而定,這些步驟會以不同的方式完成。 有四種方式會嘗試將數據模型串行化為字典:

  1. 定義上的 to_dict 方法(與數據模型的 to_dict 屬性對齊,並遵循 ToDictFunctionProtocol
  2. 檢查記錄是否為 ToDictMethodProtocol,並使用 to_dict 方法
  3. 檢查記錄是否為 Pydantic 模型,並使用模型中的 model_dump,如需更多詳情,請參閱下方附註。
  4. 迴圈查看定義中的欄位,並建立字典

選擇性:內嵌

當您有具有 embedding_generator 欄位的數據模型,或集合具有 embedding_generator 欄位時,系統會先產生內嵌並新增至字典,再將它串行化至存放區模型。

串行化步驟 2:聽寫以儲存模型

連接器必須提供方法,才能將字典轉換成存放區模型。 這是由連接器的開發人員所完成,而且每個商店都不同。

還原串行化步驟 1:將模型儲存至字典

連接器必須提供一種方法,以將儲存模型轉換為字典。 這是由連接器的開發人員所完成,而且每個商店都不同。

還原串行化步驟 2:對數據模型的聽寫

反序列化是按逆向順序完成的,會嘗試以下選項:

  1. 定義中的 from_dict 方法(對應數據模型的 from_dict 屬性,遵循 FromDictFunctionProtocol
  2. 檢查記錄是否為 FromDictMethodProtocol,並使用 from_dict 方法
  3. 檢查記錄是否為 Pydantic 模型,並使用模型中的 model_validate,如需更多詳情,請參閱下方附註。
  4. 遍歷定義中的欄位並設定值,然後將這個字典傳遞至數據模型的建構函式作為具名參數(除非數據模型本身是字典,在此情況下將原樣返回)

注意

使用 Pydantic 進行內建序列化

當您使用 Pydantic BaseModel 定義模型時,它會使用 model_dumpmodel_validate 方法來串行化和還原串行化數據模型到聽寫和還原串行化。 這項操作是通過不帶任何參數使用 model_dump 方法來完成的。如果你想要控制這一點,請考慮在數據模型上實作 ToDictMethodProtocol,因為會首先嘗試這一點。

即將推出

更多信息即將推出。