揭秘Semantic Kernel:用AI自动规划和执行用户请求

news2024/11/28 10:37:48

        在我们日益高效的开发世界中,将任务自动化并智能规划变得越来越必要。今天,我要给大家介绍一个强大的概念——Semantic Kernel中的planner功能。通过这篇文章,我们会学习到planner的工作原理以及如何实现智能任务规划。

什么是planner?

        plannerSemantic Kernel中的一个函数,它能自动接收用户的请求,并回传一个完成这一请求的详尽计划。planner的神奇之处在于利用AI技术组合内核中注册的插件,将它们重新组合成一系列完成目标的步骤。

        例如,假如你有任务插件和日历事件插件,planner可以将它们结合起来创建工作流程,如在你去商店时提醒你买牛奶,或者提醒你第二天给妈妈打电话,而无需你显式编写这些场景的代码。

初始化planner

        初始化一个planner非常简单,你只需要传入一个配置对象即可。

var planner = new HandlebarsPlanner(new HandlebarsPlannerOptions() { AllowLoops = true });

创建并运行一个计划

        获得planner后,我们可以使用它为用户的请求创建一个计划,然后调用该计划并获得结果。以下代码示例要求我们的planner解决一个LLM无法独立解决的数学问题,因为它需要多个步骤并且涉及小数点。

// 创建一个计划var plan = await planner.CreatePlanAsync(kernelWithMath, problem);this._logger.LogInformation($"Plan: {plan}");
// 执行计划var result = (await plan.InvokeAsync(kernelWithMath, [])).Trim();this._logger.LogInformation($"Results: {result}");

        当我们用问题 "如果我投资了2130.23美元,增长了23%,在我花了5美元买拿铁咖啡后我将得到多少钱?" 这段代码运行后,你应该可以得到正确的答案是2615.18美元,但这是怎么实现的呢?

planners的工作原理

        planner使用LLM(大型语言模型)提示来生成计划。你可以通过浏览到Semantic Kernel仓库中的HandlebarsPlanner提示文件来查看提示内容。

理解驱动planners的提示

        提示的最后几行对理解planner的工作至关重要。它们看起来是这样的:

## 开始现在深呼吸并完成任务:1. 保持模板简短明了,尽可能高效。2. 不要编造你并未被提供的帮助函数或其他函数,特别注意不要假设或使用任何未明确定义的帮助函数或操作。3. 如果无法使用可用的帮助函数完全实现目标,请打印 "{{insufficientFunctionsErrorMessage}}"。4. 始终先确认目标中的任何重要值。然后,使用 `\{{set}}` 帮助函数为这些值创建变量。5. 模板至少使用一次 \{{json}} 帮助函数来输出最终步骤的结果。6. 不要忘记使用小技巧,否则模板不会起作用。7. 在您完成所有步骤之前不要关闭 ``` handlebars block。

        有了这些步骤,planner就能使用一组规则通过Handlebars生成计划。同时,在提示中还有所谓的“函数手册”。

{{#each functions}}### `{{doubleOpen}}{{PluginName}}{{../nameDelimiter}}{{Name}}{{doubleClose}}`Description: {{Description}}Inputs:  {{#each Parameters}}    - {{Name}}:    {{~#if ParameterType}} {{ParameterType.Name}} -    {{~else}}        {{~#if Schema}} {{getSchemaTypeName this}} -{{/if}}    {{~/if}}    {{~#if Description}} {{Description}}{{/if}}    {{~#if IsRequired}} (required){{else}} (optional){{/if}}  {{/each}}Output:{{~#if ReturnParameter}}  {{~#if ReturnParameter.ParameterType}} {{ReturnParameter.ParameterType.Name}}  {{~else}}    {{~#if ReturnParameter.Schema}} {{getSchemaReturnTypeName ReturnParameter}}    {{else}} string{{/if}}  {{~/if}}  {{~#if ReturnParameter.Description}} - {{ReturnParameter.Description}}{{/if}}{{/if}}{{/each}}

给planner提供最佳数据

        渲染提示时,你会注意到我们为函数提供的所有描述都包括在提示中。例如,对MathPlugin.Add的描述出现在提示中就是:"Add two numbers"。

[AVAILABLE FUNCTIONS]
### `{{MathPlugin-Add}}`Description: 添加两个数字 Inputs:  - number1 double - 第一个要加的数字(必需)  - number2 double - 第二个要加的数字(必需) 输出:double(双精度浮点数)Output: double
### `{{MathPlugin.Divide}}`Description: 分割两个数字Inputs:  - number1: double - 要除的第一个数字(必需)  - number2: double - 用来除的第二个数字(必需) 输出:double(双精度浮点数)Output: double

        因为这个原因,为你的函数提供尽可能最佳的描述至关重要。如果不这样做,planner可能就无法生成正确使用你的函数的计划。

        你还可以在描述中,向模型提供如何使用函数的明确指示。以下是一些你可以使用的技术,以提高planner使用你的函数的效率。

  • 提供帮助文本——函数的使用时机或方式并不总是清晰可见,因此给出建议会有所帮助。

  • 描述输出——虽然没有明确的方式告诉planner一个函数的输出是什么,但你可以在描述中描述输出。

  • 状态输入是否必需——如果一个函数需要一个输入,你可以在输入的描述中声明,以便模型知道提供输入。相反地,你可以告诉模型输入是可选的,这样它就知道必要时可以跳过输入。

查看planner产生的计划

        由于计划是以纯文本(XML或JSON)返回的,我们可以打印结果以检查planner实际创建的计划。以下是用C#打印计划的代码。

Console.WriteLine(plan);// Plugins.MathSolver: Information: Plan: {{!-- Step 1: Set the initial investment amount --}}{{set "initialInvestment" 2130.23}}// {{!-- Step 2: Calculate the increase percentage --}}{{set "increasePercentage" 0.23}}// {{!-- Step 3: Calculate the final amount after the increase --}}{{set "finalAmount" (MathPlugin-Multiply (get "initialInvestment") (MathPlugin-Add 1 (get "increasePercentage")))}}// {{!-- Step 4: Output the final amount --}}{{json (get "finalAmount")}}

        注意在示例中,planner如何将函数串联起来并传递参数。一旦Handlebars渲染了计划,最终的结果就是:2620.1829

何时使用planner?

        正如这个例子所展示的,planner是极其强大的,因为它可以自动重新组合你已经定义的函数,随着AI模型的改进和社区开发出更好的planner,你可以依靠它们来实现越来越复杂的用户场景。

        然而,在使用planner之前,你应该考虑一些事项。以下表格描述了你应考虑的主要考量因素以及你可以采取的缓解措施来减少它们的影响。

使用预定义的计划

        很可能有用户经常询问的常见场景。为了避免与planner相关联的性能开销和成本,你可以预先创建计划,并在需要时为用户提供。

        这类似于前端开发的格言:"Bake, don't fry."(烘焙,而不是油炸。)通过预先创建(即"烘焙")你的计划,你可以避免实时生成(即"油炸")它们。在创建AI应用程序时,完全不可能不做"油炸",但你可以减少依赖它,以便使用更健康的替代方法。

        为此,你可以离线为常见场景生成计划,并将它们以XML形式存储在你的项目中。根据用户的意图,你然后可以返回计划以执行。通过"烘焙"你的计划,你还有机会创建额外的优化以提高速度或降低成本。

        planner作为Semantic Kernel的一部分,为我们展示了AI和编程相结合所能达到的高度。它不仅提升了开发效率,也为我们的创新赋予了无限可能。学习并合理利用planner将会是一个改变游戏规则的工具,它能帮助我们解放思维,将复杂任务转化为可实现的目标。现在,你也可以尝试使用planner,发挥它的强大能力来解决你的问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2062533.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vue3项目中无法实现cpolar内网穿透解决方案

运行vue3,打开cpolar启动内网穿透,结果却发现 在vue.config.js中修改为如下代码: const { defineConfig } require(vue/cli-service);module.exports defineConfig({transpileDependencies: true,devServer: {allowedHosts: all,host: 0.0…

day06-MySQL学习笔记01

2024.08.17 day06-MySQL学习笔记 前言 前面说过,三层架构,其中dao层用于操作数据。在上面的项目中,数据放在了xml文件中。在企业开发中,数据一般存储在数据库中,我们直接对数据库操作。今天就学习如何操作数据库。 首…

赛氪网技术支持第八届集创赛全国总决赛:共绘集成电路创新蓝图

赛氪网技术支持第八届集创赛全国总决赛:共绘集成电路创新蓝图 山东,2024年8月19日至21日 —— 全国瞩目的第八届全国大学生集成电路创新创业大赛(以下简称“集创赛”)全国总决赛在美丽的海滨城市山东省烟台市隆重举行。本次大赛由…

架桥机液压站比例阀放大器

架桥机液压站是专为公路桥梁建设而设计的一种重要设备,它通过先进的液压系统来实现桥梁的快速、安全架设。液压系统包括三套独立的子系统,分别服务于1号柱、2号柱以及0号柱和3号柱。每套系统均由液压泵站、液压缸、比例电磁控制阀等核心部件构成。液压泵…

IaaS,PaaS,aPaaS,SaaS,FaaS,如何区分?

​IaaS, PaaS,SaaS,aPaaS 还有一种 FaaS ,这几个都是云服务中常见的 5 大类型: IaaS:基础架构即服务,Infrastructure as a Service PaaS:平台即服务,Platform as a Service aPaaS&…

Linux_rwx权限,修改权限,修改所有者和所在组

目录 权限的基本介绍 rwx作用到文件 rwx作用到目录 权限说明案例 修改权限 修改文件所有者-chown 修改文件/目录所在组-chgrp 权限的基本介绍 第0位是文件类型,然后是所有者的权限,所属组的权限,其他用户的权限。 -代表它是一个普通…

使用VS Code开发.NET 8 环境搭建

1. sdk环境确认 -- 查看.net 版本 PS C:\Users\a> dotnet --version 8.0.303 -- 查看已安装的.net sdk 列表 PS C:\Users\a> dotnet --list-sdks 3.0.100 [C:\Program Files\dotnet\sdk] 5.0.301 [C:\Program Files\dotnet\sdk] 6.0.417 [C:\Program Files\dotnet\sdk] …

cadence617版本,如何做一个参数可调的反相器

🏆本文收录于《CSDN问答解惑-专业版》专栏,主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收…

Linux VSFTP 部署与配置

一、VSFTP 简介与应用 VSFTP(Very Secure FTP Daemon)是一款功能强大、安全可靠的FTP服务器软件,广泛应用于Linux/Unix系统中。它提供了高效的文件传输服务,并具备诸多安全特性,如用户认证、权限控制、SSL/TLS加密等。…

AI大模型太TM牛逼了!

如果你问:2024年,程序员必须掌握哪项技术?AI一定是榜首! 从去年起,AI大模型已是程序员的必备工具——‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍ 编程提效: 编写更快,程序更稳定;代码更优&am…

【全开源】php在线客服系统源码 (搭建教程+全新UI)

PHP在线客服系统是一种基于PHP编程语言开发的在线客服系统,它可以为网站提供实时的在线客服支持,方便用户与客服人员进行即时的沟通和交流。作为一种开源的系统,它的源码可以供开发者进行二次开发和定制,以满足不同网站的需求。 …

老古董Lisp实用主义入门教程(5):好奇先生用Lisp探索Lisp

鲁莽先生什么都不管 鲁莽先生打开电脑,安装一堆东西,噼里啪啦敲了一堆代码,叽里呱啦说了一堆话,然后累了就回家睡觉了。 这可把好奇先生的兴趣勾起来,他怎么也睡不着。好奇先生打开电脑,看了看鲁莽先生留…

Figma 替代品 Penpot 安装和使用教程

在设计领域,Figma 无疑是一个巨人。它彻底改变了设计流程,将协作带到了一个全新的高度。然而,随着 Adobe 收购 Figma 的消息传出,许多设计师和开发者开始担心:Figma 未来会如何演变?那些好用的特性会不会被…

【python】深入探讨python中的抽象类,创建、实现方法以及应用实战

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,…

【SpringBoot】11 多数据源(MyBatis:dynamic-datasource)

介绍 多数据源:指的是一个单一应用程序中涉及了两个及以上的数据库,这种配置允许应用程序根据业务需求灵活地管理和操作不同的数据库。 需求 一个应用服务中,连接多个数据库,有本地的也有远程的,有MysQL、Oracle、P…

代码随想录算法训练营day51:图论02:99. 岛屿数量;100. 岛屿的最大面积

99. 岛屿数量 卡码网题目链接(ACM模式)(opens new window) 题目描述: 给定一个由 1(陆地)和 0(水)组成的矩阵,你需要计算岛屿的数量。岛屿由水平方向或垂直方向上相邻的陆地连接而…

PHP农场扶农系统智慧认养智慧乡村系统农场系统小程序源码

🌱科技赋能田园梦 —— 探索“农场扶农系统”与“智慧认养智慧乡村”新篇章🚀 🌈【开篇:田园新风尚,科技引领未来】 在快节奏的都市生活中,你是否曾梦想过拥有一片属于自己的绿色天地?现在&am…

大一新生看过来,【入学证件照】这样拍才可以千万不要拍错了

大一新生在拍摄证件照时,确实需要注意一些关键点,以确保照片符合规定并能成功使用。‌不会的可以多看看我首页说明,VX小城续:桃子证件照,帮你搞定大学四年所以的照片可以打印邮寄 首先,重要的是要注意以下几…

通信总线-串口/IIC/SPI

基本概念 1.串行:只有一个数据线,bit(位)一个一个传输(本质传输的是电信号,高低电平代表0或1) 更常用(UART,IIC,SPI) 2.并行:多个…

企业文件防泄密怎么做?10款透明加密软件排行榜

在信息时代,企业的核心竞争力往往体现在其拥有的知识和信息上,而企业文件的安全性直接关系到这些信息的保护。文件防泄密已成为企业管理中的重要议题,透明加密技术因其无缝集成和高效保护的特性,成为企业防泄密的首选方案。2024年…