Fork me on GitHub

Semantic Kernel:Plugins

  插件是Semantic Kernel的核心组件。通过插件,你可以将现有的API封装成一个集合,供AI调用,从而赋予AI原本无法执行的操作能力。

  在背后,Semantic Kernel利用了最新大型语言模型(LLM)中的原生功能——Function Calling,来帮助LLM进行规划并调用API。通过函数调用,LLM可以请求特定函数的执行。Semantic Kernel会将这个请求传递给代码中的对应函数,并将结果返回给LLM,供其生成最终响应。

  并不是所有的AI SDK都有类似插件的概念(大多数只提供函数或工具)。但在企业应用场景中,插件非常有用,因为它们封装了一组功能,契合企业开发者常用的服务和API开发方式。插件还支持依赖注入。在插件的构造函数中,你可以注入执行任务所需的服务(例如数据库连接、HTTP客户端等)。而没有插件功能的SDK通常难以实现这一点。

一、用方法组改入插件

复制代码
#pragma warning disable SKEXP0001
using Microsoft.SemanticKernel;
using Microsoft.SemanticKernel.Connectors.OpenAI;
using System;
using System.ComponentModel;
using System.Globalization;

var chatModelId = "gpt-4o";
var key = File.ReadAllText(@"C:\GPT\key.txt");

var builder = Kernel.CreateBuilder();
builder.AddOpenAIChatCompletion(chatModelId, key);
var kernel = builder.Build();

kernel.ImportPluginFromFunctions("dataPlugin",
[
    kernel.CreateFunctionFromMethod(GetJapaneseDate, "GetJapaneseDate", "按日本历法,获取当前日期")
]);
[KernelFunction]
string GetJapaneseDate()
{
    var japaneseFormat = new CultureInfo("ja-JP", false).DateTimeFormat;
    japaneseFormat.Calendar = new JapaneseCalendar();
    return DateTime.Now.ToString("gg yy年MM月dd日", japaneseFormat);
}

var settings = new OpenAIPromptExecutionSettings()
{
    ToolCallBehavior = ToolCallBehavior.AutoInvokeKernelFunctions
};
var result = await kernel.InvokePromptAsync("今天是几号?", new KernelArguments(settings));
Console.WriteLine(result);
复制代码

  结果:

 二、用Type导入插件

复制代码
……
kernel.ImportPluginFromType<CurrentDateTime>();
var settings = new OpenAIPromptExecutionSettings()
{
    ToolCallBehavior = ToolCallBehavior.AutoInvokeKernelFunctions
};
var result = await kernel.InvokePromptAsync("今天是几号?", new KernelArguments(settings));
Console.WriteLine(result);
//定义一个类型
public class CurrentDateTime
{
    [KernelFunction, Description("获取当前日本历法的日期")]
    public string GetJapaneseDate()
    {
        var japaneseFormat = new CultureInfo("ja-JP", false).DateTimeFormat;
        japaneseFormat.Calendar = new JapaneseCalendar();
        return DateTime.Now.ToString("gg yy年MM月dd日", japaneseFormat);
    }
}
复制代码

  结果与前面相同。

三、把对象导成插件

复制代码
……
kernel.ImportPluginFromObject(new CurrentDateTime());

var settings = new OpenAIPromptExecutionSettings()
{
    ToolCallBehavior = ToolCallBehavior.AutoInvokeKernelFunctions
};
var result = await kernel.InvokePromptAsync("今天是几号?", new KernelArguments(settings));
Console.WriteLine(result);
……
复制代码

  结果与前面相同。

四、语义函数组成插件

  前面几个都是本地函数,看一个语义函数导入成插件的情况。语义函数可以通过定义一组文件夹和文件来定义,结构如下:

   config.json

复制代码
{
  "schema": 1,
  "description": "把给定的内容翻译成日文",
  "execution_settings": {
    "default": {
      "max_tokens": 512,
      "temperature": 0.0,
      "top_p": 0.0,
      "presence_penalty": 0.0,
      "frequency_penalty": 0.0
    }
  },
  "input_variables": [
    {
      "name": "input",
      "description": "翻译内容",
      "default": "",
      "is_required": true
    }
  ]
}
复制代码

  skprompt.txt

把{{$input}}翻译成日文

  导入语义函数插件:

复制代码
var translateDirectory = Path.Combine(
    System.IO.Directory.GetCurrentDirectory(),
    "plugins",
    "TranslatePlugin");
kernel.ImportPluginFromPromptDirectory(translateDirectory);

//method 04
var result = await kernel.InvokeAsync("TranslatePlugin", "translate", new() {
            { "input", "今天是星期一" }
          });
Console.WriteLine(result);
复制代码

  结果:

   文章来源微信公众号

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

posted @   桂素伟  阅读(3)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下
点击右上角即可分享
微信分享提示