You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Semantic Kernel多步转换中维护数据集上下文?

在Semantic Kernel多步转换中维护数据集上下文的方案

针对你开发数据处理代理时遇到的「多步转换后无法保留数据集最新状态」的问题,以下是几种实用的解决方案:

1. 利用Semantic Kernel的会话状态存储数据集

Semantic Kernel的会话状态(如Context.Variables)是原生的上下文维护机制,适合存储中小型数据集:

  • 每次完成数据转换后,将序列化后的数据集(如JSON格式)存入会话状态的指定键(比如current_dataset)
  • 后续插件调用时,从该键读取最新数据集,反序列化后继续处理
  • 代码示例(Python):
    # 加载数据集后存入会话状态
    df = pd.read_csv("products.csv")
    context.variables["current_dataset"] = df.to_json()
    
    # 后续插件中读取并转换
    def group_by_product(context):
        current_data = pd.read_json(context.variables["current_dataset"])
        grouped_data = current_data.groupby("product")["quantity"].sum().reset_index()
        context.variables["current_dataset"] = grouped_data.to_json()
        return "已按产品分组计算数量"
    
  • 注意:如果数据集过大,建议只存储数据集的唯一标识(如ID),而非完整数据,避免会话状态过载。

2. 统一数据转换插件的输入输出约定

为所有数据处理插件设计标准化的输入输出规则,强制延续上下文:

  • 每个转换插件的输入必须包含当前数据集的状态(或其标识)
  • 插件输出固定为更新后的数据集状态(或新的标识)
  • 这样代理在调度插件时,会自动将上一步的输出作为下一步的输入,无需额外处理上下文传递

3. 用内存数据库管理大型/多版本数据集

如果数据集体积较大,或需要支持版本回溯,可以结合内存数据库(如Redis、SQLite内存模式):

  • 加载原始数据集后,为其生成唯一ID,将ID存入会话状态,完整数据存入内存数据库
  • 每次转换后,用新的数据集更新数据库中对应ID的条目
  • 后续插件通过会话状态中的ID从数据库取出最新数据进行处理
  • 优势:既避免会话状态负载过高,又能轻松实现数据集版本回滚(如转换错误时恢复到上一版本)

4. 自定义上下文对象传递数据集状态

通过Semantic Kernel的Context.Items附加自定义上下文对象,存储更丰富的数据集信息:

  • 创建包含当前数据集、转换历史等字段的自定义类(如DatasetContext)
  • 将该对象添加到SK上下文的Items集合中,后续插件直接读取并更新该对象
  • 代码示例(C#):
    public class DatasetContext
    {
        public DataFrame CurrentData { get; set; }
        public List<string> TransformationLogs { get; set; } = new();
    }
    
    // 初始化时添加到上下文
    var datasetCtx = new DatasetContext { CurrentData = LoadDataset() };
    context.Items.Add("dataset_context", datasetCtx);
    
    // 插件中更新上下文
    public string ExtractColumns(Context context)
    {
        var ctx = context.Items.Get<DatasetContext>("dataset_context");
        ctx.CurrentData = ctx.CurrentData[["product", "quantity"]];
        ctx.TransformationLogs.Add("提取产品与数量列");
        return "已完成列提取";
    }
    

以上方法可根据数据集大小、业务需求灵活组合使用,核心目标是让每一步转换后的数据集状态能被后续插件直接获取,无需重复加载原始数据。

内容的提问来源于stack exchange,提问作者Soderman

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 09:22:41