首页 > 其他分享 > Semantic Kernel 入门系列:

Semantic Kernel 入门系列:

时间:2023-04-16 20:58:47浏览次数:40  
标签:Kernel Planner Semantic 创建 博客 Plan var

image

Semantic Kernel 的一个核心能力就是实现“目标导向”的AI应用。

目标导向

“目标导向”听起来是一个比较高大的词,但是却是实际生活中我们处理问题的基本方法和原则。

顾名思义,这种方法的核心就是先确定目标,然后在寻找实现目标的方法和步骤。这对于人来说的是很自然的事情,但是对于机器则不然。一大堆的指令和控制逻辑其实都是在完成另外一种产出导向的结果。所有的流程和过程都需要提前预定义好,然后期待一个结果的产出。

如今,借助 LLM AI 的力量,我们可以轻松的实现目标导向的过程。

在 Semantic Kernel中,Planner就用于这项工作。

我们可以提前准备好所需的Skill,根据设定好的最终目标,通过Planner,可以将目标分解为需要执行的任务列表,并且可以指定好对应的参数传递,然后逐个任务执行,从而实现最终目标。

做好技能准备

为了让LLM AI更好的理解我们所提供的技能,需要明确地配置好每个技能本身的描述和参数描述。

对于的Semantic Function来说,可以在config.json中配置。以下是一个Translate的配置。

需要注意的就是 descriptioninput 参数,最终会成为的LLM是否选择使用的判断标准。而这一切都是基于语义化的理解。

{
    "schema": 1,
    "type": "completion",
    "description": "Translate the input into the specified language",
    "completion": {
        "max_tokens": 256,
        "temperature": 0.0,
        "top_p": 0.0,
        "presence_penalty": 0.0,
        "frequency_penalty": 0.0
    },
    "input": {
        "parameters": [
        {
            "name": "input",
            "description": "input text",
            "defaultValue": ""
        },
        {
            "name":"language",
            "description":"the specified language",
            "defaultValue":"English"
        }
        ]
    }
}

对于Native Function ,可以使用特性进行声明,其实 SKFunction 中用于添加Function的描述, SKFunctionContextParameter 用于添加参数的说明。

public class EmailSKill {
	[SKFunction("Send email conten to receiver")]
	[SKFunctionContextParameter(Name ="content", Description = "email content")]
	[SKFunctionContextParameter(Name ="receiver", Description = "the email address of receiver")]
	public void SendTo(SKContext context){
		var email = context["content"];
		var receiver = context["receiver"];
		Console.WriteLine(
$"""
mail to: {receiver} 
{email}
""");
	}
}

准备好技能之后,就可以将这些技能导入到Kernel中,准备后续时候。

作为示例,这里导入了三个功能:

  1. MySkill.WriteText : 文案写作
  2. MySkill.Translate :文本翻译
  3. email.SendTo : 邮件发送

使用Planner

然后我们就可以开始使用 Planner了。

Planner本身也是 Semantic Kernel中的一个Skill,融合了Semantic Function 和 Native Function。

和通常的Skill一样,导入 PlannerSkill 后即可使用。

var planner = kernel.ImportSkill(new PlannerSkill(kernel),"plan");

指定好任务目标。

var goal = "The PowerBlog is about to release a new product, please write a chinese press release about the new product and send it to [email protected]";

然后就可以执行 CreatePlan 创建一个Plan。

var plan = await kernel.RunAsync(goal,planner["CreatePlan"]);

此时可以使用Plan.PathString查看当前的任务编排。

Plan所有状态的结果都会保存在Context中,所以可以通过 context.Variables.ToPlan() 方法获取Plan对象。

plan.Variables.ToPlan().PlanString.Dump("Create Plan");
/*
<goal>
The PowerBlog is about to release a new product, please write a chinese press release about the new product and send it to [email protected]
</goal>
<plan>
  <function.MySkill.WriteText input="The PowerBlog is about to release a new product" setContextVariable="PRESS_RELEASE"/>
  <function.MySkill.Translate input="$PRESS_RELEASE" language="Chinese" setContextVariable="TRANSLATED_PRESS_RELEASE"/>
  <function.email.SendTo content="$TRANSLATED_PRESS_RELEASE" receiver="[email protected]"/>
</plan>
*/

创建好了 Plan 就可以使用 ExecutePlan 执行了。

由于每次只能执行一个Function,所以我们需要通过循环来执行所有Function。
同时根据Plan的状态,判断是否执行成功,是否执行完成。

Plan 有两种状态,一种是 IsSuccessful ,表示当前的Plan是否执行成功。

另一个是 IsComplete,表示整个Plan是否执行完成。

async Task<SKContext> ExecutePlanAsync(IKernel kernel, SKContext plan)
{
	var executionResults = plan;
	while (!executionResults.Variables.ToPlan().IsComplete)
	{
		var result = await kernel.RunAsync(executionResults.Variables, planner["ExecutePlan"]);
		var planResult = result.Variables.ToPlan();
		if (planResult.IsSuccessful)
		{
			if (planResult.IsComplete)
			{
				break;
			}
		}
		else
		{
			break;
		}
		executionResults = result;
	}
	return executionResults;
}

var result = await ExecutePlanAsync(kernel,plan);
// output:
/*
mail to: [email protected]

介绍PowerBlog——专为企业和企业家设计的终极博客平台。我们的新产品旨在帮助您轻松创建、管理和优化博客内容。

PowerBlog是为想要创建与竞争对手不同的专业博客的企业和企业家完美的解决方案。通过我们的直观用户界面,您可以快速创建和管理博客文章,优化SEO内容,并跟踪博客的性能。

我们的新产品还包括强大的功能,如自动内容策划、社交媒体整合和分析工具。通过这些功能,您可以轻松监控博客的性能,并就内容策略做出明智的决定。

PowerBlog是为想要创建与竞争对手不同的专业博客的企业和企业家完美的解决方案。通过我们的直观用户界面,您可以快速创建和管理博客文章,优化SEO内容,并跟踪博客的性能。

我们很高兴向客户提供这款新产品,期待帮助您创建一个成功的博客。今天就注册,开始创建与竞争对手不同的内容吧。
*/

最后根据状态判断Plan最后执行是否成功,并从plan.Result 中获取最后的输出结果。

if(!result.Variables.ToPlan().IsSuccessful) {
	result.Variables.ToPlan().Result.Dump("Complete!");
}else {
	result.Variables.ToPlan().Result.Dump("Error");
}
/*
:Complete!:

介绍PowerBlog——专为企业和企业家设计的终极博客平台。我们的新产品旨在帮助您轻松创建、管理和优化博客内容。

PowerBlog是为想要创建与竞争对手不同的专业博客的企业和企业家完美的解决方案。通过我们的直观用户界面,您可以快速创建和管理博客文章,优化SEO内容,并跟踪博客的性能。

我们的新产品还包括强大的功能,如自动内容策划、社交媒体整合和分析工具。通过这些功能,您可以轻松监控博客的性能,并就内容策略做出明智的决定。

PowerBlog是为想要创建与竞争对手不同的专业博客的企业和企业家完美的解决方案。通过我们的直观用户界面,您可以快速创建和管理博客文章,优化SEO内容,并跟踪博客的性能。

我们很高兴向客户提供这款新产品,期待帮助您创建一个成功的博客。今天就注册,开始创建与竞争对手不同的内容吧。
*/

至此,我们就掌握了Semantic Kernel 当前所有的核心概念和基本使用方法。


参考资料:

  1. Planner in Semantic Kernel | Microsoft Learn
  2. semantic-kernel/05-using-the-planner.ipynb at main · microsoft/semantic-kernel · GitHub
  3. What is Semantic Kernel? | Microsoft Learn

标签:Kernel,Planner,Semantic,创建,博客,Plan,var
From: https://www.cnblogs.com/xbotter/p/semantic_kernel_introduction_planner.html

相关文章

  • How to use the Raspberry Pi to study the Linux kernel source code All In One
    HowtousetheRaspberryPitostudytheLinuxkernelsourcecodeAllInOne如何利用树莓派来研究Linux内核源码AllInOnehttps://github.com/torvalds/linux学习笔记在Linux系统中,一切皆文件!(......
  • Semantic Kernel 入门系列:
    当我们使用NativeFunction的时候,除了处理一些基本的逻辑操作之外,更多的还是需要进行外部数据源和服务的对接,要么是获取相关的数据,要么是保存输出结果。这一过程在SemanticKernel中可以被归类为Connector。Connector更像是一种设计模式,并不像Function和Memory一样有强制和明确......
  • Semantic Kernel 入门系列:
    了解的运作原理之后,就可以开始使用SemanticKernel来制作应用了。SemanticKernel将embedding的功能封装到了Memory中,用来存储上下文信息,就好像电脑的内存一样,而LLM就像是CPU一样,我们所需要做的就是从内存中取出相关的信息交给CPU处理就好了。内存配置使用Memory需要注册embe......
  • Semantic Kernel 入门系列:
    无尽的上下文LLM的语言理解和掌握能力在知识内容的解读和总结方面提供了强大的能力。但是由于训练数据本身来自于公共领域,也就注定了无法在一些小众或者私有的领域能够足够的好的应答。因此如何给LLM提供足够多的信息上下文,就是如今的LLMAI应用可以充分发挥能力的地方了。......
  • LargeKernel3D:在3D稀疏CNN中使用大卷积核
    前言 2DCNN使用大卷积代替小卷积,增大了卷积核的感受野,捕获到的特征更偏向于全局,效果也得到了提升,这表明较大的kernelsize很重要。但是,当直接在3DCNN中应用大卷积核时,那些在2D中成功的模块设计在3D网络效果不好,例如深度卷积。为了应对这一重要挑战,本文提出了空间分区......
  • Semantic Kernel 入门系列:
    语义的归语义,语法的归语法。基础定义最基本的NativeFunction定义只需要在方法上添加SKFunction的特性即可。usingMicrosoft.SemanticKernel.SkillDefinition;usingMicrosoft.SemanticKernel.Orchestration;namespaceMySkillsDirectory;publicclassMyCSharpSkill......
  • Semantic Kernel 入门系列:
    如果把提示词也算作一种代码的话,那么语义技能所带来的将会是全新编程方式,自然语言编程。通常情况下一段prompt就可以构成一个SemanticFunction,如此这般简单,如果我们提前可以组织好一段段prompt的管理方式,甚至可以不需要写任何的代码,就可以构造出足够多的技能来。使用文件夹管......
  • Semantic Kernel 入门系列:
    理解了LLM的作用之后,如何才能构造出与LLM相结合的应用程序呢?首先我们需要把LLMAI的能力和原生代码的能力区分开来,在SemanticKernel(以下简称SK),LLM的能力称为semanticfunction,代码的能力称为nativefunction,两者平等的称之为function(功能),一组功能构成一个技能(skill)。SK的基......
  • 语义通信论文阅读(1):Beyond Transmitting Bits: Context, Semantics, and Task-Orient
    @目录引言语义信息度量知识图谱机器学习在语义通信的应用远程模型训练![在这里插入图片描述](https://img-blog.csdnimg.cn/dd937c25348649b8ac03b210baad237c.png#pic_center=360x70)《超越比特传输:上下文、语义和面向任务的通信》这是2022年10月发布在IJSAC上的一篇语义通......
  • Semantic Kernel 入门系列:
    不论你是否关心,不可否认,AGI的时代即将到来了。在这个突如其来的时代中,OpenAI的ChatGPT无疑处于浪潮之巅。而在ChatGPT背后,我们不能忽视的是LLM(LargeLanguageModel)大型语言模型。一夜之间所有的大厂商都在搞LLM,虽然很难有谁能和OpenAI相匹敌,但是随着AI领域的新摩尔定律的发功,......