如何使用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上的文檔和示例來了解更多的細節和高級功能。

寫作不易,轉載請註明博文地址,否則禁轉!!!

👇感謝閱讀,點贊+分享+收藏+關注👇
文章出自猿惑豁微信公衆號
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章