什么是筛选器?

筛选器通过提供对函数运行方式和时间的控制和可见性来提高安全性。 这需要将负责任的 AI 原则灌输到工作中,以便确信解决方案已准备就绪。

例如,筛选器用于在审批流开始之前验证权限。 运行 IFunctionInvocationFilter 该操作可检查要提交审批的人员的权限。 这意味着只有一组选定的人员才能启动该过程。

有关筛选器的详细语义内核博客文章中提供了一个很好的筛选器示例。   语义内核筛选器

有 3 种类型的筛选器:

  • 函数调用筛选器 - 每次调用时都会执行 KernelFunction 它。 允许获取有关要执行的函数的信息、其参数、在函数执行期间捕获异常、重写函数结果、失败时重试函数执行(可用于 切换到其他 AI 模型)。
  • 提示呈现筛选器 - 它在提示呈现操作之前执行。 允许查看要发送到 AI 的提示、修改提示(例如 RAG、 PII 修订 方案),并阻止将提示发送到具有函数结果重写的 AI(可用于 语义缓存)。
  • 自动函数调用筛选器 - 类似于函数调用筛选器,但它在操作范围内 automatic function calling 执行,因此它在上下文中提供了更多信息,包括聊天历史记录、将执行的所有函数的列表和请求迭代计数器。 它还允许终止自动函数调用过程(例如,有 3 个函数要执行,但已经有第二个函数所需的结果)。

每个筛选器都有 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: