通过 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 的效果果然明显。

posted @ 2024-03-03 10:22  dudu  阅读(104)  评论(6编辑  收藏  举报