Semantic Kernel实现调用Kernel Memory
1、背景
目前Semantic Kernel
是C#调用大模型的主流操作,因此如何将Semantic Kernel
与Kernel Memory
结合起来,就可以试试了。
2、具体实现
Kernel Memory就是上一篇的所述内容,在上一篇中,也是可以直接声明Kernel Memory进行调用。这次SK调用KM如下:
// See https://aka.ms/new-console-template for more information
using Microsoft.KernelMemory;
using Microsoft.SemanticKernel;
using System.ComponentModel;var modelName = "llama3.2:3b";
var ollamaEndpoint = "http://localhost:11434";
var ollamaUri = new Uri(ollamaEndpoint);var kernelBuilder = Kernel.CreateBuilder().AddOllamaChatClient(modelName, ollamaUri);var kernel= kernelBuilder.Build();var memoryUrl = "http://127.0.0.1:9001/";
var memoryPlugin = new MemoryPlugin(memoryUrl,"",true);kernel.ImportPluginFromObject(memoryPlugin,"memory");var text = "北京动物园有10只猴子, 8只老虎, 6头大象, 4匹马, 100头狼,以及99头骆驼.\n\n" +"门票价格如下:\n\n" +"成人: 100元/人\n" +"儿童: 50元/人\n" +"联系方式: 13813818188\n" +"地址: 北京市海淀区西直门附近";await memoryPlugin.SaveAsync(text);var skprompt = """
提问:{{$input}}
回答:{{memory.ask $input}}
""";var myfunction= kernel.CreateFunctionFromPrompt(skprompt);var answer =await myfunction.InvokeAsync(kernel, "北京动物园有多少只动物?");Console.WriteLine(answer);Console.ReadLine();
2.1 实现效果
3、总结
个人理解:Semantic Kernel和Kernel Memory是并列的关系。上述的代码实际上给kernel Memory创建了一个实例,然后注册到Semantic kernel中,然后再调用,有点脱裤子放屁。为啥不直接调用呢?
另外,在之前的文章中,我们可以将方法注册到Semantic kernel中,然后通过kernel的实例,通过InvokePromptAsync实现大模型的处理,但上面的例子是通过这句var answer =await myfunction.InvokeAsync(kernel, "北京动物园有多少只动物?");
来调用的,而myfunction又是从kernel Memory中提取出来的,所以感觉有点乱。
再弄弄Agent试试,看看Agent能不能直接调用kernel Memory