深入Semantic Kernel:插件开发与实践应用(进阶篇)

文章目录

    • 一、引言
    • 二、开发Semantic Kernel插件
    • 三、实战
      • 3.1 时间信息插件
      • 3.2 小部件工厂插件
      • 3.3 初始化Semantic Kernel实例
      • 3.4 四个实战示例
        • 3.4.1 模型幻觉
        • 3.4.2 给模型提供时间信息
        • 3.4.3 AI自动调用函数
        • 3.4.4 AI自动调用和使用枚举
    • 四、结论

一、引言

在上一篇入门文章《探索Semantic Kernel:开启AI编程新篇章》中,我们了解了Semantic Kernel的基础知识,包括如何创建内核实例、配置AI模型以及执行基本的AI任务。本文将作为进阶篇,重点介绍如何开发Semantic Kernel插件,并在实际应用中调用这些插件。
在这里插入图片描述

二、开发Semantic Kernel插件

Semantic Kernel插件是扩展AI模型功能的模块,它们可以封装特定领域的知识和功能,使得AI模型能够执行更复杂的任务。在本教程中,我们将开发两个插件:TimeInformation和WidgetFactory。

三、实战

3.1 时间信息插件

TimeInformation插件提供了一个函数,用于获取当前的UTC时间。

/// <summary>
/// 返回当前时间的插件
/// </summary>
public class TimeInformation
{
    [KernelFunction]
    [Description("获取当前UTC时间")]
    public string GetCurrentUtcTime() => DateTime.UtcNow.ToString("R");
}

3.2 小部件工厂插件

WidgetFactory插件提供了一个函数,用于根据指定的类型和颜色创建小部件。

/// <summary>
/// 创建部件的插件
/// </summary>
public class WidgetFactory
{
    [KernelFunction]
    [Description("创建指定类型和颜色的部件")]
    public WidgetDetails CreateWidget([Description("要创建的小部件的类型")] WidgetType widgetType, [Description("要创建的小部件颜色")] WidgetColor[] widgetColors)
    {
        var colors = string.Join('-', widgetColors.Select(c => c.GetDisplayName()).ToArray());
        return new()
        {
            SerialNumber = $"{widgetType}-{colors}-{Guid.NewGuid()}",
            Type = widgetType,
            Colors = widgetColors
        };
    }
}

为了使插件能够处理不同的小部件类型和颜色,我们定义了两个枚举类型:WidgetType和WidgetColor。

WidgetDetails类用于存储小部件的详细信息,包括序列号、类型和颜色。

[JsonConverter(typeof(JsonStringEnumConverter))]
public enum WidgetType
{
    [Description("有用的小部件。")]
    Useful,

    [Description("装饰性的小部件。")]
    Decorative
}

[JsonConverter(typeof(JsonStringEnumConverter))]
public enum WidgetColor
{
    [Description("创建红色物品时使用")]
    Red,

    [Description("创建绿色物品时使用")]
    Green,

    [Description("创建蓝色物品时使用")]
    Blue
}

public class WidgetDetails
{
    public string SerialNumber { get; init; }
    public WidgetType Type { get; init; }
    public WidgetColor[] Colors { get; init; }
}
/// <summary>
/// 枚举扩展方法
/// </summary>
public static class EnumExtensions
{
    private static readonly ConcurrentDictionary<Enum, string> DisplayNameCache = new ConcurrentDictionary<Enum, string>();

    /// <summary>
    /// 获取枚举字段值的属性。
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="enumValue"></param>
    /// <returns></returns>
    [UnconditionalSuppressMessage("Trimming", "IL2075", Justification = "Fields are never trimmed for enum types.")]
    public static T GetAttributeOfType<T>(this Enum enumValue) where T : Attribute
    {
        FieldInfo field = enumValue.GetType().GetField(enumValue.ToString(), BindingFlags.Static | BindingFlags.Public);
        if (field == null)
        {
            return null;
        }

        return field.GetCustomAttributes<T>(inherit: false).FirstOrDefault();
    }

    /// <summary>
    /// 获取enum的显示名称
    /// </summary>
    /// <param name="enumValue"></param>
    /// <returns></returns>
    public static string GetDisplayName(this Enum enumValue)
    {
        return DisplayNameCache.GetOrAdd(enumValue, delegate (Enum e)
        {
            DisplayAttribute attributeOfType = e.GetAttributeOfType<DisplayAttribute>();
            return (attributeOfType != null) ? attributeOfType.Name : e.ToString();
        });
    }
}

3.3 初始化Semantic Kernel实例

#pragma warning disable SKEXP0001, SKEXP0010, SKEXP0050, SKEXP0020, ASP0000
//使用的模型
string model = "gpt-4o-mini";
//使用的openai代理地址,这里也可以使用国产模型和地址。只要是openai格式即可
string endpointKey = "https://xie.openai.com/v1";
//openai 密钥
string apiKey = "sk-";
            // 创建一个带有OpenAI聊天完成的内核
            IKernelBuilder kernelBuilder = Kernel.CreateBuilder();
            kernelBuilder.AddOpenAIChatCompletion(
                    modelId: model,
                    endpoint: new Uri(endpointKey),
                    apiKey: apiKey);
            //添加打印时间信息插件
            kernelBuilder.Plugins.AddFromType<TimeInformation>();

            //添加构建颜色、类型部件插件
            kernelBuilder.Plugins.AddFromType<WidgetFactory>();
            Kernel kernel = kernelBuilder.Build();

3.4 四个实战示例

3.4.1 模型幻觉
//示例1:用一个提示来调用内核,该提示要求AI提供它无法提供的信息,并可能产生幻觉
Console.WriteLine("------------------------示例1 模型无法提供的实时信息-------------------------------");
Console.WriteLine(await kernel.InvokePromptAsync("离圣诞节还有几天?"));
Console.WriteLine();

在这里插入图片描述

3.4.2 给模型提供时间信息
//示例2:使用模板提示调用内核,该提示调用插件并显示结果
Console.WriteLine("------------------------示例2 使用插件结合问题,给模型提供时间信息--------------------------------");
Console.WriteLine(await kernel.InvokePromptAsync("当前时间为: {{TimeInformation.GetCurrentUtcTime}}。 离圣诞节还有几天?"));
Console.WriteLine();

在这里插入图片描述

3.4.3 AI自动调用函数
//示例3:使用提示符调用内核,并允许AI自动调用函数
#pragma warning disable SKEXP0001 // 类型仅用于评估,在将来的更新中可能会被更改或删除。取消此诊断以继续。
            OpenAIPromptExecutionSettings settings = new() { FunctionChoiceBehavior = FunctionChoiceBehavior.Auto() };
#pragma warning restore SKEXP0001 // 类型仅用于评估,在将来的更新中可能会被更改或删除。取消此诊断以继续。
            Console.WriteLine("------------------------示例3 模型自动评估是否调用函数获取时间--------------------------------");
            Console.WriteLine(await kernel.InvokePromptAsync("离圣诞节还有几天?解释你的想法。", new(settings)));
            Console.WriteLine();

在这里插入图片描述

3.4.4 AI自动调用和使用枚举
//示例4:用提示符调用内核,并允许AI自动调用使用枚举的函数
Console.WriteLine("------------------------示例4 模型自动调用函数生成对应颜色组件- -----------------------------");
Console.WriteLine("--------------------示例4.1红色----------------------------");
//因枚举中有红色,AI自动识别并创建红色组件
Console.WriteLine(await kernel.InvokePromptAsync("为我创建一个红色小部件。", new(settings)));
Console.WriteLine();

 Console.WriteLine("--------------------示例4.2浅绿色----------------------------");
 //因枚举中有绿色,AI自动识别并创建绿色组件
 Console.WriteLine(await kernel.InvokePromptAsync("为我创建一个浅绿色小部件。", new(settings)));
 Console.WriteLine();

 Console.WriteLine("--------------------示例4.3蓝色----------------------------");
 //因枚举中有蓝色,AI自动识别并创建蓝色组件
 Console.WriteLine(await kernel.InvokePromptAsync("为我创建一个蓝色小部件。", new(settings)));
 Console.WriteLine();
 // 因枚举中没有紫色,AI会告知用户只能在系统提供的三种颜色中选取
 Console.WriteLine("--------------------示例4.4紫色----------------------------");
 Console.WriteLine(await kernel.InvokePromptAsync("为我创建一个紫色小部件。", new(settings)));

在这里插入图片描述
在这里插入图片描述

四、结论

通过开发和调用Semantic Kernel插件,我们可以将自定义功能和业务逻辑集成到AI模型中,从而创建更加强大和灵活的应用程序。这些插件不仅可以提高开发效率,还可以帮助我们更好地控制AI模型的行为。

在下一篇文章中,我们将探讨如何将Semantic Kernel与其他技术栈和服务集成,以构建更加强大和全面的AI解决方案。

参考资料:
微软文档:https://learn.microsoft.com/en-us/semantic-kernel/overview/

Github:https://github.com/microsoft/semantic-kernel

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

集成方案 | 借助 Microsoft Copilot for Sales 与 Docusign,加速销售流程!

加速协议信息提取&#xff0c;随时优化邮件内容~ 在当今信息爆炸的时代&#xff0c;销售人员掌握着丰富的数据资源。他们能够通过 CRM 平台、电子邮件、合同库以及其他多种记录系统&#xff0c;随时检索特定个人或组织的关键信息。这些数据对于销售沟通至关重要。然而&#x…

Halcon Blob分析提取小光斑

文章目录 算子complement 返回一个区域的补集select_region_point 选择包含指定像素的所有区域intensity 计算灰度值的均值和偏差 案例 算子 complement 返回一个区域的补集 complement(Region : RegionComplement : : )Region (输入对象)&#xff1a;这指的是输入的一个或多…

AI金融攻防赛:金融场景凭证篡改检测(DataWhale组队学习)

引言 大家好&#xff0c;我是GISer Liu&#x1f601;&#xff0c;一名热爱AI技术的GIS开发者。本系列文章是我跟随DataWhale 2024年10月学习赛的AI金融攻防赛学习总结文档。本文主要讲解如何解决 金融场景凭证篡改检测的核心问题&#xff0c;以及解决思路和代码实现过程。希望…

Zookeeper快速入门:部署服务、基本概念与操作

文章目录 一、部署服务1.下载与安装2.查看并修改配置文件3.启动 二、基本概念与操作1.节点类型特性总结使用场景示例查看节点查看节点数据 2.文件系统层次结构3.watcher 一、部署服务 1.下载与安装 下载&#xff1a; 一定要下载编译后的文件&#xff0c;后缀为bin.tar.gz w…

介绍Java

Java简介 Java是一门由Sun公司&#xff08;现被Oracle收购&#xff09;在1995年开发的计算机编程语言&#xff0c;其主力开发人员是James Gosling&#xff0c;被称为Java之父。Java在被命名为“Java”之前&#xff0c;实际上叫做Oak&#xff0c;这个名字源于James Gosling望向…

非线性激活pytorch

**前置知识&#xff1a; 1、 self.sigmoid1Sigmoid() outputself.sigmoid1(input) 2、常见的非线性激活函数&#xff1a; 3、非线性激活的作用&#xff1a; 线性与非线性 线性函数&#xff1a;假设你用直线去描述波浪的形状。无论你怎么改变直线的斜率&#xff0c;结果都是…

用C++编写信息管理系统(歌单信息管理)

C语言是面向过程的编程语言&#xff0c;而C是面向对象的编程语言&#xff0c;在书写代码时风格有所不同&#xff08;也存在很多共性&#xff09;。 程序说明 本次系统程序使用的是C语言进行编写&#xff0c;主要考虑怎么实现面向对象的问题。 因为本次程序属于小型系统程序&…

react中css样式隔离

使用CSS Modules css模块化 1, 创建组件样式文件时以 xxx.module.css命名, 例如 Home.module.css 代替 Home.css 2, 在组件jsx导入样式文件时使用 import styles from ./xxx.module.css 导入 代替 import ./xxx.css 3, 在组件中需要设置样式的标签上添加class值, classNa…

WebGl学习使用attribute变量绘制一个水平移动的点

在WebGL编程中&#xff0c;attribute变量是一种特殊类型的变量&#xff0c;用于从客户端传递数据到顶点着色器。这些数据通常包括顶点的位置、颜色、纹理坐标等&#xff0c;它们是与每个顶点直接相关的信息。attribute变量在顶点着色器中声明&#xff0c;并且对于每个顶点来说都…

Qt-系统线程安全(63)

目录 描述 使用 线程不安全 线程安全 释放锁问题 其他的锁 条件变量和信号量 描述 多线程程序太复杂了 在C/C 和 Linux中&#xff0c;我们为了保证线程安全&#xff0c;简单的方式就是加锁 为此 Qt 也封装了自己的一套锁管理 使用 线程不安全 我们先测验一下线程不安…

【工具】音视频翻译工具基于Whisper+ChatGPT

OpenAI推出的开源语音识别工具Whisper&#xff0c;以其卓越的语音识别能力&#xff0c;在音频和视频文件处理领域大放异彩。与此同时&#xff0c;ChatGPT也在翻译领域崭露头角&#xff0c;其强大的翻译能力备受赞誉。因此&#xff0c;一些字幕制作团队敏锐地捕捉到了这两者的结…

Android中的Activity(案例+代码+效果图)

目录 1.Activity的生命周期 核心生命周期回调 1&#xff09;onCreate() 2&#xff09;onStart() 3&#xff09;onResume() 4&#xff09;onPause() 5&#xff09;onStop() 6&#xff09;onRestart() 7&#xff09;onDestroy() 8&#xff09;生命周期图示 10&#xff09;注意事项…

Golang | Leetcode Golang题解之第468题验证IP地址

题目&#xff1a; 题解&#xff1a; func validIPAddress(queryIP string) string {if sp : strings.Split(queryIP, "."); len(sp) 4 {for _, s : range sp {if len(s) > 1 && s[0] 0 {return "Neither"}if v, err : strconv.Atoi(s); err …

教你把产品图册转为翻页电子书

​在科技飞速发展的今天&#xff0c;产品的宣传方式也在不断创新。为了让产品图册更加吸引眼球&#xff0c;我推出了一款结合动画和音乐的效果惊艳的产品图册。这款产品图册不仅展示了产品的精美外观和独特功能&#xff0c;更通过动态效果和美妙音乐&#xff0c;为观众带来一场…

LabVIEW提高开发效率技巧----点阵图(XY Graph)

在LabVIEW开发中&#xff0c;点阵图&#xff08;XY Graph&#xff09; 是一种强大的工具&#xff0c;尤其适用于需要实时展示大量数据的场景。通过使用点阵图&#xff0c;开发人员能够将实时数据可视化&#xff0c;帮助用户更直观地分析数据变化。 1. 点阵图的优势 点阵图&…

【puppeteer】wvp-puppeteer制作 过程

目录 最后的结论 制作windows&ubuntu的docker 重启桌面上的docker 命令重启 通过 Docker Desktop 图形界面重启 制作centos docker 测试 参考文档 最后的结论 ubuntu && windows 使用 dualvenregistry:5000/wvp-puppeteer:1.0 centos7 使用&#xff1a;…

Word 中脚注和尾注的区别有哪些?如何正确使用它们?

在撰写学术论文、报告或其他需要引用资料的文章时&#xff0c;脚注和尾注是两种常用的标注方法。它们不仅可以为读者提供额外的背景信息&#xff0c;还能帮助整理文章中的引用来源。下面我们就来详细的了解一下什么是脚注和尾注。 脚注 脚注&#xff08;Footnote&#xff09;…

回溯法与迭代法详解:如何从手机数字键盘生成字母组合

在这篇文章中&#xff0c;我们将详细介绍如何基于手机数字键盘的映射&#xff0c;给定一个仅包含数字 2-9 的字符串&#xff0c;输出它能够表示的所有字母组合。这是一个经典的回溯算法问题&#xff0c;适合初学者理解和掌握。 问题描述 给定一个数字字符串&#xff0c;比如 …

2024 第一次周赛

A: 题目大意 骑士每连续 i 天每天会得到 i 个金币&#xff0c;&#xff08;i 1&#xff0c; 2&#xff0c; 3 &#xff0c; …&#xff09;,那么展开看每一天可以得到的金币数&#xff1a;1 2 2 3 3 3 4 4 4 5 5 5 5 5 … 可以发现就是1个1 &#xff0c;2个2, 3个3…,那么我…

关于md5强比较和弱比较绕过的实验

在ctf比赛题中我们的md5强弱比较的绕过题型很多&#xff0c;大部分都是结合了PHP来进行一个考核。这一篇文章我将讲解一下最基础的绕过知识。 MD5弱比较 比较的步骤 在进行弱比较时&#xff0c;PHP会按照以下步骤执行&#xff1a; 确定数据类型&#xff1a;检查参与比较的两…