经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » ASP.net » 查看文章
探索Semantic Kernel内置插件:深入了解HttpPlugin的应用
来源:cnblogs  作者:董瑞鹏  时间:2024/6/25 9:05:21  对本文有异议

前言

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

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

image

.Net: refactor : SummarizeConversation #6719

HttpPlugin

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

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

构造函数

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

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

  1. public HttpPlugin() : this(null)
  2. {
  3. }
  4. [ActivatorUtilitiesConstructor]
  5. public HttpPlugin(HttpClient? client = null) =>
  6. this._client = client ?? HttpClientProvider.GetHttpClient();

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

Native functions

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

实战

第一步需要安装Nuget

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

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

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

  1. kernel.ImportPluginFromType<HttpPlugin>();
  1. var httpclient = new HttpClient();
  2. kernel.ImportPluginFromObject(new HttpPlugin(httpclient));

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

创建的接口

image

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

  1. public class Student
  2. {
  3. public string Name { get; set; }
  4. public int Age { get; set; }
  5. }

执行测试

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

  1. // Get chat completion service
  2. var chatCompletionService = kernel.GetRequiredService<IChatCompletionService>();
  3. // Start the conversation
  4. Console.Write("User > ");
  5. string? userInput;
  6. while ((userInput = Console.ReadLine()) is not null)
  7. {
  8. // Add user input
  9. history.AddUserMessage(userInput);
  10. // Enable auto function calling
  11. OpenAIPromptExecutionSettings openAIPromptExecutionSettings = new()
  12. {
  13. ToolCallBehavior = ToolCallBehavior.AutoInvokeKernelFunctions
  14. };
  15. // Get the response from the AI
  16. var result = await chatCompletionService.GetChatMessageContentAsync(
  17. history,
  18. executionSettings: openAIPromptExecutionSettings,
  19. kernel: kernel);
  20. // Print the results
  21. Console.WriteLine("Assistant > " + result);
  22. // Add the message from the agent to the chat history
  23. history.AddMessage(result.Role, result.Content ?? string.Empty);
  24. // Get user input again
  25. Console.Write("User > ");
  26. }

Get请求测试

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

Post请求测试

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

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

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

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

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

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

其他

PutDelete类似。

最后

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

原文链接:https://www.cnblogs.com/ruipeng/p/18266195

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号