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上的文檔和示例來了解更多的細節和高級功能。
寫作不易,轉載請註明博文地址,否則禁轉!!!