智能升级: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的未来等你来书写!

相关推荐
q_q王9 小时前
Ubuntu源码版comfyui的安装
大模型·文生图·comfyui·工作流·图生视频
HuggingFace11 小时前
大模型评估排障指南 | 关于可复现性
大模型·llm
AI大模型顾潇11 小时前
[特殊字符] 本地部署DeepSeek大模型:安全加固与企业级集成方案
数据库·人工智能·安全·大模型·llm·微调·llama
Coding的叶子14 小时前
React Agent:从零开始构建 AI 智能体|React Flow 实战・智能体开发・低代码平台搭建
人工智能·大模型·工作流·智能体·react flow
青衫客3619 小时前
使用本地部署的 LLaMA 3 模型进行中文对话生成
大模型·llama
Silence4Allen20 小时前
大模型微调指南之 LLaMA-Factory 篇:一键启动LLaMA系列模型高效微调
人工智能·大模型·微调·llama-factory
concisedistinct1 天前
如何评价大语言模型架构 TTT ?模型应不应该永远“固定”在推理阶段?模型是否应当在使用时继续学习?
人工智能·语言模型·大模型
Silence4Allen2 天前
RagFlow 完全指南(一):从零搭建开源大模型应用平台(Ollama、VLLM本地模型接入实战)
人工智能·大模型·rag·ragflow
青花瓷2 天前
llama-Factory不宜直接挂接Ollama的大模型
人工智能·大模型·agent·llama·智能体
想要成为计算机高手2 天前
Helix:一种用于通用人形控制的视觉语言行动模型
人工智能·计算机视觉·自然语言处理·大模型·vla