一.按官方文档先安装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 包添加到项目中:
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); } } } }
三.提示链接
前面的代码展示了如何调用各个语义函数,但您也可以链接函数(也称为提示链接)来通过多个操作处理初始输入。例如,以下代码将初始文本转换为数学符号,然后生成摘要
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
使用 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
标签:Kernel,Semantic,kernel,com,https,text,var,semantic,问答 From: https://www.cnblogs.com/liuxiaoji/p/17706911.html