iT邦幫忙

2023 iThome 鐵人賽

DAY 23
0
AI & Data

OpenAI 從提示工程(Prompt Engineering)到語義核心(Semantic Kernel)的實踐系列 第 23

Semantic Kernel的實踐:Semantic Kernel - 認識 Connector連接器

  • 分享至 

  • xImage
  •  

前言

在連續談了幾篇有關Plugins的使用之後,本篇要暫時脫離Plugins,進入下一個Semantic Kernel組成,稱為Connector連接器。

範例採用C#程式語言,並以主控台應用程式做為示範,使用的是.net 7.0。
此外GPT模型使用的是Azure OpenAI GPT-4,事實也可以依需求改用OpenAI服務,而模型也可以改用GPT-3.5。

至目前為止本系列文中的範例皆採用Microsoft.SemanticKernel套件,版號為0.24.230918.1-preview,然而下週Semantic Kernel預計會正式發行1.0版,因此後面文章若遇到1.0版發行,則會直接使用1.0版,而前面文章的範例,也會另行找時間更新,github上的程式碼也會同時更新。

Connector連接器

前面文章我們認識了Native Functoin,可以用於執行本機以程式語言所撰寫的邏輯,但除了邏輯運算之外,有些時候我們也必須整合一些外部資源或服務,當然這部份開發者也可以自行撰寫Native Functoin來滿足需求,不過做為一個SDK的Semantic Kernel不意外的也提供一些內建整合外部服務的能力,這些稱之為Connector連接器。

不過我個人認為Semantic Kernel定義Plugin與Connector的界線有些模糊,令人難以明確的區分,也容易造成開發者混亂。事實上Connector就像Plugin一樣賦予Kernel物件具有特別的額外能力。這點從Semantic Kernel的原始碼命名空間可以看出來,以BingConnector為例,其命名空間是Microsoft.SemanticKernel.Plugins.Web.Bing,可以看到是歸納為Plugins中,只是多了個Connector的稱呼而已。

實際演練

我們都知道ChatGPT模型沒有連網能力,因此,若想要打造一個可以經由web search尋找使用者提問的答案,然後再由ChatGPT生成最後回應,那麼我們可以把Semantic Kernel內建的WebSearchEngineSkill整合bing search或google search來實現這個應用

我們都知道ChatGPT 模型本身並不具備直接的網路搜索能力。但是,如果我們希望建立一個LLM應用,該應用能夠透過網路搜索來找尋使用者的問題答案,並再由 ChatGPT 進行回答生成,那麼就必擴充Kernel能力,掛上連網功能,因此可以利用 Semantic Kernel 的 WebSearchEngineSkill,並將其與 Bing Search 或 Google Search 進行整合,就可以達成。

  • 首先確認已申請Azure OpenAI服務以及Bing search服務
  • 如同先前的範例,建立Kernel物件
var kernel = new KernelBuilder()
.WithAzureChatCompletionService(
 deploy_model,   // Azure OpenAI Deployment Name
 aoai_Endpoint, // Azure OpenAI Endpoint
 api_Key  // Azure OpenAI Key
).Build();
  • 接著建立BingConnector物件(本範例以bing search為例),並且配置Kernel物件掛入WebSearchEngineSkill

注意:semantic kernel 1.0發行後,Skill將會改為Plugin,因此WebSearchEngineSkill會更名為WebSearchEnginePlugin,而ImportSkill也將更名為ImportFunctions

var bingConnector = new BingConnector(bingSerach_Key);
kernel.ImportSkill(new WebSearchEngineSkill(bingConnector), "bing");

從WebSearchEngineSkill原始碼可以看到,在建構子注入了IWebSearchEngineConnector的實作,這也表示若有需要,開發人員也可以自行實作IWebSearchEngineConnector,然後注入到WebSearchEnginePlugin

public WebSearchEnginePlugin(IWebSearchEngineConnector connector)
{
    this._connector = connector;
}
  • 調用search function進行搜尋
var bingResult = await kernel.Skills.GetFunction("bing", "search").InvokeAsync(query);

  • 建立semantic function,其prompt template以In-Context Learning技巧,將搜尋結果置入供ChatGPT模型做為生成文本的參考資料
這是從外部來源所搜尋到的結果
###
{{$ans_result}}
###

請根據上述資料,回答使用者的問題
問題:{{$query_input}}
答案:

  • 配置semantic function參數值
var variables = new ContextVariables
        {
            ["ans_result"] = bingResult.ToString(),
            ["query_input"] = query
        };
  • 叫用GPT模型等待生成結果
var result = (await kernel.RunAsync(variables, plugin["AssistantResults"])).Result;
  • 生成結果
    https://ithelp.ithome.com.tw/upload/images/20231008/20126569piklgwM1mA.png

範例原始碼 : https://github.com/iangithub/sklearn/tree/main/WebSearch

結語

本篇介紹semantic kernel裡的Connector連接器組件,就本質上我認為它是屬於Plugin的一環,同樣是擴展了模型的應用範疇,透過semantic kernel內建的連接器可以快速做一些外部服務的整合。

嗨,我是Ian,我喜歡分享與討論,今年跟2位朋友合著了一本ChatGPT主題書,如果你是一位開發者,這本書或許會有些幫助,https://www.tenlong.com.tw/products/9786263335189
這次的鐵人賽文章也會同時發佈於個人blog,歡迎關注我的blog : https://medium.com/@ianchen_27500


上一篇
Semantic Kernel的實踐:Semantic Kernel - 開箱即用Plugins
下一篇
Semantic Kernel的實踐:Semantic Kernel - 整合embedding,以建立私有知識庫應用為例
系列文
OpenAI 從提示工程(Prompt Engineering)到語義核心(Semantic Kernel)的實踐30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言