Semantic Kernel 入门系列:?Semantic Function

这篇具有很好参考价值的文章主要介绍了Semantic Kernel 入门系列:?Semantic Function。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Semantic Kernel 入门系列:?Semantic Function

如果把提示词也算作一种代码的话,那么语义技能所带来的将会是全新编程方式,自然语言编程。

通常情况下一段prompt就可以构成一个Semantic Function,如此这般简单,如果我们提前可以组织好一段段prompt的管理方式,甚至可以不需要写任何的代码,就可以构造出足够多的技能来。

使用文件夹管理Semantic Function

Semantic Kernel恰好就提供了这样一种组织方式,仅需使用文本文件和文件夹就可以管理Semantic Function。文件夹的大致结构如下:

TestSkill  #<- Skill
│
└─── SloganMaker  #<- Function
|    |
│    └─── skprompt.txt
│    └─── [config.json]
│   
└─── SummarizeBlurb  #<- Function 
     |
     └─── skprompt.txt
     └─── [config.json]

和自己手动定义的一样,每一个Function 都包含了一个 skprompt.txt 文件,里面就是对应的prompt,还有一个可选文件config.json 用作配置。如果有多个Skill的话,可以再往上创建一层文件夹将所有的Skill都放在里面。

然后我们在代码中仅需要将这个技能的文件夹导入到Kernel中即可。

// 这里将所有的Skill都放在了 SkillCollection 这个文件夹下
var textSkill = kernel.ImportSemanticSkillFromDirectory("./SkillCollection","TextSkill");

然后还是和往常一样正常调用即可,只不过这里导入得到的是Skill层级的,所以执行的时候需要从Skill中获取对应的Function,Function的名字和对应的文件夹名一致。

var input = 
"""
Congratulations! You have imagined a delicious ASK for SK to run to completion. This ASK can be given to the Planner to get decomposed into steps. Although to make the Planner work reliably, you'll need to use the most advanced model available to you. So let's start from writing basic prompts to begin with.
""";

var resultContext = await kernel.RunAsync(input,textSkill["SummarizeBlurb"]);

resultContext.Result.Dump();
// output:
// You have imagined an ASK for SK that can be given to the Planner to be decomposed into steps. To make the Planner work reliably, you need to use the most advanced model available.

扩展自己的Semantic Function管理方式

除了官方提供的方式之外,也可以自行实现一些个性化的方便的管理方式,例如存放在文档数据库上,或者对象存储服务上,甚至使用Git、FTP等方式也不是不可以。

所需要做的只不过是将prompt和配置从远程方式获取到本地,然后通过原生的SemanticFunction注册接口注册进去就行了。

一个基本的注册方式如下:

var prompt = "A powerful Prompt"; // 对应skprompt.txt文件
var promptConfig = new PromptTemplateConfig(); //对应config.json 配置

var promptTemplate= new PromptTemplate(prompt,promptConfig,kernel);
var functionConfig = new SemanticFunctionConfig(promptConfig,promptTemplate);

var skillName = "SkillName";  // skill名称
var functionName = "FunctionName"; // function名称

var function = kernel.RegisterSemanticFunction(skillName,functionName,functionConfig);

其中的SkillName 并不是必须的,如果没有话,那默认会注册到一个名为 _GLOBAL_FUNCTIONS_ 全局技能下面,从kernel.Skills中取用的时候,如果不指定SkillName,也会从这个全局技能下获取。

只需要根据自己的喜好,处理好当前技能的管理方式,就可以打造出各种各样的个性场景了。

例如为每一个用户分配一个技能池,用户可以自行微调每个技能的相关的参数。

结合后面会提及到的Prompt Template 语法,也可以创造出更多丰富的场景。

官方Github仓库中有一个样例,就是从云端加载技能,可以大致参考一下https://github.com/microsoft/semantic-kernel/blob/main/samples/dotnet/kernel-extension-load-prompts-from-cloud/SampleExtension.cs。

Semantic Function的参数配置

除了skprompt.txt ,另外一个需要注意的就是config.json文件,也就对应着 PromptTemplateConfig 这个配置类。

一个典型的配置文件类似这样:

{
  "schema": 1,
  "type": "completion",
  "description": "a function that generates marketing slogans",
  "completion": {
    "max_tokens": 1000,
    "temperature": 0.0,
    "top_p": 0.0,
    "presence_penalty": 0.0,
    "frequency_penalty": 0.0
  },
  "default_services": [
    "text-davinci-003"
  ]
}

其中 schema 目前没啥用, description 提供了Function的功能说明, type 指定了当前Function的所使用的模型类型,"completion", "embeddings”之类,默认为”completion”, default_services 指定默认使用的模型名称(官方文档中还是default_backend,应该是还没来得及更新)。然后就是我们作为常见的 completion配置了。直接参考官方文档即可。

Semantic Kernel 入门系列:?Semantic Function

更为强大的模板语法

如果仅仅是将OpenAI的接口做了一层封装的话,其实和市面上大多数的OpenAI的sdk差不了多少,

而Semantic Kernel所能提供自然会有更多,其中就Semantic Function部分,SK就提供了一套强大的Prompt Template 语法。

变量

前面已经用到过一个最简单 {{$INPUT}} 就是SK提供的变量语法,所有的变量放在 {{ }} 中, $INPUT 就是默认的输入参数,除此之外,还可以自行定义参数。

例如:

Write me a marketing slogan for my {{$INPUT}} in {{$CITY}} with 
a focus on {{$SPECIALTY}} we are without sacrificing quality.

这里的参数不区分大小写,所以有时会看到$INPUT,有时候会看到$input,都是可以的。

有了参数自然就需要能够传递多个参数进去,需要使用的是ContextVariables进行管理的。

var myContext = new ContextVariables(); 
myContext.Set("BUSINESS", "Basketweaving Service"); 
myContext.Set("CITY", "Seattle"); 
myContext.Set("SPECIALTY","ribbons"); 

var myResult = await myKernel.RunAsync(myContext,mySkill["SloganMakerFlex"]);

相比较之前直接给input运行,这里将所有参数都放在了一个ContextVariables中,打包塞进了Kernel。

函数调用

除了多个参数之外,SK还提供了类似函数调用的方式,可以在prompt中实现多种技能的组合,而且并不限制是Semantic Function 还是 Native Function。

例如有一个 weather.getForecast 的Native Function可以获取指定 city 的天气,还有一个 time.Date 可以获取今天的日期。

需要根据用户的所在城市,以及相关行程信息撰写一篇旅行日记。就可以这样写prompt:

The weather today is {{weather.getForecast $city}}.
The date is {{time.Date}}.
My itinerary for today is as follows:
===
{{ $itinerary }}
===
Generate a travel diary based on the above content.

除此之外,模板语法的还有一些符号转义的注意事项,可以具体参考Github中的文档https://github.com/microsoft/semantic-kernel/blob/main/docs/PROMPT_TEMPLATE_LANGUAGE.md。

至此,Semantic Function的基本配置和使用的掌握的差不多了。


参考资料:文章来源地址https://www.toymoban.com/news/detail-409928.html

  1. https://learn.microsoft.com/en-us/semantic-kernel/howto/semanticfunctions
  2. https://github.com/microsoft/semantic-kernel/tree/main/samples/dotnet/kernel-extension-load-prompts-from-cloud
  3. https://learn.microsoft.com/en-us/semantic-kernel/howto/configuringfunctions
  4. https://github.com/microsoft/semantic-kernel/blob/main/dotnet/src/SemanticKernel/SemanticFunctions/PromptTemplateConfig.cs
  5. https://github.com/microsoft/semantic-kernel/blob/main/docs/PROMPT_TEMPLATE_LANGUAGE.md

到了这里,关于Semantic Kernel 入门系列:?Semantic Function的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Semantic Kernel 入门系列:? Planner 计划管理

    Semantic Kernel 的一个核心能力就是实现“目标导向”的AI应用。 “目标导向”听起来是一个比较高大的词,但是却是实际生活中我们处理问题的基本方法和原则。 顾名思义,这种方法的核心就是先确定目标,然后再寻找实现目标的方法和步骤。这对于人来说的是很自然的事情

    2023年04月16日
    浏览(36)
  • Semantic Kernel 入门系列:?LLM的魔法

    ChatGPT 只是LLM 的小试牛刀,让人类能够看到的是机器智能对于语言系统的理解和掌握。 如果只是用来闲聊,而且只不过是将OpenAI的接口封装一下,那么市面上所有的ChatGPT的换皮应用都差不多。这就像是买了个徕卡镜头的手机,却只用来扫二维码一样。 由于微软的财大气粗,

    2023年04月09日
    浏览(29)
  • Semantic Kernel 入门系列:?Connector连接器

    当我们使用Native Function的时候,除了处理一些基本的逻辑操作之外,更多的还是需要进行外部数据源和服务的对接,要么是获取相关的数据,要么是保存输出结果。这一过程在Semantic Kernel中可以被归类为Connector。 Connector更像是一种设计模式,并不像Function和Memory 一样有强制和

    2023年04月15日
    浏览(42)
  • Semantic Kernel 入门系列:?LLM降临的时代

    不论你是否关心,不可否认,AGI的时代即将到来了。 在这个突如其来的时代中,OpenAI的ChatGPT无疑处于浪潮之巅。而在ChatGPT背后,我们不能忽视的是LLM(Large Language Model)大型语言模型。 一夜之间所有的大厂商都在搞LLM,虽然很难有谁能和OpenAI相匹敌,但是随着AI领域的新摩

    2023年04月08日
    浏览(35)
  • Semantic Kernel 入门系列:?突破提示词的限制

    LLM对自然语言的理解和掌握在知识内容的解读和总结方面提供了强大的能力。 但是由于训练数据本身来自于公共领域,也就注定了无法在一些小众或者私有的领域能够足够的好的应答。 因此如何给LLM 提供足够多的信息上下文,就是如今的LLM AI应用可以充分发挥能力的地方了

    2023年04月13日
    浏览(50)
  • LangChain vs Semantic Kernel

    每当向他人介绍 Semantic Kernel, 会得到的第一个问题就是 Semantic Kernel 类似于LangChain吗,或者是c# 版本的LangChain吗? 为了全面而不想重复的回答这个问题,因此我写下这篇文章。 在 ChatGPT 之前,构建 集成AI的应用程序的主要分为两个步骤: 机器学习工程师/数据科学家创建模

    2023年04月20日
    浏览(39)
  • 体验Semantic Kernel图片内容识别

        前几日在浏览devblogs.microsoft.com的时候,看到了一篇名为Image to Text with Semantic Kernel and HuggingFace的文章。这篇文章大致的内容讲的是,使用 Semantic Kernel 结合 HuggingFace 来实现图片内容识别。注意,这里说的是图片内容识别,并非是 OCR ,而是它可以大致的描述图片里的主要

    2024年04月08日
    浏览(50)
  • 使用 Semantic Kernel 实现 Microsoft 365 Copilot 架构

    3月16日,微软发布了微软365 Copilot[1]。 Microsoft 365 Copilot 将您现有的 Word、Excel、PowerPoint、Outlook 和 Teams 与大型语言模型 (LLM) 的强大功能以及来自 Microsoft Graph 和 Microsoft 365 应用的数据相结合,以创建前所未有的体验。正如您在官方视频中看到的那样,Microsoft 365 Copilot的核心

    2024年02月02日
    浏览(37)
  • 旁门左道:借助 HttpClientHandler 拦截请求,体验 Semantic Kernel 插件

    前天尝试通过 one-api + dashscope(阿里云灵积) + qwen(通义千问) 运行 Semantic Kernel 插件(Plugin) ,结果尝试失败,详见前天的博文。 今天换一种方式尝试,选择了一个旁门左道走走看,看能不能在不使用大模型的情况下让 Semantic Kernel 插件运行起来,这个旁门左道就是从 Stephen T

    2024年02月19日
    浏览(32)
  • 实现阿里云模型服务灵积 DashScope 的 Semantic Kernel Connector

    Semantic Kernel 内置的 IChatCompletionService 实现只支持 OpenAI 与 Azure OpenAI,而我却打算结合 DashScope(阿里云模型服务灵积) 学习 Semantic Kernel。 于是决定自己动手实现一个支持 DashScope 的 Semantic Kernel Connector —— DashScopeChatCompletionService,实现的过程也是学习 Semantic Kernel 源码的过程,

    2024年02月19日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包