¿Qué son los filtros?

Los filtros mejoran la seguridad al proporcionar control y visibilidad sobre cómo y cuándo se ejecutan las funciones. Esto es necesario para infundir principios de inteligencia artificial responsables en su trabajo para que se sienta seguro de que la solución está lista para la empresa.

Por ejemplo, los filtros se aprovechan para validar los permisos antes de que comience un flujo de aprobación. IFunctionInvocationFilter se ejecuta para comprobar los permisos de la persona que busca enviar una aprobación. Esto significa que solo un grupo selecto de personas podrá iniciar el proceso.

Aquí se proporciona un buen ejemplo de filtros en nuestra entrada de blog de Kernel semántico detallado en Filtros.   Filtros de kernel semántico

Hay tres tipos de filtros:

  • Filtro de invocación de función: se ejecuta cada vez KernelFunction que se invoca. Permite obtener información sobre la función que se va a ejecutar, sus argumentos, detectar una excepción durante la ejecución de la función, invalidar el resultado de la función, reintentar la ejecución de la función en caso de error (se puede usar para cambiar a otro modelo de IA).
  • Preguntar filtro de representación: se ejecuta antes de la operación de representación del símbolo del sistema. Permite ver qué mensaje se va a enviar a la inteligencia artificial, modificar el mensaje (por ejemplo, escenarios de redacción RAG, PII) y evitar que la solicitud se envíe a la inteligencia artificial con la invalidación de resultados de la función (se puede usar para el almacenamiento en caché semántico).
  • Filtro de invocación de función automática: similar al filtro de invocación de función, pero se ejecuta en un ámbito de automatic function calling operación, por lo que tiene más información disponible en un contexto, incluido el historial de chat, la lista de todas las funciones que se ejecutarán y solicitarán contadores de iteración. También permite finalizar el proceso de llamada de función automática (por ejemplo, hay tres funciones que se van a ejecutar, pero ya hay el resultado deseado de la segunda función).

Cada filtro tiene context un objeto que contiene toda la información relacionada con la ejecución de funciones o la representación del símbolo del sistema. Junto con el contexto, también hay una next devolución de llamada o delegado, que ejecuta el siguiente filtro en la canalización o la propia función. Esto proporciona más control y resulta útil en caso de que haya algunas razones para evitar la ejecución de funciones (por ejemplo, argumentos de función o mensajes malintencionados). Es posible registrar varios filtros del mismo tipo, donde cada filtro tendrá una responsabilidad diferente.

Ejemplo de filtro de invocación de función para realizar el registro antes y después de la invocación de función:

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

Ejemplo de filtro de representación del símbolo del sistema que invalida la solicitud representada antes de enviarlo a 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";
    }
}

Ejemplo de filtro de invocación de función automática que finaliza el proceso de llamada de función en cuanto tenemos el resultado deseado:

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

Más información

C#/.NET: