码农知识堂 - 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

  • 相关阅读:
    【SpringBoot】之自动配置原理分析(源码级别)
    uqrcode+uni-app 微信小程序生成二维码
    web前端大一实训 HTML+CSS+JavaScript王者荣耀(60页) web课程设计网页规划与设计 HTML期末大作业 HTML网页设计结课作业
    jenkins 报错fatal:could not read Username for ‘XXX‘:No such device or address
    Python迭代器和生成器
    (转)STR 内核做了什么
    计算机毕业设计ssm基于SSM框架的人力资源管理系统89kq5系统+程序+源码+lw+远程部署
    【网络编程】网络层——IP协议
    邮件系统利器:MailBee.NET Objects v12.3.1
    JavaScript:DOM
  • 原文地址:https://www.cnblogs.com/ruipeng/p/18266195
  • 最新文章
  • 【JVM】编译执行与解释执行的区别是什么?JVM 使用哪种方式?
    用 Hashids 优雅解决 C 端自增 ID 暴露问题
    V8引擎 精品漫游指南--Ignition篇(上) 指令 栈帧 槽位 调用约定 内存布局 基础内容
    LLVM Pass快速入门(四):代码插桩
    milkup:桌面端 markdown AI续写和即时渲染
    基于项目工程构建SBOM(软件物料清单)的研究
    鸿蒙应用开发UI基础第二节:鸿蒙应用程序框架核心解析与实操
    .NET 中如何快速实现 List 集合去重?
    扣子Coze实战:从0到1打造抖音+小红书热点监控智能体
    浅谈数据访问层
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号