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 包添加到项目中:

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需要注意以下几点
简单明了:保持说明简单并分解为子任务
向模型寻求解释:使用模型重复输入或逐步解释其推理
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

 

posted @ 2023-09-16 18:38  刘小吉  阅读(228)  评论(3编辑  收藏  举报