筛选调用的函数

已完成

语义内核中的筛选器通过启用精细控制和可见性,使开发人员能够管理和保护函数执行。 它们有助于构建符合企业标准的负责任的 AI 解决方案。 筛选器验证用户权限等作,或修改与 AI 模型的交互,以确保合规性和可靠性。

筛选器类型

语义内核提供三种类型的筛选器来增强控制和自定义:用于管理函数执行的 函数调用筛选器 、提交前用于修改提示的 提示呈现筛选器 ,以及用于定向多步骤工作流的 自动函数调用筛选器 。 每个筛选器类型都满足特定需求,使开发人员能够构建安全且可适应的 AI 解决方案。

函数调用筛选器

每次执行函数时,此筛选器都会运行,无论是源自提示还是在 C# 中实现。 其功能包括:

  • 访问有关函数及其参数的元数据。
  • 记录或验证执行前后的操作。
  • 使用替代的 AI 模型覆盖结果或重试操作。

下面是记录已调用的插件函数的函数调用筛选器示例:

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

        logger.LogInformation("Executed: {PluginName}.{FunctionName}", context.Function.PluginName, context.Function.Name);
    }
}
# Python example: Function invocation filter using a decorator

from semantic_kernel.functions.kernel_function_decorator import kernel_function

def logging_filter(func):
    def wrapper(*args, **kwargs):
        print(f"Invoking: {func.__qualname__}")
        result = func(*args, **kwargs)
        print(f"Executed: {func.__qualname__}")
        return result
    return wrapper

class WeatherForecastUtils:
    @kernel_function(name="GetWeatherForCity", description="Gets the weather for a given city.")
    @logging_filter
    def get_weather_for_city(self, city: str) -> str:
        return "Sunny"

提示呈现筛选器

此筛选器在提示呈现期间触发,可控制提示的格式和提交到 AI 的方式。 它非常适合用于修改敏感信息提示(例如 PII 修订)或启用语义缓存等任务。

下面是提示符渲染筛选器的示例:

public class SafePromptFilter : IPromptRenderFilter
{
    public async Task OnPromptRenderAsync(PromptRenderContext context, Func<PromptRenderContext, Task> next)
    {
        await next(context);

        // Modify prompt before submission
        context.RenderedPrompt = "Safe and sanitized prompt.";
    }
}
# Python example: Prompt render filter using a decorator

def safe_prompt_filter(render_func):
    def wrapper(*args, **kwargs):
        prompt = render_func(*args, **kwargs)
        # Modify prompt before submission
        return "Safe and sanitized prompt."
    return wrapper

@safe_prompt_filter
def render_prompt(user_input):
    return f"User prompt: {user_input}"

# Example usage
print(render_prompt("Sensitive information here"))

自动函数调用筛选器

此筛选器仅在自动函数调用过程中调用。 它可以根据中间结果调整甚至终止工作流。

下面是终止函数调用进程的函数调用筛选器的示例:

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;
        }
    }
}
# Python example: Auto function invocation filter using a decorator

def early_termination_filter(func):
    def wrapper(*args, **kwargs):
        result = func(*args, **kwargs)
        # Simulate checking the result and terminating if needed
        if result == "desired result":
            print("Terminating workflow early.")
            return result
        return result
    return wrapper

@early_termination_filter
def auto_function():
    # Simulate function logic
    return "desired result"

# Example usage
auto_function()

集成函数筛选器

若要集成任何函数筛选器,可以使用以下方法:

  • 依赖项注入

将函数添加到 KernelBuilder 服务:

builder.Services.AddSingleton<IFunctionInvocationFilter, LoggingFilter>();
  • 内核属性

将函数添加到内核 FunctionInvocationFilters 列表:

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

若要在 Python 中集成筛选器,请将修饰器应用于插件方法或提示呈现函数,如上所示。
像往常一样将插件类注册到内核:

kernel.add_plugin(WeatherForecastUtils(), "WeatherForecastUtils")

被装饰的方法会自动应用过滤逻辑。

始终在你的函数筛选器中调用 next 委托,以允许后续筛选器或主要操作执行。 跳过此步骤会阻止操作。

通过集成提示呈现筛选器,使语义内核解决方案更安全、更可靠。 提示筛选器允许你在提示到达 AI 之前对其进行清理。 自动调用过滤器让您可以控制函数的执行,从而根据结果实现提前终止或定义自定义逻辑。