基础定义
最基本的Native Function定义只需要在方法上添加 SKFunction
的特性即可。
using Microsoft.SemanticKernel.SkillDefinition;
using Microsoft.SemanticKernel.Orchestration;
namespace MySkillsDirectory;
public class MyCSharpSkill
{
[SKFunction("Return a string that's duplicated")]
[SKFunctionName("Dup")]//指定Function名称
public string DupDup(string text)
{
return text + text;
}
}
默认情况下只需要传递一个string 参数就行,如果需要多个参数的话,和Semantic Function
一样,也是使用Context
,不过这里传进去是 SKContext
。在方法上使用 SKFunctionContextParameter
声明一下参数,可以提供一定的说明,同时的有需要的话,可以设置参数的默认值。
public class MyCSharpSkill
{
[SKFunction("Joins a first and last name together")]
[SKFunctionContextParameter(Name = "firstname", Description = "Informal name you use")]
[SKFunctionContextParameter(Name = "lastname", Description = "More formal name you use")]
public string FullNamer(SKContext context)
{
return context["firstname"] + " " + context["lastname"];
}
}
调用的时候,一样使用 ContextVariables.
// ... instantiate a kernel as myKernel
var myContext = new ContextVariables();
myContext.Set("firstname","Sam");
myContext.Set("lastname","Appdev");
var myCshSkill = myKernel.ImportSkill ( new MyCSharpSkill(), "MyCSharpSkill");
var myOutput = await myKernel.RunAsync(myContext,myCshSkill["FullNamer"]);
Console.WriteLine(myOutput);
当然异步的方法也是支持的。这样的话,就可以处理一些像是网络请求,数据库访问、文件读写等操作了。
using Microsoft.SemanticKernel.SkillDefinition;
using Microsoft.SemanticKernel.Orchestration;
public class MyCSharpSkill
{
[SKFunction("Return the second row of a qwerty keyboard")]
[SKFunctionName("Asdfg")]
public async Task<string> AsdfgAsync(string input)
{
await ...do something asynchronous...
return "asdfghjkl";
}
这里针对 AsdfgAsync
添加了一个 SKFunctionName
的特性,主要是为了使Function name
好看一些,避免MyCSharpSkill.AsdfgAsync
这样。
混合调用
和 Semantic Function
中能够调用 Native Function
一样,在 Native Function也可以调用Semantic Function
,其中主要使用的还是 SKContext
.
public class MyCSharpSkill
{
[SKFunction("Tell me a joke in one line of text")]
[SKFunctionName("InvokeSemanticFunc")]
public async Task<string> InvokeSemanticFunc(SKContext context)
{
ISKFunction func = context.Func("Country", "Size");
//ISKFunction func = _kernel.Skills.GetFunction("Country", "Size");
var contry = await func.InvokeAsync("china");
return contry.Result.ToUpper();
}
}
这里并没有限制是 Semantic Function
还是Native Function
,所以甚至可以完全使用Native Function。
官方提供的技能(core skill)
Semantic Kernel
中大部分的能力都是有技能提供的,例如Semantic Kernel的一个核心组件Planner,其实就是一个Semantic Skill,另外官方提供了一些Core SKill,基本是日常比较常用的。具体可以参考https://github.com/microsoft/semantic-kernel/tree/main/dotnet/src/Skills/Skills.Core
和自行定义的Native Function一样的,只需要使用ImportSkill就行了
using Microsoft.SemanticKernel.CoreSkills;
myKernel.ImportSkill(new TimeSkill(), "time");
const string ThePromptTemplate = @"
Today is: {{time.Date}}";
var myKindOfDay = myKernel.CreateSemanticFunction(ThePromptTemplate, maxTokens: 150);
var myOutput = await myKindOfDay.InvokeAsync();
Console.WriteLine(myOutput);
标签:Function,Kernel,Semantic,string,MyCSharpSkill,public,Native
From: https://www.cnblogs.com/fanfan-90/p/17536062.html