Semantic Kernel:SK中的Function

news/2025/3/4 2:02:14/文章来源:https://www.cnblogs.com/axzxs2001/p/18746068

  Semantic Kernel中的Functions被设计为可被动态调用的“插件”,用于处理某些特定的操作。例如,一个Function可以是用于获取天气信息的API请求,或者是用于计算复杂数学表达式的函数。

  在SK中,Functions通常分为以下两种类型:本地函数和语义函数。

Native Functions(本地函数):

  这些是直接用编程语言(如Python、C#等)编写的代码函数,可以执行任意的编程逻辑。开发者可以将本地函数注册到Semantic Kernel中,使其成为LLM可以调用的操作。例如,取当前UTC时间。

var timer = new Timer();
var nativeFunction = kernel.CreateFunctionFromMethod(typeof(Timer).GetMethod("GetCurrentTime"), target: timer);
var result = await nativeFunction.InvokeAsync(kernel);
var time = result.GetValue<DateTime>();
Console.WriteLine("当前UTC时间:{0}", time);
class Timer
{[KernelFunction]public DateTime GetCurrentTime(){return DateTime.UtcNow;}
}

Semantic Functions(语义函数):

  这些是由自然语言描述的函数,通常由大语言模型(LLM)来执行。例如,一个语义函数可以是“给出一个国家(参数)前五大城市”。Semantic Kernel使用LLM来解释和执行这些语义函数。

using System.Text.Json;
using System.Text;
using System.Threading;
using System.Collections.Generic;
using Microsoft.SemanticKernel;
using Microsoft.SemanticKernel.Connectors.OpenAI;
using System.ComponentModel;
using System.Globalization;var chatModelId = "gpt-4o";
var key = File.ReadAllText(@"C:\GPT\key.txt");var kernel = Kernel.CreateBuilder().AddOpenAIChatCompletion(chatModelId, key).Build();var promptFunctionDescribe = "请给出{{$parameter}}的前五大城市的人口数量和经济规模";
var promptFunction = kernel.CreateFunctionFromPrompt(promptFunctionDescribe);
var result = await kernel.InvokeAsync(promptFunction, new() { ["parameter"] = "日本" });
Console.WriteLine(result.GetValue<string>());
Console.WriteLine(JsonSerializer.Serialize(result.Metadata?["Usage"]));

混合函数:

  更多的时候,可以把本地函数和语义函数混合起来做用,下面例子就是把本地函数以插件形式注册到Kernel的插件类型集合中,这样就可以在普通的本地函数中调用语义函数了。下面例子是先中数据查询出数据,然后再用语义函数来总结。

kernel.ImportPluginFromType<DataBase>();
var salesAnalysisFunctions = kernel.ImportPluginFromType<SalesAnalysis>();
var result = await kernel.InvokeAsync<string>(salesAnalysisFunctions["Analysis"]);
Console.WriteLine(result);class SalesAnalysis
{[KernelFunction]public async Task<string?> AnalysisAsync(Kernel kernel){var data = await kernel.InvokeAsync<string>(nameof(DataBase), "GetSalesData", arguments: new() { ["month"] = "July" });Console.WriteLine("查询数据如下:\r\n{0}", data);Console.WriteLine("分析中……");var result = await kernel.InvokePromptAsync("请根据下面的json数据,综合每个人的销售总额和件数,以及它们的关系,给出销售能力评价。要求:不需要给出分析过程,只用以控制台表格形式给出分析结果,评价用中文书写。数据:{{$data}}", new() { ["data"] = data });return result.GetValue<string>();}
}
public class DataBase
{List<SalesRecord> salesData = new List<SalesRecord>{// Alice's sales datanew SalesRecord("Alice", "January", 50, 1000.50m),new SalesRecord("Alice", "February", 45, 950.75m),new SalesRecord("Alice", "March", 60, 1200.30m),new SalesRecord("Alice", "April", 55, 1100.40m),new SalesRecord("Alice", "May", 70, 1500.80m),new SalesRecord("Alice", "June", 65, 1300.00m),new SalesRecord("Alice", "July", 75, 1550.25m),new SalesRecord("Alice", "August", 80, 1600.00m),new SalesRecord("Alice", "September", 85, 1700.75m),new SalesRecord("Alice", "October", 90, 1800.90m),new SalesRecord("Alice", "November", 95, 1900.60m),new SalesRecord("Alice", "December", 100, 2000.00m),// Bob's sales datanew SalesRecord("Bob", "January", 30, 600.00m),new SalesRecord("Bob", "February", 35, 700.50m),new SalesRecord("Bob", "March", 40, 800.25m),new SalesRecord("Bob", "April", 32, 640.75m),new SalesRecord("Bob", "May", 38, 760.00m),new SalesRecord("Bob", "June", 42, 820.60m),new SalesRecord("Bob", "July", 47, 940.90m),new SalesRecord("Bob", "August", 50, 1000.00m),new SalesRecord("Bob", "September", 55, 1100.30m),new SalesRecord("Bob", "October", 60, 1200.50m),new SalesRecord("Bob", "November", 65, 1300.75m),new SalesRecord("Bob", "December", 70, 1400.00m),// Charlie's sales datanew SalesRecord("Charlie", "January", 25, 500.00m),new SalesRecord("Charlie", "February", 28, 560.00m),new SalesRecord("Charlie", "March", 35, 700.00m),new SalesRecord("Charlie", "April", 30, 600.00m),new SalesRecord("Charlie", "May", 40, 800.00m),new SalesRecord("Charlie", "June", 45, 900.00m),new SalesRecord("Charlie", "July", 50, 5000.00m),new SalesRecord("Charlie", "August", 55, 1100.00m),new SalesRecord("Charlie", "September", 60, 1200.00m),new SalesRecord("Charlie", "October", 65, 1300.00m),new SalesRecord("Charlie", "November", 70, 1400.00m),new SalesRecord("Charlie", "December", 75, 1500.00m),// Diana's sales datanew SalesRecord("Diana", "January", 40, 800.00m),new SalesRecord("Diana", "February", 42, 840.00m),new SalesRecord("Diana", "March", 45, 900.00m),new SalesRecord("Diana", "April", 50, 1000.00m),new SalesRecord("Diana", "May", 55, 1100.00m),new SalesRecord("Diana", "June", 60, 1200.00m),new SalesRecord("Diana", "July", 65, 1300.00m),new SalesRecord("Diana", "August", 70, 1400.00m),new SalesRecord("Diana", "September", 75, 1500.00m),new SalesRecord("Diana", "October", 80, 1600.00m),new SalesRecord("Diana", "November", 85, 1700.00m),new SalesRecord("Diana", "December", 90, 1800.00m),// Ethan's sales datanew SalesRecord("Ethan", "January", 15, 300.00m),new SalesRecord("Ethan", "February", 18, 360.00m),new SalesRecord("Ethan", "March", 20, 400.00m),new SalesRecord("Ethan", "April", 25, 500.00m),new SalesRecord("Ethan", "May", 30, 600.00m),new SalesRecord("Ethan", "June", 35, 700.00m),new SalesRecord("Ethan", "July", 40, 800.00m),new SalesRecord("Ethan", "August", 45, 900.00m),new SalesRecord("Ethan", "September", 50, 1000.00m),new SalesRecord("Ethan", "October", 55, 1100.00m),new SalesRecord("Ethan", "November", 60, 1200.00m),new SalesRecord("Ethan", "December", 65, 1300.00m)};[KernelFunction]public async Task<string> GetSalesDataAsync(string month){var salesRecords = salesData.Where(s => s.Month == month);if (salesRecords == null){return "No sales data found for the specified name and month.";}return JsonSerializer.Serialize(salesRecords);}public class SalesRecord{public string Name { get; set; }public string Month { get; set; }public int Quantity { get; set; }public decimal Amount { get; set; }public SalesRecord(string name, string month, int quantity, decimal amount){Name = name;Month = month;Quantity = quantity;Amount = amount;}}
}

最终结果如下:

   其实用FuncationCalling更优雅,后续文章介绍……

  文章来源微信公众号

  想要更快更方便的了解相关知识,可以关注微信公众号 

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

寻觅Notepad2e

起因 这天,正当我兴致勃勃地编写新的博客时,想要打开windows的notepad,结果居然发现有个奇怪的东西,还占在最优匹配上,还好我看了一眼名字没有回车直接打开 我倒要看看是哪个国产流氓软件(注:刻板印象)给我偷偷装上的新notepad。哦,原来是TortoiseGit啊,误会国产软件…

【Flutter】 Getx动态路由管理方案

根组件配置应用入口配置:使用 GetMaterialApp 作为应用的根组件,它是 MaterialApp 的增强版本,提供了路由管理等额外功能。初始路由设置:通过 initialRoute 参数指定了应用启动时加载的初始页面为 Routes.homePage,这通常是一个字符串常量,定义在 routes.dart 文件中。路…

《数据结构(C语言版)(第3版)》勘误

第142页,如图,“i+1(1≤i≤p)为所指结点的度”,这句话看不懂。p是个指针,i是个序号,怎么它们还有数量大小关系呢? 我认为这里有误,实际上应该是:对于InsertChild:i必须满足1≤i≤p所指结点的度+1。 对于DeleteChild:i必须满足1≤i≤p所指结点的度。即“p所指结点的度…

2019-PTA模拟赛-L1-1 帅到没朋友

L1-1输入样例1: 3 3 11111 22222 55555 2 33333 44444 4 55555 66666 99999 77777 8 55555 44444 10000 88888 22222 11111 23333 88888输出样例1: 10000 88888 23333输入样例2: 3 3 11111 22222 55555 2 33333 44444 4 55555 66666 99999 77777 4 55555 44444 22222 11111输…

.NET9让指标更纯正

Metrics为程序健康运行提供了保驾护航,但过多的指标又会为问题调查,大屏展示,以及基础日志存储带来更多的负担,特别对一些几乎没有意义的指示,比如健康检查的请求指标。.NET 9 引入了一个新功能,允许在某些端点和请求上选择不采集HTTP 指标记录。你可以通过以下方法排除某…

Semantic Kernel:文转图

SK也对应了文生图的功能,本文中分别使用的是GPT的DALLE 2和DALLE 3来生成图版,虽然不如专业的文生图那么专业,但提示词到位,在一些场景中还是可用的。项目引用的是当前最新的SK包,1.18.0-rc:<Project Sdk="Microsoft.NET.Sdk"><PropertyGroup><…

Semantic Kernel:图识文

多模态是每个LLM具有的能力,图片又是最常见的信息载体,GPT对图片的识别也很早就有了,随着GPT版本的迭代,效果越来越好。SK也是在很多就适配了图识文,只不过最近版本才支持本地图片的上传。(有点晚) 图片场景识别:using Microsoft.SemanticKernel.ChatCompletion; using…

002.Gitlab基础使用

gitlab基础使用 设置语言 gitlab社区版同样支持直接配置为简体中文,可能适配率暂不支持100% 。 点击头像,Preferences——>Preferences——>Localization 。 Language设置为简体中文,save changes。 使用介绍 gitlab的基础应用主要包括项目创建、组管理、issue等功能。…

【PHP安全】无参数命令执行学习

免责声明: 由于传播、利用本公众号所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,作者不为此承担任何责任,一旦造成后果请自行承担!如有侵权烦请告知,我们会立即删除并致歉。谢谢!文章作者:先知社区(Atkx) 文章来源:https://xz.aliyun.com/ne…

分享4款.NET开源、免费、实用的商城系统

前言 今天大姚给大家分享4款.NET开源、免费、实用的商城系统,希望可以帮助到有商城系统开发需求的同学。 nopCommerce nopCommerce是一个.NET开源功能丰富、免费、灵活且可定制的开源电子商务解决方案(大家假如有商城需求可以直接使用该项目进行二次开发,省时省力) ,具备商城…

总结:单调栈

\(\texttt{单调栈}\) \(\texttt{单调栈学习笔记}\) 今天学习的是 数据结构:单调栈。 (n 久之前了……) \(\texttt{数据结构讲解}\) \(\texttt{单调栈的类型}\)单调递增栈单调递减栈单调递增栈:指的是一个栈中的元素都是单调递增的。 单调递减栈:指的是一个栈中的元素都是单…

基于ThreeJs的大屏3D地图(二)——气泡图、渐变柱体与热力图

前提 上一篇文章中我们完成了地图区块模型的渲染,在此基础之上本篇来讲解气泡图、3D柱形图以及3D热力图的实现方式。 首先,为了更好的关注点分离及与地图渲染模块的解耦,我们可以把所有类型的可视化元素抽象出一个图层基类BaseLayer: /*** 图层基类*/ abstract class BaseL…