项目地址:https://github.com/microsoft/kernel-memory
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来了解它。
Install-Package Microsoft.KernelMemory.Core2、创建一个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会使用以下默认的文档摄取管道来处理它们:
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对象,包含以下属性:
// 堆代码 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上的文档和示例来了解更多的细节和高级功能。