Semantic Kernel 如何用 Prompt Filters 为提示接入 Azure AI Content Safety 内容安全校验

Semantic Kernel 如何用 Prompt Filters 为提示接入 Azure AI Content Safety 内容安全校验 Semantic Kernel 如何用 Prompt Filters 为提示接入 Azure AI Content Safety 内容安全校验【免费下载链接】semantic-kernelIntegrate cutting-edge LLM technology quickly and easily into your apps项目地址: https://gitcode.com/GitHub_Trending/se/semantic-kernel如果你的应用把用户输入直接拼进提示发给聊天模型需要在请求到达模型之前拦截两类风险一是含有冒犯性内容的文本二是提示注入/越狱类攻击。Semantic Kernel 提供 Prompt FiltersIPromptRenderFilter机制可以在提示渲染完成后、调用模型之前插入校验逻辑dotnet/samples/Demos/ContentSafety/ 示例展示了如何用它接入 Azure AI Content Safety 的文本分析和 Prompt Shields 攻击检测服务拦截后以400 Bad Request拒绝请求从而把检测逻辑与业务逻辑分开。准备条件按 README 的要求你需要OpenAI 订阅Azure 订阅在 Azure portal 创建 Content Safety 资源输入唯一资源名、选择订阅和资源组区域仅支持East US 或 West Europe选择价格层级后点击Create得到 Endpoint 和 Key。示例项目ContentSafety.csproj目标框架为net10.0引用了Azure.AI.ContentSafety包以及仓库内的 SemanticKernel.Core 和 Connectors.OpenAI 两个项目所以它需要与核心库在同一仓库内构建。配置 Azure AI Content Safety 与 OpenAI 凭据README 给出两种配置方式。方式一直接写入appsettings.json/appsettings.Development.json。模板appsettings.json中的两个配置节需要补齐的值如下OpenAI: { ChatModelId: , ApiKey: }, AzureContentSafety: { Endpoint: , ApiKey: }对应关系在 OpenAIOptions 和 AzureContentSafetyOptions 中定义四个属性都标记为[Required]缺失时配置校验config.GetValidT会失败。方式二使用 .NET Secret ManagerREADME 给出的命令是... your endpoint ...等位置替换为你自己的值# Azure AI Content Safety dotnet user-secrets set AzureContentSafety:Endpoint ... your endpoint ... dotnet user-secrets set AzureContentSafety:ApiKey ... your api key ... # OpenAI dotnet user-secrets set OpenAI:ChatModelId ... your model ... dotnet user-secrets set OpenAI:ApiKey ... your api key ... 在 Program.cs 中注册 Kernel 与两个 Prompt FilterProgram.cs 的装配逻辑分四步// Add Semantic Kernel builder.Services.AddKernel(); builder.Services.AddOpenAIChatCompletion(openAIOptions.ChatModelId, openAIOptions.ApiKey); // Add Semantic Kernel prompt content safety filters builder.Services.AddSingletonIPromptRenderFilter, TextModerationFilter(); builder.Services.AddSingletonIPromptRenderFilter, AttackDetectionFilter(); // Add Azure AI Content Safety services builder.Services.AddSingletonContentSafetyClient(_ { return new ContentSafetyClient( new Uri(azureContentSafetyOptions.Endpoint), new AzureKeyCredential(azureContentSafetyOptions.ApiKey)); }); builder.Services.AddSingletonPromptShieldService(serviceProvider { return new PromptShieldService( serviceProvider.GetRequiredServiceContentSafetyClient(), azureContentSafetyOptions); }); // Add exception handlers builder.Services.AddExceptionHandlerContentSafetyExceptionHandler(); builder.Services.AddProblemDetails();其中两个 Filter 是校验的核心两者都先执行await next(context)完成提示渲染再取context.RenderedPrompt做分析文本审核TextModerationFilter 把渲染后的提示交给ContentSafetyClient.AnalyzeTextAsync(new AnalyzeTextOptions(prompt))。Azure AI Content Safety 将有害内容分为 Hate、Sexual、Violence、Self-Harm 四个类别每个类别有 0–7 的严重度评级裁剪后为 0、2、4、6。该示例的判断标准是任一类别Severity 0就抛出TextModerationException消息为Offensive content detected. Operation is denied.异常数据里携带每个类别的Severity明细CategoriesAnalysis。攻击检测AttackDetectionFilter 除了渲染后的提示还会从context.Arguments[documents]读取Liststring形式的文档数据交给 PromptShieldService 做 Prompt Shields 分析。服务以 POST 请求{Endpoint}contentsafety/text:shieldPrompt?api-version2024-02-15-previewapi-version 是该类构造参数的默认值发出请求。只要UserPromptAnalysis.AttackDetected为true或任一文档的AttackDetected为true就抛出AttackDetectionException消息为Attack detected. Operation is denied.。业务端点不感知这些细节。ChatController 只负责把message和documents放进KernelArguments调用kernel.InvokePromptAsync并返回结果var arguments new KernelArguments { [userMessage] chat.Message, [documents] chat.Documents }; return this.Ok((await this._kernel.InvokePromptAsync(Prompt, arguments)).ToString());统一把拦截结果转成 400 响应Filter 抛出的两个异常由 ContentSafetyExceptionHandler 捕获。它只处理TextModerationException和AttackDetectionException其他异常返回false交给默认处理。命中时响应为400 Bad Request的ProblemDetailsTitle是Bad RequestDetail是异常消息上面两条拒绝消息之一扩展字段Extensions携带异常Data中的分析明细——文本审核是categoriesAnalysis攻击检测是userPrompt和documents两组分析结果。运行与验证README 的 Testing 部分给出验证流程启动 ASP.NET Web API 应用在示例目录下执行dotnet run即可启动该 Web 应用。打开 ContentSafety.http。文件顶部定义了HostAddress http://localhost:5231包含三个场景的POST {{HostAddress}}/chat/请求场景请求体要点预期响应正常请求message: Hi, how are you today?200 OK冒犯性内容message: They are bad people!400 Bad Request攻击内容DAN 越狱提示外加一封带注入指令的documents邮件400 Bad RequestVisual Studio 202217.8 及以上版本可以直接从ContentSafety.http发送请求VS Code 用户可以把该文件当作 REST API 规范用任意工具发送这三组请求。请求体中message为必填字段documents可选见 ChatModel。判定依据是上面的状态码200 表示提示通过了两个 Filter 并正常调用模型400 表示被拦截此时检查响应体中的detail字段区分是文本审核还是攻击检测命中扩展字段里可以看到具体类别严重度或 Prompt Shields 的分析结果。限制与边界示例的拦截阈值是硬编码的任一危害类别Severity 0即拒绝不是可配置的阈值完整严重度范围为 0–7裁剪后为 0、2、4、6。Prompt Shields 调用走的是api-version2024-02-15-preview的 REST 接口。创建 Content Safety 资源时区域限定为 East US 或 West Europe。异常处理器只覆盖这两个内容安全异常其他异常例如模型调用失败会按 ASP.NET 默认异常处理走。更多背景可参考示例 README 末尾列出的 Azure AI Content Safety 文本分析与 Prompt Shields 文档。【免费下载链接】semantic-kernelIntegrate cutting-edge LLM technology quickly and easily into your apps项目地址: https://gitcode.com/GitHub_Trending/se/semantic-kernel创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考