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);
参考
2024,新年快乐
Kernel Memory 入门系列:Semantic Kernel 插件的更多相关文章
- Semantic Kernel 入门系列:🔥Kernel 内核和🧂Skills 技能
理解了LLM的作用之后,如何才能构造出与LLM相结合的应用程序呢? 首先我们需要把LLM AI的能力和原生代码的能力区分开来,在Semantic Kernel(以下简称SK),LLM的能力称为 sem ...
- Semantic Kernel 入门系列:🥑Memory内存
了解的运作原理之后,就可以开始使用Semantic Kernel来制作应用了. Semantic Kernel将embedding的功能封装到了Memory中,用来存储上下文信息,就好像电脑的内存一样 ...
- Semantic Kernel 入门系列:🍋Connector连接器
当我们使用Native Function的时候,除了处理一些基本的逻辑操作之外,更多的还是需要进行外部数据源和服务的对接,要么是获取相关的数据,要么是保存输出结果.这一过程在Semantic Kern ...
- Semantic Kernel 入门系列:🛸LLM降临的时代
不论你是否关心,不可否认,AGI的时代即将到来了. 在这个突如其来的时代中,OpenAI的ChatGPT无疑处于浪潮之巅.而在ChatGPT背后,我们不能忽视的是LLM(Large Language ...
- Semantic Kernel 入门系列:🪄LLM的魔法
ChatGPT 只是LLM 的小试牛刀,让人类能够看到的是机器智能对于语言系统的理解和掌握. 如果只是用来闲聊,而且只不过是将OpenAI的接口封装一下,那么市面上所有的ChatGPT的换皮应用都差不 ...
- Semantic Kernel 入门系列:💬Semantic Function
如果把提示词也算作一种代码的话,那么语义技能所带来的将会是全新编程方式,自然语言编程. 通常情况下一段prompt就可以构成一个Semantic Function,如此这般简单,如果我们提前可以组织好 ...
- Semantic Kernel 入门系列:💾Native Function
语义的归语义,语法的归语法. 基础定义 最基本的Native Function定义只需要在方法上添加 SKFunction 的特性即可. using Microsoft.SemanticKernel. ...
- Semantic Kernel 入门系列:🥑突破提示词的限制
无尽的上下文 LLM的语言理解和掌握能力在知识内容的解读和总结方面提供了强大的能力. 但是由于训练数据本身来自于公共领域,也就注定了无法在一些小众或者私有的领域能够足够的好的应答. 因此如何给LLM ...
- Semantic Kernel 入门系列:📅 Planner 计划管理
Semantic Kernel 的一个核心能力就是实现"目标导向"的AI应用. 目标导向 "目标导向"听起来是一个比较高大的词,但是却是实际生活中我们处理问题的 ...
- Kernel Memory Layout on ARM Linux
这是内核自带的文档,讲解ARM芯片的内存是如何布局的!比较简单,对于初学者可以看一下!但要想深入理解Linux内存管理,建议还是找几本好书看看,如深入理解Linux虚拟内存,嵌入系统分析,Linux内 ...
随机推荐
- 千呼万唤始出来 JDK 21 LTS, 久等了
平地起惊雷!!! 目录 英雄的迟暮 大人时代变了 JDK 21 LTS 前 JAVA并发编程模型 JDK 21 LTS 中的 JAVA 并发编程模型 虚拟线程 VS 线程池 The Last 你可以称 ...
- PostgreSQL学习笔记-6.基础知识:ALTER、TRUNCATE 、View(视图)、TRANSACTION 事务、LOCK 锁
ALTER TABLE 命令 在 PostgreSQL 中,ALTER TABLE 命令用于添加,修改,删除一张已经存在表的列. 另外你也可以用 ALTER TABLE 命令添加和删除约束. 语法 用 ...
- isHex
public class Test { public static boolean isHex(String str) { boolean isHexFlg = true; int i = 0; ch ...
- oracle下载安装教程(带安装包)
废话不多说上连接: 链接:https://pan.baidu.com/s/1ukUjxbTpodxwxoGQUKl8KA?pwd=y6ju 提取码:y6ju oracle下载速度太慢了我存在了百度网盘 ...
- WPF性能优化:Freezable 对象
Freezable是WPF中一个特殊的基类,用于创建可以冻结(Freeze)的可变对象.冻结一个对象意味着将其状态设置为只读,从而提高性能并允许在多线程环境中共享对象. Freezable的应用 我们 ...
- grafana 配置自定义dashboard
本文为博主原创,转载请注明出处: 1.配置数据源 配置完成后,点击Save And Test,如果配置正确,页面则显示如下: 2.配置dashboard 点击 A ...
- splay + 垃圾回收 知识点与例题的简要讲解
splay 简要讲解 前置芝士:普通二叉树 splay tree是一个越处理越灵活的数据结构,通过splay(伸展)操作,使整棵树的单次查询时间复杂度接近于O(log n),整棵树的高度也接近于log ...
- 监控Mysql数据库
Prometheus(普罗米修斯) 监控Mysql数据库: 这个是基于第一版本环境搭建的,需要部署prometheus: 服务器 IP地址 Prometheus服务器 192.168.1.22 被监控 ...
- 一键安装LNMP
#!/bin/bash #2020年3月1日 #auto_install_lnmp. #by fly ################################ NGX_VER="$1 ...
- NOI Linux 食用指北
写这篇 blog 的原因是某个小朋友要考 CSP 了还不会用 linux,怎么回事呢. 单击图片即可放大. 前置- linux 虚拟机的安装 在官网 / 其他地方下载 VMware. 在 noi 官网 ...