Semantic Kernel介绍
语义内核是一种轻型开源开发工具包,可用于轻松生成 AI 代理并将最新的 AI 模型集成到 C#、Python 或 Java 代码库中。 它充当一个高效的中间件,可实现企业级解决方案的快速交付。
更多内容:https://learn.microsoft.com/zh-cn/semantic-kernel/overview/
ChatGLM介绍
中文名:智谱清言,是大语言模型,类似的还有豆包、通义千问等等。让它自己介绍下吧。
我是 ChatGLM,一个由智谱 AI 公司精心打造的人工智能助手。我的核心是一个基于深度学习的语言模型,经过大量数据和算法的训练,我能够理解和生成自然语言,从而与用户进行流畅的对话。我的设计初衷是为了提供信息查询、知识解答、文本生成和日常交流等服务。
选择它的原因是,智谱有免费的模型:glm-4-flash。方便大家可以尝试。
开始
注册并获取模型apikeys
网站链接:https://www.bigmodel.cn/
邀请链接:注册即可获得额外GLM-4-Air 2000万Tokens好友专属福利
小伙伴们可以通过网站链接,进行注册,也可以通过邀请链接,互惠互利。不影响后续教程。
注册完成以后,前往APIkeys 设置
添加完API keys后,可以在下面的列表中进行复制。
示例
使用微软官方提供的快速入门指南示例。使用python的小伙伴,看到这里可以离开自行研究了。以下我使用C#来演示。
打开Visual Studio,新建一个控制台项目。通过Nuget安装包:Microsoft.SemanticKernel
打开Program.cs,代码修改如下:
// Import packages
using System.ComponentModel;
using System.Text.Json.Serialization;
using Microsoft.SemanticKernel;
using Microsoft.SemanticKernel.ChatCompletion;
using Microsoft.SemanticKernel.Connectors.OpenAI;
internal class Program
{
private static async Task Main(string[] args)
{
var httpclient = new HttpClient(new GlmHttpHandler());
// 使用 OpenAI 聊天完成创建内核
var builder = Kernel.CreateBuilder().AddOpenAIChatCompletion("glm-4-flash", <使用上面智谱的api keys>, httpClient: httpclient);
// Build the kernel
Kernel kernel = builder.Build();
var chatCompletionService = kernel.GetRequiredService<IChatCompletionService>();
// 添加插件(LightsPlugin 类定义如下)
kernel.Plugins.AddFromType<LightsPlugin>("Lights");
OpenAIPromptExecutionSettings openAIPromptExecutionSettings = new()
{
FunctionChoiceBehavior = FunctionChoiceBehavior.Auto()
};
// 创建聊天上下文
var history = new ChatHistory();
string? userInput;
do
{
// 用户消息
Console.Write("User > ");
userInput = Console.ReadLine();
// 添加用户消息到聊天上下文
history.AddUserMessage(userInput);
// 获取AI响应
var result = await chatCompletionService.GetChatMessageContentAsync(
history,
executionSettings: openAIPromptExecutionSettings,
kernel: kernel);
// 打印结果
Console.WriteLine("Assistant > " + result);
// 将来自AI的响应消息添加到聊天上下文
history.AddMessage(result.Role, result.Content ?? string.Empty);
}
while (userInput is not null);
}
}
public class GlmHttpHandler : HttpClientHandler
{
protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
request.RequestUri = new Uri("https://open.bigmodel.cn/api/paas/v4/chat/completions");
return base.SendAsync(request, cancellationToken);
}
}
public class LightsPlugin
{
// Mock data for the lights
private readonly List<LightModel> lights = new()
{
new LightModel { Id = 1, Name = "Table Lamp", IsOn = false },
new LightModel { Id = 2, Name = "Porch light", IsOn = false },
new LightModel { Id = 3, Name = "Chandelier", IsOn = true }
};
[KernelFunction("get_lights")]
[Description("Gets a list of lights and their current state")]
[return: Description("An array of lights")]
public async Task<List<LightModel>> GetLightsAsync()
{
return lights;
}
[KernelFunction("change_state")]
[Description("Changes the state of the light")]
[return: Description("The updated state of the light; will return null if the light does not exist")]
public async Task<LightModel?> ChangeStateAsync(int id, bool isOn)
{
var light = lights.FirstOrDefault(light => light.Id == id);
if (light == null)
{
return null;
}
// Update the light with the new state
light.IsOn = isOn;
return light;
}
}
public class LightModel
{
[JsonPropertyName("id")]
public int Id { get; set; }
[JsonPropertyName("name")]
public string Name { get; set; }
[JsonPropertyName("is_on")]
public bool? IsOn { get; set; }
}
测试结果:
User > 我有灯吗
Assistant > 根据查询结果,您有3盏灯,分别是台灯、门廊灯和吊灯。其中,台灯和门廊灯目前处于关闭状态,而吊灯处于开启状态。
User > 打开台灯
Assistant > 已成功打开台灯。
User > 查看灯的状态
Assistant > 当前灯的状态如下:台灯开启,门廊灯关闭,吊灯开启。
User > 关闭路灯
Assistant > 已成功关闭门廊灯。
User > 关闭车灯
Assistant > 您没有提到具体的车灯类型,请问您想要关闭哪种车灯?例如,前大灯、尾灯还是雾灯?
User > 前大灯
Assistant > 请问您现在是否已经关闭了前大灯?
User > 你帮我看看
Assistant > 根据查询结果,目前没有找到与车灯相关的设备信息。请问您是否确认要关闭车灯?
User > 确认
Assistant > 很抱歉,我们无法控制车灯的开关。如果您需要关闭车灯,请手动操作。
当你询问与灯相关的问题时,大模型会去调用灯的相关函数来补充回答,小伙伴们可以发挥想象,玩一玩。