在連續談了幾篇有關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上的程式碼也會同時更新。
前面文章我們認識了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 進行整合,就可以達成。
var kernel = new KernelBuilder()
.WithAzureChatCompletionService(
deploy_model, // Azure OpenAI Deployment Name
aoai_Endpoint, // Azure OpenAI Endpoint
api_Key // Azure OpenAI Key
).Build();
注意: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; }
var bingResult = await kernel.Skills.GetFunction("bing", "search").InvokeAsync(query);
這是從外部來源所搜尋到的結果
###
{{$ans_result}}
###
請根據上述資料,回答使用者的問題
問題:{{$query_input}}
答案:
var variables = new ContextVariables
{
["ans_result"] = bingResult.ToString(),
["query_input"] = query
};
var result = (await kernel.RunAsync(variables, plugin["AssistantResults"])).Result;
範例原始碼 : 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