使用 SK Plugin 给 LLM 添加能力

前几篇我们介绍了如何使用 SK + ollama 跟 LLM 进行基本的对话。如果只是对话的话其实不用什么 SK 也是可以的。今天让我们给 LLM 整点活,让它真的给我们干点啥。

What is Plugin?

Plugins are a key component of Semantic Kernel. If you have already used plugins from ChatGPT or Copilot extensions in Microsoft 365, you’re already familiar with them. With plugins, you can encapsulate your existing APIs into a collection that can be used by an AI. This allows you to give your AI the ability to perform actions that it wouldn’t be able to do otherwise.
Behind the scenes, Semantic Kernel leverages function calling, a native feature of most of the latest LLMs to allow LLMs, to perform planning and to invoke your APIs. With function calling, LLMs can request (i.e., call) a particular function. Semantic Kernel then marshals the request to the appropriate function in your codebase and returns the results back to the LLM so the LLM can generate a final response.

以上是微软文档的原话。说人话:
Plugins 是 SK 的关键组件。基于 Plugins 你可以封装已有的 API 给 AI 使用。这给了 AI 执行动作的能力。在背后,SK 利用了大多数最新大语言模型 (LLMs) 的本地功能调用功能,使LLMs能够进行规划并调用您的API。通过功能调用,LLMs可以请求(即调用)特定的函数。然后,Semantic Kernel 将请求传递给代码库中的相应函数,并将结果返回给LLM,以便LLM生成最终的响应。
说的更直白一点,Plugins 给 LLM 提供了方法调用的能力。这就比较有意思了。我们知道 LLM 是基于过往的内容训练出来的,也就是说 LLM 并不能回答当前的一些信息,因为它不知道。比如你问它今天有什么新闻,它肯定不知道,因为这不在它的训练集里面。或者你问它今天天气怎么样它也不知道。同样它也没有办法给你做一些特定领域的事情,比如你让他们给某某发一条短信,它做不到,因为它没有这个能力。但是现在有了 Plugin,这一切就有了可能。

以下让我们使用 SK + Plugin 给 LLM 添加感知天气的能力。当我们问 LLM 某个城市的天气的时候,它能精确的给出回答。
在我们开始之前还是先试试直接问 LLM 天气问题会得到什么结果:

可以看到当我问 What is the weather now of SuZhou ? 后 LLM 直接说它不能获得实时数据。

定义 WeatherPlugin

using System.ComponentModel;
using Microsoft.SemanticKernel;namespace SKLearning
{public sealed class WeatherPlugin{[KernelFunction, Description("Gets the weather details of a given location")][return: Description("Weather details")]        public static async Task<string> GetWeatherByLocation([Description("name of the location")]string location){var key = "...";var url = @$"http://api.weatherapi.com/v1/current.json?key={key}&q={location}";using var client = new HttpClient();var response = await client.GetAsync(url);var content = await response.Content.ReadAsStringAsync();Console.WriteLine(content);return content;}}
}

一个 plugin 就是一个 C# 的类。在这个类里面承载了一个或N个方法。我们给方法添加描述,给入参,出参添加描述好让 LLM 认识这个方法的作用。这个描述非常重要,请使用尽量简洁明了的语言。
我们可以看到 WeatherPlugin 里的 GetWeatherByLocation 是通过要给 API 实时获取某个城市的天气信息。这个返回值是 JSON 格式的,并不需要进行特殊的处理,LLM 可以直接识别里面的内容。

添加 Plugin 到 kernel

var httpClient = new HttpClient();
var builder = Kernel.CreateBuilder().AddOpenAIChatCompletion(modelId: modelId!, apiKey: null, endpoint: endpoint, httpClient: httpClient);
var kernel = builder.Build();
kernel.Plugins.AddFromType<WeatherPlugin>();

以上代码片段演示了如何添加 OpenAI 的 Chat 服务以及如何添加 Plugin 。

与 AI 对话

var settings = new OpenAIPromptExecutionSettings(){ Temperature = 0.0, ToolCallBehavior = ToolCallBehavior.AutoInvokeKernelFunctions };
var chatCompletionService = kernel.GetRequiredService<IChatCompletionService>();
var history = new ChatHistory();
var initMessage ="I am a weatherman. I can tell you the weather of any location. Try asking me about the weather of a location.";
history.AddSystemMessage(initMessage);
Console.WriteLine(initMessage);while (true)
{Console.BackgroundColor = ConsoleColor.Black;Console.Write("You:");var input = Console.ReadLine();if (string.IsNullOrWhiteSpace(input)){break;}history.AddUserMessage(input);// Get the response from the AIvar contents = await chatCompletionService.GetChatMessageContentsAsync(history, settings, kernel);foreach (var chatMessageContent in contents){var content = chatMessageContent.Content;Console.BackgroundColor = ConsoleColor.DarkGreen;Console.WriteLine($"AI: {content}");history.AddMessage(chatMessageContent.Role, content ?? "");}
}

以上内容跟上次演示的内容没啥特别大的区别,无非就是读取用户的输入,等待 LLM 的回答。

试一下

让我们运行程序,然后再次问 What is the weather now of SuZhou?
可以看到 LLM 精确的回答出了当前苏州的天气:

I am a weatherman. I can tell you the weather of any location. Try asking me about the weather of a location.

You: What is the weather now of SuZhou?

AI: The current weather in Suzhou, China is patchy light drizzle with a temperature of 17.2°C (62.9°F). The wind is blowing at 3.6 mph (5.8 kph) from the NNE direction. The humidity is 86% and the visibility is 5 km (3 miles).

总结

通过以上演示,我们自定义了一个实时获取天气信息的 plugin 给 LLM 使用。当我们问到天气信息的时候 LLM 会实时调用这个方法,然后使用方法结果构造一个可读性非常高的回答。有了 plugin 之后 LLM 真正的可以触发一些动作,执行一些任务,获取实时信息了。

希望此文对你有所帮助,谢谢。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

FreeNAS 11.2-U6 简易上手指南

NAS是一个网络附属存储管理器,简单的可以理解为一个可以将数据存储至网络设备的服务。 NAS一般都会支持数据冗余、日志、压缩以及校验等功能。 国内最出名的应该就是群晖的系统了,当然我们这里主要讲解的是FreeNAS。 FreeNAS是一个基于FreeBSD进行二次开发的开源NAS系统,其支…

WhyNotWin11(win11检测工具)

微软官方Windows11检测工具写的太烂,第三方作者开发了一个,软件给每一项都标注了功能,通过了显示绿色,没通过显示红色。Windows目前不支持6、7代处理器。另外,主板不支持加密TPM2.0加密的也不行,不过这个TPM加密,估计后面会妥协,哦不,所有的都会妥协。获取地址:https…

vue基础语法

1、插值语法 <!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><title>插值语法</title><script src="../vu/js/vue.js"></script> </head> <body><!--插值语法示…

Luogu P4287 SHOI2011 双倍回文 题解 [ 紫 ] [ manacher ]

manacher 经典结论。双倍回文:回文子串结论的经典应用。 结论 先放本题最关键的结论:一个字符串本质不同的回文子串最多只有 \(n\) 个。 考虑如何证明: 假设我们一个一个地在当前字符串(黑色部分)的结尾加入字符(红色部分),那么会出现如下情况:显然,加入红色字符后,…

傲梅轻松备份(系统备份还原)v7.4.1 技术师增强版

傲梅轻松备份是由傲梅官方推出的电脑上一键备份系统工具,有着业界最快的备份速度,能够瞬间将电脑上的系统备份下来,方便用户下次系统一键还原。傲梅轻松备份专业版专业解决用户的备份系统不会、磁盘备份不会、文件备份太麻烦等等各种问题,简化了整个备份的流程,加快了备份…

Python多分类Logistic回归详解与实践

在机器学习中,Logistic回归是一种基本但非常有效的分类算法。它不仅可以用于二分类问题,还可以扩展应用于多分类问题。本文将详细介绍如何使用Python实现一个多分类的Logistic回归模型,并给出详细的代码示例。在机器学习中,Logistic回归是一种基本但非常有效的分类算法。它…

【STC8H】STC8 系列单片机低功耗延时方法

STC8 单片机低功耗延时方法 单片机延时通常方法就是跑while循环,但在低功耗要求下可以利用定时唤醒方式使MCU在延时期间睡眠,降低功耗。以STC8G1K08为例: 寄存器 WKTCH^8为使能,其余15位用于控制唤醒时间。并且在唤醒后系统会继续从掉电语句的下一句执行。延时计算 按照公式…

C盘注册表优化清理工具!Wise Registry Cleaner v11.1.9.724

Wise Registry Cleaner是一款优化电脑性能的软件,通过清理注册表中的无效和过时信息来提升计算机运行速度。它能快速扫描并安全清理垃圾文件,同时优化PC。软件具备一键撤销更改和注册表备份功能,确保操作安全。最新版本改进了清理规则,增加了优化项目,并解决了特定软件兼容…

winrar(解压工具-含电脑版和手机版)

winrar,全球使用人数最多解压工具 winrar 烈火汉化无广告版(含电脑版和手机版),一款在官方原版的基础上注册破/解winrar64位去广告版,安装即可使用,不需要使用注册码及key文件,非常简单易用,欢迎有需要的朋友们前来下载使用。另:程序容易被杀毒软件误报,但亲测无毒可…

JVM实战—9.线上FGC的几种案例

大纲 1.如何优化每秒十万QPS的社交APP的JVM性能(增加S区大小 + 优化内存碎片) 2.如何对垂直电商APP后台系统的FGC进行深度优化(定制JVM参数模版) 3.不合理设置JVM参数可能导致频繁FGC(优化反射的软引用被每次YGC回收) 4.线上系统每天数十次FGC导致频繁卡顿的优化(大对象问题) 5…

Unity 中一些常见的富文本标签

Unity 支持的富文本标签主要用于在 Text 和 TextMeshPro 中格式化和控制文本的显示效果。以下是 Unity 中一些常见的富文本标签: 1. 字体样式 <b> 和 </b>: 粗体 <i> 和 </i>: 斜体 <u> 和 </u>: 下划线 <s> 和 </s>: 删除线…

WinMemoryCleaner 电脑内存清理工具

告别卡顿,让电脑飞起来! 这款免费的 RAM 清理器利用了本机 Windows 功能来清理内存区域。有时候,程序在运行结束后并不会释放分配给它的内存,这会导致计算机的性能下降。换句话说,当你使用 Windows Memory Cleaner 来优化内存时,可以继续进行其他工作,而无需浪费时间重新…