Note
このドキュメントは最終的なものであり、ますます良くなります!
このガイドは、v1 より前のバージョンの .NET Semantic Kernel SDK から v1 以降へのアップグレードを支援することを目的としています。
このドキュメントの参照として使用される v1 より前のバージョンは、変更の大部分が発生し始めた最初のベータ リリースの前の最後のバージョンである 0.26.231009 バージョンでした。
パッケージの変更
多くのパッケージが再定義、削除、および名前変更された結果、適切なクリーンアップと名前空間の簡略化を行ったことを考慮すると、古いパッケージの多くを名前変更、非推奨、削除する必要があります。 次の表は、パッケージの変更点を示しています。
Microsoft.SemanticKernelで始まるすべてのパッケージは、簡潔にするために..プレフィックスで切り捨てられました。
| 以前の名前 | V1 名 | バージョン | 理由 |
|---|---|---|---|
| ..Connectors.AI.HuggingFace | ..Connectors.HuggingFace | preview | |
| ..Connectors.AI.OpenAI | ..Connectors.OpenAI | v1 | |
| ..Connectors.AI.Oobabooga | MyIA.SemanticKernel.Connectors.AI.Oobabooga | alpha | コミュニティ 駆動型コネクタ ⚠️まだv1以上の準備ができていません |
| ..Connectors.Memory.Kusto | ..Connectors.Kusto | alpha | |
| ..Connectors.Memory.DuckDB | ..Connectors.DuckDB | alpha | |
| ..Connectors.Memory.Pinecone | ..Connectors.Pinecone | alpha | |
| ..Connectors.Memory.Redis | ..Connectors.Redis | alpha | |
| ..Connectors.Memory.Qdrant | ..Connectors.Qdrant | alpha | |
| -- | ..Connectors.Postgres | alpha | |
| ..Connectors.Memory.AzureCognitiveSearch | ..Connectors.Memory.AzureAISearch | alpha | |
| ..Functions.Semantic | -削除- | Core でマージ済み | |
| ..Reliability.Basic | -削除- | .NET 依存関係挿入に置き換えられました | |
| ..Reliability.Polly | -削除- | .NET 依存関係挿入に置き換えられました | |
| ..TemplateEngine.Basic | -削除- | Core でマージ済み | |
| ..Planners.Core | ..Planners.OpenAI Planners.Handlebars |
preview | |
| -- | ..Experimental.Agents | alpha | |
| -- | ..Experimental.Orchestration.Flow | v1 |
信頼性パッケージ - .NET 依存関係挿入に置き換えられました
信頼性の基本パッケージと Polly パッケージは、.net 依存関係の挿入 ConfigureHttpClientDefaults サービス コレクション拡張機能を使用して、目的の回復性ポリシーを HttpClient インスタンスに挿入できるようになりました。
// Before
var retryConfig = new BasicRetryConfig
{
MaxRetryCount = 3,
UseExponentialBackoff = true,
};
retryConfig.RetryableStatusCodes.Add(HttpStatusCode.Unauthorized);
var kernel = new KernelBuilder().WithRetryBasic(retryConfig).Build();
// After
builder.Services.ConfigureHttpClientDefaults(c =>
{
// Use a standard resiliency policy, augmented to retry on 401 Unauthorized for this example
c.AddStandardResilienceHandler().Configure(o =>
{
o.Retry.ShouldHandle = args => ValueTask.FromResult(args.Outcome.Result?.StatusCode is HttpStatusCode.Unauthorized);
});
});
パッケージの削除と必要な変更
以下のいずれかのパッケージを使用する場合は、V1 が使用する最新バージョンと一致していることを確認します。
| [パッケージ名] | バージョン |
|---|---|
| Microsoft.Extensions.Configuration | 8.0.0 |
| Microsoft.Extensions.Configuration.Binder | 8.0.0 |
| Microsoft.Extensions.Configuration.EnvironmentVariables | 8.0.0 |
| Microsoft.Extensions.Configuration.Json | 8.0.0 |
| Microsoft.Extensions.Configuration.UserSecrets | 8.0.0 |
| Microsoft.Extensions.DependencyInjection | 8.0.0 |
| Microsoft.Extensions.DependencyInjection.Abstractions | 8.0.0 |
| Microsoft.Extensions.Http | 8.0.0 |
| Microsoft.Extensions.Http.Resilience | 8.0.0 |
| Microsoft.Extensions.Logging | 8.0.0 |
| Microsoft.Extensions.Logging.Abstractions | 8.0.0 |
| Microsoft.Extensions.Logging.Console | 8.0.0 |
規則名の変更
内部の名前付け規則の多くは、AI コミュニティがどのように名前を付けるかをより適切に反映するように変更されました。 OpenAI が大規模なシフトを開始し、Prompt、Plugins、Models、RAG などの用語が形成されたので、コミュニティが SDK の使用を理解しやすくするために、これらの用語に合わせる必要があることを明確にしました。
| 以前の名前 | V1 名 |
|---|---|
| セマンティック関数 | Prompt 関数 |
| ネイティブ関数 | メソッド関数 |
| コンテキスト変数 | カーネル引数 |
| 要求の設定 | プロンプト実行の設定 |
| テキストの入力候補 | テキストの生成 |
| 画像の生成 | テキストから画像へ |
| スキル | プラグイン |
コード名の変更
会話名の変更に続いて、コード名の多くも新しい名前付け規則をより適切に反映するように変更されました。 また、コードを読みやすくするために、Abbreaviations も削除されました。
| 以前の名前 | V1 名 |
|---|---|
| ContextVariables | KernelArguments |
| ContextVariables.Set | KernelArguments.Add |
| IImageGenerationService | ITextToImageService |
| ITextCompletionService | ITextGenerationService |
| Kernel.CreateSemanticFunction | Kernel.CreateFunctionFromPrompt |
| Kernel.ImportFunctions | Kernel.ImportPluginFrom____ |
| Kernel.ImportSemanticFunctionsFromDirectory | Kernel.ImportPluginFromPromptDirectory |
| Kernel.RunAsync | Kernel.InvokeAsync |
| NativeFunction | MethodFunction |
| OpenAIRequestSettings | OpenAIPromptExecutionSettings |
| RequestSettings | PromptExecutionSettings |
| SKException | KernelException |
| SKFunction | KernelFunction |
| SKFunctionMetadata | KernelFunctionAttribute |
| SKJsonSchema | KernelJsonSchema |
| SKParameterMetadata | KernelParameterMetadata |
| SKPluginCollection | KernelPluginCollection |
| SKReturnParameterMetadata | KernelReturnParameterMetadata |
| SemanticFunction | PromptFunction |
| SKContext | FunctionResult (出力) |
名前空間の簡略化
以前の名前空間には、プロジェクト内のディレクトリ名と 1 対 1 に一致する深い階層がありました。 これは一般的な方法ですが、セマンティック カーネル パッケージのコンシューマーは、コードに多数の異なる usingを追加する必要がありました。 セマンティック カーネル パッケージ内の名前空間の数を減らして、機能の大部分がメインの Microsoft.SemanticKernel 名前空間に含まれるようにすることにしました。 詳細については、下を参照してください。
| 以前の名前 | V1 名 |
|---|---|
| Microsoft.SemanticKernel.Orchestration | Microsoft.SemanticKernel |
| Microsoft.SemanticKernel.Connectors.AI.* | Microsoft.SemanticKernel.Connectors.* |
| Microsoft.SemanticKernel.SemanticFunctions | Microsoft.SemanticKernel |
| Microsoft.SemanticKernel.Events | Microsoft.SemanticKernel |
| Microsoft.SemanticKernel.AI.* | Microsoft.SemanticKernel.* |
| Microsoft.SemanticKernel.Connectors.AI.OpenAI.* | Microsoft.SemanticKernel.Connectors.OpenAI |
| Microsoft.SemanticKernel.Connectors.AI.HuggingFace.* | Microsoft.SemanticKernel.Connectors.HuggingFace |
カーネル
Kernel インスタンスを作成して使用するコードが簡略化されました。 開発者は独自のKernel実装を作成する必要がないように、IKernel インターフェイスは削除されました。 Kernel クラスは、サービスとプラグインのコレクションを表します。 現在の Kernel インスタンスは、セマンティック カーネルの背後にある設計理念と一致するすべての場所で使用できます。
IKernelインターフェイスがKernelクラスに変更されました。Kernel.ImportFunctionsは削除され、Kernel.ImportPluginFrom____に置き換えられました。____は、Functions、Object、PromptDirectory、Type、Grp、またはOpenAIAsyncなどです。// Before var textFunctions = kernel.ImportFunctions(new StaticTextPlugin(), "text"); // After var textFunctions = kernel.ImportPluginFromObject(new StaticTextPlugin(), "text");Kernel.RunAsyncが削除され、Kernel.InvokeAsyncに置き換えられました。 シフトされたパラメーターの順序 。関数が最初です。// Before KernelResult result = kernel.RunAsync(textFunctions["Uppercase"], "Hello World!"); // After FunctionResult result = kernel.InvokeAsync(textFunctions["Uppercase"], new() { ["input"] = "Hello World!" });Kernel.InvokeAsyncでは、KernelResultではなくFunctionResultが返されるようになりました。Kernel.InvokeAsyncは、呼び出しごとに最初のパラメーターとして 1 つの関数のみを対象とします。 パイプライン処理はサポートされていません。チェーン動作を実現するには、 Example 60 を使用します。❌ サポート対象外
KernelResult result = await kernel.RunAsync(" Hello World! ", textFunctions["TrimStart"], textFunctions["TrimEnd"], textFunctions["Uppercase"]);✔️ 呼び出しごとに 1 つの関数
var trimStartResult = await kernel.InvokeAsync(textFunctions["TrimStart"], new() { ["input"] = " Hello World! " }); var trimEndResult = await kernel.InvokeAsync(textFunctions["TrimEnd"], new() { ["input"] = trimStartResult.GetValue<string>() }); var finalResult = await kernel.InvokeAsync(textFunctions["Uppercase"], new() { ["input"] = trimEndResult.GetValue<string>() });✔️ プラグインカーネルインジェクションを使用したチェーン
// Plugin using Kernel injection public class MyTextPlugin { [KernelFunction] public async Task<string> Chain(Kernel kernel, string input) { var trimStartResult = await kernel.InvokeAsync("textFunctions", "TrimStart", new() { ["input"] = input }); var trimEndResult = await kernel.InvokeAsync("textFunctions", "TrimEnd", new() { ["input"] = trimStartResult.GetValue<string>() }); var finalResult = await kernel.InvokeAsync("textFunctions", "Uppercase", new() { ["input"] = trimEndResult.GetValue<string>() }); return finalResult.GetValue<string>(); } } var plugin = kernel.ImportPluginFromObject(new MyTextPlugin(), "textFunctions"); var finalResult = await kernel.InvokeAsync(plugin["Chain"], new() { ["input"] = " Hello World! "});Kernel.InvokeAsyncは文字列を入力として受け入れなくなりました。代わりにKernelArgumentsインスタンスを使用してください。 関数が最初の引数になり、入力引数をKernelArgumentsインスタンスとして指定する必要があります。// Before var result = await kernel.RunAsync("I missed the F1 final race", excuseFunction); // After var result = await kernel.InvokeAsync(excuseFunction, new() { ["input"] = "I missed the F1 final race" });Kernel.ImportSemanticFunctionsFromDirectoryが削除され、Kernel.ImportPluginFromPromptDirectoryに置き換えられました。Kernel.CreateSemanticFunctionが削除され、Kernel.CreateFunctionFromPromptに置き換えられました。- 引数:
OpenAIRequestSettingsは現在OpenAIPromptExecutionSettings
- 引数:
コンテキスト変数
ContextVariables はKernelArguments として再定義され、ディクショナリになりました。ここで、キーは引数の名前、値は引数の値です。 SetやGetなどのメソッドが削除され、代わりに共通辞書 Add またはインデクサー []を使用して値を設定および取得する必要があります。
// Before
var variables = new ContextVariables("Today is: ");
variables.Set("day", DateTimeOffset.Now.ToString("dddd", CultureInfo.CurrentCulture));
// After
var arguments = new KernelArguments() {
["input"] = "Today is: ",
["day"] = DateTimeOffset.Now.ToString("dddd", CultureInfo.CurrentCulture)
};
// Initialize directly or use the dictionary indexer below
arguments["day"] = DateTimeOffset.Now.ToString("dddd", CultureInfo.CurrentCulture);
カーネル ビルダー
KernelBuilder は、より直感的で使いやすくするために多くの変更が加えられました。また、.NET ビルダーのアプローチに合わせて簡単に、より一致するようにしました。
KernelBuilderの作成は、Kernel.CreateBuilder()メソッドを使用してのみ作成できるようになりました。この変更により、任意のコード ベースで KernelBuilder をより簡単かつ簡単に使用でき、複雑さとメンテナンスのオーバーヘッドを増やす複数の方法ではなく、ビルダーを使用する 1 つの主な方法が保証されます。
// Before IKernel kernel = new KernelBuilder().Build(); // After var builder = Kernel.CreateBuilder().Build();KernelBuilder.With...の名前がKernelBuilder.Add...に変更されました。WithOpenAIChatCompletionServiceの名前がAddOpenAIChatCompletionServiceに変更されました。WithAIService<ITextCompletion>
KernelBuilder.WithLoggerFactoryは使用されません。代わりに、依存関係挿入アプローチを使用してロガー ファクトリを追加します。IKernelBuilder builder = Kernel.CreateBuilder(); builder.Services.AddLogging(c => c.AddConsole().SetMinimumLevel(LogLevel.Information));WithAIService<T>依存関係の挿入以前は、
KernelBuilderには削除されたメソッドWithAIService<T>があり、開発者が依存関係挿入コンテナーにサービスを追加できるように、新しいServiceCollection Servicesプロパティが公開されていました。 つまり、次のようになります。builder.Services.AddSingleton<ITextGenerationService>()
カーネルの結果
カーネルがプラグインのコンテナーになり、1 つの関数だけを実行するようになったため、 KernelResult エンティティを持つ必要がなくなり、カーネルからのすべての関数呼び出しで FunctionResultが返されるようになりました。
SKContext
内部およびコミュニティからの多くの議論とフィードバックの後、API を簡素化し、より直感的にするために、 SKContext の概念はさまざまなエンティティ (関数入力用の KernelArguments と関数出力用の FunctionResult ) に表示されました。
Kernel関数呼び出しに必要な引数を作成する重要な決定により、SKContextが削除され、KernelArgumentsとFunctionResultが導入されました。
KernelArguments は、以前に SKContext.Variables プロパティに保持されていた関数呼び出しの入力引数を保持するディクショナリです。
FunctionResult は、 Kernel.InvokeAsync メソッドの出力であり、以前に SKContext.Result プロパティに保持されていた関数呼び出しの結果を保持します。
新しいプラグインの抽象化
- KernelPlugin Entity: V1 より前には、プラグイン中心のエンティティの概念はありませんでした。 これはV1で変更され、カーネルに追加するすべての関数に対して、それが属するプラグインを取得します。
プラグインの不変性
プラグインは既定で不変として、すぐに使用できる DefaultKernelPlugin 実装によって作成されます。つまり、作成後に変更または変更することはできません。
また、カーネル内で同じ名前を共有するプラグインをインポートしようとすると、キー違反の例外が発生します。
KernelPlugin抽象化を追加することで、可変性をサポートする可能性のある動的実装が可能になり、Example 69で変更可能なプラグインを実装する方法の例を示しました。
複数のプラグインを 1 つに結合する
ディレクトリからプラグインを作成し、同じプラグインのメソッド関数を後で追加しようとすると、両方のプラグインを個別に作成し、それらを単一のプラグインに組み合わせて関数を反復処理して、 kernel.ImportPluginFromFunctions("myAggregatePlugin", myAggregatedFunctions) 拡張機能を使用して最終的なプラグインに集約する別のアプローチを使用しない限り、機能しません。
試験的属性機能の使用。
この機能は、V1 で変更または完全に削除できる機能をマークするために導入されました。
モードの詳細については、現在リリースされている試験的機能の一覧 ここで確認してください。
構成ファイルのプロンプト
プロンプト構成ファイルには、既定および複数のサービス/モデル構成を含む主要な変更が導入されました。
注意すべきその他の名前付けの変更:
completionの名前がexecution_settingsに変更されました。inputの名前がinput_variablesに変更されました。defaultValueの名前がdefaultに変更されました。parametersの名前がinput_variablesに変更されました。service_idに一致したexecution_settings内の各プロパティ名は、サービス/モデルの実行設定を構成するために使用されます。 つまり、次のようになります。// The "service1" execution settings will be used to configure the OpenAIChatCompletion service Kernel kernel = Kernel.CreateBuilder() .AddOpenAIChatCompletion(serviceId: "service1", modelId: "gpt-4")
以前
{
"schema": 1,
"description": "Given a text input, continue it with additional text.",
"type": "completion",
"completion": {
"max_tokens": 4000,
"temperature": 0.3,
"top_p": 0.5,
"presence_penalty": 0.0,
"frequency_penalty": 0.0
},
"input": {
"parameters": [
{
"name": "input",
"description": "The text to continue.",
"defaultValue": ""
}
]
}
}
After
{
"schema": 1,
"description": "Given a text input, continue it with additional text.",
"execution_settings": {
"default": {
"max_tokens": 4000,
"temperature": 0.3,
"top_p": 0.5,
"presence_penalty": 0.0,
"frequency_penalty": 0.0
},
"service1": {
"model_id": "gpt-4",
"max_tokens": 200,
"temperature": 0.2,
"top_p": 0.0,
"presence_penalty": 0.0,
"frequency_penalty": 0.0,
"stop_sequences": ["Human", "AI"]
},
"service2": {
"model_id": "gpt-3.5_turbo",
"max_tokens": 256,
"temperature": 0.3,
"top_p": 0.0,
"presence_penalty": 0.0,
"frequency_penalty": 0.0,
"stop_sequences": ["Human", "AI"]
}
},
"input_variables": [
{
"name": "input",
"description": "The text to continue.",
"default": ""
}
]
}