探索Semantic Plugins:开启大模型的技能之门

semantic,plugins · 浏览次数 : 11

小编点评

# 使用Semantic Kernel插件 在本章中,我们将详细介绍如何使用Semantic Kernel的插件。Semantically Kernel的一个显著特点是具有强大的插件生态系统,它通过结合自定义/预定义的插件来应对智能业务挑战。这使得传统的代码可以与智能插件协同工作,灵活地融入应用程序场景,简化传统应用向智能化转型的过程。 ## 什么是插件? 在LLMs(大型语言模型)的训练数据和实际使用之间存在时间差,同时LLMs对于企业内部知识的认知存在局限性。OpenAI通过插件将ChatGPT与第三方应用程序连接起来,这些插件允许ChatGPT与开发人员定义的API进行交互,从而增强ChatGPT的功能并实现更广泛的操作。这些插件可以用于检索实时信息(如体育赛事比分、股票价格、最新新闻等),检索知识库信息(如公司文档、个人笔记等),以及协助用户执行相关操作(如预订航班、公司内预定会议、订餐等)。 ## 定义插件 在Semantic Kernel中定义插件有两种主要方式: 1. 语义插件(Semantic Plugins):通过预定义模板进行插件定义。这些模板可以包含多个提示词(Prompts)。提示词和相应的参数配置放置在`skprompt.txt`文件中,而相关参数设置则放置在`config.json`文件中。例如,以下是一个简单的提示词模板,用于将输入文本翻译成英文: ``` Translate {{input}} into {{language}} ``` 配置文件`config.json`包含以下内容: ```json { "schema": 1, "description": "Translate sentences into a language of your choice", "execution_settings": { "default": { "max_tokens": 2000, "temperature": 0.7, "top_p": 0.0, "presence_penalty": 0.0, "frequency_penalty": 0.0, "stop_sequences": ["[done]"] } }, "input_variables": [ { "name": "input", "description": "The sentence to translate", "default": "" }, { "name": "language", "description": "The language to translate to", "default": "" } ] } ``` 2. 本地插件(Native Plugins):通过在函数内部定义插件。这种方法提供了更多的灵活性,但通常不如语义插件常见。 ## 注册插件 要在Semantic Kernel中注册插件,您需要使用`KernelExtensions`类中的`CreatePluginFromPromptDirectory`扩展方法。这将允许您将插件添加到系统中。 ```csharp string folder = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Plugins"); kernel.ImportPluginFromPromptDirectory(folder); ``` 要注册插件,您可以使用以下代码: ```csharp var kernel = Kernel.CreateBuilder() .AddAzureOpenAIChatCompletion(config.ModelId, endpoint: config.Endpoint, apiKey: config.ApiKey) .Build(); ``` ## 测试插件 要使用插件,您可以从`kernel.Plugins`中获取功能函数,并通过调用相应的函数来体验插件提供的功能。 ```csharp var jokeKernelFunction = kernel.Plugins.GetFunction("Prompts", "Translator"); Console.WriteLine("System: Please enter the text to translate:"); var userText = Console.ReadLine(); Console.WriteLine("System: Please enter the language to translate to:"); var language = Console.ReadLine(); var results = await jokeKernelFunction.InvokeAsync(kernel, new KernelArguments() { {"input", userText}, {"language", language} }); Console.WriteLine($"Assistant: {results.ToString()}"); ``` 在本章的剩余部分,我们将深入探讨如何使用原生插件(Native Plugins),这些插件是直接在内核中定义的,而不是通过模板。

正文

前言

在之前的章节中我们或多或少的已经接触到了 Semantic KernelPlugins,本章我们讲详细介绍如何使用插件。

Semantic Kernel 的一大特点是拥有强大的插件,通过结合自定义/预定义的插件解决智能业务的问题。让传统的代码和智能插件一起工作灵活地接入到应用场景简化传统应用向智能化转型的过程。

什么是Plugins

image

我们知道LLMs(大模型)的训练数据和我们使用之间有时间差,还有一个问题 LLMs 对自己企业化内的知识认知有缺陷。OpenAI通过插件将ChatGPT和第三方的应用程序之间进行连接,这些插件使 ChatGPT 能够与开发人员定义的 API 进行交互,从而增强 ChatGPT 的功能并允许有更广泛的操作,如:

  • 检索实时信息,例如,体育赛事比分、股票价格、最新新闻等。
  • 检索知识库信息, 例如,公司文档、个人笔记等。
  • 协助用户进行相关操作,例如,预订航班、公司内预定会议、订餐等。

Semantic Kernel 遵循 OpenAI 的插件的插件规范,可以很方便地接入和导出插件(如基于 Bing, Microsoft 365, OpenAI 的插件),这样可以让开发人员很简单地调用不同的插件服务。除了兼容 OpenAI 的插件外,Semantic Kernel 内也有属于自己插件定义的方式。不仅可以在规定模版格式上定义 Plugins, 更可以在函数内定义 Plugins.

从高层次上理解插件是一组可以公开给 AI 应用程序和服务的功能。

插件要提供在语义上描述其行为方式的详细信息,从函数的输入、输出到副作用,一切都需要以 AI 可以理解的方式进行描述.

定义插件

在 Semantic Kernel 中定义 Plugins 插件有两种方式,第一种是通过模版定义插件也叫Semantic Plugins(语义插件),第二种是通过函数创建插件也叫 Native Plugins(本地插件)

Sermantic Plugins

通过模版定义插件
我们知道可以通过Prompts(提示词工程)可以和LLMs进行对话,我们在处理一系列特定业务过程中,可能不止一个Prompts,可能是一组Prompts的集合。我们可以把这些针对业务能力的Prompts集合放到Semantic Kernel的插件集合内。

模版格式

Semantic Kernel 模版定义格式有固定的格式,Prompts(提示词)都放在 skprompt.txt 文件内,而相关参数设置都放在 config.json 文件内,文件结构参考如下图

     const string ConfigFile = "config.json";
     const string PromptFile = "skprompt.txt";

这些都是在 SK 写死的配置,所以插件内的命名一定要遵循这个规则!

|-plugins
    |-Prompts
        |-Translator
            |-skprompt.txt
            |-config.json
    |-WriterPlugins
        |-Joke
            |-skprompt.txt
            |-config.json
        |-ShortPoem
            |-skprompt.txt
            |-config.json

skprompt.txt

我们先来看看 skprompt.txt 的定义,这里一般是放置和业务相关的 Prompt,可以支持多个参数,每个参数都放置在 {{$参数名}} 内,如以下格式:

Translate {{$input}} into {{$language}}

在之前的章节我们介绍过这是SKTemplateFormat的默认格式"semantic-kernel"

config.json

这是配置相关的内容,随了设置和 LLMs 相关的参数外,你也可以设定输入的参数以及相关描述

{
  "schema": 1,
  "description": "Translate sentenses into a language of your choice",
  "execution_settings": {
    "default": {
      "max_tokens": 2000,
      "temperature": 0.7,
      "top_p": 0.0,
      "presence_penalty": 0.0,
      "frequency_penalty": 0.0,
      "stop_sequences": ["[done]"]
    }
  },
  "input_variables": [
    {
      "name": "input",
      "description": "sentense to translate",
      "default": ""
    },
    {
      "name": "language",
      "description": "Language to translate to",
      "default": ""
    }
  ]
}

这其实就是对PromptTemplateConfig提示词模版配置类的 json 数据,最后在 SK 内会被反序列化到对象内。

   // Load prompt configuration. Note: the configuration is optional.
   var configPath = Path.Combine(functionDirectory, ConfigFile);
   var promptConfig = File.Exists(configPath) ?
                PromptTemplateConfig.FromJson(File.ReadAllText(configPath)) :
                new PromptTemplateConfig();

之前我们对PromptTemplateConfig类进行过详细的讲解,不熟悉的可以看看深入学习 Semantic Kernel:创建和配置 prompts functions

从解决方案的角度看一下配置的目录图

image

注册 Semantic Plugins

要从 Semantic Kernel 中要实现Semantic Plugins模板化插件的注册,需要KernelExtensions类中的CreatePluginFromPromptDirectory扩展方法。

再开始之前在我们代码的解决方案Plugins文件夹下对每一个skprompt.txtconfig.json进行生成设置

image

核心代码

var kernel = Kernel.CreateBuilder()
    .AddAzureOpenAIChatCompletion(config.ModelId, endpoint: config.Endpoint, apiKey: config.ApiKey)
    .Build();
//注册插件
string folder = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Plugins");
kernel.ImportPluginFromPromptDirectory(folder);

string[] pluginNames = ["Prompts", "WriterPlugins"];

foreach (var pluginName in pluginNames)
{
    kernel.ImportPluginFromPromptDirectory(Path.Combine(folder, pluginName));
}

//测试从插件获得funciton
var jokeKernelFunction = kernel.Plugins.GetFunction("Prompts", "Translator");
Console.WriteLine("System: 请输入要翻译的内容");
var userResuest = Console.ReadLine();
Console.WriteLine("System: 请输入要翻译的语言语种");
var language = Console.ReadLine();

var results = await jokeKernelFunction.InvokeAsync(kernel, new KernelArguments()
{
  {"input", userResuest},
  {"language", language}
});

Console.WriteLine($"Assistant: {results.ToString()}");

插件名称约定

ImportPluginFromPromptDirectory这个方法在注册插件过程中如果没有指定插件名字会默认用文件夹名称

   pluginName ??= new DirectoryInfo(pluginDirectory).Name;

输出

System: 请输入要翻译的内容
User: 那么近那么美周末去河北
System: 请输入要翻译的语言语种
User: 英文
Assistant: So close, so beautiful, go to Hebei for the weekend.

最后

本章我们详细介绍了如何使用 Semantic Kernel 的插件功能,包括插件的概念、定义插件的两种方式(Semantic Plugins 和 Native Plugins)、以及如何注册和调用 Semantic Plugins。通过插件,我们可以扩展 ChatGPT 的功能,使其能够与第三方应用程序进行连接,实现更广泛的操作和服务。

通过注册插件并调用相应函数,我们可以实现诸如翻译、笑话生成等功能。在下一篇中,我们将关注 Native Plugins 原生函数插件的介绍。

参考文献

示例代码

本文源代码

与探索Semantic Plugins:开启大模型的技能之门相似的内容:

探索Semantic Plugins:开启大模型的技能之门

前言 在之前的章节中我们或多或少的已经接触到了 Semantic Kernel 的 Plugins,本章我们讲详细介绍如何使用插件。 Semantic Kernel 的一大特点是拥有强大的插件,通过结合自定义/预定义的插件解决智能业务的问题。让传统的代码和智能插件一起工作灵活地接入到应用场景简化传统

探索Native Plugins:开启大模型的技能之门

前言 上一章节我们了解了一下Semantic Kernnel中Plugins插件的概念以及学习了的 Semantic Kernel 模板插件的创建,本章节我们来学习 Native Plugins 原生函数插件使用。 通过函数定义插件 在之前的章节中我们介绍过在在 Semantic Kernel 中应

探索Semantic Kernel内置插件:深入了解ConversationSummaryPlugin的应用

前言 经过前几章的学习我们已经熟悉了Semantic Kernel 插件的概念,以及基于Prompts构造的Semantic Plugins和基于本地方法构建的Native Plugins。本章我们来讲解一下在Semantic Kernel 中内置的一些插件,让我们避免重复造轮子。 内置插件 Sem

探索Semantic Kernel内置插件:深入了解HttpPlugin的应用

前言 上一章我们熟悉了Semantic Kernel中的内置插件和对ConversationSummaryPlugin插件进行了实战,本章我们讲解一下另一个常用的内置插件HttpPlugin的应用。 上一章对ConversationSummaryPlugin总结进行了调整之后,顺便给Semantic

探索 SK 示例 -- GitHub 存储库中的机器人

微软 3月22日 一篇文章“Semantic-kernel 嵌入和记忆:使用聊天UI探索GitHub Repos”[1] ,文章中进行了展示了嵌入,该文章解释了他们如何帮助开发人员提出有关GitHub存储库的问题或使用自然语言查询探索GitHub存储库。与嵌入一起,这是在SK存储器[2](嵌入集合)

.NET周报 【4月第1期 2023-04-02】

国内文章 探索 SK 示例 -- GitHub 存储库中的机器人 https://www.cnblogs.com/shanyou/p/17280627.html 微软 3月22日 一篇文章“Semantic-kernel 嵌入和记忆:使用聊天UI探索GitHub Repos”[1] ,文章中进行了展

文章《Semantic Kernel -- LangChain 的替代品?》的错误和疑问 探讨

微信公众号文章 Semantic Kernel —— LangChain 的替代品?[1] ,它使用的示例代码是Python ,他却发了这么一个疑问:支持的语言对比(因为 Semantic Kernel 是用 C#开发的,所以它对 C#比较支持)如上所示。不清楚 Semantic Kernel 为什

[转帖]探索惊群 ①

https://wenfh2020.com/2021/09/25/thundering-herd/ 惊群比较抽象,类似于抢红包 😁。它多出现在高性能的多进程/多线程服务中,例如:nginx。 探索惊群 系列文章将深入 Linux (5.0.1) 内核,透过 多进程模型 去剖析惊群现象、惊群原理、惊

探索贪心算法:解决优化问题的高效策略

贪心算法是一种在每一步选择中都采取当前最佳选择的算法,以期在整体上达到最优解。它广泛应用于各种优化问题,如最短路径、最小生成树、活动选择等。本文将介绍贪心算法的基本概念、特点、应用场景及其局限性。 贪心算法的基本概念 贪心算法的核心思想是局部最优策略,即在每一步选择中都选择当前看起来最优的选项,希望

《探索Python Requests中的代理应用与实践》

本文详细介绍了如何在Python的requests库中使用高匿代理和隧道代理,以及如何部署一个简易的代理IP池来提高爬虫的稳定性和匿名性。同时,文章还深入探讨了野生代理的来源及其潜在的安全风险和使用限制。这篇文章适合希望进一步了解代理技术及其在网络爬虫开发中应用的读者。