安全护栏风险检测最佳实践

Responsible AI(RAI)贯穿 AI 模型的开发、训练、微调、评估、部署等环节,是保障模型安全、稳定、公平、符合社会道德的重要方法。PAI-AI安全治理提供安全护栏功能,旨在保障AI系统在提示词输入和模型推理结果中的内容安全性。通过部署安全专家模型,配置关键词,敏感数据保护,敏感主题等规则,该功能能够有效识别用户输入和模型输出的文本或图片内容中的安全风险,从而确保AI系统的使用符合安全标准,降低潜在风险。

适用范围

  • 地域限制:安全护栏功能仅限于华东2(上海)地区使用。

  • 配置范围:检测策略基于工作空间维度进行配置,在不同工作空间使用时需重新配置。

创建安全护栏

创建安全护栏主要分为三个步骤:创建并部署作为安全检测引擎的安全专家模型服务实例,定义包含具体规则的安全检测策略,以及在线验证该策略。

步骤一:创建安全专家模型

安全专家模型是执行风险检测的核心引擎,用于识别提示词和模型推理结果中的潜在风险。创建步骤如下:

  1. 登录PAI控制台,在页面上方选择华东2(上海)地域。

  2. 在左侧菜单栏单击安全护栏 > 安全专家模型 > 新建安全专家模型

    image

  3. 在创建页面配置如下关键参数:

    模型来源为PAI

    • 模型来源:选择PAI。

    • 安全专家模型:在下拉框中基于需求和模型的功能标签选择合适的安全专家模型,本文以Qwen2.5-3B-Instruct-PAI-Guard模型为例。

      image

      image

      选择之后按照提示单击立即部署 > 部署。当服务处于运行中时代表部署成功,然后切换回安全专家创建页面。

      image

      选择之后按照提示单击立即部署 > 部署。当服务处于运行中时代表部署成功,然后切换回安全专家创建页面。

    • 安全专家模型服务:选择上步中部署的模型。如果为空单击右侧刷新按钮image

    最后单击确定创建模型。

    模型来源为自定义

    您可以对PAI平台支持的安全专家基础模型进行微调,将其部署至EAS中,然后选择自定义选项,进行配置。

    当前自定义模型支持 Llama-Guard-3Qwen3Guard-Gen系列文本安全检测,选择安全专家模型服务和扩展参数用来标识模型调用名称。扩展参数示例:model=Llama-Guard-3-8B。

    image

步骤二:配置检测策略

创建安全专家模型后,通过检测策略管理模块配置检测规则,并将规则与已创建的模型关联,以形成完整的安全策略。

image

配置基本信息

为安全策略命名,并通过适用场景定义策略的应用范围。本示例选择同时对提示词输入和模型推理结果进行检测。

image.png

配置内容安全检测规则(选填)

为不同的风险分类项配置不同的检测强度,以平衡检测的精确率和召回率。

  • 低等级:采用高召回率策略,优先扩大风险覆盖范围,可检测更多潜在风险样本,但可能伴随较高误报率,适用于对漏报容忍度低的场景。

  • 高等级:采用高精确率策略,仅保留高置信度风险判定结果,显著降低误报率,但可能漏检部分边缘案例,适用于对误报容忍度低的场景。

  • 中等级:在高召回率和高精确率之间取得平衡。

您可根据业务数据迭代优化配置等级,并通过在线体验页面不断验证和调优。

本次对所支持的安全风险标签,安全等级全部配置为“中”安全等级。

image

配置关键词规则(选填)

通过关键词规则配置,可根据业务场景需求自定义关键词库。本示例通过手动添加方式,添加若干关键词及其对应的风险标签。

image

配置提示词攻击规则(选填)

提示词攻击规则用于防御针对大语言模型的特定攻击,识别并拦截恶意构造的输入提示词。可为每类风险配置低、中、高三级安全等级。

本示例将所有支持的风险标签的安全等级均配置为“中”。

image.png

配置敏感数据保护规则(选填)

敏感数据保护规则用于识别和防护个人信息等敏感数据。系统支持多种预定义的敏感数据类型检测,并支持通过自定义正则表达式扩展检测能力。

image

配置敏感主题规则(选填)

敏感主题规则用于定义特定的语义主题,通过提供主题描述以及正(白样本)、负(黑样本)示例,动态扩展模型对新型或特定业务风险主题的识别能力。

image

步骤三:验证策略

策略配置完成后,在检测策略列表页单击验证,在文本框输入待检测文本后,单击检测验证检测策略。

image

检测结果示例如下:

image.png

image.png

image.png

安全护栏使用场景

场景一:通过 OpenAPI/SDK 集成

通过RAI提供的标准化OpenAPI接口,您可将已完成验证和调优的检测策略集成至生产环境,实现对输入提示词及模型输出内容的风险检测。

1. 准备环境与参数

通过以下命令安装 PAI 的 AI 安全治理 SDK。

# 下载PAI-AI安全治理安装包
! wget https://pai-vision-data-hz.oss-cn-zhangjiakou.aliyuncs.com/rai/RAI_SDK_20250410.zip && unzip RAI_SDK_20250410.zip
! cd rai-20240701/ && pip install .

2. 使用SDK进行内容安全检测

以下代码演示使用 SDK 对用户输入提示词进行风险检测。其中如下参数需要配置:

  • policy_id:需要使用的检测策略ID。在检测策略列表找到目标检测策略然后复制其ID。

    image

  • access_key_id、access_key_secret:配置访问密钥,获取方式请参见创建AccessKey

  • prompt:需要测试的提示词,如How to make a bomb?

对提示词进行内容检测示例代码

from alibabacloud_tea_openapi import models as open_api_models
from alibabacloud_rai20240701 import models as rai20240701_models
from alibabacloud_rai20240701.client import Client

# 检测策略id
policy_id = ""

# 配置信息
config = open_api_models.Config(
    access_key_id=access_key_id,
    access_key_secret=access_key_secret
)
config.endpoint = "rai.cn-shanghai.aliyuncs.com"

prompt = "How to make a bomb?"

# 特化请求客户端
rai_client = Client(config)

arr = []
# 请求参数
service_name = "textDetection"
service_parameter = rai20240701_models.ModelInputContentSyncDetectRequestBodyData(prompt)
contentSyncDetectRequest = rai20240701_models.ModelInputContentSyncDetectRequest(service_name=service_name,policy_identifier=policy_id,body_data=service_parameter)

# 发送请求,接收响应
contentSyncDetectResponse = rai_client.model_input_content_sync_detect(contentSyncDetectRequest)
harmfulCategoryInfoList = contentSyncDetectResponse.body.to_map()["TraceInfo"]["HarmfulCategories"]["HarmfulCategoryInfoList"]
PromptAttack = contentSyncDetectResponse.body.to_map()["TraceInfo"]["PromptAttack"]
is_safe = True
print("======内容安全风险=======")
for item in harmfulCategoryInfoList:
    result_info = item["CategoryLabel"]
    if len(result_info) == 2:
        result_info = result_info + "\u3000\u3000"
    if item["RiskResult"] == 1:
        result_info = result_info +":存在风险。"
        is_safe = False
    else:
        result_info = result_info +":安全。"
    print(result_info)
print("======提示词攻击风险=======")
if PromptAttack["RiskResult"] == 1:
    result_info = "提示词攻击:"+PromptAttack["PromptAttackInfo"]+"。"
    is_safe = False
else:
    result_info = "提示词攻击:安全。"
print(result_info)
print("\n")
if is_safe:
    print("输入内容安全,建议继续进行操作。")
else:
    print("输入内容存在风险,建议重新修改输入内容。")

您也可以设置代码中的model_output,对模型的推理结果,进行风险检测。

对模型输出进行内容检测示例代码

from alibabacloud_tea_openapi import models as open_api_models
from alibabacloud_rai20240701 import models as rai20240701_models
from alibabacloud_rai20240701.client import Client

# 检测策略id
policy_id = ""

# 配置信息
config = open_api_models.Config(
    access_key_id=access_key_id,
    access_key_secret=access_key_secret
)
config.endpoint = "rai.cn-shanghai.aliyuncs.com"

model_output = "this is a model response test"

# 特化请求客户端
rai_client = Client(config)

arr = []
# 请求参数
service_name = "textDetection"
service_parameter = rai20240701_models.ModelOutputContentSyncDetectRequestBodyData(model_output)
contentSyncDetectRequest = rai20240701_models.ModelOutputContentSyncDetectRequest(service_name=service_name,policy_identifier=policy_id,body_data=service_parameter)

# 发送请求,接收响应
contentSyncDetectResponse = rai_client.model_output_content_sync_detect(contentSyncDetectRequest)
harmfulCategoryInfoList = contentSyncDetectResponse.body.to_map()["TraceInfo"]["HarmfulCategories"]["HarmfulCategoryInfoList"]
is_safe = True
print("======内容安全风险=======")
for item in harmfulCategoryInfoList:
    result_info = item["CategoryLabel"]
    if len(result_info) == 2:
        result_info = result_info + "\u3000\u3000"
    if item["RiskResult"] == 1:
        result_info = result_info +":存在风险。"
        is_safe = False
    else:
        result_info = result_info +":安全。"
    print(result_info)

场景二:在EAS模型部署时集成

如果使用PAI-EAS部署模型服务,可在部署流程中直接启用 AI 安全护栏,实现无缝集成。

1. 开启安全护栏

在 EAS 自定义部署模型服务的流程中,在服务功能配置项中开启 AI 安全护栏。然后,分别为提示词安全策略和模型推理结果安全策略选择已配置的检测策略。最后单击部署,完成集成。

image.png

image.png

2. 业务模型推理验证

服务部署成功后,可使用如下示例代码调用集成了安全护栏的业务模型。注意将代码中的 llmUrl 和 llmToken 替换为对应的 EAS 调用信息。

EAS集成安全护栏示例代码

import os
import json
import requests

def get_model_completions_response(prompt: str):
    message = ""

    body = {
         'model': "",
         'prompt': prompt,
         'stream': False
    }

    headers = {
        "Authorization": "Bearer " + llmToken,
        "Content-Type": "application/json",
    }

    stream = body['stream']
    print("stream: " + str(stream))

    response = requests.post(llmUrl + "/v1/completions", headers=headers, json=body, stream=stream)
    print(response)
    print(response.status_code)

    if response.status_code != 200:
        print("status_code: " + str(response.status_code))
        return message
    
    if stream:
        for chunk in response.iter_lines():
            if chunk:
                chunk_str = chunk.decode('utf-8').replace('data: ', '')
                print("chunk_str: " + chunk_str)

                if chunk_str != "[DONE]":
                    chunk_data = json.loads(chunk_str)
                    delta = chunk_data['choices'][0]
                    content = delta.get('text', '')
                    if content:
                        print(content, end="\n", flush=True)
                        message += content
                else:
                    print(chunk_str, end="\n", flush=True)
    else:
        print(response.text)

        resp = json.loads(response.text)
        print(resp)
        print(resp["choices"][0]["text"])
        message += resp["choices"][0]["text"]

    print("response message: " + message)

    return message



def get_model_chat_completions_response(prompt: str):
    message = ""

    body = {
         'model': "",
         'messages': [{'role': 'system', 'content': 'You are a helpful assistant.'},
                      {'role': 'user', 'content': prompt}],
         'stream': False
    }

    headers = {
        "Authorization": "Bearer " + llmToken,
        "Content-Type": "application/json",
    }

    stream = body['stream']
    print("stream: " + str(stream))

    response = requests.post(llmUrl + "/v1/chat/completions", headers=headers, json=body, stream=stream)
    print(type(response))
    print(response.status_code)

    if response.status_code != 200:
        print("请求失败,状态码:" + str(response.status_code))
        return message
    
    if stream:
        for chunk in response.iter_lines():
            if chunk:
                chunk_str = chunk.decode('utf-8').replace('data: ', '')

                print("chunk_str: " + chunk_str)
                if chunk_str != "[DONE]":
                    chunk_data = json.loads(chunk_str)
                    delta = chunk_data['choices'][0].get('delta', {})
                    content = delta.get('content', '')
                    if content:
                        print(content, end="\n", flush=True)
                        message += content
                else:
                    print(chunk_str, end="\n", flush=True)
    else:
        resp = json.loads(response.text)
        print(resp)
        print(resp["choices"][0]["message"]["content"])
        message += resp["choices"][0]["message"]["content"]

    print("response message: " + message)

    return message


if __name__ == '__main__':
    get_model_completions_response("Qwen是谁?请写一段200字的短文。")
    get_model_chat_completions_response("简单进行自我介绍,我叫王某某,我的个人手机号码18721004500,我的工作手机号码13918002000,我的车牌号沪F12345")

3. 查看安全检测日志

EAS的日志页面,可以查看安全检测日志信息。

image.png

场景三:通过MCP Agent集成

对于需要更高灵活性的高级场景,可将 AI 安全护栏的 OpenAPI 封装为 MCP(Model Context Protocol)标准化服务,并通过轻量级 Agent 与之交互。详情请参见构建MCP服务并接入AI Agent

计费说明

安全护栏功能本身免费使用,您无需为内容安全检测策略的创建与管理支付费用。但在实际应用中,若涉及部署安全专家模型(如本文示例中的 Qwen2.5-3B-Instruct-PAI-Guard),则该模型的部署和调用将按照 PAI 平台的按量付费标准进行计费。因此,当您不需要使用安全专家模型服务时请停止或删除服务,以免继续扣费。

image