智能升级:AntSK教你如何让聊天机器人实现智能联网操作

        随着人工智能技术的飞速发展,智能体已经逐步融入到我们的日常生活中。不过,要想让智能体不仅能聊天,还能接入网络实时获取信息,为我们提供更多便利,所需技术的复杂性不得不让人瞩目。今天,我将和各位分享如何在基于.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的未来等你来书写!

posted @ 2024-03-04 14:08  许泽宇  阅读(595)  评论(1编辑  收藏  举报