Partager via


Qu’est-ce que les filtres ?

Les filtres améliorent la sécurité en fournissant un contrôle et une visibilité sur la façon et le moment où les fonctions s’exécutent. Cela est nécessaire pour inculquer des principes d’IA responsables dans votre travail afin de vous sentir confiant que votre solution est prête pour l’entreprise.

Par exemple, les filtres sont utilisés pour valider les autorisations avant qu’un flux d’approbation ne commence. Il IFunctionInvocationFilter est exécuté pour vérifier les autorisations de la personne qui cherche à soumettre une approbation. Cela signifie que seul un groupe de personnes sélectionné sera en mesure de lancer le processus.

Un bon exemple de filtres est fourni ici dans notre billet de blog détaillé du noyau sémantique sur les filtres.   Filtres de noyau sémantique

Il existe 3 types de filtres :

  • Filtre d’appel de fonction : il est exécuté chaque fois KernelFunction qu’il est appelé. Permet d’obtenir des informations sur la fonction qui va être exécutée, ses arguments, intercepter une exception pendant l’exécution de la fonction, remplacer le résultat de la fonction, réessayer l’exécution de la fonction en cas d’échec (peut être utilisé pour basculer vers un autre modèle IA).
  • Filtre de rendu d’invite : il est exécuté avant l’opération de rendu d’invite. Permet de voir quelle invite va être envoyée à l’IA, de modifier l’invite (par exemple, RAG, scénarios de réaction des informations personnelles) et d’empêcher l’invite d’être envoyée à l’IA avec remplacement des résultats de fonction (peut être utilisée pour la mise en cache sémantique).
  • Filtre d’appel de fonction automatique : similaire au filtre d’appel de fonction, mais il est exécuté dans une étendue d’opération automatic function calling , de sorte qu’il dispose d’informations supplémentaires disponibles dans un contexte, notamment l’historique des conversations, la liste de toutes les fonctions qui seront exécutées et les compteurs d’itération de requête. Il permet également d’arrêter le processus d’appel de fonction automatique (par exemple, il existe 3 fonctions à exécuter, mais il existe déjà le résultat souhaité de la deuxième fonction).

Chaque filtre a un context objet qui contient toutes les informations relatives à l’exécution de la fonction ou au rendu d’invite. Avec le contexte, il existe également un next délégué/rappel, qui exécute le filtre suivant dans le pipeline ou la fonction lui-même. Cela fournit davantage de contrôle, et il est utile dans le cas où il existe certaines raisons d’éviter l’exécution de la fonction (par exemple, des invites malveillantes ou des arguments de fonction). Il est possible d’inscrire plusieurs filtres du même type, où chaque filtre aura une responsabilité différente.

Exemple de filtre d’appel de fonction pour effectuer la journalisation avant et après l’appel de fonction :

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

Exemple de filtre de rendu d’invite qui remplace l’invite rendue avant de l’envoyer à l’IA :

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

Exemple de filtre d’appel de fonction automatique qui met fin au processus d’appel de fonction dès que nous avons le résultat souhaité :

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

Plus d’informations

C#/.NET :