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

semantic,kernel,httpplugin · 浏览次数 : 0

小编点评

前言 上一章我们熟悉了Semantic Kernel中的内置插件和对ConversationSummaryPlugin插件进行了实战。这一章我们将讲解另一个常用的内置插件HttpPlugin的应用。 HttpPlugin HttpPlugin是一个原生插件,提供了Http的功能,允许用户通过Http协议与外部进行交互。接下来我们将分析HttpPlugin的整体结构和使用方法。 构造函数 HttpPlugin类有两个构造函数: 1. 第一个构造函数没有参数,它会调用第二个构造函数,并传递null作为参数。 2. 第二个构造函数接受一个HttpClient类型的参数。如果未提供,则使用HttpClientProvider.GetHttpClient()方法获取一个新的HttpClient实例。 重点关注第二个构造函数,它支持HttpClient的实例化,增加了插件的灵活性。例如,可以定义一个HttpclientHandler对请求进行添加自定义的HttpHeader或者进行参数的拼接转发等操作。 Native functions HttpPlugin提供了以下四个原生函数: 1. GetAsync:发送一个HTTP GET请求,并返回响应体作为字符串。 2. PostAsync:发送一个HTTP POST请求,带有请求体,并返回响应体作为字符串。 3. PutAsync:发送一个HTTP PUT请求,带有请求体,并返回响应体作为字符串。 4. DeleteAsync:发送一个HTTP DELETE请求,并返回响应体作为字符串。 实战 第一步是安装Nuget包 安装Nuget包:Microsoft.SemanticKernel.Plugins.Core - Version 1.14.1-alpha。请注意,该包目前只有预览版本。如果使用VS的包管理器安装,需要勾选包括预览发行版。 注册插件 有两种方式注册HttpPlugin: 1. 使用kernel.ImportPluginFromType();创建接口并实例化。 2. 使用kernel.ImportPluginFromObject(new HttpPlugin(httpclient));从对象实例化。 测试 执行测试时,我们仍然使用Semantic Kernel的会话服务,并自动触发function calling形式。 1. 获取聊天完成服务:var chatCompletionService = kernel.GetRequiredService(); 2. 开始对话:Console.Write("User > "); 3. 循环获取用户输入并执行: * 添加用户输入:history.AddUserMessage(userInput); * 启用自动函数调用:OpenAIPromptExecutionSettings openAIPromptExecutionSettings = new(); * 设置工具调用行为:openAIPromptExecutionSettings.ToolCallBehavior = ToolCallBehavior.AutoInvokeKernelFunctions; * 获取AI响应:var result = await chatCompletionService.GetChatMessageContentAsync(history, executionSettings: openAIPromptExecutionSettings, kernel: kernel); * 打印结果:Console.WriteLine("Assistant > " + result); * 将消息添加到聊天历史:history.AddMessage(result.Role, result.Content ?? string.Empty); 4. 获取用户输入:Console.Write("User > "); 总结 本章节详细介绍了HttpPlugin插件的应用和功能。通过实战演练,我们了解了如何使用这个插件进行HTTP请求和响应。同时,我们也看到了插件在处理POST请求时的局限性,以及在项目中根据需求自定义插件的灵活性。希望这个插件能够在未来变得更加完善,以更灵活的方式支持更多请求类型。

正文

前言

上一章我们熟悉了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 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-typetext/plainpost请求,如果支持需要自定义实现没有提供对应的MediaTypeFormatter

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

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

其他

PutDelete类似。

最后

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

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

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

前言 上一章我们熟悉了Semantic Kernel中的内置插件和对ConversationSummaryPlugin插件进行了实战,本章我们讲解一下另一个常用的内置插件HttpPlugin的应用。 上一章对ConversationSummaryPlugin总结进行了调整之后,顺便给Semantic

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

前言 经过前几章的学习我们已经熟悉了Semantic Kernel 插件的概念,以及基于Prompts构造的Semantic Plugins和基于本地方法构建的Native Plugins。本章我们来讲解一下在Semantic Kernel 中内置的一些插件,让我们避免重复造轮子。 内置插件 Sem

探索Semantic Plugins:开启大模型的技能之门

前言 在之前的章节中我们或多或少的已经接触到了 Semantic Kernel 的 Plugins,本章我们讲详细介绍如何使用插件。 Semantic Kernel 的一大特点是拥有强大的插件,通过结合自定义/预定义的插件解决智能业务的问题。让传统的代码和智能插件一起工作灵活地接入到应用场景简化传统

探索 SK 示例 -- GitHub 存储库中的机器人

微软 3月22日 一篇文章“Semantic-kernel 嵌入和记忆:使用聊天UI探索GitHub Repos”[1] ,文章中进行了展示了嵌入,该文章解释了他们如何帮助开发人员提出有关GitHub存储库的问题或使用自然语言查询探索GitHub存储库。与嵌入一起,这是在SK存储器[2](嵌入集合)

探索Native Plugins:开启大模型的技能之门

前言 上一章节我们了解了一下Semantic Kernnel中Plugins插件的概念以及学习了的 Semantic Kernel 模板插件的创建,本章节我们来学习 Native Plugins 原生函数插件使用。 通过函数定义插件 在之前的章节中我们介绍过在在 Semantic Kernel 中应

.NET周报 【4月第1期 2023-04-02】

国内文章 探索 SK 示例 -- GitHub 存储库中的机器人 https://www.cnblogs.com/shanyou/p/17280627.html 微软 3月22日 一篇文章“Semantic-kernel 嵌入和记忆:使用聊天UI探索GitHub Repos”[1] ,文章中进行了展

文章《Semantic Kernel -- LangChain 的替代品?》的错误和疑问 探讨

微信公众号文章 Semantic Kernel —— LangChain 的替代品?[1] ,它使用的示例代码是Python ,他却发了这么一个疑问:支持的语言对比(因为 Semantic Kernel 是用 C#开发的,所以它对 C#比较支持)如上所示。不清楚 Semantic Kernel 为什

[转帖]探索惊群 ①

https://wenfh2020.com/2021/09/25/thundering-herd/ 惊群比较抽象,类似于抢红包 😁。它多出现在高性能的多进程/多线程服务中,例如:nginx。 探索惊群 系列文章将深入 Linux (5.0.1) 内核,透过 多进程模型 去剖析惊群现象、惊群原理、惊

基于 Cloudflare Workers 和 cloudflare-docker-proxy 搭建镜像加速服务

本文主要介绍了如何基于 Cloudflare Workers 和 cloudflare-docker-proxy 搭建 dockerhub、gcr、quay 等镜像加速服务。 最近,受限于各种情况,部分主流镜像站都关了,为了能够正常使用,建议自己搭建一个加速器。 写文之前,也已经部署好了一个,可以直

探索Web Components

这篇文章介绍了Web Components技术,它允许开发者创建可复用、封装良好的自定义HTML元素,并直接在浏览器中运行,无需依赖外部库。通过组合HTML模板、Shadow DOM、自定义元素和HTML imports,Web Components增强了原生DOM的功能,提高了组件化开发的封装性和...