Semantic Kernel 入门系列:📅 Planner 规划器
Semantic Kernel 的一个核心能力就是实现“目标导向”的AI应用。
目标导向
“目标导向”听起来是一个比较高大的词,但是却是实际生活中我们处理问题的基本方法和原则。
顾名思义,这种方法的核心就是先确定目标,然后再寻找实现目标的方法和步骤。这对于人来说的是很自然的事情,但是对于机器则不然。一大堆的指令和控制逻辑其实都是在完成另外一种产出导向的结果。所有的流程和过程都需要提前预定义好,然后期待一个结果的产出。
如今,借助 LLM AI 的力量,我们可以轻松的实现目标导向的过程。
在 Semantic Kernel中,Planner就用于这项工作。
我们可以提前准备好所需的Plugin,根据设定好的最终目标,通过Planner,可以将目标分解为需要执行的任务列表,并且可以指定好对应的参数传递,然后逐个任务执行,从而实现最终目标。
做好插件准备
为了让LLM AI更好的理解我们所提供的插件,需要明确地配置好每个插件本身的描述和参数描述。
对于的Semantic Function来说,可以在config.json中配置。以下是一个Translate的配置。
需要注意的就是 description
和 input
参数,最终会成为的LLM是否选择使用的判断标准。而这一切都是基于语义化的理解。
{
"schema": 1,
"description": "Translate the input into the specified language",
"execution_settings": {
"default": {
"max_tokens": 1024,
"temperature": 0.0,
"top_p": 0.9,
"presence_penalty": 0.0,
"frequency_penalty": 0.0
}
},
"input_variables": [
{
"name": "input",
"description": "input text",
"defaultValue": ""
},
{
"name":"language",
"description":"the specified language",
"defaultValue":"English"
}
]
}
对于Native Function ,可以使用特性进行声明,对于 KernelFunction
需要使用Description
特性添加Function的描述, Description
同样可以用于添加参数的说明。
public class EmailPlugin {
[KernelFunction]
[Description("Send email content to receiver")]
public void SendTo([Description("email content")]string content,
[Description("the email address of receiver")]string receiver)
{
Console.WriteLine(
$"""
mail to: {receiver}
{content}
""");
}
}
准备好插件之后,就可以将这些插件导入到Kernel中,等待后续使用。
作为示例,这里导入了三个功能:
MyPlugin.WriteText
: 文案写作MyPlugin.Translate
: 文本翻译email.SendTo
: 邮件发送
使用Planner
然后我们就可以开始使用 Planner了。
Planner作为一个核心组件,提供了几种不同的实现。目前(1.*版本)最推荐的是HandleBarsPlanner。
使用HandleBarsPlanner的时候,需要提前安装Nuget包 Microsoft.SemanticKernel.Planners.Handlebars
,然后创建一个planner实例。
var planner = new HandlebarsPlanner();
指定好任务目标。
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";
然后就可以使用Planner创建一个Plan了。
var plan = await planner.CreatePlanAsync(kernel,goal);
此时可以使用plan.ToString()
查看当前的任务编排。
plan.ToString().Dump();
/*
{{!-- Step 0: Define relevant information for the press release and email address --}}
{{set "productReleaseInfo" "PowerBlog 发布了一款新产品,这标志着我们公司在产品创新和科技进步上迈出了重要一步。我们的新产品旨在为用户提供更加便捷的解决方案,以满足他们不断变化的需求。"}}
{{set "language" "zh"}}
{{set "emailReceiver" "mail@example.com"}}
{{!-- Step 1: Write the press release in Chinese using the custom helper --}}
{{set "pressReleaseChinese" (MyPlugin-WriteText input=productReleaseInfo)}}
{{!-- Step 2: Translate the press release into Chinese --}}
{{set "translatedPressRelease" (MyPlugin-Translate language=language input=pressReleaseChinese)}}
{{!-- Step 3: Send the translated press release to the provided email address --}}
{{email-SendTo content=translatedPressRelease receiver=emailReceiver}}
*/
由于是HandleBars引擎支持的模板,所以生成的任务流程也是handlebars模式的,方便后续解析和执行。
plan直接进行执行的话,会自动执行所有的任务,
var result = await plan.InvokeAsync(kernel);
result.Dump();
/*
mail to: mail@example.com
PowerBlog激动地宣布我们最新的突破 —— 一款创新级产品,它的问世标志着公司在产品创新和科技进步领域取得了重要的进展。这一里程碑式的成就代表了我们对未来科技的持续探索和承诺,该产品专为满足您日益变化的需求而设计。
随着世界的加速变化,我们认识到这样一个不争的事实:解决方案也需要快速适应其演变。因此,我们努力洞悉并预见客户的需求,推出了这款全新产品。它不仅提供了更简单、更直观的用户体验,还能以高效灵活的方式全面满足您的需求。
这款产品的核心在于易用性和智能。我们整合了最先进的技术,确保每位用户都能轻松体验到它的强大功能,无论您面临什么样的挑战,它都将是您身边的强大助手。PowerBlog正是凭借这款创新性产品,领您进入一个全新且高效的世界。
立即体验PowerBlog的全新力作,和我们一起迎接更加便捷的未来。因为在PowerBlog,我们相信最佳的产品应该能带您领略最迷人的未来。
*/
至此,我们就掌握了Semantic Kernel 当前所有的核心概念和基本使用方法。
TIPS: 由于模型的能力问题,目前推荐使用GPT4模型执行以上操作。
参考资料: