Semantic Kernel 简单问答
一.按官方文档先安装Semantic Kernel
1. 创建一个新的控制台App
2.添加 semantic kernel nuget包 Microsoft.SemanticKernel
注意:目前这个框架还是预览版本所以安装的时候需要把预览勾选上
3.编写代码
4.将 API 密钥和其他参数的配置占位符替换为您的密钥和设置
5.使用F5或运行dotnet run
二.开始Semantic Kernel
OpenAI / Azure OpenAI API 密钥
要运行下 LLM 提示和语义函数,请确保拥有 Open AI API 密钥或 Azure Open AI 服务密钥。
Nuget package
如何从 C# 控制台应用程序使用语义内核的快速示例。首先,让我们创建一个面向 .NET 6 或更高版本的新项目,并 Microsoft.SemanticKernel从 Visual Studio 中的命令提示符将 nuget 包添加到项目中:
1 | dotnet add package Microsoft.SemanticKernel --prerelease |
带输入参数的运行提示
将以下代码复制并粘贴到您的项目中,并使用您的 Azure OpenAI 密钥:
需要注意2点
1.需要您有API KEY,
2.需要梯子
using Microsoft.SemanticKernel; using Microsoft.SemanticKernel.Memory; using Microsoft.SemanticKernel.Orchestration; namespace YaDea.Semantic.Kernel { internal class Program { static async Task Main(string[] args) { try { const string ApiKey = "key"; //var kernel = Kernel.Builder.Configure(c => // { // c.AddOpenAITextCompletionService("openai", "text-davinci-003", Environment.GetEnvironmentVariable("MY_OPEN_AI_API_KEY")); // c.AddOpenAIEmbeddingGenerationService("openai", "text-embedding-ada-002", Environment.GetEnvironmentVariable("MY_OPEN_AI_API_KEY")); // }) // .WithMemoryStorage(new VolatileMemoryStore()) // .Build(); /* * 这里必须要有梯子 * 不足问题:调用频率受限于官方规则,1 分钟只能调用 3 次。—— 这是账号限速,也有不限速的账号。 */ var builder = new KernelBuilder(); //builder.WithAzureChatCompletionService( // "gpt-35-turbo", // 模型名称 // "https://contoso.openai.azure.com/", // Endpoint // "...your Azure OpenAI Key..."); // Key builder.WithOpenAIChatCompletionService("gpt-3.5-turbo", ApiKey); builder.WithOpenAITextEmbeddingGenerationService("text-embedding-ada-002", ApiKey); // Alternative using OpenAI //builder.WithOpenAIChatCompletionService( // "text-davinci-003",//"gpt-3.5-turbo", // OpenAI Model name // "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"); // OpenAI API Key //builder.WithOpenAITextEmbeddingGenerationService("text-embedding-ada-002", // "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"); // 内存配置 // 也可以使用 Vector Database 向量数据库 // docker pull qdrant/qdrant // docker run -p 6333:6333 qdrant/qdrant // 使用Memory需要注册 embedding模型,目前使用的就是 text-embedding-ad -002。同时需要为Kernel添加MemoryStore,用于存储更多的信息,这里Semantic Kernel提供了一个 VolatileMemoryStore,就是一个普通的内存存储的MemoryStore。 builder.WithMemoryStorage(new VolatileMemoryStore()); var kernel = builder.Build(); // 信息存储 // 完成了基础信息的注册后,就可以往Memroy中存储信息了 //const string MemoryCollectionName = "天气"; //await kernel.Memory.SaveInformationAsync(MemoryCollectionName, id: "info1", text: "成都的天气"); //await kernel.Memory.SaveInformationAsync(MemoryCollectionName, id: "info2", text: "关于天气的一些传闻消息"); // 语义搜索 //var questions = new[] //{ // "今天天气?", // "关于天气的消息?" //}; //foreach (var q in questions) //{ // var response = kernel.Memory.SearchAsync(MemoryCollectionName, q); // await foreach (var item in response) // { // Console.WriteLine(q + " " + item.Metadata.Text); // } //} // 这里将所有的Skill都放在了 SkillCollection 这个文件夹下 var textSkill = kernel.ImportSemanticSkillFromDirectory(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "SkillCollection"), "Skills"); while (true) { Console.WriteLine("请输入您的问题: "); var input = Console.ReadLine(); //var myContext = new ContextVariables(); //myContext.Set("input", input.ToString()); //// 可以根据对应的定位信息由客户端传过来地理位置 //myContext.Set("city", "成都"); var resultContext = await kernel.RunAsync(input, textSkill["Tips"]); var rel = resultContext.Result; Console.WriteLine(rel); } } catch (Exception ex) { Console.WriteLine(ex.Message); } } } }
三.提示链接
例如,以下代码将初始文本转换为数学符号,然后生成摘要
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | string translationPrompt = @"{{$input}} Translate the text to math." ; string summarizePrompt = @"{{$input}} Give me a TLDR with the fewest words." ; var translator = kernel.CreateSemanticFunction(translationPrompt, maxTokens: 200); var summarize = kernel.CreateSemanticFunction(summarizePrompt, maxTokens: 100); string inputText = @" 1st Law of Thermodynamics - Energy cannot be created or destroyed. 2nd Law of Thermodynamics - For a spontaneous process, the entropy of the universe increases. 3rd Law of Thermodynamics - A perfect crystal at zero Kelvin has zero entropy." ; // Run two prompts in sequence (prompt chaining) var output = await kernel.RunAsync(inputText, translator, summarize); Console.WriteLine(output); // Output: ΔE = 0, ΔSuniv > 0, S = 0 at 0K. |
Prompt 编写示例
不要浪费时间
使用简短、清晰、完整的句子。
不要使用项目符号或破折号。
使用主动语音。
最大化细节、意义
关注内容
{{$input}}
+++++
编写Prompt需要注意以下几点
简单明了:保持说明简单并分解为子任务
向模型寻求解释:使用模型重复输入或逐步解释其推理
Markdown语法:帮组模型更好地理解指令--列如 加粗以强调,创建标题,项目符号列表等.
不要太专注于微观优化:措辞,格式化和指令位置的微小变化不会产生巨大差异
few shot :选择模棱两可且语义相似的示例来为您的特定用例自定义模型
Temperature:对确定性任务用较低温度,对创造性任务使用较高温度
创建一个目录专门来存储Prompt
使用 ImportSemanticSkillFromDirectory将Prompt导入
kernel.ImportSemanticSkillFromDirectory(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "SkillCollection"), "Skills");
测试结果
就这样一个简单问答训练就完成了
最后附上测试程序
链接: https://pan.baidu.com/s/1CBKwKXRCVw8AKdSyNhsi3A?pwd=9875 提取码: 9875
参考文献
https://www.cnblogs.com/xbotter/p/semantic_kernel_introduction_connector.html
https://github.com/microsoft/semantic-kernel
https://learn.microsoft.com/en-us/semantic-kernel/concepts-sk/connectors
https://learn.microsoft.com/en-us/semantic-kernel/overview/
https://learn.microsoft.com/en-us/semantic-kernel/ai-orchestration/kernel/?tabs=Csharp
https://learn.microsoft.com/en-us/semantic-kernel/prompt-engineering/your-first-prompt
https://learn.microsoft.com/en-us/semantic-kernel/ai-orchestration/plugins/native-functions/using-the-SKFunction-decorator?tabs=Csharp
https://github.com/johnmaeda/SK-Recipes
问题文献
https://github.com/microsoft/semantic-kernel/issues/1839
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 推荐几款开源且免费的 .NET MAUI 组件库
· 实操Deepseek接入个人知识库
· 易语言 —— 开山篇
· Trae初体验