フィルターとは
フィルターは、関数の実行方法とタイミングを制御して可視性を提供することで、セキュリティを強化します。 これは、ソリューションがエンタープライズ対応であることを確信できるように、責任ある AI 原則を作業に導入するために必要です。
たとえば、承認フローが開始される前に、フィルターを利用してアクセス許可を検証します。 IFunctionInvocationFilter
は、承認を送信しようとしているユーザーのアクセス許可を確認するために実行されます。 つまり、プロセスを開始できるのは、選択したユーザーグループだけです。
フィルターの良い例は ここに フィルターに関するセマンティック カーネルのブログ記事で提供されています。
フィルターには次の 3 種類があります。
- 関数呼び出しフィルター -
KernelFunction
が呼び出されるたびに実行されます。 実行される関数、その引数、関数の実行中に例外をキャッチする、関数の結果をオーバーライドする、失敗した場合に関数の実行を再試行する (他の AI モデルに 切り替えるために使用できます) に関する情報を取得できます。 - プロンプト レンダリング フィルター - プロンプトレンダリング操作の前に実行されます。 AI に送信されるプロンプトを確認したり、プロンプトを変更したり (RAG、 PII の編集 シナリオなど)、関数の結果のオーバーライドを使用してプロンプトが AI に送信されないようにすることができます ( Semantic Caching に使用できます)。
- 自動関数呼び出しフィルター - 関数呼び出しフィルターと同様ですが、
automatic function calling
操作のスコープで実行されるため、チャット履歴、実行されるすべての関数の一覧、要求イテレーション カウンターなど、コンテキストで使用できる詳細情報が含まれます。 また、自動関数呼び出しプロセスを終了することもできます (たとえば、実行する関数は 3 つありますが、2 番目の関数の目的の結果は既にあります)。
各フィルターには、関数の実行またはプロンプトのレンダリングに関連するすべての情報を含む context
オブジェクトがあります。 コンテキストと共に、パイプラインまたは関数自体で次のフィルターを実行する next
デリゲート/コールバックもあります。 これにより、より多くの制御が提供され、関数の実行を回避する何らかの理由 (悪意のあるプロンプトや関数の引数など) がある場合に便利です。 同じ種類の複数のフィルターを登録できます。各フィルターの役割は異なります。
関数呼び出しの前後にログを実行する関数呼び出しフィルターの例:
public sealed class LoggingFilter(ILogger logger) : IFunctionInvocationFilter
{
public async Task OnFunctionInvocationAsync(FunctionInvocationContext context, Func<FunctionInvocationContext, Task> next)
{
logger.LogInformation("FunctionInvoking - {PluginName}.{FunctionName}", context.Function.PluginName, context.Function.Name);
await next(context);
logger.LogInformation("FunctionInvoked - {PluginName}.{FunctionName}", context.Function.PluginName, context.Function.Name);
}
}
レンダリングされたプロンプトを AI に送信する前にオーバーライドするプロンプト レンダリング フィルターの例:
public class SafePromptFilter : IPromptRenderFilter
{
public async Task OnPromptRenderAsync(PromptRenderContext context, Func<PromptRenderContext, Task> next)
{
// Example: get function information
var functionName = context.Function.Name;
await next(context);
// Example: override rendered prompt before sending it to AI
context.RenderedPrompt = "Safe prompt";
}
}
目的の結果が得られたらすぐに関数呼び出しプロセスを終了する自動関数呼び出しフィルターの例:
public sealed class EarlyTerminationFilter : IAutoFunctionInvocationFilter
{
public async Task OnAutoFunctionInvocationAsync(AutoFunctionInvocationContext context, Func<AutoFunctionInvocationContext, Task> next)
{
await next(context);
var result = context.Result.GetValue<string>();
if (result == "desired result")
{
context.Terminate = true;
}
}
}
詳細
C#/.NET: