什麼是篩選條件?
篩選會藉由提供函式執行方式和時機的控制和可見度,來增強安全性。 您必須這麼做,才能將負責任的 AI 準則灌輸到您的工作中,讓您確信解決方案已準備好企業。
例如,篩選會用來在核准流程開始之前驗證許可權。 會 IFunctionInvocationFilter
執行 來檢查想要提交核准的人員許可權。 這表示只有選取的一組人員才能開始此程式。
在篩選的詳細語意核心部落格文章中,這裡提供了一個很好的篩選範例。
篩選有 3 種類型:
- 函式調用篩選 - 每次叫用時
KernelFunction
都會執行。 允許取得即將執行的函式、其自變數、在函式執行期間攔截例外狀況、覆寫函式結果、失敗時重試函式執行的資訊(可用來 切換至其他 AI 模型)。 - 提示轉譯篩選 - 會在提示轉譯作業之前執行。 允許查看將傳送至 AI 的提示、修改提示(例如 RAG、 PII 修訂 案例),以及防止提示傳送至具有函式結果覆寫的 AI(可用於 語意快取)。
- 自動函式調用篩選 - 類似於函式調用篩選,但它是在作業範圍內
automatic function calling
執行,因此它在內容中有更多可用資訊,包括聊天記錄、將執行的所有函式清單,以及要求反覆運算計數器。 它也允許終止自動函式呼叫進程(例如,有3個函式要執行,但已經有第二個函式所需的結果)。
每個篩選都有 context
物件,其中包含與函式執行或提示轉譯相關的所有資訊。 除了內容,還有委派 next
/回呼,它會在管線或函式本身中執行下一個篩選。 這可提供更多的控制權,萬一有一些原因可以避免函式執行(例如惡意提示或函式自變數)會很有用。 可以註冊相同類型的多個篩選,其中每個篩選都會有不同的責任。
函式調用篩選條件的範例,以在函式調用前後執行記錄:
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);
}
}
提示轉譯篩選範例,它會先覆寫轉譯的提示,再將它傳送至 AI:
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";
}
}
自動函式調用篩選的範例,只要我們有所需的結果,就會終止函式呼叫進程:
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;
}
}
}
其他相關資訊
C#/.NET: