如何使用Microsoft.KernelMemory来快速地构建和管理你的数据索引

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上的文档和示例来了解更多的细节和高级功能。

写作不易,转载请注明博文地址,否则禁转!!!

👇感谢阅读,点赞+分享+收藏+关注👇
文章出自猿惑豁微信公众号
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章