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 插件的更多相关文章

  1. Semantic Kernel 入门系列:🔥Kernel 内核和🧂Skills 技能

    理解了LLM的作用之后,如何才能构造出与LLM相结合的应用程序呢? 首先我们需要把LLM AI的能力和原生代码的能力区分开来,在Semantic Kernel(以下简称SK),LLM的能力称为 sem ...

  2. Semantic Kernel 入门系列:🥑Memory内存

    了解的运作原理之后,就可以开始使用Semantic Kernel来制作应用了. Semantic Kernel将embedding的功能封装到了Memory中,用来存储上下文信息,就好像电脑的内存一样 ...

  3. Semantic Kernel 入门系列:🍋Connector连接器

    当我们使用Native Function的时候,除了处理一些基本的逻辑操作之外,更多的还是需要进行外部数据源和服务的对接,要么是获取相关的数据,要么是保存输出结果.这一过程在Semantic Kern ...

  4. Semantic Kernel 入门系列:🛸LLM降临的时代

    不论你是否关心,不可否认,AGI的时代即将到来了. 在这个突如其来的时代中,OpenAI的ChatGPT无疑处于浪潮之巅.而在ChatGPT背后,我们不能忽视的是LLM(Large Language ...

  5. Semantic Kernel 入门系列:🪄LLM的魔法

    ChatGPT 只是LLM 的小试牛刀,让人类能够看到的是机器智能对于语言系统的理解和掌握. 如果只是用来闲聊,而且只不过是将OpenAI的接口封装一下,那么市面上所有的ChatGPT的换皮应用都差不 ...

  6. Semantic Kernel 入门系列:💬Semantic Function

    如果把提示词也算作一种代码的话,那么语义技能所带来的将会是全新编程方式,自然语言编程. 通常情况下一段prompt就可以构成一个Semantic Function,如此这般简单,如果我们提前可以组织好 ...

  7. Semantic Kernel 入门系列:💾Native Function

    语义的归语义,语法的归语法. 基础定义 最基本的Native Function定义只需要在方法上添加 SKFunction 的特性即可. using Microsoft.SemanticKernel. ...

  8. Semantic Kernel 入门系列:🥑突破提示词的限制

    无尽的上下文 LLM的语言理解和掌握能力在知识内容的解读和总结方面提供了强大的能力. 但是由于训练数据本身来自于公共领域,也就注定了无法在一些小众或者私有的领域能够足够的好的应答. 因此如何给LLM ...

  9. Semantic Kernel 入门系列:📅 Planner 计划管理

    Semantic Kernel 的一个核心能力就是实现"目标导向"的AI应用. 目标导向 "目标导向"听起来是一个比较高大的词,但是却是实际生活中我们处理问题的 ...

  10. Kernel Memory Layout on ARM Linux

    这是内核自带的文档,讲解ARM芯片的内存是如何布局的!比较简单,对于初学者可以看一下!但要想深入理解Linux内存管理,建议还是找几本好书看看,如深入理解Linux虚拟内存,嵌入系统分析,Linux内 ...

随机推荐

  1. java线程的interrup、tUninterruptibles.sleepUninterruptibly和sleep、wait

    参考: (1)https://blog.csdn.net/qq_36031640/article/details/116696685 (2)https://blog.csdn.net/liuxiao7 ...

  2. vue2和vue3使用echarts时无数据,怎么显示暂无数据图片或文字

    一开始也经历了用v-if和v-show,v-show的话echarts还会留出暂无数据图片的位置,导致echarts变形,v-if在加载和不加载切换时,dom会获取不到:后来也是在网上找的方法,时间有 ...

  3. Teamcenter RAC 开发之《PlaceHolder》

    背景 做个swing表单,有时候想实现一些网页input标签的placeHolder提示,可能本人写vue or html写多,对某些细节有强迫症,所以找小下资料 实现方法(Swingx) 看源码

  4. c语言代码练习2(1)

    //利用while循环计算1-10阶乘的和#define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> int main( ) { int i ...

  5. About Info-ZIP

    LATEST RELEASES: Zip 3.00 was released on 7 July 2008. WiZ 5.03 was released on 11 March 2005. UnZip ...

  6. jmeter的全局变量(将登陆token设置全局)

    1.首先调用登陆接口,用json提取器,取出响应内的token值  2.在beanshell取样器中设置全局变量 //设置全局变量方法一:用函数__setProperty设置${__setProper ...

  7. Java并发编程和多线程的区别

    并发编程: 并发编程是一种编程范式,它关注的是编写能够正确和高效处理多个并发任务的程序.并发编程不仅包括多线程,还包括了处理多个独立任务的各种技术和模式,如进程.协程.分布式编程等.并发编程的目标是实 ...

  8. JUC并发编程学习笔记(十五)JMM

    JMM 请你谈谈对Volatile的理解 Volatile是java虚拟机提供的轻量级的同步机制 1.保证可见性 2.不保证原子性 3.禁止指令重排 什么是JMM JVM->java虚拟机 JM ...

  9. Wampserver搭建DVWA和sqli-labs问题总结

    Wampserver 搭建 DVWA 和 sqli-labs 问题总结 遇到问题解决的思路方法 百度,博客去搜索相关的问题,人工智能 chatgpt 查看官方文档,查看注释. 本次解决方法就是在文档的 ...

  10. (Good topic)字符串的最大公因子 (3.21leetcode每日打卡)

      对于字符串 S 和 T,只有在 S = T + ... + T(T 与自身连接 1 次或多次)时,我们才认定 "T 能除尽 S". 返回最长字符串 X,要求满足 X 能除尽 s ...