智慧升級:AntSK教你如何讓聊天機器人實現智慧聯網操作

许泽宇發表於2024-03-04

隨著人工智慧技術的飛速發展,智慧體已經逐步融入到我們的日常生活中。不過,要想讓智慧體不僅能聊天,還能接入網路實時獲取資訊,為我們提供更多便利,所需技術的複雜性不得不讓人矚目。今天,我將和各位分享如何在基於.NET開發的AI知識庫/智慧體專案AntSK中,利用Semantic Kernel實現智慧體的聯網功能,加入查詢天氣、傳送郵件、呼叫外部API等“神技能”。

AntSK是什麼?

AntSK是一個基於最新的.NET8技術棧以及AntBlazorSemantic Kernel開發的開源專案,為開發者提供了構建AI知識庫和智慧體的強大工具。專案原始碼開放在GitHub平臺,讓每位對AI和.NET感興趣的開發者都能參與進來,探索智慧體的無限可能。

https://github.com/xuzeyu91/AntSK

  

AntSK的聯網功能

AntSK的智慧體中嵌入網路操作,聽起來是不是感覺非常“黑科技”?別急,這並沒有我們想象的那麼複雜。Semantic Kernel作為AntSK中的一大核心SDK,已經為我們提供了便捷的自動呼叫功能,讓聯網操作變得觸手可及。

配置API通道

首先,我們先來配置通向外界的API通道。這一步相較於編碼來說簡單得多,僅需要構造一個配置API的頁面。在這個頁面中,我們可以設定要呼叫的具體介面資訊,比如請求頭、請求方式、引數等。

然後同時,我們也需要在應用中選擇對應的API外掛

智慧體如何自動呼叫API

在AntSK中,應用的配置完成,你是否期待智慧體能自如地呼叫API呢?正是如此,透過下面的程式碼配置,我們的智慧體可以在聊天時動態地注入API外掛,並且根據不同的場景去呼叫指定的API介面,比如天氣查詢:

OpenAIPromptExecutionSettings settings = new() { ToolCallBehavior = ToolCallBehavior.AutoInvokeKernelFunctions };

動態注入API外掛

我們還需要編寫一些程式碼來讓智慧體在實際聊天過程中注入我們預設的API外掛。以下是示例程式碼,詳細地展現瞭如何按照不同的方法型別(GET或POST),建立函式並將其注入到Semantic Kernel外掛中:

public void ImportFunctionsByApp(Apps app, Kernel _kernel)
{
    //開啟自動外掛呼叫
    var apiIdList = app.ApiFunctionList.Split(",");
    var apiList = _apis_Repositories.GetList(p => apiIdList.Contains(p.Id));
    List<KernelFunction> functions = new List<KernelFunction>();
    var plugin = _kernel.Plugins.FirstOrDefault(p => p.Name == "ApiFunctions");
    {
        foreach (var api in apiList)
        {
            switch (api.Method)
            {
                case HttpMethodType.Get:
                    functions.Add(_kernel.CreateFunctionFromMethod((string msg) =>
                    {
                        try
                        {
                            Console.WriteLine(msg);
                            RestClient client = new RestClient();
                            RestRequest request = new RestRequest(api.Url, Method.Get);
                            foreach (var header in api.Header.Split("\n"))
                            {
                                var headerArray = header.Split(":");
                                if (headerArray.Length == 2)
                                {
                                    request.AddHeader(headerArray[0], headerArray[1]);
                                }
                            }
                            //這裡應該還要處理一次引數提取,等後面再迭代
                            foreach (var query in api.Query.Split("\n"))
                            {
                                var queryArray = query.Split("=");
                                if (queryArray.Length == 2)
                                {
                                    request.AddQueryParameter(queryArray[0], queryArray[1]);
                                }
                            }
                            var result = client.Execute(request);
                            return result.Content;
                        }
                        catch (System.Exception ex)
                        {
                            return "呼叫失敗:" + ex.Message;
                        }
                    }, api.Name, $"{api.Describe}"));
                    break;
                case HttpMethodType.Post:
                    functions.Add(_kernel.CreateFunctionFromMethod((string msg) =>
                    {
                        try
                        {
                            Console.WriteLine(msg);
                            RestClient client = new RestClient();
                            RestRequest request = new RestRequest(api.Url, Method.Post);
                            foreach (var header in api.Header.Split("\n"))
                            {
                                var headerArray = header.Split(":");
                                if (headerArray.Length == 2)
                                {
                                    request.AddHeader(headerArray[0], headerArray[1]);
                                }
                            }
                            //這裡應該還要處理一次引數提取,等後面再迭代
                            request.AddJsonBody(api.JsonBody);
                            var result = client.Execute(request);
                            return result.Content;
                        }
                        catch (System.Exception ex)
                        {
                            return "呼叫失敗:" + ex.Message;
                        }
                    }, api.Name, $"{api.Describe}"));
                    break;
            }
        }
        _kernel.ImportPluginFromFunctions("ApiFunctions", functions);
    }
}

  實戰演示

我們可以看到,已經可以在聊天過程中順利的呼叫我們的天氣查詢API了,並返回給我們今天的天氣如何,同理我們也可以透過配置聯網搜尋API讓聊天機器人具備搜尋實時資訊的能力。

結語

將這樣一種創新與強大的技術分享給大家,我感到無比自豪。我希望你能在GitHub上給AntSK點上一個star,相信專案的潛力會讓你感到興奮。如果你在使用過程中遇到任何問題,或者有新的構想想要貢獻,都可以透過加入我們的【.Net/AI應用開發交流群】來參與討論。目前由於群人數已滿,你可以先透過新增我的微信xuzeyu91,我將會邀請你進入群聊。

這個專案不僅僅是技術的集合,它更是一個開放的社群,一個共同成長的空間。如果你對人工智慧、.Net開發有熱情,那麼AntSK無疑將是你展示才華、交流思想的絕佳平臺。在未來的版本迭代中,我相信AntSK會變得更強大、更智慧,能夠解決越發複雜的問題,並在人類與計算機互動中發揮關鍵作用。

正如新興科技所展示的,未來並非遙遠,而是觸手可及。AntSK正是這一理念的體現,它不僅僅為技術愛好者和專業人士提供了交流的舞臺,更為整個社會開啟了智慧互動的新程度。它證明了,無論是在知識管理、複雜決策支援還是日常生活輔助中,人工智慧都能發揮其獨有的力量。

趕快參與進來吧,AI的未來等你來書寫!

相關文章