码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 探索Semantic Kernel内置插件:深入了解HttpPlugin的应用


    合集 - AI(12)
    1.一键接入大模型:One-Api本地安装配置实操05-072.入门Semantic Kernel:OneApi集成与HelloWorld05-083.深入学习Semantic Kernel:创建和配置prompts functions05-214.Semantic Kernel入门系列:利用YAML定义prompts functions05-225.Semantic Kernel入门系列:利用Handlebars创建Prompts functions05-236.深入探讨Function Calling:实现外部函数调用的工作原理05-287.深入探讨Function Calling:在Semantic Kernel中的应用实践05-308.探索Semantic Plugins:开启大模型的技能之门06-049.探索Native Plugins:开启大模型的技能之门06-0710.Semantic Kernel入门系列:通过依赖注入管理对象和插件06-1111.探索Semantic Kernel内置插件:深入了解ConversationSummaryPlugin的应用06-18
    12.探索Semantic Kernel内置插件:深入了解HttpPlugin的应用06-25
    收起

    前言

    上一章我们熟悉了Semantic Kernel中的内置插件和对ConversationSummaryPlugin插件进行了实战,本章我们讲解一下另一个常用的内置插件HttpPlugin的应用。

    上一章对ConversationSummaryPlugin总结进行了调整之后,顺便给Semantic Kernel提了一个PR已经被采纳了,在此记录一下!

    image

    .Net: refactor : SummarizeConversation #6719

    HttpPlugin

    HttpPlugin插件属于Native Plugins原生插件。它提供了Http的功能,允许用户通过Http协议与外部进行交互。

    我们对这个插件的整体进行分析一下

    构造函数

    提供了两个构造函数。第一个构造函数没有参数,它调用了第二个构造函数,并传递null作为参数。

    第二个构造函数接受一个HttpClient类型的参数,如果未提供,则使用HttpClientProvider.GetHttpClient()方法获取一个新的HttpClient实例。

       public HttpPlugin() : this(null)
       {
       }
    
        [ActivatorUtilitiesConstructor]
        public HttpPlugin(HttpClient? client = null) =>
         this._client = client ?? HttpClientProvider.GetHttpClient();
    

    这里重点说一下第二个构造函数,支持HttpClient的构造函数,这就有更多的可玩性了,比如可以定义一个HttpclientHandler对请求进行添加自定义的HttpHeader或者进行参数的拼接转发等操作。

    Native functions

    GetAsync:发送一个HTTP GET请求,并返回响应体作为字符串。
    PostAsync:发送一个HTTP POST请求,带有请求体,并返回响应体作为字符串。
    PutAsync:发送一个HTTP PUT请求,带有请求体,并返回响应体作为字符串。
    DeleteAsync:发送一个HTTP DELETE请求,并返回响应体作为字符串。

    实战

    第一步需要安装Nuget 包

    NuGet\Install-Package Microsoft.SemanticKernel.Plugins.Core -Version 1.14.1-alpha
    

    该包目前只有预览版本,如果用VS的包管理器安装,那需要勾选包括预览发行版

    Semantic Kernel注册插件有两种方式:

    kernel.ImportPluginFromType();
    
    var httpclient = new HttpClient();
    kernel.ImportPluginFromObject(new HttpPlugin(httpclient));
    

    以上两种方式对应两种生命周期的注册

    创建的接口

    image

    这个接口都很简单 对我们Student对象的增删改查

    public class Student
    {
     
        public string Name { get; set; }
    
    
        public int Age { get; set; }
    
    }
    

    执行测试

    我们的测试程序还是以Semantic Kernel的会话服务,自动触发function calling的形式

    // Get chat completion service
    var chatCompletionService = kernel.GetRequiredService();
    
    // Start the conversation
    Console.Write("User > ");
    string? userInput;
    while ((userInput = Console.ReadLine()) is not null)
    {
        // Add user input
        history.AddUserMessage(userInput);
    
        // Enable auto function calling
        OpenAIPromptExecutionSettings openAIPromptExecutionSettings = new()
        {
            ToolCallBehavior = ToolCallBehavior.AutoInvokeKernelFunctions
        };
    
        // Get the response from the AI
        var result = await chatCompletionService.GetChatMessageContentAsync(
            history,
            executionSettings: openAIPromptExecutionSettings,
            kernel: kernel);
    
        // Print the results
        Console.WriteLine("Assistant > " + result);
    
        // Add the message from the agent to the chat history
        history.AddMessage(result.Role, result.Content ?? string.Empty);
    
        // Get user input again
        Console.Write("User > ");
    }
    
    

    Get请求测试

    User > 帮我向https://localhost:7014/Student发一个get请求
    Assistant > 向https://localhost:7014/Student发起GET请求后成功得到了响应,返回的数据显示包含了一个学生的信息。该学生名为 张三,年龄为16岁。这表明请求执行成功,获取到了预期的数据。
    

    Post请求测试

    HttpPlugin的这个功能比较鸡肋,可以看一下代码

     [KernelFunction]
     [Description("Makes a POST request to a uri")]
     public Task<string> PostAsync([Description("The URI of the request")] string uri, [Description("The body of the request")] string body, CancellationToken cancellationToken = default(CancellationToken))
     {
         return SendRequestAsync(uri, HttpMethod.Post, new StringContent(body), cancellationToken);
     }
    

    参数形式是new StringContent(body),也就是说MediaTypeHeaderValue媒体类型默认为 StringContent text/plain。

    Asp.Net Core 只能接收Post请求json格式的string,不能接收原始string
    即 content-type为text/plain的post请求,如果支持需要自定义实现没有提供对应的MediaTypeFormatter。

    所以说这个插件的Post请求场景局限,真正用到生产还需要自己去实现一个插件!!!

    User > 向https://localhost:7014/student 发一个post请求
    Assistant > 已成功向 https://localhost:7014/student 发送了 POST 请求。如果需要发送具体的数据,请提供要包含在请求体内的 JSON 数据。
    

    其他

    Put和Delete类似。

    最后

    可以借鉴HttpPlugin的实现思路在项目中灵活的运行,如果不支持那就可以自定义插件来完成需求的开发,还是比较期待这个插件能够更加完善的一点,在未来以更灵活的方式支持Post等请求的多种形式。

    本文来自博客园,作者:董瑞鹏,转载请注明原文链接:https://www.cnblogs.com/ruipeng/p/18266195

  • 相关阅读:
    Python中直接赋值、浅拷贝和深拷贝的区别
    [netcore] ASP.NET Core 中间件
    【递归、搜索与回溯算法】第一节.初识递归、搜索与回溯算法
    UI自动化测试中公认最佳的设计模式-POM
    硬盘格式化了怎么恢复数据
    SpringBoot整合WebSocket实战演练——Java入职十三天
    浅聊三种设计模式(单例、工厂、代理)
    C++:用CopyFileExA拷贝文件 (附完整源码)
    学了C++能做什么?
    软考证书具体用途--详细介绍
  • 原文地址:https://www.cnblogs.com/ruipeng/p/18266195
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号