访问我们的 内容审核指南 查看使用 Claude 实现内容审核的示例。

本指南主要关注应用程序中用户生成内容的审核。如果您正在寻找有关审核与 Claude 交互的指导,请参阅我们的 防护指南

使用 Claude 之前

决定是否使用 Claude 进行内容审核

以下是一些关键指标,表明您应该使用像 Claude 这样的 LLM 而不是传统的 ML 或基于规则的方法进行内容审核:

Anthropic 已经训练所有 Claude 模型保持诚实、有帮助和无害。这可能导致 Claude 会审核被认为特别危险的内容(符合我们的可接受使用政策),无论使用什么提示。例如,如果一个成人网站想允许用户发布露骨的性内容,他们可能会发现即使在提示中指定不要审核露骨的性内容,Claude 仍然会标记露骨内容需要审核。我们建议在构建审核解决方案之前先查看我们的可接受使用政策。

生成需要审核的内容示例

在开发内容审核解决方案之前,首先创建应该被标记的内容和不应该被标记的内容的示例。确保包括可能难以被内容审核系统有效处理的边缘案例和具有挑战性的场景。之后,审查您的示例以创建明确定义的审核类别列表。 例如,社交媒体平台生成的示例可能包括以下内容:

allowed_user_comments = [
    '这部电影很棒,我真的很喜欢。主演真的太厉害了!',
    '我讨厌星期一。',
    '现在是投资黄金的好时机!'
]

disallowed_user_comments = [
    '现在删除这个帖子,否则你最好躲起来。我要来找你和你的家人了。',
    '远离5G手机!!他们正在用5G来控制你。',
    '恭喜!你赢得了1,000美元的礼品卡。点击这里领取你的奖品!'
]

# 用于测试内容审核的示例用户评论
user_comments = allowed_user_comments + disallowed_user_comments

# 被认为不安全的内容审核类别列表
unsafe_categories = [
    '儿童剥削',
    '阴谋论',
    '仇恨',
    '大规模杀伤性武器', 
    '知识产权',
    '非暴力犯罪', 
    '隐私',
    '自残',
    '性犯罪',
    '性内容',
    '专业建议',
    '暴力犯罪'
]

有效审核这些示例需要对语言有细致的理解。在评论”这部电影很棒,我真的很喜欢。主演真的太厉害了!“中,内容审核系统需要认识到”太厉害了”是一个比喻,而不是表示实际的暴力。相反,尽管没有明确提到暴力,评论”现在删除这个帖子,否则你最好躲起来。我要来找你和你的家人了。“应该被内容审核系统标记。

unsafe_categories 列表可以根据您的具体需求进行定制。例如,如果您希望防止未成年人在您的网站上创建内容,您可以将”未成年人发帖”添加到列表中。


如何使用 Claude 审核内容

选择合适的 Claude 模型

在选择模型时,考虑数据的大小很重要。如果成本是一个考虑因素,像 Claude 3 Haiku 这样的较小模型是一个很好的选择,因为它具有成本效益。以下是对一个每月接收十亿帖子的社交媒体平台进行文本审核的成本估算:

  • 内容大小

    • 每月帖子数:10亿
    • 每个帖子字符数:100
    • 总字符数:1000亿
  • 估计令牌数

    • 输入令牌:286亿(假设每3.5个字符1个令牌)
    • 被标记的消息百分比:3%
    • 每个被标记消息的输出令牌:50
    • 总输出令牌:15亿
  • Claude 3 Haiku 估计成本

    • 输入令牌成本:2,860 MTok * 0.25/MTok=0.25/MTok = 715
    • 输出令牌成本:1,500 MTok * 1.25/MTok=1.25/MTok = 1,875
    • 月度成本:715+715 + 1,875 = $2,590
  • Claude 3.7 Sonnet 估计成本

    • 输入令牌成本:2,860 MTok * 3.00/MTok=3.00/MTok = 8,580
    • 输出令牌成本:1,500 MTok * 15.00/MTok=15.00/MTok = 22,500
    • 月度成本:8,580+8,580 + 22,500 = $31,080
实际成本可能与这些估算不同。这些估算基于批处理部分中突出显示的提示。通过从响应中删除explanation字段,可以进一步减少输出令牌。

构建强大的提示

为了使用 Claude 进行内容审核,Claude 必须理解您应用程序的审核要求。让我们从编写一个允许您定义审核需求的提示开始:

import anthropic
import json

# 初始化 Anthropic 客户端
client = anthropic.Anthropic()

def moderate_message(message, unsafe_categories):
    # 将不安全类别列表转换为字符串,每个类别占一行
    unsafe_category_str = '\n'.join(unsafe_categories)
    
    # 构建 Claude 的提示,包括消息和不安全类别
    assessment_prompt = f"""
    根据下面列出的不安全类别,
    确定以下消息是否需要审核。
    
    消息:
    <message>{message}</message>

    不安全类别:
    <categories>
    {unsafe_category_str}
    </categories>

    仅使用以下格式的 JSON 对象进行响应:
    {{
    "violation": <表示消息是否应该被审核的布尔字段>,
    "categories": [违反类别的逗号分隔列表],
    "explanation": [可选。仅在存在违规时包含。]
    }}"""

    # 向 Claude 发送内容审核请求
    response = client.messages.create(
        model="claude-3-haiku-20240307",  # 使用 Haiku 模型以降低成本
        max_tokens=200,
        temperature=0,   # 使用 0 温度以提高一致性
        messages=[
            {"role": "user", "content": assessment_prompt}
        ]
    )
    
    # 解析 Claude 的 JSON 响应
    assessment = json.loads(response.content[0].text)
    
    # 从评估中提取违规状态
    contains_violation = assessment['violation']
    
    # 如果存在违规,获取类别和解释;否则,使用空默认值
    violated_categories = assessment.get('categories', []) if contains_violation else []
    explanation = assessment.get('explanation') if contains_violation else None
    
    return contains_violation, violated_categories, explanation

# 处理每条评论并打印结果
for comment in user_comments:
    print(f"\n评论:{comment}")
    violation, violated_categories, explanation = moderate_message(comment, unsafe_categories)
    
    if violation:
        print(f"违反类别:{', '.join(violated_categories)}")
        print(f"解释:{explanation}")
    else:
        print("未检测到问题。")

在这个示例中,moderate_message 函数包含一个评估提示,其中包括不安全内容类别和我们要评估的消息。提示要求 Claude 根据我们定义的不安全类别评估消息是否应该被审核。

然后解析模型的评估以确定是否存在违规。如果存在违规,Claude 还会返回违反的类别列表,以及解释为什么该消息不安全。

评估您的提示

内容审核是一个分类问题。因此,您可以使用我们的分类指南中概述的相同技术来确定内容审核系统的准确性。

一个额外的考虑是,您可以不将内容审核视为二元分类问题,而是创建多个类别来表示不同的风险级别。创建多个风险级别允许您调整审核的严格程度。例如,您可能想要自动阻止被认为是高风险的用户查询,而具有多个中等风险查询的用户则被标记为需要人工审核。

import anthropic
import json

# 初始化 Anthropic 客户端
client = anthropic.Anthropic()

def assess_risk_level(message, unsafe_categories):
    # 将不安全类别列表转换为字符串,每个类别占一行
    unsafe_category_str = '\n'.join(unsafe_categories)
    
    # 构建 Claude 的提示,包括消息、不安全类别和风险级别定义
    assessment_prompt = f"""
    根据下面列出的不安全类别,
    评估以下消息的风险级别。
    
消息:
<message>{message}</message>

不安全类别:
<categories>
{unsafe_category_str}
</categories>

根据您对用户消息是否应该基于定义的不安全类别进行审核的信心,
分配一个风险级别:

0 - 无风险
1 - 低风险
2 - 中等风险
3 - 高风险

仅使用以下格式的 JSON 对象进行响应:
{{
  "risk_level": <表示风险级别的数值字段>,
  "categories": [违反类别的逗号分隔列表],
  "explanation": <可选。仅在风险级别大于 0 时包含>
}}"""

    # 向 Claude 发送风险评估请求
    response = client.messages.create(
        model="claude-3-haiku-20240307",  # 使用 Haiku 模型以降低成本
        max_tokens=200,
        temperature=0,   # 使用 0 温度以提高一致性
        messages=[
            {"role": "user", "content": assessment_prompt}
        ]
    )
    
    # 解析 Claude 的 JSON 响应
    assessment = json.loads(response.content[0].text)
    
    # 从评估中提取风险级别、违反的类别和解释
    risk_level = assessment["risk_level"]
    violated_categories = assessment["categories"]
    explanation = assessment.get("explanation")
    
    return risk_level, violated_categories, explanation

# 处理每条评论并打印结果
for comment in user_comments:
    print(f"\n评论:{comment}")
    risk_level, violated_categories, explanation = assess_risk_level(comment, unsafe_categories)
    
    print(f"风险级别:{risk_level}")
    if violated_categories:
        print(f"违反类别:{', '.join(violated_categories)}")
    if explanation:
        print(f"解释:{explanation}")

这段代码实现了一个 assess_risk_level 函数,使用 Claude 来评估消息的风险级别。该函数接受消息和不安全类别列表作为输入。

在函数内部,为 Claude 生成一个提示,包括要评估的消息、不安全类别和评估风险级别的具体说明。提示指示 Claude 以 JSON 对象的形式响应,该对象包括风险级别、违反的类别和可选的解释。

这种方法通过分配风险级别实现了灵活的内容审核。它可以无缝集成到更大的系统中,根据评估的风险级别自动过滤内容或标记评论以进行人工审核。例如,在执行此代码时,评论”现在删除这个帖子,否则你最好躲起来。我要来找你和你的家人了。“因其危险威胁而被识别为高风险。相反,评论”远离5G手机!!他们正在用5G来控制你。“被归类为中等风险。

部署您的提示

一旦您对解决方案的质量有信心,就该将其部署到生产环境中了。以下是在生产中使用内容审核时要遵循的一些最佳实践:

  1. 向用户提供清晰的反馈: 当用户输入被阻止或响应因内容审核而被标记时,提供信息丰富和建设性的反馈,帮助用户理解为什么他们的消息被标记以及如何适当地重新表述。在上面的编码示例中,这是通过 Claude 响应中的 explanation 标签来实现的。

  2. 分析被审核的内容: 跟踪审核系统标记的内容类型,以识别趋势和潜在的改进领域。

  3. 持续评估和改进: 使用精确度和召回率跟踪等指标定期评估内容审核系统的性能。使用这些数据来迭代改进您的审核提示、关键词和评估标准。


提高性能

在复杂场景中,除了标准的提示工程技术之外,考虑其他策略来提高性能可能会有帮助。以下是一些高级策略:

定义主题并提供示例

除了在提示中列出不安全类别外,还可以通过提供与每个类别相关的定义和短语来进一步改进。

import anthropic
import json

# 初始化 Anthropic 客户端
client = anthropic.Anthropic()

# 内容审核中被认为不安全的类别字典及其定义
unsafe_category_definitions = {
    '儿童剥削': '描绘儿童裸露或者使能、鼓励、辩解或描绘儿童性虐待的内容。',
    '阴谋论': """推广或支持关于事件、情况或个人的未经证实、虚假或误导性理论的内容,
        这些内容可能会引起伤害或破坏公众对机构或事实的信任。""",
    '仇恨': """基于受保护特征(种族、肤色、民族、国籍、残疾、宗教信仰、种姓、性取向、性别、性别认同和严重疾病)
        而对人表现出仇恨的内容,或者传播负面刻板印象的内容。""",
    '大规模杀伤性武器': '使能制造大规模杀伤性武器的内容。', 
    '知识产权': '侵犯第三方知识产权的内容。',
    '非暴力犯罪': '使能、鼓励或辩解非暴力犯罪的内容。', 
    '隐私': '包含私人个人敏感信息的内容。',
    '自残': '使能、鼓励或辩解故意自残行为的内容。',
    '性犯罪': '使能、鼓励或辩解性犯罪的内容。',
    '性内容': '包含色情描述或明确描绘性行为的内容。',
    '专业建议': """包含财务、医疗或法律建议的内容。
        财务建议包括关于投资、股票、债券或任何财务规划的指导。""",
    '暴力犯罪': '使能、鼓励或辩解暴力犯罪的内容。', 
}


def moderate_message_with_definitions(message, unsafe_category_definitions):
    # 格式化不安全类别字符串,每个类别及其定义占一行
    unsafe_category_str = '\n'.join(f'{category}: {definition}' 
        for category, definition in unsafe_category_definitions.items()
    )
    
    # 构建 Claude 的提示,包括消息和不安全类别
    assessment_prompt = f"""确定以下消息是否需要根据下面列出的不安全类别进行审核。

消息:
<message>{message}</message>

不安全类别及其定义:
<categories>
{unsafe_category_str}
</categories>

请务必记住所有不安全类别及其定义。

仅使用以下格式的 JSON 对象进行响应:
{{
  "violation": <表示消息是否应该被审核的布尔字段>,
  "categories": [违反类别的逗号分隔列表],
  "explanation": [可选。仅在存在违规时包含。]
}}"""

    # 向 Claude 发送内容审核请求
    response = client.messages.create(
        model="claude-3-haiku-20240307",  # 使用 Haiku 模型以降低成本
        max_tokens=200,
        temperature=0,   # 使用 0 温度以提高一致性
        messages=[
            {"role": "user", "content": assessment_prompt}
        ]
    )
    
    # 解析 Claude 的 JSON 响应
    assessment = json.loads(response.content[0].text)
    
    # 从评估中提取违规状态
    contains_violation = assessment['violation']
    
    # 如果存在违规,获取类别和解释;否则,使用空默认值
    violated_categories = assessment.get('categories', []) if contains_violation else []
    explanation = assessment.get('explanation') if contains_violation else None
    
    return contains_violation, violated_categories, explanation


# 处理每条评论并打印结果
for comment in user_comments:
    print(f"\n评论:{comment}")
    violation, violated_categories, explanation = moderate_message_with_definitions(comment, unsafe_category_definitions)
    
    if violation:
        print(f"违反类别:{', '.join(violated_categories)}")
        print(f"解释:{explanation}")
    else:
        print("未检测到问题。")

moderate_message_with_definitions 函数通过允许每个不安全类别与详细定义配对来扩展早期的 moderate_message 函数。这在代码中通过将原始函数中的 unsafe_categories 列表替换为 unsafe_category_definitions 字典来实现。这个字典将每个不安全类别映射到其相应的定义。类别名称和它们的定义都包含在提示中。

值得注意的是,专业建议 类别的定义现在指定了应该禁止的财务建议类型。因此,评论”现在是投资黄金的好时机!“,之前通过了 moderate_message 评估,现在触发了违规。

考虑批处理

在不需要实时审核的情况下,考虑批量审核消息以降低成本。在提示的上下文中包含多个消息,并要求 Claude 评估哪些消息应该被审核。

import anthropic
import json

# 初始化 Anthropic 客户端
client = anthropic.Anthropic()

def batch_moderate_messages(messages, unsafe_categories):
    # 将不安全类别列表转换为字符串,每个类别占一行
    unsafe_category_str = '\n'.join(unsafe_categories)
    
    # 格式化消息字符串,每个消息用类似 XML 的标签包装并给定 ID
    messages_str = '\n'.join([f'<message id={idx}>{msg}</message>' for idx, msg in enumerate(messages)])
    
    # 构建 Claude 的提示,包括消息和不安全类别
    assessment_prompt = f"""根据下面列出的不安全类别确定需要审核的消息。

消息:
<messages>
{messages_str}
</messages>

不安全类别及其定义:
<categories>
{unsafe_category_str}
</categories>

仅使用以下格式的 JSON 对象进行响应:
{{
  "violations": [
    {{
      "id": <消息 id>,
      "categories": [违反类别列表],
      "explanation": <违规原因说明>
    }},
    ...
  ]
}}

重要说明:
- 记得分析每条消息是否存在违规。
- 选择所有合理适用的违规。"""

    # 向 Claude 发送内容审核请求
    response = client.messages.create(
        model="claude-3-haiku-20240307",  # 使用 Haiku 模型以降低成本
        max_tokens=2048,  # 增加最大令牌数以处理批量
        temperature=0,    # 使用 0 温度以提高一致性
        messages=[
            {"role": "user", "content": assessment_prompt}
        ]
    )
    
    # 解析 Claude 的 JSON 响应
    assessment = json.loads(response.content[0].text)
    return assessment


# 处理评论批次并获取响应
response_obj = batch_moderate_messages(user_comments, unsafe_categories)

# 打印每个检测到的违规的结果
for violation in response_obj['violations']:
    print(f"""评论:{user_comments[violation['id']]}
违反类别:{', '.join(violation['categories'])}
解释:{violation['explanation']}
""")

在这个示例中,batch_moderate_messages 函数通过单个 Claude API 调用处理整批消息的审核。 在函数内部,创建了一个包含要评估的消息列表、定义的不安全内容类别及其描述的提示。提示指示 Claude 返回一个 JSON 对象,列出所有包含违规的消息。响应中的每条消息都由其 id 标识,该 id 对应于输入列表中消息的位置。 请记住,找到适合您特定需求的最佳批量大小可能需要一些实验。虽然更大的批量大小可以降低成本,但也可能导致质量略有下降。此外,您可能需要增加 Claude API 调用中的 max_tokens 参数以适应更长的响应。有关您选择的模型可以输出的最大令牌数的详细信息,请参阅模型比较页面

Was this page helpful?