筛选调用的函数
语义内核中的筛选器通过启用精细控制和可见性,使开发人员能够管理和保护函数执行。 它们有助于构建符合企业标准的负责任的 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 之前对其进行清理。 自动调用过滤器让您可以控制函数的执行,从而根据结果实现提前终止或定义自定义逻辑。