學習材料: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 的效果果然明顯。