Kernel Memory 入门系列:Semantic Kernel 插件
Kernel Memory 入門(mén)系列:Semantic Kernel 插件
Kernel Memory 本身提供了完整的RAG能力,這部分能力如果通過(guò)Semantic Kernel Memory的話,也是可以實(shí)現(xiàn)的,但是整體的管理成本會(huì)比較高。
因此通過(guò)Kernel Memory 構(gòu)建知識(shí)庫(kù)管理,然后通過(guò)插件的方式,將Kernel Memory接入到Semantic Kernel 中,這樣就可以有效的提升整體的使用效率。
初始化插件
首先需要在Semantic Kernel 的項(xiàng)目中添加對(duì)應(yīng)的Kernel Memory的Semantic Kernel Plugin包。
dotnet add package Microsoft.KernelMemory.SemanticKernelPlugin
然后就取出構(gòu)建KernelMemory,構(gòu)建的步驟和之前的方式一樣,也可以使用Kernel Memory Service的 WebClient.
var memory = new KernelMemoryBuilder()
//...
.Build<MemoryServerless>();
// OR
var memory = new MemoryWebClient("http://127.0.0.1:9001");
完成構(gòu)建之后就可以Semantic Kernel 中導(dǎo)入插件了。
var memoryPlugin = kernel.ImportPluginFromObject(new MemoryPlugin(memory), "memory");
如果直接使用Kernel Memory Service的話,也可以通過(guò)快捷方式直接構(gòu)建。
var memoryPlugin = kernel.ImportPluginFromObject(new MemoryPlugin("http://127.0.0.1:9001"), "memory");
如果有使用其中的ApiKey參數(shù)的話,也可以參考其中的參數(shù)說(shuō)明進(jìn)行配置。
另外還可以指定默認(rèn)的 Index 和文檔的 tags。
new MemoryPlugin(memory,
defaultIndex: "default",
defaultRetrievalTags:
new TagCollection()
{
{"user", "xbotter"}
}
);
插件的功能
MemoryPlugin 本身提供了近乎完整的Kernel Memory的功能,包括:
- Save
- SaveFile
- SaveWebPage
- Search
- Ask
- Delete
- WaitForDocumentReadiness
也就意味著如果在Semantic Kernel 中,通過(guò)插件功能的編排,可以實(shí)現(xiàn)動(dòng)態(tài)的知識(shí)庫(kù)管理。
當(dāng)然也可以通過(guò) plugin 直接調(diào)用其中的方法例如:
var context = new KernelArguments
{
[MemoryPlugin.FilePathParam] = DocFilename,
[MemoryPlugin.DocumentIdParam] = "NASA001"
};
await memoryPlugin["SaveFile"].InvokeAsync(kernel, context);
插件的使用
導(dǎo)入到Semantic Kernel 中的插件可以通過(guò)在提示詞函數(shù)中直接使用,最常見(jiàn)的就是在提示詞中使用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 一樣,調(diào)用 memory.ask 方法可以直接獲取 Kernel Memory的回答,構(gòu)成提示詞的一部分。
如果只是需要檢索相關(guān)的文檔的話,可以使用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);
這里其實(shí)就相當(dāng)于是使用 PromptFunction 替換了 KernelMemory中的Ask方法。
另外其中的一些參數(shù)都可以通過(guò)KernelArguments進(jìn)行配置,例如:
var args = new KernelArguments
{
[MemoryPlugin.IndexParam ] = "default",
[MemoryPlugin.LimitParam] = "10",
[MemoryPlugin.MinRelevanceParam] = "0"
};
最后就是Kernel Function 的調(diào)用了:
var question = "any question";
var answer = await askFunction.InvokeAsync(kernel, question);
// or
args["input"] = question;
var result = await kernel.InvokeAsync(searchFunction,args);
參考
- SemanticKernelPlugin
2024,新年快樂(lè)
總結(jié)
以上是生活随笔為你收集整理的Kernel Memory 入门系列:Semantic Kernel 插件的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Docker部署系列之Docker Co
- 下一篇: 『UniApp』uni-app-打包成A