Kernel Memory 入门系列:自定义处理流程

在整个文档预处理的流程中,涉及到很多的处理步骤,例如:文本提取,文本分片,向量化和存储。这些步骤是Kernel Memory中的默认提供的处理方法,如果有一些其他的需求,也可以进行过程的自定义。

自定义Handler

在Kernel Memory中,可以通过自定义Handler的方式来实现自定义的处理流程。自定义Handler需要实现IPipelineStepHandler接口,该接口定义如下:

public interface IPipelineStepHandler
{
string StepName { get; } Task<(bool success, DataPipeline updatedPipeline)> InvokeAsync(DataPipeline pipeline, CancellationToken cancellationToken = default);
}

其中,StepName是自定义Handler的名称,用于在Pipeline中指定该步骤,InvokeAsync方法是自定义Handler的执行方法。在InvokeAsync方法中,可以对DataPipeline中的数据进行修改,从而实现自定义的处理。

主要的实现逻辑在InvokeAsync方法中,其中DataPipeline是主要的数据结构,它包含了整个文档处理的流程中的所有数据。

如果想要得到当前处理流程中的文件,可以通过DataPipeline.Files属性获取。

public async Task<(bool success, DataPipeline updatedPipeline)> InvokeAsync(DataPipeline pipeline, CancellationToken cancellationToken = default)
{
foreach (DataPipeline.FileDetails file in pipeline.Files)
{
Console.WriteLine(file.Name);
} return (true, pipeline);
}

实现的过程中建议为Handler注入IPipelineOrchestrator, 通过IPipelineOrchestrator可以获取到当前的Memory的大部分基础组件和文件管理的方法。

例如,如果想获取文件的内容,就可以IPipelineOrchestrator.ReadTextFileAsync方法:

IPipelineOrchestrator orchestrator;
var fileContent = await orchestrator.ReadTextFileAsync(pipeline, file.Name, cancellationToken);

如果想要存储生成的文件内容,就可以使用IPipelineOrchestrator.WriteTextFileAsync方法:

IPipelineOrchestrator orchestrator;
await orchestrator.WriteTextFileAsync(pipeline, file.Name, fileContent, cancellationToken);

除了文本内容,还可以通过IPipelineOrchestrator.ReadFileAsyncIPipelineOrchestrator.WriteFileAsync方法来读取和存储二进制文件。

除此之外,还可以通过IPipelineOrchestrator 获取 TextGeneratorEmbeddingGeneratorsMemoryDbs等基础组件,搭配使用实现更多丰富的流程。

例如使用TextGenerator文本生成服务,可以构建自己的提示词方法,为当前的文档生成摘要、提炼关键词等。

生成的文本,首先通过IPipelineOrchestrator.WriteFileAsync进行内容的存储, 然后将文件信息存放到file.GeneratedFiles中,这样就可以在后续的处理流程中使用了。

var generatedFile = ...;
await orchestrator.WriteFileAsync(pipeline, generatedFile.Name, generatedFile.Content, cancellationToken);
file.GeneratedFiles.Add(new DataPipeline.GeneratedFileDetails
{
Id = Guid.NewGuid().ToString("N"),
ParentId = file.Id,
Name = generatedFile.Name,
Size = generatedFile.Length,
MimeType = generatedFile.Type,
ArtifactType = DataPipeline.ArtifactTypes.SyntheticData,
Tags = pipeline.Tags,
});

另外,其中的File本身存在一组方法,可以用来判断该文件是否已经被当前流程处理过了,以避免重复处理:

 file.MarkProcessedBy(this); // 标记当前文件已经被当前Handler处理过了
file.AlreadyProcessedBy(this); // 判断当前文件是否已经被当前Handler处理过了

注册Handler

完成Handler逻辑的编写后,就可以将Handler注册到Memory中进行使用了。

在构建Memory后,通过AddHandler方法即可完成注册:

var memory = new KernelMemoryBuilder()
// ...
.Build<MemoryServerless>(); memory.AddHandler(new MyHandler(memory.Orchestrator));

另外也可以在 MemoryBuilder 阶段,针对Orchestrator进行Handler的注册:

var memoryBuilder = new KernelMemoryBuilder();
var orchestrator = memoryBuilder.GetOrchestrator(); var myHandler = new MyHandler(orchestrator);
await orchestrator.AddHandlerAsync(myHandler);

自定义处理流程

注册完成Handler后,就可以在自定义的Pipeline中使用了。

一种方式是在memory.ImportDocumentAsync的时候,指定 Steps:

await memory.ImportDocumentAsync("sample-Wikipedia-Moon.txt", steps: new[] { "my_step" });

另一种是围绕着Orchestrator进行Pipeline的构建:

var pipeline = orchestrator
.PrepareNewDocumentUpload(index: "tests", documentId: "inProcessTest", new TagCollection { { "testName", "example3" } })
.AddUploadFile("file1", "file1-Wikipedia-Carbon.txt", "file1-Wikipedia-Carbon.txt")
.AddUploadFile("file2", "file2-Wikipedia-Moon.txt", "file2-Wikipedia-Moon.txt")
.Then("extract")
.Then("partition")
.Then("summarize")
.Then("gen_embeddings")
.Then("save_records")
.Build(); await orchestrator.RunPipelineAsync(pipeline, cancellationToken);

以上就完成了自定义流程的实现。

参考

Kernel Memory 入门系列:自定义处理流程的更多相关文章

  1. webpack 快速入门 系列 - 自定义 wepack 上

    其他章节请看: webpack 快速入门 系列 自定义 wepack 上 通过"初步认识webpack"和"实战一"这 2 篇文章,我们已经学习了 webpac ...

  2. vue 快速入门 系列 —— vue loader 下

    其他章节请看: vue 快速入门 系列 vue loader 下 CSS Modules CSS Modules 是一个流行的,用于模块化和组合 CSS 的系统.vue-loader 提供了与 CSS ...

  3. Semantic Kernel 入门系列:🥑Memory内存

    了解的运作原理之后,就可以开始使用Semantic Kernel来制作应用了. Semantic Kernel将embedding的功能封装到了Memory中,用来存储上下文信息,就好像电脑的内存一样 ...

  4. 【Lucene3.6.2入门系列】第05节_自定义停用词分词器和同义词分词器

    首先是用于显示分词信息的HelloCustomAnalyzer.java package com.jadyer.lucene; import java.io.IOException; import j ...

  5. 【JAVA零基础入门系列】Day8 Java的控制流程

    什么是控制流程?简单来说就是控制程序运行逻辑的,因为程序一般而言不会直接一步运行到底,而是需要加上一些判断,一些循环等等.举个栗子,就好比你准备出门买个苹果,把这个过程当成程序的话,可能需要先判断一下 ...

  6. Cordova入门系列(四)自定义Cordova插件--showToast

    前三篇Cordova入门系列,简单讲解了Cordova,以及如何调用Cordova插件,今天我们讲解一下如何自己做一个插件. 自定义插件,就是自己写一些安卓java代码,然后和js代码以及配置文件,封 ...

  7. Spring Boot入门系列(十七)整合Mybatis,创建自定义mapper 实现多表关联查询!

    之前讲了Springboot整合Mybatis,介绍了如何自动生成pojo实体类.mapper类和对应的mapper.xml 文件,并实现最基本的增删改查功能.mybatis 插件自动生成的mappe ...

  8. WPF快速入门系列(8)——MVVM快速入门

    一.引言 在前面介绍了WPF一些核心的内容,其中包括WPF布局.依赖属性.路由事件.绑定.命令.资源样式和模板.然而,在WPF还衍生出了一种很好的编程框架,即WVVM,在Web端开发有MVC,在WPF ...

  9. 快速入门系列--WebAPI--01基础

    ASP.NET MVC和WebAPI已经是.NET Web部分的主流,刚开始时两个公用同一个管道,之后为了更加的轻量化(WebAPI是对WCF Restful的轻量化),WebAPI使用了新的管道,因 ...

  10. 快速入门系列--WebAPI--03框架你值得拥有

    接下来进入的是俺在ASP.NET学习中最重要的WebAPI部分,在现在流行的互联网场景下,WebAPI可以和HTML5.单页应用程序SPA等技术和理念很好的结合在一起.所谓ASP.NET WebAPI ...

随机推荐

  1. 银河麒麟使用kickstart二次打包制作安装镜像ISO

    系统:银河麒麟 V10 SP2 服务器:百信恒山 TS02F-F30 安装方式:服务器挂载ISO镜像进行安装 1.安装 mkisofs 软件包: #yum install genisoimage 2. ...

  2. defined('BASEPATH') OR exit('No direct script access allowed'); 的作用

    起到保护.php文件的作用, 如果直接访问此php文件会得到"不允许直接访问脚本"的错误提示 如果你是用ci框架或者其他的什么, 就建议加上, 如果你怕别人恶意攻击你的话

  3. EXE一机一码打包加密大师(EXE加密, 一机一码, 添加授权,添加静态密码,支持设置试用时间)

    EXE一机一码打包加密大师可以打包加密保护EXE文件,同时给EXE文件添加上一机一码认证,或者静态密码,不同的电脑打开加密后的文件需要输入不同的激活码才能正常使用,保护文件安全,方便向用户收费. 下载 ...

  4. 文盘Rust -- tonic-Rust grpc初体验

    gRPC 是开发中常用的开源高性能远程过程调用(RPC)框架,tonic 是基于 HTTP/2 的 gRPC 实现,专注于高性能.互操作性和灵活性.该库的创建是为了对 async/await 提供一流 ...

  5. vscode没有完全汉化怎么办? vs code部分内容没汉化的解决办法

  6. Termius for macOS or Windows Download ssh

    mac电脑   苹果系统 window 系统 链接  服务器,访问 ecs ,ssh链接 工具 下载地址:http://pgyd.online/?website/53.html Termius for ...

  7. 21.3 Python 使用DPKT分析数据包

    dpkt项目是一个Python模块,主要用于对网络数据包进行解析和操作.它可以处理多种协议,例如TCP.UDP.IP等,并提供了一些常用的网络操作功能,例如计算校验和.解析DNS数据包等.由于其简单易 ...

  8. 殷浩详解DD系列

    第五讲:https://blog.csdn.net/Taobaojishu/article/details/115911833 内部有1-4讲链接

  9. [转载]R2: 相关系数、复相关系数及半偏相关系数之间的联系

    开贴举例说明相关系数.复相关系数及半偏相关系数之间的联系. 比如,我们要预测学生在高中的表现(学生成绩),一种方法是测量学习速度和难易程度的能力测验来衡量学生的学习能力.那么,假设一个学生已经做了这样 ...

  10. 聊聊Transform模型

    摘自<BERT基础教程:Transformer大模型实战 > 概述 循环神经网络和长短期记忆网络已经广泛应用于时序任务,比如文本预测.机器翻译.文章生成等.然而,它们面临的一大问题就是如何 ...