Dela via


Vad är filter?

Filter förbättrar säkerheten genom att ge kontroll och synlighet över hur och när funktioner körs. Detta krävs för att ingjuta ansvarsfulla AI-principer i ditt arbete så att du känner dig säker på att din lösning är företagsklar.

Filter används till exempel för att verifiera behörigheter innan ett godkännandeflöde börjar. IFunctionInvocationFilter körs för att kontrollera behörigheterna för den person som vill skicka ett godkännande. Det innebär att endast en utvald grupp med personer kommer att kunna starta processen.

Ett bra exempel på filter finns här i vårt detaljerade blogginlägg om semantisk kernel på Filter.   Semantiska kernelfilter

Det finns tre typer av filter:

  • Funktionsanropsfilter – det körs varje gång KernelFunction anropas. Gör det möjligt att hämta information om funktionen som ska köras, dess argument, fånga ett undantag under funktionskörningen, åsidosätta funktionsresultatet, försöka köra funktionen igen vid fel (kan användas för att växla till en annan AI-modell).
  • Återgivningsfilter för fråga – det körs innan återgivningsåtgärden. Gör att du kan se vilken uppmaning som ska skickas till AI, ändra prompten (t.ex. RAG, PII-redigeringsscenarier ) och förhindra att uppmaningen skickas till AI med åsidosättning av funktionsresultat (kan användas för semantisk cachelagring).
  • Filter för anrop av automatiska funktioner – liknar funktionsanropsfilter, men det körs i en omfattning av automatic function calling åtgärden, så det har mer information tillgänglig i en kontext, inklusive chatthistorik, lista över alla funktioner som ska köras och begära iterationsräknare. Det gör det också möjligt att avsluta processen för automatisk funktionsanrop (t.ex. det finns 3 funktioner att köra, men det finns redan önskat resultat från den andra funktionen).

Varje filter har context objekt som innehåller all information som rör funktionskörning eller promptåtergivning. Tillsammans med kontexten finns det också ett next ombud/återanrop som kör nästa filter i själva pipelinen eller själva funktionen. Detta ger mer kontroll, och det är användbart om det finns några skäl att undvika funktionskörning (t.ex. skadliga prompt- eller funktionsargument). Det är möjligt att registrera flera filter av samma typ, där varje filter har olika ansvar.

Exempel på funktionsanropsfilter för att utföra loggning före och efter funktionsanrop:

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

Exempel på promptåtergivningsfilter som åsidosätter renderad uppmaning innan den skickas till 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";
    }
}

Exempel på automatiskt funktionsanropsfilter som avslutar funktionsanropsprocessen så snart vi har önskat resultat:

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

Mer information

C#/.NET: