😎

Semantic Kernel で自作スキルをクラスライブラリ形式で共有したい

2023/05/06に公開

したい!!!ということでやり方です。
公式でこうしてくださいというのはないので、もしかしたら公式からそのうち別の方法が出るかもしれません…。

やり方はネイティブ スキルでセマンティック スキルをラップするといった感じになります。例えば要約する関数を持ったスキルは以下のようになります。

class MySemanticSkill
{
    private ISKFunction _summarize;

    public MySemanticSkill(IKernel kernel)
    {
        _summarize = kernel.CreateSemanticFunction(
            """
            長すぎるので要約してください。

            ### 入力
            {{$input}}

            ### 要約

            """,
            maxTokens: 1024);
        
        // 必要な数だけ CreateSementicFunction でセマンティック スキルの関数を作る
    }

    // 必要な数だけメソッドを作る
    [SKFunction("長い文章を要約します。")]
    [SKFunctionInput(Description = "要約元の文章。")]
    public Task<SKContext> Summarize(string input) => 
        // 純粋に ISKFunction を呼び出すだけでも OK だし独自の処理を入れても OK
        _summarize.InvokeAsync(input);

    // 普通のネイティブスキルも必要に応じて定義
}

これをクラスライブラリにして公開しておけば使う側は以下のように ImportSkill で読み込むことが出来ます。

var skills = kernel.ImportSkill(new MySemanticSkill(kernel), nameof(MySemanticSkill));

こんな拡張メソッドを作っておくとそれっぽいかもしれません。

static class IKernelExtensions
{
    public static IDictionary<string, ISKFunction> ImportMySemanticSkill(this IKernel kernel, string skillName = "") => 
        kernel.ImportSkill(new MySemanticSkill(kernel), skillName);
}

// 使う側
var skills = kernel.ImportMySemanticSkill(nameof(MySemanticSkill));
Microsoft (有志)

Discussion