探索Semantic Plugins:開啟大模型的技能之門

董瑞鹏發表於2024-06-04

前言

在之前的章節中我們或多或少的已經接觸到了 Semantic KernelPlugins,本章我們講詳細介紹如何使用外掛。

Semantic Kernel 的一大特點是擁有強大的外掛,透過結合自定義/預定義的外掛解決智慧業務的問題。讓傳統的程式碼和智慧外掛一起工作靈活地接入到應用場景簡化傳統應用向智慧化轉型的過程。

什麼是Plugins

image

我們知道LLMs(大模型)的訓練資料和我們使用之間有時間差,還有一個問題 LLMs 對自己企業化內的知識認知有缺陷。OpenAI透過外掛將ChatGPT和第三方的應用程式之間進行連線,這些外掛使 ChatGPT 能夠與開發人員定義的 API 進行互動,從而增強 ChatGPT 的功能並允許有更廣泛的操作,如:

  • 檢索實時資訊,例如,體育賽事比分、股票價格、最新新聞等。
  • 檢索知識庫資訊, 例如,公司文件、個人筆記等。
  • 協助使用者進行相關操作,例如,預訂航班、公司內預定會議、訂餐等。

Semantic Kernel 遵循 OpenAI 的外掛的外掛規範,可以很方便地接入和匯出外掛(如基於 Bing, Microsoft 365, OpenAI 的外掛),這樣可以讓開發人員很簡單地呼叫不同的外掛服務。除了相容 OpenAI 的外掛外,Semantic Kernel 內也有屬於自己外掛定義的方式。不僅可以在規定模版格式上定義 Plugins, 更可以在函式內定義 Plugins.

從高層次上理解外掛是一組可以公開給 AI 應用程式和服務的功能。

外掛要提供在語義上描述其行為方式的詳細資訊,從函式的輸入、輸出到副作用,一切都需要以 AI 可以理解的方式進行描述.

定義外掛

在 Semantic Kernel 中定義 Plugins 外掛有兩種方式,第一種是透過模版定義外掛也叫Semantic Plugins(語義外掛),第二種是透過函式建立外掛也叫 Native Plugins(本地外掛)

Sermantic Plugins

透過模版定義外掛
我們知道可以透過Prompts(提示詞工程)可以和LLMs進行對話,我們在處理一系列特定業務過程中,可能不止一個Prompts,可能是一組Prompts的集合。我們可以把這些針對業務能力的Prompts集合放到Semantic Kernel的外掛集合內。

模版格式

Semantic Kernel 模版定義格式有固定的格式,Prompts(提示詞)都放在 skprompt.txt 檔案內,而相關引數設定都放在 config.json 檔案內,檔案結構參考如下圖

     const string ConfigFile = "config.json";
     const string PromptFile = "skprompt.txt";

這些都是在 SK 寫死的配置,所以外掛內的命名一定要遵循這個規則!

|-plugins
    |-Prompts
        |-Translator
            |-skprompt.txt
            |-config.json
    |-WriterPlugins
        |-Joke
            |-skprompt.txt
            |-config.json
        |-ShortPoem
            |-skprompt.txt
            |-config.json

skprompt.txt

我們先來看看 skprompt.txt 的定義,這裡一般是放置和業務相關的 Prompt,可以支援多個引數,每個引數都放置在 {{$引數名}} 內,如以下格式:

Translate {{$input}} into {{$language}}

在之前的章節我們介紹過這是SKTemplateFormat的預設格式"semantic-kernel"

config.json

這是配置相關的內容,隨了設定和 LLMs 相關的引數外,你也可以設定輸入的引數以及相關描述

{
  "schema": 1,
  "description": "Translate sentenses into a language of your choice",
  "execution_settings": {
    "default": {
      "max_tokens": 2000,
      "temperature": 0.7,
      "top_p": 0.0,
      "presence_penalty": 0.0,
      "frequency_penalty": 0.0,
      "stop_sequences": ["[done]"]
    }
  },
  "input_variables": [
    {
      "name": "input",
      "description": "sentense to translate",
      "default": ""
    },
    {
      "name": "language",
      "description": "Language to translate to",
      "default": ""
    }
  ]
}

這其實就是對PromptTemplateConfig提示詞模版配置類的 json 資料,最後在 SK 內會被反序列化到物件內。

   // Load prompt configuration. Note: the configuration is optional.
   var configPath = Path.Combine(functionDirectory, ConfigFile);
   var promptConfig = File.Exists(configPath) ?
                PromptTemplateConfig.FromJson(File.ReadAllText(configPath)) :
                new PromptTemplateConfig();

之前我們對PromptTemplateConfig類進行過詳細的講解,不熟悉的可以看看深入學習 Semantic Kernel:建立和配置 prompts functions

從解決方案的角度看一下配置的目錄圖

image

註冊 Semantic Plugins

要從 Semantic Kernel 中要實現Semantic Plugins模板化外掛的註冊,需要KernelExtensions類中的CreatePluginFromPromptDirectory擴充套件方法。

再開始之前在我們程式碼的解決方案Plugins資料夾下對每一個skprompt.txtconfig.json進行生成設定

image

核心程式碼

var kernel = Kernel.CreateBuilder()
    .AddAzureOpenAIChatCompletion(config.ModelId, endpoint: config.Endpoint, apiKey: config.ApiKey)
    .Build();
//註冊外掛
string folder = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Plugins");
kernel.ImportPluginFromPromptDirectory(folder);

string[] pluginNames = ["Prompts", "WriterPlugins"];

foreach (var pluginName in pluginNames)
{
    kernel.ImportPluginFromPromptDirectory(Path.Combine(folder, pluginName));
}

//測試從外掛獲得funciton
var jokeKernelFunction = kernel.Plugins.GetFunction("Prompts", "Translator");
Console.WriteLine("System: 請輸入要翻譯的內容");
var userResuest = Console.ReadLine();
Console.WriteLine("System: 請輸入要翻譯的語言語種");
var language = Console.ReadLine();

var results = await jokeKernelFunction.InvokeAsync(kernel, new KernelArguments()
{
  {"input", userResuest},
  {"language", language}
});

Console.WriteLine($"Assistant: {results.ToString()}");

外掛名稱約定

ImportPluginFromPromptDirectory這個方法在註冊外掛過程中如果沒有指定外掛名字會預設用資料夾名稱

   pluginName ??= new DirectoryInfo(pluginDirectory).Name;

輸出

System: 請輸入要翻譯的內容
User: 那麼近那麼美週末去河北
System: 請輸入要翻譯的語言語種
User: 英文
Assistant: So close, so beautiful, go to Hebei for the weekend.

最後

本章我們詳細介紹瞭如何使用 Semantic Kernel 的外掛功能,包括外掛的概念、定義外掛的兩種方式(Semantic Plugins 和 Native Plugins)、以及如何註冊和呼叫 Semantic Plugins。透過外掛,我們可以擴充套件 ChatGPT 的功能,使其能夠與第三方應用程式進行連線,實現更廣泛的操作和服務。

透過註冊外掛並呼叫相應函式,我們可以實現諸如翻譯、笑話生成等功能。在下一篇中,我們將關注 Native Plugins 原生函式外掛的介紹。

參考文獻

  • 開啟大模型的技能之門 - Plugins
  • Understanding AI plugins in Semantic Kernel

示例程式碼

本文原始碼

相關文章