Freigeben über


Was sind Filter?

Filter verbessern die Sicherheit, indem sie Kontrolle und Sichtbarkeit darüber bereitstellen, wie und wann Funktionen ausgeführt werden. Dies ist erforderlich, um verantwortungsvolle KI-Prinzipien in Ihre Arbeit zu integrieren, damit Sie sicher sind, dass Ihre Lösung für Unternehmen bereit ist.

Beispielsweise werden Filter verwendet, um Berechtigungen zu überprüfen, bevor ein Genehmigungsfluss beginnt. Der IFunctionInvocationFilter Vorgang wird ausgeführt, um die Berechtigungen der Person zu überprüfen, die eine Genehmigung übermitteln möchte. Dies bedeutet, dass nur eine ausgewählte Gruppe von Personen den Prozess starten kann.

Ein gutes Beispiel für Filter finden Sie hier in unserem detaillierten Blogbeitrag "Semantic Kernel" zu Filtern.   Semantischer Kernelfilter

Es gibt drei Arten von Filtern:

  • Funktionsaufruffilter – sie wird jedes Mal ausgeführt, wenn KernelFunction sie aufgerufen wird. Ermöglicht das Abrufen von Informationen zu Funktionen, die ausgeführt werden sollen, deren Argumente, Fangen einer Ausnahme während der Funktionsausführung, Außerkraftsetzen des Funktionsergebnisses, Wiederholen der Funktionsausführung im Falle eines Fehlers (kann verwendet werden, um zu einem anderen KI-Modell zu wechseln).
  • Eingabeaufforderungsrenderfilter – es wird vor dem Eingabeaufforderungsrenderingvorgang ausgeführt. Ermöglicht es, zu sehen, welche Aufforderung an KI gesendet wird, Einegabeaufforderung ändern (z. B. RAG-, PII-Redaction-Szenarien ) und verhindern, dass die Eingabeaufforderung mit Funktionsergebnisüberschreibung an KI gesendet wird (kann für die semantische Zwischenspeicherung verwendet werden).
  • Automatischer Funktionsaufruffilter – ähnlich dem Funktionsaufruffilter, wird aber in einem Vorgangsbereich automatic function calling ausgeführt, sodass weitere Informationen in einem Kontext verfügbar sind, einschließlich Chatverlauf, Liste aller Funktionen, die ausgeführt werden, und Iterationszähler anfordern. Es ermöglicht auch das Beenden des Prozesses für den automatischen Funktionsaufruf (z. B. gibt es drei auszuführende Funktionen, aber es gibt bereits das gewünschte Ergebnis aus der zweiten Funktion).

Jeder Filter verfügt context über ein Objekt, das alle Informationen zum Ausführen der Funktion oder zum Rendern von Eingabeaufforderungen enthält. Zusammen mit dem Kontext gibt es auch einen next Delegat/Rückruf, der den nächsten Filter in der Pipeline oder Funktion selbst ausführt. Dies bietet mehr Kontrolle, und es ist nützlich, falls es einige Gründe gibt, die Funktionsausführung zu vermeiden (z. B. böswillige Eingabeaufforderung oder Funktionsargumente). Es ist möglich, mehrere Filter desselben Typs zu registrieren, wobei jeder Filter unterschiedliche Verantwortung hat.

Beispiel für Funktionsaufruffilter zum Ausführen der Protokollierung vor und nach dem Funktionsaufruf:

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

Beispiel für den Aufforderungsrenderenderfilter, der die gerenderte Eingabeaufforderung überschreibt, bevor sie an KI gesendet wird:

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

Beispiel für automatische Funktionsaufruffilter, der den Prozess zum Aufrufen von Funktionen beendet, sobald das gewünschte Ergebnis erzielt wird:

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

Weitere Informationen

C#/.NET: