当前位置:首页 > AI > 正文内容

深化学习Semantic Kernel:创建和装备prompts functions

邻居的猫1个月前 (12-09)AI1012

导言

上一章咱们了解了一下 Semantic Kernel 的理论常识,Kernel 创立以及简略的Sample了解了一下 SK 的根本运用。在Semantic Kernel中的 kernel functions由两部分组成榜首部分是prompts functions(提示函数),第二部分Native function(原生函数), kernel functions是构成插件(Plugins)的中心,一个插件代表一个或许多个的kernel functions,今日咱们要点了解一下榜首部分prompts functions(提示函数)。

kernel functions 根底

咱们知道跟大言语模型(LLM)交互靠的是提示(prompts),有用的提示规划关于运用 LLM AI 模型完结预期成果至关重要。提示工程,也称为提示规划,是一个新式范畴,需求创造力和对细节的重视。它触及挑选正确的单词、短语、符号和格局,以辅导模型生成高质量和相关的文本。

提示工程的深化学习是用好大言语模型的要害。

创立提示函数

Semantic Kernel中供给了多种经过Prompts创立KernelFunction的扩展办法,底层本质上都是调用KernelFunctionFromPromptCreate办法来完结提示函数的创立。

    public static KernelFunction Create(
        IPromptTemplate promptTemplate,
        PromptTemplateConfig promptConfig,
        ILoggerFactory? loggerFactory = null)
    {
        Verify.NotNull(promptTemplate);
        Verify.NotNull(promptConfig);

        return new KernelFunctionFromPrompt(
            template: promptTemplate,
            promptConfig: promptConfig,
            logger: loggerFactory?.CreateLogger(typeof(KernelFunctionFactory)) ?? NullLogger.Instance);
    }

这里边其实只要第二个参数PromptTemplateConfig是咱们需求关怀的,榜首个参数promptTemplate是依据第二个参数 promptConfigTemplate特点来结构的,接下来咱们要点了解一下PromptTemplateConfig的装备。

PromptTemplateConfig的特点

public sealed class PromptTemplateConfig
{
    private string? _templateFormat;
    private string _template = string.Empty;

    [JsonPropertyName("name")]
    public string? Name { get; set; }

    [JsonPropertyName("description")]
    public string? Description { get; set; }
    public static string SemanticKernelTemplateFormat => "semantic-kernel";

    [JsonPropertyName("template_format")]
    [AllowNull]
    public string TemplateFormat
    {
        get => this._templateFormat ?? SemanticKernelTemplateFormat;
        set => this._templateFormat = value;
    }

    [JsonPropertyName("template")]
    public string Template
    {
        get => this._template;
        set
        {
            Verify.NotNull(value);
            this._template = value;
        }
    }

    [JsonPropertyName("input_variables")]
    public List<InputVariable> InputVariables
    {
        get => this._inputVariables ??= [];
        set
        {
            Verify.NotNull(value);
            this._inputVariables = value;
        }
    }

    [JsonPropertyName("output_variable")]
    public OutputVariable? OutputVariable { get; set; }


    [JsonPropertyName("execution_settings")]
    public Dictionary<string, PromptExecutionSettings> ExecutionSettings
    {
        get => this._executionSettings ??= [];
        set
        {
            Verify.NotNull(value);
            this._executionSettings = value;
        }
    }

    [Experimental("SKEXP0001")]
    [JsonPropertyName("allow_unsafe_content")]
    public bool AllowUnsafeContent { get; set; } = false;
}

为了便利展现咱们只保存PromptTemplateConfig的中心特点,这个类十分的重要,包含咱们要界说装备模版也是依据此类的字段来装备。

下面咱们对PromptTemplateConfig的特点进行简略的解说

咱们能够把PromptTemplateConfig能够看做是对一个函数的表述,带着这个了解来解读这个装备类更简略了解,如用 C#界说一个函数

[Description("无参无回来值的静态函数")]
static void SampleFunction()
{
    Console.Write("无参无回来值函数");
}

Name特点

Name特点是在PromptTemplateConfig中用来获取或设置在运用此装备创立提示函数(Prompts functions)时运用的默许函数称号。
类型可空,假如不设置创立函数时将动态生成一个随机称号。命名规矩:运用 GUID 生成一个不含连字符的随机字符串,并将其格局化为以"func"为前缀的函数称号

    private static string CreateRandomFunctionName() => $"func{Guid.NewGuid():N}";

Name 相似与咱们在 C#中的函数名

Description 特点

Description特点是用于表明一个函数的描绘信息,假如在创立prompts functions时分没有显现指定函数描绘信息,那会选用Description 特点的描绘。

结合咱们界说的 C#自界说函数中Description来了解这个特点,其实便是给办法装备一个描绘信息,提示办法也是一种特别的办法。

TemplateFormat特点

TemplateFormat特点用于对prompts提示模板的格局装备,默许值为 "semantic-kernel"
关于prompts的模版格局化引擎 用的有两种,榜首种便是 Semantic Kernel 自带的处理格局"semantic-kernel";第二种则是handlebars

Template特点

Template 特点用于存储和办理用于界说prompts模板字符串。在设置模板字符串时,会进行空值验证,以确保模板字符串不为 null,然后确保在生成prompts提示时模板内容有有用可用。

InputVariables 特点

InputVariables特点用于prompts提示模板中运用的输入变量调集。

InputVariable 目标包含的特点:

  • Name:变量的称号,用于标识输入变量。
  • Description:变量的描绘,供给关于输入变量的阐明。
  • Default:变量的默许值。
  • IsRequired:指示变量是否为必需的,默许为 true。
  • JsonSchema:描绘变量的 JSON 形式。
  • AllowUnsafeContent:指示是否答应不安全内容,默许为 false。

OutputVariable 特点

OutputVariable 特点用于界说和办理prompts提示模板中的输出变量。

参阅咱们c#界说函数 这个我了解的便是对咱们函数回来值参数的一个描绘

ExecutionSettings特点

ExecutionSettings特点用于获取或设置提示模板运用的履行设置调集;类型为Dictionary<string, PromptExecutionSettings>,表明一个键值对调集,其间键为服务 ID,值为履行设置。

      ExecutionSettings =
      {
          {
            OpenAIPromptExecutionSettings.DefaultServiceId,
              new OpenAIPromptExecutionSettings()
              {
                  MaxTokens = 1000,
                  Temperature = 0
              }
          },
          {
              "gpt-3.5-turbo", new OpenAIPromptExecutionSettings()
              {
                  ModelId = "gpt-3.5-turbo-0613",
                  MaxTokens = 4000,
                  Temperature = 0.2
              }
          }
      }

履行的装备为 PromptExecutionSettings.DefaultServiceId默许值是"default",因为Semantic Kernel都是依据.Net 8 的键值依靠注入Keyed,所以 default 便是获取的上面默许的履行装备,

kernel.GetRequiredService<ITextGenerationService>();
kernel.GetRequiredService<ITextGenerationService>("gpt-3.5-turbo");

从代码处了解就简略多了,能够经过ServiceKey去获取不同大模型的实例。

OpenAIPromptExecutionSettings 装备

这个装备是大模型的进行恳求时的参数装备,是PromptExecutionSettings提示履行设置的子类,OpenAI 的装备便是OpenAIPromptExecutionSettings,Google的大模型有自己的完结比方GeminiPromptExecutionSettings 中心参数其实都差不多,现在咱们用OpenAI的提示词履行设置了解下装备的参数。

  • MaxTokens:指定在生成文本或完结恳求时答应生成的最大符号数,大多数模型的上下文长度为 2048 个符号(支撑 4096 的 davinci-codex 在外)。
  • Temperature: 操控完结成果的随机性。默许是 1.0,一般取值范围在0-1.0之间。较高的温度会添加生成文本的随机性,使得生成的文本愈加多样化和立异性,而较低的温度则会削减随机性,使得生成的文本愈加安稳和可猜测。

    关于更具构思的使用程序,请测验 0.9,关于具有清晰答案的使用程序,请测验 0(argmax 采样)。

  • TopP: 用于操控完结成果的多样性。默许是1.0。经过设置不同的值能够调整生成文本的多样性程度。较高的 TopP 值会导致生成的文本愈加多样化,而较低的值则或许使生成的文本愈加安稳和会集。

    运用温度进行采样的代替办法,称为核采样,其间模型考虑具有 top_p 概率质量的符号的成果。因而,0.1 表明仅考虑包含前 10% 概率质量的代币。咱们一般主张改动这个或温度,但不要一同改动两者。

  • PresencePenalty: 特点承受介于-2.0和2.0之间的数字。默许是0。正值将依据新符号是否在文本中呈现来对其进行赏罚,然后添加模型议论新主题的或许性。

    新符号:模型测验引进新的内容或概念,以添加生成文本的多样性和立异性

  • FrequencyPenalty:特点用于操控模型生成文本时对重复内容的处理办法。默许是0。它承受介于-2.0 和 2.0 之间的数字,其间正值表明依据符号在文本中的现有频率对其进行赏罚,以下降模型直接重复相同内容的或许性。经过设置较高的 FrequencyPenalty 值,模型更有或许防止直接重复相同内容,然后下降生成文本中重复内容的频率.

  • StopSequences:特点用于指定一个字符串列表,其间包含模型在生成文本时遇到指定序列时应中止生成进一步符号。

    例如,假如设置 StopSequences 为[""],则当模型生成文本时遇到"<END>"序列时,生成进程将中止。

  • ChatSystemPrompt:特点用于指定在运用谈天模型生成文本时要运用的体系提示。默许值是:"Assistant is a large language model."。这个体系提示能够影响生成文本的方向和内容,协助模型更好地了解生成使命的布景和要求。经过合理设置 ChatSystemPrompt 特点,能够定制生成文本时运用的体系提示,以取得契合预期的生成成果。

  • ToolCallBehavior:特点用于获取或设置怎么处理东西调用的行为。

          // Enable auto function calling
        OpenAIPromptExecutionSettings openAIPromptExecutionSettings = new()
        {
            ToolCallBehavior = ToolCallBehavior.AutoInvokeKernelFunctions
        };
    

    1.EnableKernelFunctions:会向模型供给内核的插件函数信息,但不会主动处理函数调用恳求。模型需求显式建议函数调用恳求,并体系会传达这些恳求给恰当的处理程序来履行。

     OpenAIPromptExecutionSettings settings = new() { ToolCallBehavior = ToolCallBehavior.EnableKernelFunctions };
     var chatHistory = new ChatHistory();
     ChatMessageContent result = await chat.GetChatMessageContentAsync(chatHistory, settings, kernel);
     //手动调用
     IEnumerable<FunctionCallContent> functionCalls = FunctionCallContent.GetFunctionCalls(result);
    

    EnableKernelFunctions:需求经过 FunctionCallContent 手动调用

    2.AutoInvokeKernelFunctions:除了向模型供给内核的插件函数信息外,还会测验主动处理任何函数调用恳求。模型建议函数调用恳求后,体系会主动履行相应的操作,并将成果回来给模型,而无需模型显式处理函数调用的进程。

ResponseFormat特点

ResponseFormat的特点,用于获取或设置用于完结操作的呼应格局。可选值包含:"json_object""text",以及 ChatCompletionsResponseFormat 目标,能够挑选不同的值来指定呼应的格局类型,例如运用 JSON 目标、纯文本等不同的呼应格局

ResultsPerPrompt特点

ResultsPerPrompt 特点用于确认每个提示生成的完结次数。默许值:默许为 1,即每个提示只生成一个完结成果。在自然言语处理中,一个提示(prompt)是输入给模型的文本或问题,而完结(completion)是模型生成的对应输出。经过设置 ResultsPerPrompt 特点,您能够指定每个提示应该生成多少个完结成果。

Seed特点

Seed特点的作用是为了操控采样确实认性,经过指定种子值,能够在必定程度上确保相同种子和参数下的重复恳求回来相同的成果。但是,因为确认性并不是彻底确保的,成果仍或许有必定程度的改变

User特点

经过为每个最终用户分配一个仅有的标识符,OpenAI 能够更好地盯梢和办理用户的行为,一同也能够更有用地监控体系是否遭到乱用。

prompts functions 实战

Semantic Kernel 有几个 Kernel 目标的扩展办法用于prompts提示词模版来创立KernelFunction,总的来说能够有三类:

咱们持续用咱们上一章的 OneApi 署理星火讯飞 V3.5 办法来对接 Semantic Kernel 具体装备能够找我上一篇文章

依据 String 字符串创立 prompts functions

实战

//依据String模版创立kernel functions
Console.WriteLine("====>依据String模版创立kernel functions<=====");
{
    string prompt = "What is the intent of this request? {{$request}}";
    var kernel = Kernel.CreateBuilder().AddOpenAIChatCompletion(modelId: config.ModelId,
        apiKey: config.ApiKey,
        httpClient: client).Build();
    var kernelFunction = kernel.CreateFunctionFromPrompt(prompt);

    string request = "I want to send an email to the marketing team celebrating their recent milestone.";

    // Create a kernel arguments object and add the  request
    var kernelArguments = new KernelArguments
            {
                { "request", request }
            };
    var functionResult = await kernelFunction.InvokeAsync(kernel, kernelArguments);

    Console.WriteLine(functionResult?.ToString() ?? string.Empty);
}

当然 SK 也供给了愈加简略的办法,直接传prompts string 模版

    var functionResult = await kernel.InvokePromptAsync(prompt, kernelArguments);

这个办法内部实践上便是调用了CreateFunctionFromPrompt创立了kernel functions,意图是简化提示函数创立的进程

依据PromptTemplateConfig目标创立 prompts functions

经过上面的介绍咱们现已对PromptTemplateConfig的参数设置现已有了一个大致的知道,要完结这个要求需求凭借到咱们的 kernel.CreateFunctionFromPrompt这个扩展办法,下面咱们来实操一下:

实战

string request = "I want to send an email to the marketing team celebrating their recent milestone.";
{
    var kernel = Kernel.CreateBuilder().AddOpenAIChatCompletion(modelId: config.ModelId,
    apiKey: config.ApiKey,
    httpClient: client).Build();

    var kernelFunctions = kernel.CreateFunctionFromPrompt(new PromptTemplateConfig()
    {
        Name = "intent",
        Description = "use assistant to understand user input intent.",
        TemplateFormat = PromptTemplateConfig.SemanticKernelTemplateFormat,//此处能够省掉默许便是"semantic-kernel"
        Template = "What is the intent of this request? {{$request}}",
        InputVariables = [new() { Name = "request", Description = "The user's request.", IsRequired = true }],
        ExecutionSettings = new Dictionary<string, PromptExecutionSettings>() {
               {
                      OpenAIPromptExecutionSettings.DefaultServiceId ,//"default"
                        new OpenAIPromptExecutionSettings()
                        {
                            MaxTokens = 1024,
                            Temperature = 0
                        }
                    },
        }
    });
    var kernelArguments = new KernelArguments
    {
                { "request", request }
            };
    var functionResult = await kernelFunctions.InvokeAsync(kernel, kernelArguments);

    Console.WriteLine(functionResult?.ToString() ?? string.Empty);
}

运转作用

image

依据pluginDirectory从指定的插件目录中创立插件

此办法是创立插件的办法之一,之前有介绍过插件便是一组kernel functions的调集,经过界说文件夹模版能够生成prompts functions,这部分内容等学习到Semantic KernelPlugins在侧重解说吧。

最终

在本章中,咱们深化探讨了 Semantic Kernel 中的 kernel functions,要点重视了榜首部分的 prompts functions(提示函数)。咱们学习了怎么依据不同办法创立这些提示函数,包含依据字符串模板和 PromptTemplateConfig 目标的创立办法,以及怎么从指定的插件目录中创立插件。

经过具体解说 PromptTemplateConfig 的特点,咱们了解了怎么装备和办理提示模板,以及怎么调整履行设置来影响提示函数的生成成果。咱们还实践操作了创立 kernel functions 的进程,加深了对提示工程的实践运用。

最终,咱们展望了未来的学习方向,即 Semantic KernelPlugins 部分,这将为咱们供给更多关于插件的创立和使用办法,进一步扩展咱们的常识和使用范畴。

经过本章的学习,信任您对 prompts functions 的创立和装备有了更深化的了解,为进一步探究和使用 Semantic Kernel 打下了坚实的根底。假如您有任何疑问或需求进一步协助,请随时向我发问。感谢阅览!🚀

参阅资料

configure-prompts

本文示例源代码

本文源代码

😄欢迎重视笔者大众号一同学习沟通,获取更多有用的常识~
image

扫描二维码推送至手机访问。

版权声明:本文由51Blog发布,如需转载请注明出处。

本文链接:https://www.51blog.vip/?id=396

标签: dotNetAI
分享给朋友:

“深化学习Semantic Kernel:创建和装备prompts functions” 的相关文章

Transformers 结构 Pipeline 使命详解:文本转音频(text-to-audio 或 text-to-speech)

Transformers 结构 Pipeline 使命详解:文本转音频(text-to-audio 或 text-to-speech)

在上一篇文章(Transformers 结构使命概览:从零开始把握 Pipeline(管道)与 Task(使命)),咱们深化探讨了 Transformers 结构中的 Pipeline 和 Task 分类、装备及履行流程。今日,咱们将聚集于五大使命之一的text-to-audio或text-to-s...

国产亚洲综合ai,崛起中的智能力量

国产亚洲综合ai,崛起中的智能力量

1. 国产AI技术: 国内的AI大模型数量已经突破200个,用户量高达6亿。一些主要的国产AI模型包括Kimi、智谱清言、通义千问、文心一言、豆包、天工AI、讯飞星火、腾讯元宝和秘塔。 这些大模型主要依赖于深度学习技术,从海量数据中学习各种技能,并拥有独特的神经网络架构和训练数据选择。2...

机器学习文本分类, 文本分类概述

1. 数据收集:收集需要分类的文本数据。2. 数据预处理:对文本数据进行清洗、分词、去除停用词、词干提取或词形还原等处理,以便于后续的分析。3. 特征提取:从预处理后的文本中提取有用的特征,如词频、TFIDF(词频逆文档频率)等。5. 模型评估:使用测试数据集来评估模型的性能,常用的指标包括准确率、...

机器学习之父,机器学习之父——艾伦·图灵的传奇人生与贡献

机器学习之父,机器学习之父——艾伦·图灵的传奇人生与贡献

“机器学习之父”这一称号通常指的是杰弗里·辛顿(Geoffrey Hinton),他是机器学习和人工智能领域的先驱之一。杰弗里·辛顿是深度学习领域的开拓者,他的研究对现代人工智能的发展有着深远的影响。杰弗里·辛顿的主要贡献包括:1. 反向传播算法:这是训练神经网络的基本算法之一,使得神经网络可以有效...

绘图ai,技术革新与艺术创作的融合

绘图ai,技术革新与艺术创作的融合

1. 图像生成AI:如DeepArt、GAN(生成对抗网络)等,可以将用户的照片或图像转换成不同的艺术风格。例如,将普通照片转换为梵高、莫奈等大师的画风。2. 绘画辅助AI:如Adobe Photoshop中的内容感知填充、自动修图等功能,可以帮助用户更高效地完成图像编辑和设计工作。3. 3D建模A...

机器学习模型怎么跑,从搭建到优化

机器学习模型怎么跑,从搭建到优化

机器学习模型通常包括以下几个步骤来运行:1. 数据准备:首先需要收集和准备数据,这包括数据清洗、数据转换和数据归一化等。数据质量对模型的性能至关重要。2. 选择模型:根据问题的类型(如分类、回归、聚类等)选择合适的机器学习算法。常见的算法包括线性回归、逻辑回归、决策树、随机森林、支持向量机、神经网络...