首页
/ Semantic Kernel中向量存储记录定义的可变性优化

Semantic Kernel中向量存储记录定义的可变性优化

2025-05-08 14:16:43作者:薛曦旖Francesca

在微软开源的Semantic Kernel项目中,最近针对VectorStoreRecordDefinition类型的可变性进行了重要讨论和优化。本文将深入分析这一技术决策的背景、考量因素以及最终实现方案。

背景与问题

VectorStoreRecordDefinition是Semantic Kernel中用于定义向量存储记录结构的关键类型。在最初的设计中,该类型及其属性被设计为不可变(immutable)的,这意味着一旦创建实例后就不能再修改其属性值。

这种设计遵循了.NET生态中推崇的不可变类型最佳实践,旨在防止用户意外修改已被向量集合使用的定义,从而导致潜在的并发问题和不可预测的行为。然而,在实际开发过程中,这种不可变性给动态构建记录定义带来了不便。

技术讨论

在技术讨论中,开发团队提出了两种不同的观点:

  1. 支持不可变性的观点

    • 防止用户意外修改已被集合使用的定义
    • 符合.NET生态中不可变类型的设计趋势
    • 对于静态定义场景非常友好
    • 可以通过克隆方式创建修改后的新实例
  2. 支持可变性的观点

    • 简化动态构建记录定义的代码
    • 提高开发效率,特别是在测试和原型阶段
    • 可以采用其他模式(如建造者模式)来锁定最终状态

解决方案演进

经过深入讨论和技术评估,开发团队做出了以下关键决策:

  1. 架构变更:发现记录定义仅作为构造内部模型的输入使用,构造完成后不会被MEVD(向量数据扩展)引用,因此后续修改不会影响已构建的集合。

  2. 一致性考虑:与项目中其他选项类型(如RecordRetrievalOptions)的设计决策保持一致,这些类型也被设计为可变的。

  3. 实际需求:认识到动态构建场景的实际需求,特别是在需要根据运行时条件(如不同向量存储实现)动态配置属性的情况下。

实现与影响

最终实现(#11882)将VectorStoreRecordDefinition及其相关类型改为可变设计,带来了以下优势:

  1. 简化动态构建:现在可以直接修改定义对象的属性,无需创建中间集合。
var result = new VectorStoreRecordDefinition();
foreach (var f in fields)
{
    // 直接添加属性到结果对象
    result.Properties.Add(new VectorStoreRecordDataProperty(...));
}
  1. 保持安全性:由于架构上确保定义对象不会被活动集合引用,可变性不会引入并发问题。

  2. 开发体验:降低了学习曲线,使新用户能够更直观地使用API。

最佳实践建议

虽然类型现在支持可变性,但在实际使用中仍建议:

  1. 对于静态定义,优先使用对象初始化器语法
  2. 避免在多个地方共享和修改同一个定义实例
  3. 在复杂场景中考虑使用建造者模式封装构建逻辑
  4. 注意线程安全性,确保定义在构建完成前不被并发访问

这一变更体现了Semantic Kernel项目在API设计上平衡安全性与易用性的思考过程,也展示了如何根据实际架构演进调整设计决策。

登录后查看全文
热门项目推荐

热门内容推荐

最新内容推荐

项目优选

收起
ohos_react_nativeohos_react_native
React Native鸿蒙化仓库
C++
176
261
RuoYi-Vue3RuoYi-Vue3
🎉 (RuoYi)官方仓库 基于SpringBoot,Spring Security,JWT,Vue3 & Vite、Element Plus 的前后端分离权限管理系统
Vue
861
511
ShopXO开源商城ShopXO开源商城
🔥🔥🔥ShopXO企业级免费开源商城系统,可视化DIY拖拽装修、包含PC、H5、多端小程序(微信+支付宝+百度+头条&抖音+QQ+快手)、APP、多仓库、多商户、多门店、IM客服、进销存,遵循MIT开源协议发布、基于ThinkPHP8框架研发
JavaScript
93
15
openGauss-serveropenGauss-server
openGauss kernel ~ openGauss is an open source relational database management system
C++
129
182
openHiTLSopenHiTLS
旨在打造算法先进、性能卓越、高效敏捷、安全可靠的密码套件,通过轻量级、可剪裁的软件技术架构满足各行业不同场景的多样化要求,让密码技术应用更简单,同时探索后量子等先进算法创新实践,构建密码前沿技术底座!
C
259
300
kernelkernel
deepin linux kernel
C
22
5
cherry-studiocherry-studio
🍒 Cherry Studio 是一款支持多个 LLM 提供商的桌面客户端
TypeScript
596
57
CangjieCommunityCangjieCommunity
为仓颉编程语言开发者打造活跃、开放、高质量的社区环境
Markdown
1.07 K
0
HarmonyOS-ExamplesHarmonyOS-Examples
本仓将收集和展示仓颉鸿蒙应用示例代码,欢迎大家投稿,在仓颉鸿蒙社区展现你的妙趣设计!
Cangjie
398
371
Cangjie-ExamplesCangjie-Examples
本仓将收集和展示高质量的仓颉示例代码,欢迎大家投稿,让全世界看到您的妙趣设计,也让更多人通过您的编码理解和喜爱仓颉语言。
Cangjie
332
1.08 K