探索Semantic Kernel内置插件:深入了解HttpPlugin的应用

news/2024/9/20 7:47:01

前言

上一章我们熟悉了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<HttpPlugin>();
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<IChatCompletionService>();// Start the conversation
Console.Write("User > ");
string? userInput;
while ((userInput = Console.ReadLine()) is not null)
{// Add user inputhistory.AddUserMessage(userInput);// Enable auto function callingOpenAIPromptExecutionSettings openAIPromptExecutionSettings = new(){ToolCallBehavior = ToolCallBehavior.AutoInvokeKernelFunctions};// Get the response from the AIvar result = await chatCompletionService.GetChatMessageContentAsync(history,executionSettings: openAIPromptExecutionSettings,kernel: kernel);// Print the resultsConsole.WriteLine("Assistant > " + result);// Add the message from the agent to the chat historyhistory.AddMessage(result.Role, result.Content ?? string.Empty);// Get user input againConsole.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-typetext/plainpost请求,如果支持需要自定义实现没有提供对应的MediaTypeFormatter

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

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

其他

PutDelete类似。

最后

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/47554.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

【转载】Unity Shader - 在 URP 获取 Ambient(环境光) 颜色

转自 https://blog.csdn.net/linjf520/article/details/120783291之前在 Unity Built-in 管线中,我们在自定义 shader 中,可以使用一下代码来获取 Ambient 环境光的颜色: fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.rgb但是在 Unity URP 中,发现不生效了,虽然 URP 中也有…

振弦采集仪在地铁隧道工程安全监测中的应用实践

振弦采集仪在地铁隧道工程安全监测中的应用实践 河北稳控科技振弦采集仪是一种常用于结构监测领域的仪器,主要用于测量结构物振动的频率、幅值、相位以及动力特性等参数。在地铁隧道工程的安全监测中,振弦采集仪起着关键的作用。 随着城市的不断发展,地铁隧道工程在城市建设…

国内docker镜像仓库

由于不可抗因素,国内dokcer的镜像都下架了,然后国内推出了自己的镜像仓库 https://atomhub.openatom.cn 截至目前336个镜像,也是搞笑,后面会越来越多。。。。。编辑Docker配置文件: 打开或创建 /etc/docker/daemon.json 文件 {"registry-mirrors": ["https:…

免费且离线的同声翻译利器「GitHub 热点速览」

开源的翻译软件众多,但大多数依赖于翻译 API 服务,因此就需要联网、有次数限制、并非完全免费。然后,本周上榜的是一款可以离线使用的 Android 翻译软件:RTranslator,它创建于 4 年前,最初也是基于谷歌翻译 API 开发,但在上周发布的 2.0 版本中,采用了全新的 NLLB+Whis…

【主流技术】聊一聊消息队列 RocketMQ 的基本结构与概念

RocketMQ 是阿里巴巴在 2012 年开源的分布式消息中间件,目前已经捐赠给 Apache 软件基金会,并于 2017 年 9 月 25 日成为 Apache 的顶级项目。作为经历过多次阿里巴巴双十一这种“超级工程”的洗礼并有稳定出色表现的国产中间件,以其高性能、低延时和高可靠等特性近年来已经…

.NET使用CsvHelper快速读取和写入CSV文件

前言 在日常开发中使用CSV文件进行数据导入和导出、数据交换是非常常见的需求,今天我们来讲讲在.NET中如何使用CsvHelper这个开源库快速实现CSV文件读取和写入。 CsvHelper类库介绍 CsvHelper是一个.NET开源、快速、灵活、高度可配置、易于使用的用于读取和写入CSV文件的类库。…

2. RequestMapping注解

1. RequestMapping的作用 ​@RequestMapping​ 注解是 Spring MVC 框架中的一个控制器映射注解,用于将请求映射到相应的处理方法上。具体来说,它可以将指定 URL 的请求绑定到一个特定的方法或类上,从而实现对请求的处理和响应。 2. RequestMapping的出现位置 ​​ 通过Reque…

1. 初始SpringMVC

1. 学习本套教程前的知识储备JavaSE HTML+CSS+JavaScript Vue AJAX + axios Thymeleaf Servlet Maven Spring2. 什么是MVC MVC架构模式相关课程,在老杜的JavaWeb课程中已经详细的讲解了,如果没有学过的,可以看这个视频:https://www.bilibili.com/video/BV1Z3411C7NZ MVC是一…