第9章-Semantic-Kernel函数过滤器

Semantic Kernel 提供了强大的过滤器机制(Filters),帮助开发者实现函数调用过程的可观察性、安全性与可控性,构建符合企业标准的 Responsible AI 解决方案。


🧱 三种过滤器类型

类型
作用描述

Function Invocation Filter

拦截并处理每一次函数执行(不管是 Prompt 驱动还是 C# 调用)

Prompt Render Filter

在提示词渲染前进行处理,如敏感信息脱敏、缓存处理等

Auto Function Invocation Filter

拦截自动函数调用过程,可实现中途终止、流程控制等


🔍 1. Function Invocation Filter(函数调用过滤器)

该过滤器会在每次函数执行时触发,支持:

  • 访问函数元数据和参数

  • 执行前后日志记录、权限校验

  • 替换结果或切换模型重试

✅ 示例:记录函数调用日志

public sealed class LoggingFilter(ILogger logger) : IFunctionInvocationFilter
{
    public async Task OnFunctionInvocationAsync(FunctionInvocationContext context, Func<FunctionInvocationContext, Task> next)
    {
        logger.LogInformation("Invoking: {PluginName}.{FunctionName}", context.Function.PluginName, context.Function.Name);

        await next(context); // 注意:必须调用 next 才能继续执行!

        logger.LogInformation("Executed: {PluginName}.{FunctionName}", context.Function.PluginName, context.Function.Name);
    }
}

🧾 2. Prompt Render Filter(提示词渲染过滤器)

该过滤器在 Prompt 渲染前触发,适用于:

  • 敏感信息处理(如 PII 脱敏)

  • 动态修改提示词

  • 启用语义缓存

✅ 示例:替换为“安全提示词”

public class SafePromptFilter : IPromptRenderFilter
{
    public async Task OnPromptRenderAsync(PromptRenderContext context, Func<PromptRenderContext, Task> next)
    {
        await next(context);
        context.RenderedPrompt = "Safe and sanitized prompt.";
    }
}

⚙️ 3. Auto Function Invocation Filter(自动函数调用过滤器)

只在自动函数调用流程中触发,适用于:

  • 分阶段流程控制

  • 条件终止自动调用链

✅ 示例:达到期望结果即终止调用链

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;
        }
    }
}

🧩 如何注册过滤器?

✅ 方法一:通过 DI 容器注入

builder.Services.AddSingleton<IFunctionInvocationFilter, LoggingFilter>();

✅ 方法二:直接添加到 Kernel

kernel.FunctionInvocationFilters.Add(new LoggingFilter(logger));

⚠️ 重要:务必调用 next(context) 以继续执行操作链,否则函数将被中断!


🎯 小结

过滤器类型
用途

FunctionInvocationFilter

日志、安全、替代执行等通用函数拦截

PromptRenderFilter

Prompt 格式化前的内容管控

AutoFunctionInvocationFilter

控制自动调用流程、中途终止

通过合理集成这些过滤器,开发者可提升系统安全性、透明性和智能性,打造符合生产级要求的 AI 应用。

Last updated