Kernel Memory 入门系列:Semantic Kernel 插件
Kernel Memory 入門系列:Semantic Kernel 插件
Kernel Memory 本身提供了完整的RAG能力,這部分能力如果通過Semantic Kernel Memory的話,也是可以實現的,但是整體的管理成本會比較高。
因此通過Kernel Memory 構建知識庫管理,然后通過插件的方式,將Kernel Memory接入到Semantic Kernel 中,這樣就可以有效的提升整體的使用效率。
初始化插件
首先需要在Semantic Kernel 的項目中添加對應的Kernel Memory的Semantic Kernel Plugin包。
dotnet add package Microsoft.KernelMemory.SemanticKernelPlugin
然后就取出構建KernelMemory,構建的步驟和之前的方式一樣,也可以使用Kernel Memory Service的 WebClient.
var memory = new KernelMemoryBuilder()
//...
.Build<MemoryServerless>();
// OR
var memory = new MemoryWebClient("http://127.0.0.1:9001");
完成構建之后就可以Semantic Kernel 中導入插件了。
var memoryPlugin = kernel.ImportPluginFromObject(new MemoryPlugin(memory), "memory");
如果直接使用Kernel Memory Service的話,也可以通過快捷方式直接構建。
var memoryPlugin = kernel.ImportPluginFromObject(new MemoryPlugin("http://127.0.0.1:9001"), "memory");
如果有使用其中的ApiKey參數的話,也可以參考其中的參數說明進行配置。
另外還可以指定默認的 Index 和文檔的 tags。
new MemoryPlugin(memory,
defaultIndex: "default",
defaultRetrievalTags:
new TagCollection()
{
{"user", "xbotter"}
}
);
插件的功能
MemoryPlugin 本身提供了近乎完整的Kernel Memory的功能,包括:
- Save
- SaveFile
- SaveWebPage
- Search
- Ask
- Delete
- WaitForDocumentReadiness
也就意味著如果在Semantic Kernel 中,通過插件功能的編排,可以實現動態的知識庫管理。
當然也可以通過 plugin 直接調用其中的方法例如:
var context = new KernelArguments
{
[MemoryPlugin.FilePathParam] = DocFilename,
[MemoryPlugin.DocumentIdParam] = "NASA001"
};
await memoryPlugin["SaveFile"].InvokeAsync(kernel, context);
插件的使用
導入到Semantic Kernel 中的插件可以通過在提示詞函數中直接使用,最常見的就是在提示詞中使用Ask方法和Search方法。
var skPrompt = """
Question to Kernel Memory: {{$input}}
Kernel Memory Answer: {{memory.ask $input}}
If the answer is empty say 'I don't know' otherwise reply with a preview of the answer, truncated to 15 words.
""";
var askFunction = kernel.CreateFunctionFromPrompt(skPrompt);
和直接使用 MemoryClient 一樣,調用 memory.ask 方法可以直接獲取 Kernel Memory的回答,構成提示詞的一部分。
如果只是需要檢索相關的文檔的話,可以使用Search方法。
var skPrompt = """
Facts:
{{memory.search $input}}
======
Given only the facts above, provide a comprehensive/detailed answer.
You don't know where the knowledge comes from, just answer.
If you don't have sufficient information, reply with 'I don't know'.
Question: {{$input}}
Answer:
""";
var searchFunction = kernel.CreateFunctionFromPrompt(skPrompt);
這里其實就相當于是使用 PromptFunction 替換了 KernelMemory中的Ask方法。
另外其中的一些參數都可以通過KernelArguments進行配置,例如:
var args = new KernelArguments
{
[MemoryPlugin.IndexParam ] = "default",
[MemoryPlugin.LimitParam] = "10",
[MemoryPlugin.MinRelevanceParam] = "0"
};
最后就是Kernel Function 的調用了:
var question = "any question";
var answer = await askFunction.InvokeAsync(kernel, question);
// or
args["input"] = question;
var result = await kernel.InvokeAsync(searchFunction,args);
參考
- SemanticKernelPlugin
2024,新年快樂
總結
以上是生活随笔為你收集整理的Kernel Memory 入门系列:Semantic Kernel 插件的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Docker部署系列之Docker Co
- 下一篇: 『UniApp』uni-app-打包成A