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

image

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

目标导向

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

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

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

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

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

做好插件准备

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

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

需要注意的就是 descriptioninput 参数,最终会成为的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中,等待后续使用。

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

  1. MyPlugin.WriteText : 文案写作
  2. MyPlugin.Translate : 文本翻译
  3. 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模型执行以上操作。


参考资料:

  1. Automatically orchestrate AI with planners
  2. Example65_HandlebarsPlanner.cs
posted @ 2023-04-16 20:43  宵伯特  阅读(1718)  评论(2编辑  收藏  举报