首页 > 其他分享 >探索Native Plugins:开启大模型的技能之门

探索Native Plugins:开启大模型的技能之门

时间:2024-06-07 10:45:34浏览次数:25  
标签:kernel 插件 Semantic Kernel 创建 Plugins Native 技能

前言

上一章节我们了解了一下Semantic KernnelPlugins插件的概念以及学习了的 Semantic Kernel 模板插件的创建,本章节我们来学习 Native Plugins 原生函数插件使用。

通过函数定义插件

在之前的章节中我们介绍过在在 Semantic Kernel 中应用 Function Calling,在文中讲解了Functioncalling的概念,以及在SK中的应用。
Semantic Kernel中定义Native Plugins 函数插件,和 gpt-3.5-turbo 在 6 月 13 日 发布的 Function Calling特别的像,这是通过增加外部函数,通过调用来增强 OpenAI 模型的能力。

在 Semantic Kernel 中定义函数插件

Semantic Kernerl 中提供了很多定义Native Plugins的扩展方法来创建插件下面介绍最常用的几种:

根据类型创建插件

  • SK源码
    public static KernelPlugin ImportPluginFromType<T>(this Kernel kernel, string? pluginName = null)
    {
        KernelPlugin plugin = CreatePluginFromType<T>(kernel, pluginName);
        kernel.Plugins.Add(plugin);
        return plugin;
    }
  • 定义Native Plugins

Semantic Kernel 中定义函数插件,需要用到两个特性KernelFunctionDescription
KernelFunction特性把函数标记为一个SKNative functionDescription给函数和参数以及返回值加描述,方便LLMs能够更好的理解。

具体使用如下

public class WeatherPlugin
{
    public static string GetWeather => "WeatherSearch";

    [KernelFunction, Description("根据城市查询天气")]
    public string WeatherSearch([Description("城市名")] string city)
    {
        return $"{city}, 25℃,天气晴朗。";
    }
}
  • Kernel添加插件
kernel.ImportPluginFromType<WeatherPlugin>();

这就是刚才说的根据类型来创建SK插件

  • 调用
var getWeatherFunc = kernel.Plugins.GetFunction(nameof(WeatherPlugin), WeatherPlugin.GetWeather);
var weatherContent = await getWeatherFunc.InvokeAsync(kernel, new() { ["city"] = "北京" });
Console.WriteLine(weatherContent.ToString());
  • 输出
北京, 25℃,天气晴朗。

这是手动调用的方式当然也可以IChatCompletionService会话模式自动调用。

根据对象创建

主要用到了ImportPluginFromObject这个扩展方法

    public static KernelPlugin ImportPluginFromObject(this Kernel kernel, object target, string? pluginName = null)
    {
        KernelPlugin plugin = CreatePluginFromObject(kernel, target, pluginName);
        kernel.Plugins.Add(plugin);
        return plugin;
    }
  • 定义根据城市名获取美食的插件
public class FinefoodPlugin
{
    [KernelFunction, Description("根据城市获取美食推荐")]
    public string GetFinefoodList([Description("城市名")] string city)
    {
        return "烤鸭,卤煮,老北京炸酱面,炒肝等";
    }
}

和上一个使用 Type 注册插件是一样的操作

  • 注册并调用
    FinefoodPlugin finefoodPlugin = new();
    kernel.ImportPluginFromObject(finefoodPlugin);
    var getWeatherFunc = kernel.Plugins.GetFunction(nameof(FinefoodPlugin), "GetFinefoodList");
    var weatherContent = await getWeatherFunc.InvokeAsync(kernel, new() { ["city"] = "北京" });
    Console.WriteLine(weatherContent.ToString());
  • 输出:
烤鸭,卤煮,老北京炸酱面,炒肝等
  • 扩展
    既然 Kernel 对象提供了根据对象实例创建插件的方案,那么就可以我们最喜欢的依赖注入获取的服务做插件的实例,这一点非常的重要,在以后项目实战中很实用。

依赖注入举例

    IServiceCollection services = new ServiceCollection();
    services.AddSingleton<FinefoodPlugin>();
    var rootProvider = services.BuildServiceProvider();
    FinefoodPlugin finefoodPlugin = rootProvider.GetRequiredService<FinefoodPlugin>();
    kernel.ImportPluginFromObject(finefoodPlugin);

根据 Kernelfunction 创建对象的实例

SK 提供了几个根据 Kernelfunction 来创建Plugins的方案,这就用到Kernel对象创建 kernel functions的扩展方法。

关于Kernel Function的创建有两种常用的形式第一种是根据Prompts来创建Semantic function也可以叫Prompts function,第二种是根据 C#的Delegate来创建Kernel Function

第一种方案之前的文章中有讲过,有兴趣可以浏览一下深入学习 Semantic Kernel:创建和配置 prompts functions,这里不过多介绍。

第二种在这里我们重点讲一下,根据委托来创建Kernel Function

  • 源码一览
    public static KernelFunction CreateFunctionFromMethod(
        this Kernel kernel,
        Delegate method,
        string? functionName = null,
        string? description = null,
        IEnumerable<KernelParameterMetadata>? parameters = null,
        KernelReturnParameterMetadata? returnParameter = null)
    {
        Verify.NotNull(kernel);
        Verify.NotNull(method);

        return KernelFunctionFactory.CreateFromMethod(method.Method, method.Target, functionName, description, parameters, returnParameter, kernel.LoggerFactory);
    }

在之前的文章介绍过,所有创建Kernelfunction基本上都是利用KernelFunctionFactoryfunction工厂创建的,其实插件的创建也是一样通过KernelPluginFactory插件plugin工厂创建的。

创建一个根据城市名获取游玩地点的插件

  • 创建 Kernel Function
    var kernelfunction = kernel.CreateFunctionFromMethod((string city) => { return $"{city} 好玩的地方有八达岭长城,故宫,恭王府等"; },
        functionName: "GetTourismClassic", description: "获取城市的经典",
         [
            new KernelParameterMetadata(name:"city") {
             Description="城市名"
    }]);
  • 注册插件并调用
    kernel.ImportPluginFromFunctions("TourismClassicPlugin", [kernelfunction]);
    var getTourismClassic = kernel.Plugins.GetFunction("TourismClassicPlugin", "GetTourismClassic");
    var weatherContent = await getTourismClassic.InvokeAsync(kernel, new() { ["city"] = "北京" });
    Console.WriteLine(weatherContent.ToString());
  • 输出
北京 好玩的地方有八达岭长城,故宫,恭王府等

扩展

上面介绍的都是在Sk中创建Native Plugins常用的方法,还有一些用法,比如

  • ImportPluginFromApiManifestAsync OpenAPI 功能相关
  • ImportPluginFromOpenAIAsync 通过 OpenAI 的 ChatGPT 格式为 OpenAI 插件创建一个插件
  • CreatePluginFromOpenApiAsync 从 OpenAPI v3 端点创建插件
  • ImportPluginFromGrpcFile 从 gRPC 文档导入
  • 其他

最后

本章我们学习了在 Semantic Kernel 中使用 Native Plugins 原生函数插件的方法,包括通过函数定义插件和根据对象创建插件的步骤。我们探讨了不同的创建插件的方式,以及如何注册插件并进行调用。通过这些方法,我们可以扩展 Semantic Kernel 的功能,增强模型的能力。

参考文献

示例代码

本文源代码

标签:kernel,插件,Semantic,Kernel,创建,Plugins,Native,技能
From: https://www.cnblogs.com/ruipeng/p/18234840

相关文章

  • 从0到1训练私有大模型技能与应用实现 ,企业急迫需求,抢占市场先机
    从0到1训练私有大模型:技能构建与应用实现,助力企业抢占市场先机在当今数字化浪潮中,人工智能(AI)技术已成为企业实现创新和突破的关键。特别是在大模型技术领域,其强大的数据处理能力和泛化能力为企业提供了前所未有的机遇。为了满足企业急迫的需求,抢占市场先机,本文将从0到1探讨如何训......
  • Spring Boot 不能加载 tcnative-2.dll 库(Can't load library: tcnative-2.dll)
    SpringBoot不能加载tcnative-2.dll库本文将介绍怎样解决SpringBoot在启动时抛出“org.apache.tomcat.jni.LibraryNotFoundError:Can'tloadlibrary:*\tcnative-2.dll”错误。在使用SpringBoot3创建项目的过程中,将日志的级别调为debug,日志打印了“org.apache.tomca......
  • Nativefier : 将网址打包成exe桌面程序
    1、需求场景    在日常开发中,需要针对一些网页在一体机上使用,同时在浏览器上也可以使用,这里推荐大家用nativefier,对网址进行打包。以下是nativefier安装命令:npminstallnativefier-g2、使用方法--arch系统--icon小图标文件,必须是256*256默认从网页的关键......
  • ### 探索Java开发中的关键问题:从性能优化到安全性,全方位提升你的编程技能
    在这篇文章中,我们将深入探讨Java开发中最受关注的关键问题,并提供实用的解决方案,帮助你在编程之路上不断精进。以下是我们将覆盖的主要内容:1. **性能优化**     * **垃圾回收(GarbageCollection)**    * **问题**:不同垃圾回收器的选择和调优。......
  • 探索Semantic Plugins:开启大模型的技能之门
    前言在之前的章节中我们或多或少的已经接触到了SemanticKernel的Plugins,本章我们讲详细介绍如何使用插件。SemanticKernel的一大特点是拥有强大的插件,通过结合自定义/预定义的插件解决智能业务的问题。让传统的代码和智能插件一起工作灵活地接入到应用场景简化传统应用向......
  • Spring Boot使用GraalVM编译为native excutable app的日志示例及主要步骤说明
    日志示例[INFO]---native-maven-plugin:0.9.28:compile(default-cli)@my-app---[INFO]FoundGraalVMinstallationfromGRAALVM_HOMEvariable.[INFO][graalvmreachabilitymetadatarepositoryforch.qos.logback:logback-classic:1.4.14]:Configurationdirector......
  • WinDbg基本原理和使用方法,掌握基本的调试技术,并能够应用于实际的调试工作中;高级调试技
    WinDbg初级应用的大纲:1.WinDbg基础知识WinDbg简介:介绍WinDbg是什么以及其在Windows调试和分析中的作用。安装与配置:指导学员如何安装和配置WinDbg调试环境,包括下载安装、符号配置等基本步骤。2.调试基础调试流程:解释调试的基本流程,包括启动目标程序、设置断点、执行程序......
  • FSDump工具的内部原理和高级应用技术,基本用法和应用场景,掌握文件加密属性的查看和加密
    EFSDump初级应用的大纲:1.了解EFSDump简介:介绍EFSDump工具的作用、原理和功能。安装与配置:指导学习者如何获取和配置EFSDump工具,准备使用环境。2.基本用法查看文件加密属性:演示如何使用EFSDump查看文件的加密属性,识别加密文件。导出加密密钥:指导学习者如何导出文件的加......
  • 深度学习论文翻译解析(二十二):Uniformed Students Student-Teacher Anomaly Detection W
    论文标题:UniformedStudentsStudent-TeacherAnomalyDetectionWithDiscriminativeLatentEmbbeddings论文作者: PaulBergmann MichaelFauser DavidSattlegger CarstenSteger论文地址:https://openaccess.thecvf.com/content_CVPR_2020/papers/Bergmann_Uninformed......
  • 分享3个能养你一辈子的技能
    有哪些技能可以让你用一辈子?当今社会,许多人都在寻求一种能够确保终身职业安全的技能。面对不断变化的工作市场和技术的迅速发展,人们常常感到焦虑,担心自己现有的技能可能很快就会过时。因此,本着“技多不压身”的原则,越来越多的人开始热衷于学习新技能、考取各种证书和参加......