通過 Kernel Memory 初步體驗 Retrieval Augmented Generation

學習材料:Quick intro to Kernel Memory: install, upload a doc, ask a question

創建控制檯項目

dotnet new console
dotnet add package Microsoft.KernelMemory.Core

創建 IKernelMemory 實例

var memory = new KernelMemoryBuilder()
    .WithOpenAIDefaults(OPENAI_API_KEY)
    .Build<MemoryServerless>();

注:默認大模型用的是 gpt-3.5-turbo-16k

運行控制檯程序,通過日誌可以看到加載了哪些 handler

info: Microsoft.KernelMemory.Handlers.TextExtractionHandler[0]
      Handler 'extract' ready
info: Microsoft.KernelMemory.Handlers.TextPartitioningHandler[0]
      Handler 'partition' ready
info: Microsoft.KernelMemory.Handlers.SummarizationHandler[0]
      Handler 'summarize' ready
info: Microsoft.KernelMemory.Handlers.GenerateEmbeddingsHandler[0]
      Handler 'gen_embeddings' ready, 1 embedding generators
info: Microsoft.KernelMemory.Handlers.SaveRecordsHandler[0]
      Handler save_records ready, 1 vector storages
info: Microsoft.KernelMemory.Handlers.DeleteDocumentHandler[0]
      Handler 'private_delete_document' ready
info: Microsoft.KernelMemory.Handlers.DeleteIndexHandler[0]
      Handler 'private_delete_index' ready
info: Microsoft.KernelMemory.Handlers.DeleteGeneratedFilesHandler[0]
      Handler 'delete_generated_files' ready

導入 PDF 文件

PDF 文件是 博客園鼠標墊.pdf,內容來自這篇博文

導入 PDF 文件的代碼

await memory.ImportDocumentAsync("博客園鼠標墊.pdf", documentId: "doc001");

對應上面這行代碼的控制檯日誌輸出

info: Microsoft.KernelMemory.Pipeline.BaseOrchestrator[0]
      Queueing upload of 1 files for further processing [request doc001]
info: Microsoft.KernelMemory.Pipeline.BaseOrchestrator[0]
      File uploaded: 博客園鼠標墊.pdf, 174013 bytes
info: Microsoft.KernelMemory.Pipeline.BaseOrchestrator[0]
      Handler 'extract' processed pipeline 'default/doc001' successfully
info: Microsoft.KernelMemory.Pipeline.BaseOrchestrator[0]
      Handler 'partition' processed pipeline 'default/doc001' successfully
info: Microsoft.KernelMemory.Pipeline.BaseOrchestrator[0]
      Handler 'gen_embeddings' processed pipeline 'default/doc001' successfully
info: Microsoft.KernelMemory.Pipeline.BaseOrchestrator[0]
      Handler 'save_records' processed pipeline 'default/doc001' successfully
info: Microsoft.KernelMemory.Pipeline.BaseOrchestrator[0]
      Pipeline 'default/doc001' complete

從日誌看,在 import document 的過程中就完成了 embedding 的生成並保存至向量數據庫。

從源碼看,生成 embedding 是由 OpenAITextEmbeddingGenerator 調用 Semantic Kernel 中的 OpenAITextEmbeddingGenerationService 完成的。

接下來,基於內存向量數據庫中的 embeddings 數據,向 gpt-3.5-turbo-16k 模型提問,Kernel Memory 會自動根據提示詞檢索對應的 embeddings 然後一起發給大模型,這就是 RAG(Retrieval Augmented Generation)

var question = "博客園鼠標墊在哪買";
var answer = await memory.AskAsync(question);
Console.WriteLine($"Question: {question}\n\nAnswer: {answer.Result}");

運行程序,看看 AI 的回答:

Question: 博客園鼠標墊在哪買

Answer: 博客園鼠標墊可以在淘寶上購買。購買鏈接爲https://item.taobao.com/item.htm?id=761724714914。另外,如果不想在淘寶上購買,也可以通過博客園的企業微信購買。

如果不使用 embedding,ChatGPT 的回答一看就是編出來的

博客園鼠標墊可以在博客園的官方網站上購買,也可以在其他在線購物平臺或者實體店中找到。你可以在博客園網站上搜索他們的商店或者聯繫客服詢問購買渠道

RAG 的效果果然明顯。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章