Sdílet prostřednictvím


Co jsou filtry?

Filtry vylepšují zabezpečení tím, že poskytují kontrolu a přehled o tom, jak a kdy funkce běží. To je potřeba k instilovat zodpovědné principy AI do vaší práce, abyste měli jistotu, že vaše řešení je připravené pro podniky.

Filtry se například využívají k ověření oprávnění před zahájením toku schválení. Spustí se a IFunctionInvocationFilter zkontroluje oprávnění osoby, která chce odeslat schválení. To znamená, že proces zahájí jenom výběrová skupina lidí.

Dobrý příklad filtrů je zde k dispozici v našem podrobném blogovém příspěvku o sémantickém jádru na Filtry.   Sémantické filtry jádra

Existují tři typy filtrů:

  • Filtr vyvolání funkce – spustí se při KernelFunction každém vyvolání. Umožňuje získat informace o funkci, která se bude spouštět, její argumenty, zachytit výjimku během provádění funkce, přepsat výsledek funkce, opakovat spuštění funkce v případě selhání (lze použít k přepnutí na jiný model AI).
  • Filtr vykreslování výzvy – spustí se před operací vykreslování výzvy. Umožňuje zobrazit, jaké výzvy se odešlou do AI, upravit výzvu (např. scénáře redakce RAG, PII) a zabránit odeslání výzvy do AI s přepsání výsledku funkce (lze ji použít pro sémantické ukládání do mezipaměti).
  • Filtr automatického vyvolání funkce – podobný filtru vyvolání funkce, ale provádí se v oboru automatic function calling operace, takže má k dispozici další informace v kontextu, včetně historie chatu, seznam všech funkcí, které se budou spouštět, a čítače iterace požadavků. Umožňuje také ukončit proces automatického volání funkce (např. existují 3 funkce ke spuštění, ale požadovaný výsledek z druhé funkce už existuje).

Každý filtr obsahuje context objekt, který obsahuje všechny informace související se spuštěním funkce nebo vykreslováním výzvy. Spolu s kontextem next existuje také delegát /zpětné volání, který provede další filtr v kanálu nebo samotné funkci. To poskytuje větší kontrolu a je užitečné v případě, že existuje několik důvodů, proč se vyhnout spuštění funkce (např. škodlivé výzvy nebo argumenty funkce). Je možné zaregistrovat více filtrů stejného typu, kde každý filtr bude mít jinou odpovědnost.

Příklad filtru vyvolání funkce pro provedení protokolování před a po vyvolání funkce:

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

Příklad filtru vykreslování výzvy, který před odesláním do AI přepíše vykreslenou výzvu:

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

Příklad filtru automatického vyvolání funkce, který ukončí proces volání funkce hned po dosažení požadovaného výsledku:

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

Více informací

C#/.NET: