Semantic Kernel 入门系列:? Planner 规划器

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

Semantic Kernel 入门系列:? Planner 规划器

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": 1024,
        "temperature": 0.0,
        "top_p": 0.9,
        "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了。

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

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

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

Planner作为一个核心组件,在0.13版本之后从Skill中提升了出来,目前(0.13版本)使用了独立的SequentialPlanner,直接创建即可使用。

var planner = new SequentialPlanner(kernel);

指定好任务目标。

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 mail@example.com";
0.13之前版本 然后就可以执行 `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 mail@example.com
</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="mail@example.com"/>
</plan>
*/

然后就可以直接使用 SequentialPlanner 创建一个Plan了。

var plan = await planner.CreatePlanAsync(goal);

此时可以使用plan.ToJson(),查看任务编排的情况。

plan.ToJson().Dump("Create Plan");
0.13之前版本

创建好了 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: mail@example.com

介绍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内容,并跟踪博客的性能。

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

0.13 版本之后,任务执行方法更加简单。
由于Plan本身就是一组 ISKFunction,所以可以直接使用 Kernel.RunAsync执行

var result = await kernel.RunAsync(plan);

和通常的Skill执行一样,查看result.Result即可得到结果。

result.Result.Dump("RESULT");

如果需要逐步执行查看结果,或者进行干预的话,也可以手动的调用执行过程。执行的状态都由Plan本身来维护,使用 HasNextStep可以查看当前所有任务是否执行完成,可以使用Plan 的 InvokeNextStepAsync 来执行下一步,也可以使用Kernel的StepAsync逐步执行。

async Task<Plan> ExecutePlanAsync(IKernel kernel, Plan plan,string input = "")
{
	while(plan.HasNextStep){
	   if(string.IsNullOrWhiteSpace(input)){
	   	await kernel.StepAsync(plan);
	   }else {
	   	await kernel.StepAsync(input,plan);
	   }
	   plan.State.Dump();
	   if(!plan.HasNextStep){
	   		break;
	   }
	}
	return plan;
}
await ExecutePlanAsync(kernel,plan);

Plan执行完成的结果,可以直接使用Plan.State.ToString() 获取。

plan.State.ToString().Dump("RESULT");
// output
/*
PowerBlog很高兴地宣布即将推出我们的最新产品,这将彻底改变人们生活的方式。我们一直在不懈努力地开发一款产品,它将对我们的客户生活产生重大影响,我们相信我们已经做到了这一点。

我们的新产品旨在成为一款改变游戏规则的产品,为用户提供独特的体验,增强他们的日常生活。我们相信,这款产品将成为任何想要提高生产力、效率和整体生活质量的人必备的产品。

我们知道人们总是在寻找简化生活的方法,而这正是我们的新产品的目的。它将帮助用户更好地管理时间,保持组织,更有效地实现他们的目标。

我们很高兴能够向我们的客户提供这款产品,我们迫不及待地想看到它对他们生活的积极影响。请继续关注我们最新产品的发布,准备体验一种新的生活方式。
*/

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

TIPS: 由于模型的能力问题,目前推荐使用GPT4模型执行以上操作。


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

  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
  4. kernel-syntax-examples/Example12_Planning

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

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

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

相关文章

  • Semantic Kernel 入门系列:?Native Function

    语义的归语义,语法的归语法。 最基本的Native Function定义只需要在方法上添加 SKFunction 的特性即可。 默认情况下只需要传递一个string 参数就行,如果需要多个参数的话,和Semantic Function一样,也是使用Context,不过这里传进去是 SKContext 。在方法上使用 SKFunctionContextParameter 声

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

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

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

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

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

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

    2023年04月15日
    浏览(42)
  • 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日
    浏览(38)
  • 体验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

领红包