(5)SK插件

(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

相关推荐
unicrom_深圳市由你创科技3 小时前
工业上位机,用Python+Qt还是C#+WPF?
python·qt·c#
偶尔的鼠标人14 小时前
Avalonia DataGrid 控件的LostFocus事件会多次触发
开发语言·c#
ytttr87314 小时前
C# 仿QQ聊天功能实现 (SQL Server数据库)
数据库·oracle·c#
future_studio16 小时前
聊聊 Unity(小白专享、C# 小程序 之 图片播放器)
unity·小程序·c#
c#上位机1 天前
wpf中Grid的MouseDown 事件无法触发的原因
c#·wpf
CodeCraft Studio1 天前
国产化PDF处理控件Spire.PDF教程:如何在 C# 中从 HTML 和 PDF 模板生成 PDF
pdf·c#·html·.net·spire.pdf·pdf文档开发·html创建模板pdf
ysdysyn1 天前
.NET 10深度解析:性能革新与开发生态的全新篇章
c#·.net
L X..1 天前
Unity 光照贴图异常修复笔记
unity·c#·游戏引擎
reasonsummer1 天前
【办公类-115-06】20250920职称资料上传04——docx复制、docx转PDF(课程表11个)
开发语言·windows·python·c#
William_cl2 天前
一、前置基础(MVC学习前提)_核心特性_【C# 泛型入门】为什么说 List<T>是程序员的 “万能收纳盒“?避坑指南在此
学习·c#·mvc