前言

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

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

什么是Plugins

我们知道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

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

注册 Semantic Plugins

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

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

核心代码

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:开启大模型的技能之门的更多相关文章

  1. ILLA Cloud: 调用 Hugging Face Inference Endpoints,开启大模型世界之门

    一个月前,我们 宣布了与 ILLA Cloud 与达成的合作,ILLA Cloud 正式支持集成 Hugging Face Hub 上的 AI 模型库和其他相关功能. 今天,我们为大家带来 ILLA ...

  2. Picasso:开启大前端的未来

    “道生一,一生二,二生三,三生万物.” —— <道德经> Picasso是大众点评移动研发团队自研的高性能跨平台动态化框架,经过两年多的孕育和发展,目前在美团多个事业群已经实现了大规模的应 ...

  3. 华为高级研究员谢凌曦:下一代AI将走向何方?盘古大模型探路之旅

    摘要:为了更深入理解千亿参数的盘古大模型,华为云社区采访到了华为云EI盘古团队高级研究员谢凌曦.谢博士以非常通俗的方式为我们娓娓道来了盘古大模型研发的"前世今生",以及它背后的艰难 ...

  4. DeepSpeed Chat: 一键式RLHF训练,让你的类ChatGPT千亿大模型提速省钱15倍

    DeepSpeed Chat: 一键式RLHF训练,让你的类ChatGPT千亿大模型提速省钱15倍 1. 概述 近日来,ChatGPT及类似模型引发了人工智能(AI)领域的一场风潮. 这场风潮对数字世 ...

  5. 无插件的大模型浏览器Autodesk Viewer开发培训-武汉-2014年8月28日 9:00 – 12:00

    武汉附近的同学们有福了,这是全球第一次关于Autodesk viewer的教室培训. :) 你可能已经在各种场合听过或看过Autodesk最新推出的大模型浏览器,这是无需插件的浏览器模型,支持几十种数 ...

  6. 跟上节奏 大数据时代十大必备IT技能

    跟上节奏 大数据时代十大必备IT技能 新的想法诞生新的技术,从而造出许多新词,云计算.大数据.BYOD.社交媒体……在互联网时代,各种新词层出不穷,让人应接不暇.这些新的技术,这些新兴应用和对应的IT ...

  7. PowerDesigner 学习:十大模型及五大分类

    个人认为PowerDesigner 最大的特点和优势就是1)提供了一整套的解决方案,面向了不同的人员提供不同的模型工具,比如有针对企业架构师的模型,有针对需求分析师的模型,有针对系统分析师和软件架构师 ...

  8. PowerDesigner 15学习笔记:十大模型及五大分类

    个人认为PowerDesigner 最大的特点和优势就是1)提供了一整套的解决方案,面向了不同的人员提供不同的模型工具,比如有针对企业架构师的模型,有针对需求分析师的模型,有针对系统分析师和软件架构师 ...

  9. 文心大模型api使用

    文心大模型api使用 首先,我们要获取硅谷社区的连个key 复制两个api备用 获取Access Token 获取access_token示例代码 之后就会输出 作文创作 作文创作:作文创作接口基于文 ...

  10. AI大模型学习了解

    # 百度文心 上线时间:2019年3月 官方介绍:https://wenxin.baidu.com/ 发布地点: 参考资料: 2600亿!全球最大中文单体模型鹏城-百度·文心发布 # 华为盘古 上线时 ...

随机推荐

  1. 《c#高级编程》第2章C#2.0中的更改(二)——匿名类型

    一.概念 C#中的匿名类型是一种特殊类型,可以在运行时动态创建一个对象,该对象可以包含多个属性,这些属性的名称和类型可以在创建时指定.相对于定义具体的类,匿名类型更加灵活和简洁. C#的匿名类型通常用 ...

  2. Django框架——图书管理系统、聚合查询、分组查询、F与Q查询

    图书管理系统 1.表设计 先考虑普通字段再考虑外键字段 数据库迁移.测试数据录入 2.首页展示 3.书籍展示 4.书籍添加 5.书籍编辑 后端如何获取用户想要编辑的数据.前端如何展示出待编辑的数据 6 ...

  3. 力扣15(Java)-三数之和(中等)

    题目: 给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != j.i != k 且 j != k ,同时还满足 nums[i] + ...

  4. 力扣627(MySQL)-变更性别(简单)

    题目: Salary 表: 请你编写一个 SQL 查询来交换所有的 'f' 和 'm' (即,将所有 'f' 变为 'm' ,反之亦然),仅使用 单个 update 语句 ,且不产生中间临时表. 注意 ...

  5. 面试官:在原生input上面使用v-model和组件上面使用有什么区别?

    前言 还是上一篇面试官:来说说vue3是怎么处理内置的v-for.v-model等指令? 文章的那个粉丝,面试官接着问了他另外一个v-model的问题. 面试官:vue3的v-model都用过吧,来讲 ...

  6. Azkaban业务流程如何转化为DataWorks业务流程

    简介: 用户在迁移上云的时候,需要将云下的的Azkaban任务迁移上云,之前通过用户在DataWroks一步步创建对应的业务流程,其转化难度和转化时间都是一定的成本和时间,但如何能做到省时省力的方式迁 ...

  7. OceanBase首次阐述战略:继续坚持自研开放之路 开源300万行核心代码

    简介: 在数据库OceanBase3.0峰会上,蚂蚁集团自主研发的分布式数据库OceanBase首次从技术.商业和生态三个维度对未来发展战略进行了系统性阐述.同时,OceanBase宣布正式开源,并成 ...

  8. 复杂推理模型从服务器移植到Web浏览器的理论和实战

    ​简介: 随着机器学习的应用面越来越广,能在浏览器中跑模型推理的Javascript框架引擎也越来越多了.在项目中,前端同学可能会找到一些跑在服务端的python算法模型,很想将其直接集成到自己的代码 ...

  9. 漫画 | 一口气搞懂 Serverless !

    ​简介: 第二届云原生编程挑战赛为热爱技术的年轻人提供一个挑战世界级技术问题的舞台,希望用技术为全社会创造更大价值. 作者 | 刘欣 呃,我可能是别人眼中所说的不用奋斗的一代. 大家喜欢听的什么多姿多 ...

  10. 什么是IPD项目管理模式?聊聊IPD下的产品研发流程

    IPD(集成产品开发)涵盖了产品从创意提出到研发.生产.运营等,包含了产品开发到营销运营的整个过程.围绕产品(或项目)生命周期的过程的管理模式,是一套生产流程,更是时下国际先进的管理体系.IPD(集成 ...