(5)SK插件
- 什么是AI插件?
使用人工智能插件的目的是通过利用人工智能能力来增强软件应用程序的功能。人工智能插件可以提供各种功能,如自然语言处理、图像识别、预测分析等。
通过将AI插件集成到应用程序中,您可用为您的应用提供更智能的功能,从而提高用户体验。
下面我们会通过一些案例来了解插件的使用方法。
准备工作
创建一个名称为4_SK_Plugin
的控制台项目
复制以下代码到4_SK_Plugin
项目文件中
xml
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.SemanticKernel" Version="1.12.0" />
</ItemGroup>
</Project>
创建OpenAIHttpClientHandler.cs
csharp
namespace ConsoleApp1;
public class OpenAIHttpClientHandler : HttpClientHandler
{
private readonly string _uri;
public OpenAIHttpClientHandler(string uri) => _uri = uri.TrimEnd('/');
protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request,
CancellationToken cancellationToken)
{
UriBuilder uriBuilder;
if (request.RequestUri?.LocalPath == "/v1/chat/completions")
{
uriBuilder = new UriBuilder(_uri + "/v1/chat/completions");
request.RequestUri = uriBuilder.Uri;
}
else if (request.RequestUri?.LocalPath == "/v1/embeddings")
{
uriBuilder = new UriBuilder(_uri + "/v1/embeddings");
request.RequestUri = uriBuilder.Uri;
}
return await base.SendAsync(request, cancellationToken);
}
}
时间插件
由于大模型通常都是训练好的,所以当您询问时间时,大模型可能无法回答您的问题,所以我们需要一个时间插件来帮助我们回答时间问题。
打开Program.cs
csharp
using System.ComponentModel;
using ConsoleApp1;
using Microsoft.SemanticKernel;
using Microsoft.SemanticKernel.ChatCompletion;
using Microsoft.SemanticKernel.Connectors.OpenAI;
var kernel = Kernel.CreateBuilder()
.AddOpenAIChatCompletion(
modelId: "gpt-3.5-turbo",
apiKey: "这里填写在https://api.token-ai.cn/创建的令牌",
httpClient: new HttpClient(new OpenAIHttpClientHandler("https://api.token-ai.cn/")))
.Build();
// 加载时间插件
kernel.Plugins.AddFromType<TimeInformationPlugin>();
// 获取聊天完成服务
var chatCompletionService = kernel.GetRequiredService<IChatCompletionService>();
// 启用自动函数调用
OpenAIPromptExecutionSettings openAIPromptExecutionSettings = new()
{
ToolCallBehavior = ToolCallBehavior.AutoInvokeKernelFunctions
};
ChatHistory chatHistory = [];
string? input = null;
chatHistory.AddUserMessage("现在几点了?");
var chatResult = await chatCompletionService.GetChatMessageContentAsync(chatHistory, openAIPromptExecutionSettings, kernel);
Console.Write($"\nAssistant > {chatResult}\n");
/// <summary>
///一个返回当前时间的插件。
/// </summary>
public class TimeInformationPlugin
{
/// <summary>
/// 以UTC检索当前时间。
/// </summary>
/// <returns>UTC格式的当前时间。</returns>
[KernelFunction, Description("UTC格式的当前时间。")]
public string GetCurrentUtcTime()
=> DateTime.UtcNow.ToString("R");
}
在上面的代码中,我们创建了一个时间插件,这个插件可以返回当前的UTC时间。
然后将插件加载到kernel
中,然后我们询问了现在几点了?
的问题,AI会返回当前的UTC时间。
在这个过程中AI的流程如下图所示:
天气插件
准备工作
打开https://www.seniverse.com/注册一个账号,然后复制密钥。
打开Program.cs
csharp
using System.ComponentModel;
using ConsoleApp1;
using Microsoft.SemanticKernel;
using Microsoft.SemanticKernel.ChatCompletion;
using Microsoft.SemanticKernel.Connectors.OpenAI;
var kernel = Kernel.CreateBuilder()
.AddOpenAIChatCompletion(
modelId: "gpt-3.5-turbo",
apiKey: "这里填写在https://api.token-ai.cn/创建的令牌",
httpClient: new HttpClient(new OpenAIHttpClientHandler("https://api.token-ai.cn/")))
.Build();
// 加载时间插件
kernel.Plugins.AddFromType<WeatherInformationPlugin>();
// 获取聊天完成服务
var chatCompletionService = kernel.GetRequiredService<IChatCompletionService>();
// 启用自动函数调用
OpenAIPromptExecutionSettings openAIPromptExecutionSettings = new()
{
ToolCallBehavior = ToolCallBehavior.AutoInvokeKernelFunctions
};
ChatHistory chatHistory = [];
string? input = null;
chatHistory.AddUserMessage("深圳今天天气怎么样?");
var chatResult =
await chatCompletionService.GetChatMessageContentAsync(chatHistory, openAIPromptExecutionSettings, kernel);
Console.Write($"\nAssistant > {chatResult}\n");
/// <summary>
///一个返回当前时间的插件。
/// </summary>
public class WeatherInformationPlugin : IDisposable
{
private readonly HttpClient client;
public WeatherInformationPlugin()
{
this.client = new HttpClient();
}
/// <summary>
/// 以UTC检索当前时间。
/// </summary>
/// <returns>UTC格式的当前时间。</returns>
[KernelFunction, Description("获取指定的城市今天天气。")]
public async Task<string> GetCityWeather([Description("指定的城市")]string city)
{
string url = $"https://api.seniverse.com/v3/weather/now.json?key=您的key&location={city}&language=zh-Hans&unit=c";
var response = await client.GetAsync(url);
var content = await response.Content.ReadAsStringAsync();
return content;
}
public void Dispose()
{
client.Dispose();
}
}
结果输出:
shell
Assistant > 今天深圳的天气是阴,气温为25摄氏度,体感温度为27摄氏度,湿度为75%,能见度为30.0公里,东风风速为10.0级。
在上面的代码中我们创建了WeatherInformationPlugin
插件,这个插件可以返回指定城市的天气信息,在这个WeatherInformationPlugin
类型中我们提供了一个GetCityWeather
方法,这个方法我们通过Description
对这个function进行描述如果你需要更好的效果,对于这个描述需要更详细的描述作用,比如现在的描述获取指定的城市今天天气。
。然后方法的参数city
作为入参也需要进行描述,这个描述是指定的城市
。然后我们通过HttpClient
来请求https://www.seniverse.com/的API来获取天气信息。
在这个过程中AI的流程如下图所示:
免费开放的SK AI教程站点:https://docs.token-ai.cn/
OpenAI官方API价格的六折站点:https://api.token-ai.cn/
AI学习qq交流群:961090189