Semantic Kernel中,Function作为核心的功能,主要分为Semantic Function和Native Function。 其中,Semantic Function是由Prompt形成的Function,提供了访问大模型并输出响应的功能。而Native Function是由本地原生代码组成,提供了让AI调度本地功能完成复杂任务的能力。可以说,大模型作为AI的大脑,Semantic Function则是大脑要处理的问题的反射弧,而Native Function则是大模型的手脚,去实现具体的业务功能。这篇中,主要包含Semantic Function的创建和使用.
函数管理和创建
在Semantic Kernel中,既支持常规的直接由PromptString来创建Prompt,也支持使用文件夹管理的方式进行。通常有几种方式来创建Prompt: 直接创建,文件导入或者自定义创建方式。
直接创建
直接由Prmopt创建的方式如下:
using Microsoft.SemanticKernel.SemanticFunctions;
var prompt =
"""
[SUMMARIZATION RULES]
DONT WASTE WORDS
USE SHORT, CLEAR, COMPLETE SENTENCES.
DO NOT USE BULLET POINTS OR DASHES.
USE ACTIVE VOICE.
MAXIMIZE DETAIL, MEANING
FOCUS ON THE CONTENT
[BANNED PHRASES]
This article
This document
This page
This material
[END LIST]
Summarize:
Hello how are you?
+++++
Hello
Summarize this
{
{
$input}}
+++++
""";
var summaryFunction = kernel.CreateSemanticFunction(prompt,new PromptTemplateConfig());
从文件夹导入
而使用文件夹管理则是将Prompt存放在skprompt.txt中,并将配置文件放在同级目录的config.json中
再使用Semantic提供的Import功能来导入
_kernel.ImportPluginFromPromptDirectory(directoryName);
var func = _kernel.Plugins.GetFunction("PluginName", "FunctionName");
扩展创建方式
使用文件夹导入或直接创建Prompt需要在代码里直接写入prompt,我们也可以使用数据库等方式来管理我们的Prompt。
首先我们定义一个包含了Prompt设置的对象类型:
/// <summary>
/// 函数描述
/// </summary>
public interface IFunctionDescriptor
{
/// <summary>
/// 插件名称
/// </summary>
public string PluginName {
get; }
/// <summary>
/// 函数名称
/// </summary>
public string FunctionName {
get; }
/// <summary>
/// 描述
/// </summary>
public string FunctionDescription {
get; }
/// <summary>
/// model设置,json格式
/// 例:<br/>
/// {<br/>
/// "schema": 1,<br/>
/// "description": "description",<br/>
/// "type": "completion",<br/>
/// "completion": {<br/>
/// "max_tokens": 100,<br/>
/// "temperature": 0.1,<br/>
/// "top_p": 1.0,<br/>
/// "presence_penalty": 0.0,<br/>
/// "frequency_penalty": 0.0<br/>
/// }
/// </summary>
public string PromptConfig {
get; }
/// <summary>
/// 提示词
/// </summary>
public string Prompt {
get; }
}
然后我们根据这个类型定义一个导入方法:
public static class FunctionDescImporter
{
/// <summary>
/// create plugin from specific descriptors
/// </summary>
/// <param name="functionDescriptors">descriptors of plugins and functions</param>
/// <param name="promptTemplateFactory">
/// The <see cref="IPromptTemplateFactory"/> to use when interpreting discovered prompts into <see cref="IPromptTemplate"/>s.
/// If null, a default factory will be used.
/// </param>
/// <returns></returns>
public static List<KernelPlugin> CreatePluginsFromDescriptors(List<IFunctionDescriptor> functionDescriptors, IPromptTemplateFactory promptTemplateFactory = null,
IServiceProvider services =