亚马逊AWS官方博客

Amazon Comprehend 新增功能 – 毒舌监察功能

借助 Amazon Comprehend,您无需成为机器学习专家即可从文本中提取见解。使用其内置模型,Comprehend 可以分析输入文档的语法,查找实体、事件、关键短语、个人身份信息(PII),以及总体情绪或和特定实体(如品牌或产品)有关的情绪。

我们于近日增加了检测恶意内容的功能。这项新功能可帮助您为最终用户构建更安全的环境。例如,您可以利用毒舌监察功能来提高对外部贡献(例如评论)开放的应用程序的安全性。当使用生成式人工智能时,您可以使用毒舌监察功能检查大型语言模型(LLM)的输入提示和输出回应。

毒舌监察功能可与 AWS 命令行界面(AWS CLI)以及 AWS SDK 搭配使用。我们通过几个使用 AWS CLI 和 AWS SDK 的例子来了解它在实践中是如何运作的,以及如何检查 LLM 的使用情况。

搭配使用 Amazon Comprehend 毒舌监察功能和 AWS CLI
AWS CLI 中新增的 detect-toxic-content 子命令会检测文本中的恶意内容。输出中包含一个标签列表,每个列表对应输入中的一个文本段。针对每个文本段,所提供的列表中会有标签和一个评分(介于 0 和 1 之间)。

Amazon Comprehend 毒舌监察功能 API

例如,这条 AWS CLI 命令会分析一个文本段,然后为该文本段返回一个 Labels 部分和一个总体 Toxicity 评分,评分介于 0 和 1 之间:

aws comprehend detect-toxic-content --language-code en --text-segments Text="'Good morning, it\'s a beautiful day.'"
{
    "ResultList": [
        {
            "Labels": [
                {
                    "Name": "PROFANITY",
                    "Score": 0.00039999998989515007
                },
                {
                    "Name": "HATE_SPEECH",
                    "Score": 0.01510000042617321
                },
                {
                    "Name": "INSULT",
                    "Score": 0.004699999932199717
                },
                {
                    "Name": "GRAPHIC",
                    "Score": 9.999999747378752e-05
                },
                {
                    "Name": "HARASSMENT_OR_ABUSE",
                    "Score": 0.0006000000284984708
                },
                {
                    "Name": "SEXUAL",
                    "Score": 0.03889999911189079
                },
                {
                    "Name": "VIOLENCE_OR_THREAT",
                    "Score": 0.016899999231100082
                }
            ],
            "Toxicity": 0.012299999594688416
        }
    ]
}

和预想的一样,所有评分都接近于零,未在此文本中检测到恶意内容。

要将输入作为文件进行传送,我首先使用 AWS CLI --generate-cli-skeleton 选项来生成 detect-toxic-content 命令所使用 JSON 语法的框架:

aws comprehend detect-toxic-content --generate-cli-skeleton
{
    "TextSegments": [
        {
            "Text": ""
        }
    ],
    "LanguageCode": "en"
}

我会编写输出到文件,并且添加三个文本段(我不会在此显示关于如何处理恶意内容的文本)。这次找到了不同级别的恶意内容。每个 Labels 部分和对应的输入文本段相关。

aws comprehend detect-toxic-content --cli-input-json file://input.json
{
    "ResultList": [
        {
            "Labels": [
                {
                    "Name": "PROFANITY",
                    "Score": 0.03020000085234642
                },
                {
                    "Name": "HATE_SPEECH",
                    "Score": 0.12549999356269836
                },
                {
                    "Name": "INSULT",
                    "Score": 0.0738999992609024
                },
                {
                    "Name": "GRAPHIC",
                    "Score": 0.024399999529123306
                },
                {
                    "Name": "HARASSMENT_OR_ABUSE",
                    "Score": 0.09510000050067902
                },
                {
                    "Name": "SEXUAL",
                    "Score": 0.023900000378489494
                },
                {
                    "Name": "VIOLENCE_OR_THREAT",
                    "Score": 0.15549999475479126
                }
            ],
            "Toxicity": 0.06650000065565109
        },
        {
            "Labels": [
                {
                    "Name": "PROFANITY",
                    "Score": 0.03400000184774399
                },
                {
                    "Name": "HATE_SPEECH",
                    "Score": 0.2676999866962433
                },
                {
                    "Name": "INSULT",
                    "Score": 0.1981000006198883
                },
                {
                    "Name": "GRAPHIC",
                    "Score": 0.03139999881386757
                },
                {
                    "Name": "HARASSMENT_OR_ABUSE",
                    "Score": 0.1777999997138977
                },
                {
                    "Name": "SEXUAL",
                    "Score": 0.013000000268220901
                },
                {
                    "Name": "VIOLENCE_OR_THREAT",
                    "Score": 0.8395000100135803
                }
            ],
            "Toxicity": 0.41280001401901245
        },
        {
            "Labels": [
                {
                    "Name": "PROFANITY",
                    "Score": 0.9997000098228455
                },
                {
                    "Name": "HATE_SPEECH",
                    "Score": 0.39469999074935913
                },
                {
                    "Name": "INSULT",
                    "Score": 0.9265999794006348
                },
                {
                    "Name": "GRAPHIC",
                    "Score": 0.04650000110268593
                },
                {
                    "Name": "HARASSMENT_OR_ABUSE",
                    "Score": 0.4203999936580658
                },
                {
                    "Name": "SEXUAL",
                    "Score": 0.3353999853134155
                },
                {
                    "Name": "VIOLENCE_OR_THREAT",
                    "Score": 0.12409999966621399
                }
            ],
            "Toxicity": 0.8180999755859375
        }
    ]
}

搭配使用 Amazon Comprehend 毒舌监察功能和 AWS SDK
与刚才对 AWS CLI 的操作类似,我可以使用 AWS SDK 以编程方式检测应用程序中的恶意内容。以下 Python 脚本使用适用于 Python 的 AWS SDK(Boto3)来检测文本段中的恶意内容,而且如果评分大于指定阈值,则将打印标签。在代码中,我编辑了第二个和第三个文本段,并将其替换为 ***

import boto3

comprehend = boto3.client('comprehend')

THRESHOLD = 0.2
response = comprehend.detect_toxic_content(
    TextSegments=[
        {
            "Text": "You can go through the door go, he's waiting for you on the right."
        },
        {
            "Text": "***"
        },
        {
            "Text": "***"
        }
    ],
    LanguageCode='en'
)

result_list = response['ResultList']

for i, result in enumerate(result_list):
    labels = result['Labels']
    detected = [ l for l in labels if l['Score'] > THRESHOLD ]
    if len(detected) > 0:
        print("Text segment {}".format(i + 1))
        for d in detected:
            print("{} score {:.2f}".format(d['Name'], d['Score']))

我会运行 Python 脚本。输出中包含在第二个和第三个文本段中检测到的标签和评分。在第一个文本段中未检测到恶意内容。

Text segment 2
HATE_SPEECH score 0.27
VIOLENCE_OR_THREAT score 0.84
Text segment 3
PROFANITY score 1.00
HATE_SPEECH score 0.39
INSULT score 0.93
HARASSMENT_OR_ABUSE score 0.42
SEXUAL score 0.34

搭配使用 Amazon Comprehend 毒舌监察功能和 LLM
我按这篇博客文章中的描述使用 Amazon SageMaker JumpStart 部署了 Mistral 7B 模型。

为了避免模型回应中出现恶意内容,我使用三个函数构建 Python 脚本:

  • query_endpoint 使用 SageMaker JumpStart 部署的端点来调用 Mistral 7B 模型。
  • check_toxicity 使用 Comprehend 来检测文本中的恶意内容,然后返回检测到的标签列表。
  • avoid_toxicity 在输入中接收已检测到的标签列表,并返回描述该如何避免恶意内容的消息。

只有未在输入提示中检测到恶意内容时,对 LLM 的查询才会完成。然后,如果在输出中未检测到恶意内容,仅在此时才会打印来自 LLM 的回应。若检测到恶意内容,脚本会提供关于如何修正输入提示的建议。

以下是 Python 脚本的代码:

import json
import boto3

comprehend = boto3.client('comprehend')
sagemaker_runtime = boto3.client("runtime.sagemaker")

ENDPOINT_NAME = "<REPLACE_WITH_YOUR_SAGEMAKER_JUMPSTART_ENDPOINT>"
THRESHOLD = 0.2


def query_endpoint(prompt):
    payload = {
        "inputs": prompt,
        "parameters": {
            "max_new_tokens": 68,
            "no_repeat_ngram_size": 3,
        },
    }
    response = sagemaker_runtime.invoke_endpoint(
        EndpointName=ENDPOINT_NAME, ContentType="application/json", Body=json.dumps(payload).encode("utf-8")
    )
    model_predictions = json.loads(response["Body"].read())
    generated_text = model_predictions[0]["generated_text"]
    return generated_text


def check_toxicity(text):
    response = comprehend.detect_toxic_content(
        TextSegments=[
            {
                "Text":  text
            }
        ],
        LanguageCode='en'
    )

    labels = response['ResultList'][0]['Labels']
    detected = [ l['Name'] for l in labels if l['Score'] > THRESHOLD ]

    return detected


def avoid_toxicity(detected):
    formatted = [ d.lower().replace("_", " ") for d in detected ]
    message = (
        "Avoid content that is toxic and is " +
        ", ".join(formatted) + ".\n"
    )
    return message


prompt = "Building a website can be done in 10 simple steps:"

detected_labels = check_toxicity(prompt)

if len(detected_labels) > 0:
    # Toxicity detected in the input prompt
    print("Please fix the prompt.")
    print(avoid_toxicity(detected_labels))
else:
    response = query_endpoint(prompt)

    detected_labels = check_toxicity(response)

    if len(detected_labels) > 0:
        # Toxicity detected in the output response
        print("Here's an improved prompt:")
        prompt = avoid_toxicity(detected_labels) + prompt
        print(prompt)
    else:
        print(response)

脚本中的示例提示不会返回恶意回应,但更加保险的做法是了解您可以通过设置自动流程来检查并降低该风险。

可用性和定价
Amazon Comprehend 的毒舌监察功能现已在以下 AWS 区域推出:美国东部(弗吉尼亚州北部)、美国西部(俄勒冈州)、欧洲地区(爱尔兰)和亚太地区(悉尼)。

在使用毒舌监察功能时,您不需要做出长期承诺,支付的费用基于输入字符的单位数量(1 个单位 = 100 个字符),每个请求最低按 3 个单位(300 个字符)收费。有关更多信息,请参见 Amazon Comprehend 定价

利用毒舌监察功能提升在线社区的安全性,并对在您的应用程序中采用 LLM 进行简化。

Danilo