.NET Core C#系列之 Semantic Kernel Prompt提示词高级教程

摘要:在平常使用的时候,我们通常会利用Prompt为我们处理业务数据或者帮我们处理一些数据模型,也可以通过Prompt来实现一些高级的功能,下面我们通过一个案例来了解Semantic Kernel的对话提示功能和一些高级的用法。利用Prompt帮我整理用户信息很多场

在平常使用的时候,我们通常会利用Prompt为我们处理业务数据或者帮我们处理一些数据模型,也可以通过Prompt来实现一些高级的功能,下面我们通过一个案例来了解Semantic Kernel的对话提示功能和一些高级的用法。利用Prompt帮我整理用户信息很多场景下我们对于利用AI做应用处理的时候都会使用用户的信息,但是用户的信息是非常多的,我们需要对用户的信息进行整理,下面我们通过一个案例来了解如何利用Prompt帮我们整理用户的信息。创建一个控制台的项目打开Visual Studio 2022,然后创建一个名称为4_Chat_Prompts的控制台项目然后复制以下代码到4_Chat_Prompts项目文件中 Exe net8.0 _4_Chat_Prompts enable enable 创建一个Kernel然后复制上一个教程的OpenAIHttpClientHandler.cs到4_Chat_Prompts项目文件中。点我跳转打开Program.cs然后复制以下代码到Program.csusing System.Text.json;using ConsoleApp1;using Microsoft.SemanticKernel;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;string info = @" 张飞 | 项目 | 信息 | | ---- | ---- | | 名字 | 张飞 | | 字号 | 益德 | | 出生日期 | 未知 | | 出生地 | 涿郡 | | 职业 | 汉末群雄、蜀汉五虎上将之一 | | 主要成就 | 蜀汉五虎上将之一,曾任益州牧,有勇猛之名 | | 逝世日期 | 221年 | | 主要关系 | 刘备的结义兄弟,关羽的结义兄弟 | 刘备 | 项目 | 信息 | | ---- | ---- | | 名字 | 刘备 | | 字号 | 玄德 | | 出生日期 | 161年 | | 出生地 | 涿郡 | | 职业 | 汉朝皇帝,蜀汉政权创立者 | | 主要成就 | 三国时期蜀汉的建立者和首任皇帝,有仁德之名 | | 逝世日期 | 223年 | | 主要关系 | 张飞和关羽的结义兄弟 | 关羽 | 项目 | 信息 | | ---- | ---- | | 名字 | 关羽 | | 字号 | 云长 | | 出生日期 | 未知 | | 出生地 | 河东解县 | | 职业 | 汉末群雄、蜀汉五虎上将之一 | | 主要成就 | 蜀汉五虎上将之一,曾任荆州牧,有忠义之名 | | 逝世日期 | 219年 | | 主要关系 | 刘备的结义兄弟,张飞的结义兄弟 | ";var promptTemplate = @" ## 用户信息: {{$input}} ## 要求: - 您需要帮我将用户的名字,字号,出生日期,出生地,职业,主要成就,逝世日期,主要关系转换成到我提供的下面类中,以便让我支持序列化 - 您不需要返回任何的回复,只返回json字符串防止序列化错误 - 如果是多个请用包裹,然后你不要在外面多对象包括,我需要的结果是只返回 [{}] 这种效果。 public class Info { /// /// 获取或设置名字。 /// public string Name { get; set; } /// /// 获取或设置字号。 /// public string Alias { get; set; } /// /// 获取或设置出生日期。 /// public string BirthDate { get; set; } /// /// 获取或设置出生地。 /// public string BirthPlace { get; set; } /// /// 获取或设置职业。 /// public string Occupation { get; set; } /// /// 获取或设置主要成就。 /// public string MainAchievement { get; set; } /// /// 获取或设置逝世日期。 /// public string DeathDate { get; set; } } ";var kernelArguments = new KernelArguments{ ["input"] = info,};var json = await kernel.InvokePromptAsync(promptTemplate, kernelArguments);var values = JsonSerializer.Deserialize(json.ToString);foreach (var value in values){ Console.WriteLine($"Name: {value.Name}"); Console.WriteLine($"Alias: {value.Alias}"); Console.WriteLine($"BirthDate: {value.BirthDate}"); Console.WriteLine($"BirthPlace: {value.BirthPlace}"); Console.WriteLine($"Occupation: {value.Occupation}"); Console.WriteLine($"MainAchievement: {value.MainAchievement}"); Console.WriteLine($"DeathDate: {value.DeathDate}"); Console.WriteLine;}public class Info{ /// /// 获取或设置名字。 /// public string Name { get; set; } /// /// 获取或设置字号。 /// public string Alias { get; set; } /// /// 获取或设置出生日期。 /// public string BirthDate { get; set; } /// /// 获取或设置出生地。 /// public string BirthPlace { get; set; } /// /// 获取或设置职业。 /// public string Occupation { get; set; } /// /// 获取或设置主要成就。 /// public string MainAchievement { get; set; } /// /// 获取或设置逝世日期。 /// public string DeathDate { get; set; }}运行项目Name: 张飞Alias: 益德BirthDate: 未知BirthPlace: 涿郡Occupation: 汉末群雄、蜀汉五虎上将之一MainAchievement: 蜀汉五虎上将之一,曾任益州牧,有勇猛之名DeathDate: 221年在这里案例中我们通过Prompt帮我们整理了用户的信息,然后将用户的信息转换成了我们提供的类Info,然后我们通过JsonSerializer将json字符串转换成了Info类,然后我们输出了用户的信息。这个实现有时候会受到模型的影响,如果模型不够好,可能会导致输出的结果不够准确,所以在使用的时候需要注意。实际场景中,这个所谓的Info不一定是这种表格模板,也可以是pdf,word等等,只要你能够提供一个模板,Semantic Kernel都可以帮你处理。处理的效果跟模型和Prmopt都有关系 如果你确认你一定要用这个模型去处理,那么你就得调整您的Prompt,让模型更好的理解您的需求。

下一篇,我们讲解 prompt进行发送邮件。就是AI调用你本地程序函数。

直白的例子:小爱同学,请关灯。你的程序写的有关灯function函数,函数调用硬件,硬件进行断电,实现关灯的结果。当然小爱关灯的技术原理更深奥,这里我是举个例子哈。

来源:opendotnet

相关推荐