SemanticKernel:新增外掛

mingupupup發表於2024-06-06

SemanticKernel介紹

Semantic Kernel是一個SDK,它將OpenAI、Azure OpenAI和Hugging Face等大型語言模型(LLMs)與C#、Python和Java等傳統程式語言整合在一起。Semantic Kernel透過允許您定義外掛來實現這一點,這些外掛可以透過幾行程式碼連結在一起。

image-20240606090229088

為什麼需要新增外掛?

大語言模型雖然具有強大的自然語言理解和生成能力,但它們通常是基於預訓練的模型,其功能受限於訓練時所接觸的資料和任務。為大語言模型新增外掛是為了擴充套件其功能、提高其靈活性和實用性。比如你問一個大語言模型今天是幾號?它無法提供實時資訊甚至會出現幻覺,這時候外掛就派上用場了。

Semantic Kernel can orchestrate AI plugins from any provider

實踐

外掛分為提示詞外掛與本地函式外掛,本次示例用的是本地函式。建立一個TimeInformation類:

 public class TimeInformation
 {
     [KernelFunction]
     [Description("Retrieves the current time in UTC.")]
     public string GetCurrentUtcTime() => DateTime.UtcNow.ToString("R");

 }

[KernelFunction]SemanticKernel中的一個特性,表示指定匯入為外掛的類中的方法應作為 Microsoft.SemanticKernel.KernelFunction 包含在生成的 Microsoft.SemanticKernel.KernelPlugin 中。 [Description]特性用於為類、方法、屬性等新增描述資訊。

在kernel中加入這個外掛:

builder.Plugins.AddFromType<TimeInformation>();
var kernel = builder.Build();

現在來試試效果:

// Example 1. Invoke the kernel with a prompt that asks the AI for information it cannot provide and may hallucinate
Text += "問:還有多少天到7月1號?\r\n";
Text += "答:" + await kernel.InvokePromptAsync("還有多少天到7月1號?") + "\r\n";

// Example 2. Invoke the kernel with a templated prompt that invokes a plugin and display the result       
Text += "問:還有多少天到7月1號?\r\n";
Text += "答:" + await kernel.InvokePromptAsync("現在時間是 {{TimeInformation.GetCurrentUtcTime}},還有多少天到7月1號?") + "\r\n";

// Example 3. Invoke the kernel with a prompt and allow the AI to automatically invoke functions
OpenAIPromptExecutionSettings settings = new() { ToolCallBehavior = ToolCallBehavior.AutoInvokeKernelFunctions };       
Text += "問:還有多少天到7月1號?\r\n";
Text += "答:" + await kernel.InvokePromptAsync("還有多少天到7月1號,請解釋一下你的思考?", new(settings)) + "\r\n";

效果如下所示:

image-20240606092641539

第一個回答沒有使用外掛,大語言模型出現幻覺了。

第二個回答透過使用模板化的提示來呼叫外掛,回答正確。

第三個回答透過自動呼叫外掛,回答正確。

參考

1、microsoft/semantic-kernel: Integrate cutting-edge LLM technology quickly and easily into your apps (github.com)

2、Understanding AI plugins in Semantic Kernel and beyond | Microsoft Learn

3、semantic-kernel/dotnet/samples/GettingStarted/Step2_Add_Plugins.cs at main · microsoft/semantic-kernel (github.com)

相關文章