深化学习Semantic Kernel:创建和装备prompts functions
导言
上一章咱们了解了一下 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
的扩展办法,底层本质上都是调用KernelFunctionFromPrompt
的Create
办法来完结提示函数的创立。
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
是依据第二个参数 promptConfig
的Template
特点来结构的,接下来咱们要点了解一下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);
}
运转作用
依据pluginDirectory
从指定的插件目录中创立插件
此办法是创立插件的办法之一,之前有介绍过插件便是一组kernel functions
的调集,经过界说文件夹模版能够生成prompts functions
,这部分内容等学习到Semantic Kernel
的 Plugins
在侧重解说吧。
最终
在本章中,咱们深化探讨了 Semantic Kernel
中的 kernel functions
,要点重视了榜首部分的 prompts functions(提示函数)
。咱们学习了怎么依据不同办法创立这些提示函数,包含依据字符串模板和 PromptTemplateConfig
目标的创立办法,以及怎么从指定的插件目录中创立插件。
经过具体解说 PromptTemplateConfig
的特点,咱们了解了怎么装备和办理提示模板,以及怎么调整履行设置来影响提示函数的生成成果。咱们还实践操作了创立 kernel functions
的进程,加深了对提示工程的实践运用。
最终,咱们展望了未来的学习方向,即 Semantic Kernel
的 Plugins
部分,这将为咱们供给更多关于插件的创立和使用办法,进一步扩展咱们的常识和使用范畴。
经过本章的学习,信任您对 prompts functions
的创立和装备有了更深化的了解,为进一步探究和使用 Semantic Kernel
打下了坚实的根底。假如您有任何疑问或需求进一步协助,请随时向我发问。感谢阅览!🚀
参阅资料
configure-prompts
本文示例源代码
本文源代码
😄欢迎重视笔者大众号一同学习沟通,获取更多有用的常识~