Delen via


Wat zijn filters?

Filters verbeteren de beveiliging door controle en zichtbaarheid te bieden over hoe en wanneer functies worden uitgevoerd. Dit is nodig om verantwoorde AI-principes in te voeren in uw werk, zodat u zich ervan overtuigd voelt dat uw oplossing gereed is voor ondernemingen.

Filters worden bijvoorbeeld gebruikt om machtigingen te valideren voordat een goedkeuringsstroom begint. De IFunctionInvocationFilter opdracht wordt uitgevoerd om de machtigingen te controleren van de persoon die een goedkeuring wil indienen. Dit betekent dat alleen een selecte groep personen het proces kan starten.

Hier vindt u een goed voorbeeld van filters in onze gedetailleerde Semantische Kernel-blogpost over Filters.   Semantische kernelfilters

Er zijn drie typen filters:

  • Functie-aanroepfilter: deze wordt elke keer uitgevoerd wanneer KernelFunction deze wordt aangeroepen. Hiermee kunt u informatie ophalen over de functie die wordt uitgevoerd, de argumenten ervan, een uitzondering vangen tijdens het uitvoeren van de functie, het overschrijven van het functieresultaat, het uitvoeren van de functie opnieuw proberen in geval van een fout (kan worden gebruikt om over te schakelen naar een ander AI-model).
  • Promptweergavefilter: het wordt uitgevoerd voordat de prompt wordt weergegeven. Hiermee kunt u zien welke prompt wordt verzonden naar AI, wijzigingsprompt (bijvoorbeeld RAG- en PII-redactionscenario's ) en voorkomen dat de prompt naar AI wordt verzonden met functieresultaatoverschrijving (kan worden gebruikt voor Semantische caching).
  • Automatische functieaanroepfilter, vergelijkbaar met het functieaanroepfilter, maar wordt uitgevoerd in een bewerkingsbereik automatic function calling , zodat er meer informatie beschikbaar is in een context, inclusief chatgeschiedenis, een lijst met alle functies die worden uitgevoerd en iteratietellers worden aangevraagd. Hiermee kunt u ook het proces voor automatisch aanroepen van functies beĆ«indigen (er zijn bijvoorbeeld drie functies die moeten worden uitgevoerd, maar er is al het gewenste resultaat van de tweede functie).

Elk filter heeft context een object dat alle informatie bevat met betrekking tot het uitvoeren van functies of het weergeven van prompts. Samen met context is er ook een next gedelegeerde/callback, waarmee het volgende filter in de pijplijn of functie zelf wordt uitgevoerd. Dit biedt meer controle en het is handig als er enkele redenen zijn om de uitvoering van de functie te voorkomen (bijvoorbeeld schadelijke prompts of functieargumenten). Het is mogelijk om meerdere filters van hetzelfde type te registreren, waarbij elk filter een andere verantwoordelijkheid heeft.

Voorbeeld van functieaanroepfilter voor het uitvoeren van logboekregistratie voor en na functieaanroepen:

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

Voorbeeld van een prompt-weergavefilter waarmee de weergegeven prompt wordt overschreven voordat deze naar AI wordt verzonden:

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

Voorbeeld van het aanroepfilter voor automatische functies waarmee het aanroepen van functies wordt beƫindigd zodra we het gewenste resultaat hebben:

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

Meer informatie

C#/.NET: