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.
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: