Condividi tramite


Che cosa sono i filtri?

I filtri migliorano la sicurezza fornendo controllo e visibilità su come e quando vengono eseguite le funzioni. Questo è necessario per infondere principi di IA responsabili nel lavoro in modo che si senta sicuro che la soluzione sia pronta per l'azienda.

Ad esempio, i filtri vengono sfruttati per convalidare le autorizzazioni prima dell'inizio di un flusso di approvazione. Viene IFunctionInvocationFilter eseguito per controllare le autorizzazioni della persona che sta cercando di inviare un'approvazione. Ciò significa che solo un gruppo selezionato di persone sarà in grado di avviare il processo.

Un buon esempio di filtri è disponibile qui nel post di blog dettagliato sul kernel semantico su Filtri.   Filtri del kernel semantico

Esistono 3 tipi di filtri:

  • Filtro chiamate di funzione: viene eseguito ogni volta KernelFunction che viene richiamato. Consente di ottenere informazioni sulla funzione che verrà eseguita, i relativi argomenti, intercettare un'eccezione durante l'esecuzione della funzione, eseguire l'override del risultato della funzione, ripetere l'esecuzione della funzione in caso di errore (può essere usato per passare ad altro modello di intelligenza artificiale).
  • Filtro di rendering prompt: viene eseguito prima dell'operazione di rendering della richiesta. Consente di visualizzare il prompt che verrà inviato all'intelligenza artificiale, modificare il prompt (ad esempio rag, scenari di redazione delle informazioni personali) e impedire l'invio del prompt all'intelligenza artificiale con override dei risultati della funzione (può essere usato per la memorizzazione nella cache semantica).
  • Filtro di chiamata automatica della funzione: simile al filtro di chiamata di funzione, ma viene eseguito in un ambito di automatic function calling operazione, pertanto contiene altre informazioni disponibili in un contesto, tra cui cronologia chat, elenco di tutte le funzioni che verranno eseguite e richiedere contatori di iterazione. Consente anche di terminare il processo di chiamata automatica delle funzioni (ad esempio, ci sono 3 funzioni da eseguire, ma esiste già il risultato desiderato dalla seconda funzione).

Ogni filtro ha context un oggetto che contiene tutte le informazioni correlate all'esecuzione della funzione o al rendering del prompt. Insieme al contesto, esiste anche un next delegato/callback, che esegue il filtro successivo nella pipeline o nella funzione stessa. Ciò offre un maggiore controllo ed è utile nel caso in cui ci siano alcuni motivi per evitare l'esecuzione di funzioni (ad esempio argomenti di prompt o funzioni dannosi). È possibile registrare più filtri dello stesso tipo, in cui ogni filtro avrà una responsabilità diversa.

Esempio di filtro di chiamata di funzione per eseguire la registrazione prima e dopo la chiamata di funzione:

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

Esempio di filtro di rendering prompt che esegue l'override del prompt prima di inviarlo all'intelligenza artificiale:

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

Esempio di filtro di chiamata alla funzione automatica che termina il processo di chiamata di funzione non appena è disponibile il risultato desiderato:

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

Ulteriori informazioni

C#/.NET: