Microsoft.KernelMemory是一个开源的服务和插件,专门用于通过自定义的连续数据混合管道对数据集进行高效的索引。
利用先进的嵌入和LLM,系统可以使用自然语言对索引的数据进行查询,同时提供引用和链接到原始来源。
Microsoft.KernelMemory可以作为Semantic Kernel, Microsoft Copilot和ChatGPT的插件,与最流行的AI平台上构建的应用程序进行无缝集成,增强数据驱动的功能。
//项目地址:https://github.com/microsoft/kernel-memory
换句话说,Microsoft.KernelMemory能方便我们使用自然语言来管理和查询索引的数据信息,同时还能自定义每个步骤的处理逻辑及后端应用。
目前,Microsoft.KernelMemory支持以下后端:
- 向量存储:Azure Cognitive Search、Qdrant
- 内容存储:Azure Blobs、本地文件系统
- 异步摄取队列:Azure Queues、RabbitMQ、本地文件基础队列
支持以下几种模式:
- 服务模式:Microsoft.KernelMemory作为一个服务运行,可以吞吐数千个文档和信息,而不会阻塞你的应用程序。你可以使用MemoryWebClient来与服务进行通信,发送文档,查询和请求。
var client = new MemoryWebClient("http://localhost:5000");
- 无服务器模式:可以将MemoryServerlessClient嵌入到你的应用程序中,直接在本地进行文档导入和查询。这种模式适合于小规模的数据集和快速的原型开发。
var memory = new KernelMemoryBuilder () .WithOpenAIDefaults(Env.Var("OPENAI_API_KEY")) .Build();
- 库模式:可以直接使用Microsoft.KernelMemory的核心类和接口,自定义你的数据管道和业务处理逻辑。这种模式适合于高度定制化的场景和高级用户。
var memoryBuilder = new KernelMemoryBuilder().WithOpenAIDefaults(Env.Var("OPENAI_API_KEY"));
memoryBuilder.Build();
var orchestrator = memoryBuilder.GetOrchestrator();
// Define custom .NET handlers
var step1 = new MyHandler1("step1", orchestrator);
var step2 = new MyHandler2("step2", orchestrator);
var step3 = new MyHandler3("step3", orchestrator);
await orchestrator.AddHandlerAsync(step1);
await orchestrator.AddHandlerAsync(step2);
await orchestrator
接下来,我们通过一个简单的Demo来了解它。扫个关注吧👇
要使用Microsoft.KernelMemory来实现对文本的索引创建、删除、查询,可以参考以下步骤:
1、安装Microsoft.KernelMemory的NuGet包,并在应用程序中引用它。
Install-Package Microsoft.KernelMemory.Core
2、创建一个KernelMemoryBuilder对象,并配置要使用的后端、连接器和插件,也可以扩展相应接口来自定义,非常灵活。例如:使用Qdrant作为向量存储,本地文件系统作为内容存储,RabbitMQ作为异步摄取队列,以及OpenAI作为LLM嵌入生成器,代码如下:
var memory = new KernelMemoryBuilder()
.WithQdrantVectorStore(…) // 使用Qdrant作为向量存储
.WithSimpleFileStorage(…) // 使用本地文件系统作为内容存储
.WithRabbitMQPipeline(…) // 使用RabbitMQ作为异步摄取队列
.WithOpenAIDefaults(Env.Var("OPENAI_API_KEY")) // 使用OpenAI作为LLM嵌入生成器
.Build();
3、使用ImportDocumentAsync方法来导入文本文件到KernelMemory中,并为它们添加标签。例如,这里导入一个名为meeting-transcript.docx的文件,并为它添加user和date两个标签,代码如下:
await memory.ImportDocumentAsync("meeting-transcript.docx", tags: new() { { "user", "Blake" }, { "date", "2023-11-08" } });
可以使用ImportDocumentAsync方法来导入多个文件,并为它们添加多个标签。例如,如果要导入一个名为business-plan.docx和一个名为project-timeline.pdf的文件,并为它们添加user, collection, fiscalYear等标签,可以使用以下代码:
await memory.ImportDocumentAsync(new Document ("file001")
.AddFile("business-plan.docx")
.AddFile("project-timeline.pdf")
.AddTag("user", "Blake")
.AddTag("collection", "business")
.AddTag("collection", "plans")
.AddTag("fiscalYear", "2023"));
导入文本文件后,KernelMemory会使用以下默认的文档摄取管道来处理它们:
- 提取文本:识别文件格式并提取信息
- 将文本分割成小块,以优化搜索
- 使用LLM嵌入生成器提取向量
- 将结果保存到向量数据库中
4、如果想要删除file001,可以使用以下代码:
await memory.DeleteDocumentAsync("file001");
5、要使用自然语言对索引的文本进行查询,可以使用AskAsync方法,并提供一个问题和一个可选的过滤器。例如,如果想要询问会议的参与人数,并根据user和date标签进行过滤,可以使用以下代码:
var answer = await memory.AskAsync("How many people attended the meeting?", filter: new MemoryFilter ()
.ByTag("user", "Blake")
.ByTag("date", "2023-11-08"));
AskAsync方法会返回一个MemoryAnswer对象,包含以下属性:
- Question: 客户问题
- Result: 答案的内容
- Confidence: 用于产生答案的相关来源列表
你可以使用这些属性来显示或处理答案和来源。例如:
Console.WriteLine(answer.Result + "/n");
foreach (var x in answer.RelevantSources)
{
Console.WriteLine($" * {x.SourceName} -- {x.Partitions.First().LastUpdate:D}");
}
以上就是使用Microsoft.KernelMemory来实现对文本的索引创建、删除、查询的基本步骤和示例。你可以参考GitHub上的文档和示例来了解更多的细节和高级功能。
写作不易,转载请注明博文地址,否则禁转!!!