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

2024-08-22 13:20

本文主要是介绍揭秘Semantic Kernel:用AI自动规划和执行用户请求,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

        在我们日益高效的开发世界中,将任务自动化并智能规划变得越来越必要。今天,我要给大家介绍一个强大的概念——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,发挥它的强大能力来解决你的问题。

这篇关于揭秘Semantic Kernel:用AI自动规划和执行用户请求的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1096384

相关文章

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

AI绘图怎么变现?想做点副业的小白必看!

在科技飞速发展的今天,AI绘图作为一种新兴技术,不仅改变了艺术创作的方式,也为创作者提供了多种变现途径。本文将详细探讨几种常见的AI绘图变现方式,帮助创作者更好地利用这一技术实现经济收益。 更多实操教程和AI绘画工具,可以扫描下方,免费获取 定制服务:个性化的创意商机 个性化定制 AI绘图技术能够根据用户需求生成个性化的头像、壁纸、插画等作品。例如,姓氏头像在电商平台上非常受欢迎,

大模型研发全揭秘:客服工单数据标注的完整攻略

在人工智能(AI)领域,数据标注是模型训练过程中至关重要的一步。无论你是新手还是有经验的从业者,掌握数据标注的技术细节和常见问题的解决方案都能为你的AI项目增添不少价值。在电信运营商的客服系统中,工单数据是客户问题和解决方案的重要记录。通过对这些工单数据进行有效标注,不仅能够帮助提升客服自动化系统的智能化水平,还能优化客户服务流程,提高客户满意度。本文将详细介绍如何在电信运营商客服工单的背景下进行

从去中心化到智能化:Web3如何与AI共同塑造数字生态

在数字时代的演进中,Web3和人工智能(AI)正成为塑造未来互联网的两大核心力量。Web3的去中心化理念与AI的智能化技术,正相互交织,共同推动数字生态的变革。本文将探讨Web3与AI的融合如何改变数字世界,并展望这一新兴组合如何重塑我们的在线体验。 Web3的去中心化愿景 Web3代表了互联网的第三代发展,它基于去中心化的区块链技术,旨在创建一个开放、透明且用户主导的数字生态。不同于传统

AI一键生成 PPT

AI一键生成 PPT 操作步骤 作为一名打工人,是不是经常需要制作各种PPT来分享我的生活和想法。但是,你们知道,有时候灵感来了,时间却不够用了!😩直到我发现了Kimi AI——一个能够自动生成PPT的神奇助手!🌟 什么是Kimi? 一款月之暗面科技有限公司开发的AI办公工具,帮助用户快速生成高质量的演示文稿。 无论你是职场人士、学生还是教师,Kimi都能够为你的办公文

Andrej Karpathy最新采访:认知核心模型10亿参数就够了,AI会打破教育不公的僵局

夕小瑶科技说 原创  作者 | 海野 AI圈子的红人,AI大神Andrej Karpathy,曾是OpenAI联合创始人之一,特斯拉AI总监。上一次的动态是官宣创办一家名为 Eureka Labs 的人工智能+教育公司 ,宣布将长期致力于AI原生教育。 近日,Andrej Karpathy接受了No Priors(投资博客)的采访,与硅谷知名投资人 Sara Guo 和 Elad G

揭秘世界上那些同时横跨两大洲的国家

我们在《世界人口过亿的一级行政区分布》盘点全球是那些人口过亿的一级行政区。 现在我们介绍五个横跨两州的国家,并整理七大洲和这些国家的KML矢量数据分析分享给大家,如果你需要这些数据,请在文末查看领取方式。 世界上横跨两大洲的国家 地球被分为七个大洲分别是亚洲、欧洲、北美洲、南美洲、非洲、大洋洲和南极洲。 七大洲示意图 其中,南极洲是无人居住的大陆,而其他六个大洲则孕育了众多国家和

三国地理揭秘:为何北伐之路如此艰难,为何诸葛亮无法攻克陇右小城?

俗话说:天时不如地利,不是随便说说,诸葛亮六出祁山,连关中陇右的几座小城都攻不下来,行军山高路险,无法携带和建造攻城器械,是最难的,所以在汉中,无论从哪一方进攻,防守方都是一夫当关,万夫莫开;再加上千里运粮,根本不需要打,司马懿只需要坚守城池拼消耗就能不战而屈人之兵。 另一边,洛阳的虎牢关,一旦突破,洛阳就无险可守,这样的进军路线,才是顺势而为的用兵之道。 读历史的时候我们常常看到某一方势

动态规划---打家劫舍

题目: 你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。 给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。 思路: 动态规划五部曲: 1.确定dp数组及含义 dp数组是一维数组,dp[i]代表

AI hospital 论文Idea

一、Benchmarking Large Language Models on Communicative Medical Coaching: A Dataset and a Novel System论文地址含代码 大多数现有模型和工具主要迎合以患者为中心的服务。这项工作深入探讨了LLMs在提高医疗专业人员的沟通能力。目标是构建一个模拟实践环境,人类医生(即医学学习者)可以在其中与患者代理进行医学