• 如何使用Microsoft.KernelMemory来快速地构建和管理你的数据索引
  • 发布于 2个月前
  • 173 热度
    0 评论
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的核心类和接口,自定义你的数据管道和业务处理逻辑。这种模式适合于高度定制化的场景和高级用户。
// Memory setup, e.g. how to calculate and where to store embeddings
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.AddHandlerAsync(step3);
接下来,我们通过一个简单的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: 用于产生答案的相关来源列表

你可以使用这些属性来显示或处理答案和来源。例如:
// 堆代码 duidaima.com
Console.WriteLine(answer.Result + "/n");
foreach (var x in answer.RelevantSources)
{
    Console.WriteLine($"  * {x.SourceName} -- {x.Partitions.First().LastUpdate:D}");
}
以上就是使用Microsoft.KernelMemory来实现对文本的索引创建、删除、查询的基本步骤和示例。你可以参考GitHub上的文档和示例来了解更多的细节和高级功能。
用户评论