为了使数据模型存储在数据库中,需要将其转换为数据库可以理解的格式。 不同的数据库需要不同的存储架构和格式。 有些具有需要遵守的严格架构,而另一些则允许用户定义架构。
语义内核提供的矢量存储连接器具有内置映射器,可以将您的数据模型与数据库架构进行双向映射。 有关内置映射器如何为每个数据库映射数据的详细信息,请参阅每个连接器 的 
为了将定义为 类 或 定义 的数据模型存储到数据库中,需要将其序列化为数据库可以理解的格式。
可通过两种方式完成,即使用语义内核提供的内置序列化或提供自己的序列化逻辑。
以下两个关系图显示了数据模型与存储模型之间的序列化和反序列化的流程。
序列化流(用于更新插入)

反序列化流(用于获取和搜索)

标有 *(在这两个关系图中)的步骤由特定连接器的开发人员实现,并且对于每个商店都是不同的。 标有 ** (在这两个图表中)的步骤是作为文档上的方法提供,或者是作为文档定义的一部分提供,这部分始终由用户提供,更多信息请参阅 直接序列化 。
(反)序列化方法
直接序列化(从数据模型到存储模型)
直接序列化是确保完全控制模型序列化方式和优化性能的最佳方式。 缺点是,特定于数据存储,因此在使用时,在采用同一数据模型的不同存储之间切换并不是那么容易。
可以通过在数据模型中实现遵循 SerializeMethodProtocol 协议的方法,或者将遵循 SerializeFunctionProtocol 的函数添加到记录定义中,这两种方法都可以在 semantic_kernel/data/vector_store_model_protocols.py中找到。
当其中一个函数存在时,它将用于将数据模型直接序列化到存储模型。
甚至可以仅实现两种方法中的一种,并使用内置的(反)序列化处理另一个方向。例如,当处理不在控制范围内创建的集合,并且需要对反序列化的方式进行一些自定义(而且无论如何也无法执行更新插入),这可能会非常有用。
内置(反)序列化(数据模型到字典对象和字典到存储模型,反之亦然)
对于每个不同且定义为内置连接器一部分的存储,内置序列化首先将数据模型转换为字典,然后将其序列化为存储理解的模型。 反序列化按相反顺序完成。
序列化步骤 1:数据模型到字典
根据你拥有的数据模型类型,这些步骤以不同的方式完成。 可通过四种方式尝试将数据模型序列化为字典:
-               定义上的 to_dict方法(与数据模型的 to_dict 属性一致,遵循ToDictFunctionProtocol)
- 检查记录是否为 ToDictMethodProtocol并使用to_dict方法
- 检查记录是否为 Pydantic 模型并使用模型的 model_dump;有关详细信息,请参阅以下说明。
- 遍历定义中的字段并创建字典
可选:嵌入
如果数据模型具有 embedding_generator 字段,或者集合具有 embedding_generator 字段,则会在序列化到存储模型之前生成嵌入并将其添加到字典中。
序列化步骤 2:字典到存储模型
连接器必须提供将字典转换为存储模型的方法。 这由连接器的开发人员完成,对于每个商店都是不同的。
反序列化步骤 1:存储模型到字典
连接器必须提供一种方法,以便将存储模型转换为字典。 这由连接器的开发人员完成,对于每个商店都是不同的。
反序列化步骤 2:字典到数据模型
反序列化按相反的顺序完成,它会尝试以下选项:
-               定义上的 from_dict方法(与数据模型的 from_dict 属性一致,遵循FromDictFunctionProtocol)
- 检查记录是否为 FromDictMethodProtocol并使用from_dict方法
- 检查记录是否为 Pydantic 模型并使用模型的 model_validate;有关详细信息,请参阅以下说明。
- 循环遍历定义中的字段并设置其值,然后将这个字典作为命名参数传递给数据模型的构造函数(除非数据模型本身是一个字典,在这种情况下,它将按原样返回)。
注意
将 Pydantic 与内置序列化配合使用
使用 Pydantic BaseModel 定义模型时,它将使用 model_dump 和 model_validate 方法将数据模型序列化到字典和从字典反序列化数据模型。 这是通过使用不带任何参数的 model_dump 方法来完成的,如果您希望对此进行控制,建议在您的数据模型上实现 ToDictMethodProtocol,因为系统会优先尝试该方法。
即将推出
即将提供更多信息。