内容审核

内容审核是维护数字应用中安全、尊重和高效环境的关键方面。本指南讨论如何使用 Claude 在您的数字应用中审核内容。


访问内容审核 Cookbook查看使用 Claude 实现内容审核的示例。

Tip
本指南侧重于审核应用中用户生成的内容。如果您需要关于审核与 Claude 交互的指导,请参阅护栏指南

使用 Claude 构建之前

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

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

您希望以经济高效的方式快速实现

传统的 ML 方法需要大量的工程资源、ML 专业知识和基础设施成本。人工审核系统的成本更高。使用 Claude,您可以以极低的时间和价格建立一个复杂的审核系统。

您需要语义理解和快速决策

传统的 ML 方法,如词袋模型或简单模式匹配,往往难以理解内容的语气、意图和上下文。虽然人工审核系统擅长理解语义含义,但需要时间来审核内容。Claude 通过结合语义理解和快速提供审核决定的能力来弥补这一差距。

您需要一致的策略决策

通过利用其先进的推理能力,Claude 可以统一地解释和应用复杂的审核指南。这种一致性有助于确保对所有内容的公平处理,减少可能破坏用户信任的不一致或有偏见的审核决策的风险。

您的审核策略可能会随时间变化或演进

一旦传统的 ML 方法建立起来,更改它是一项费力且数据密集的工作。另一方面,随着产品或客户需求的演进,Claude 可以轻松适应审核策略的变更或新增,而无需对训练数据进行大量重新标注。

您需要可解释的审核决策推理

如果您希望为用户或监管机构提供审核决策背后的清晰解释,Claude 可以生成详细且连贯的理由说明。这种透明度对于建立信任和确保内容审核实践的问责制非常重要。

您需要多语言支持而无需维护单独的模型

传统的 ML 方法通常需要为每种支持的语言维护单独的模型或进行大量翻译流程。人工审核需要雇用精通每种支持语言的工作人员。Claude 的多语言能力使其能够在无需单独模型或大量翻译流程的情况下对各种语言的内容进行分类,从而简化全球客户群的审核。

您需要多模态支持

Claude 的多模态能力使其能够跨文本和图像分析和解释内容。这使其成为在需要同时评估不同媒体类型的环境中进行全面内容审核的多功能工具。

Note
Anthropic 已训练所有 Claude 模型做到诚实、有益和无害。这可能导致 Claude 审核被视为特别危险的内容(符合可接受使用政策),无论使用何种提示词。例如,一个希望允许用户发布明确色情内容的成人网站可能会发现,即使他们在提示词中指定了不要审核明确的性内容,Claude 仍会标记明确内容需要审核。在构建审核解决方案之前,请考虑审查 AUP。

生成需要审核的内容示例

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

allowed_user_comments = [
    "This movie was great, I really enjoyed it. The main actor really killed it!",
    "I hate Mondays.",
    "It is a great time to invest in gold!",
]

disallowed_user_comments = [
    "Delete this post now or you better hide. I am coming after you and your family.",
    "Stay away from the 5G cellphones!! They are using 5G to control you.",
    "Congratulations! You have won a $1,000 gift card. Click here to claim your prize!",
]

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

# 被认为不安全的内容审核类别列表
unsafe_categories = [
    "Child Exploitation",
    "Conspiracy Theories",
    "Hate",
    "Indiscriminate Weapons",
    "Intellectual Property",
    "Non-Violent Crimes",
    "Privacy",
    "Self-Harm",
    "Sex Crimes",
    "Sexual Content",
    "Specialized Advice",
    "Violent Crimes",
]

有效审核这些示例需要对语言有细致的理解。在评论 This movie was great, I really enjoyed it. The main actor really killed it! 中,内容审核系统需要识别"killed it"是一个隐喻,而不是实际暴力的表示。相反,尽管评论 Delete this post now or you better hide. I am coming after you and your family. 没有明确提及暴力,但内容审核系统应将其标记为违规。

unsafe_categories 列表可以自定义以满足您的特定需求。例如,如果您希望防止未成年人在您的网站上发布内容,可以在列表中添加"Underage Posting"。


如何使用 Claude 审核内容

选择合适的 Claude 模型

选择模型时,考虑数据的大小很重要。如果成本是关注点,像 Claude Haiku 4.5 这样的较小模型因其性价比而是一个极好的选择。以下是一个社交媒体平台每月接收十亿条帖子审核文本的成本估算:

  • 内容大小

    • 每月帖子数:10 亿
    • 每条帖子字符数:100
    • 总字符数:1000 亿
  • 估算 token 数

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

    • 输入 token 成本:28,600 MTok x $1.00/MTok = $28,600 USD
    • 输出 token 成本:1,500 MTok x $5.00/MTok = $7,500 USD
    • 月成本:$28,600 + $7,500 = $36,100 USD
  • Claude Opus 4.7 估算成本

    • 输入 token 成本:28,600 MTok x $5.00/MTok = $143,000 USD
    • 输出 token 成本:1,500 MTok x $25.00/MTok = $37,500 USD
    • 月成本:$143,000 + $37,500 = $180,500 USD
Tip
实际成本可能与这些估算不同。这些估算基于批处理部分中突出显示的提示词。通过从响应中移除 explanation 字段,可以进一步减少输出 token。

构建强大的提示词

为了使用 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"""
    Determine whether the following message warrants moderation,
    based on the unsafe categories outlined below.

    Message:
    <message>{message}</message>

    Unsafe Categories:
    <categories>
    {unsafe_category_str}
    </categories>

    Respond with ONLY a JSON object, using the format below:
    {{
    "violation": <Boolean field denoting whether the message should be moderated>,
    "categories": [Comma-separated list of violated categories],
    "explanation": [Optional. Only include if there is a violation.]
    }}"""

    # 将请求发送给 Claude 进行内容审核
    response = client.messages.create(
        model="claude-haiku-4-5-20251001",  # 使用 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"\nComment: {comment}")
    violation, violated_categories, explanation = moderate_message(
        comment, unsafe_categories
    )

    if violation:
        print(f"Violated Categories: {', '.join(violated_categories)}")
        print(f"Explanation: {explanation}")
    else:
        print("No issues detected.")

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

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

评估您的提示词

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

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

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"""
    Assess the risk level of the following message,
    based on the unsafe categories listed below.

Message:
<message>{message}</message>

Unsafe Categories:
<categories>
{unsafe_category_str}
</categories>

Assign a risk level based on your confidence that the user's message should be moderated
based on the defined unsafe categories:

0 - No risk
1 - Low risk
2 - Medium risk
3 - High risk

Respond with ONLY a JSON object, using the format below:
{{
  "risk_level": <Numerical field denoting the risk level>,
  "categories": [Comma-separated list of violated categories],
  "explanation": <Optional. Only include if risk level is greater than 0>
}}"""

    # 将请求发送给 Claude 进行风险评估
    response = client.messages.create(
        model="claude-haiku-4-5-20251001",  # 使用 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"\nComment: {comment}")
    risk_level, violated_categories, explanation = assess_risk_level(
        comment, unsafe_categories
    )

    print(f"Risk Level: {risk_level}")
    if violated_categories:
        print(f"Violated Categories: {', '.join(violated_categories)}")
    if explanation:
        print(f"Explanation: {explanation}")

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

在函数内部,为 Claude 生成一个提示词,包括要评估的消息、不安全类别和评估风险级别的具体指令。该提示词指示 Claude 返回一个 JSON 对象,包含风险级别、违规类别和可选的解释。

这种方法通过分配风险级别实现了灵活的内容审核。它可以无缝集成到更大的系统中,以自动化内容过滤或根据评估的风险级别标记评论进行人工审核。例如,执行此代码时,评论 Delete this post now or you better hide. I am coming after you and your family. 因其危险威胁而被识别为高风险。相反,评论 Stay away from the 5G cellphones!! They are using 5G to control you. 被归类为中等风险。

部署您的提示词

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

  1. 向用户提供清晰的反馈: 当用户输入被阻止或响应因内容审核而被标记时,提供信息丰富且建设性的反馈,帮助用户理解其消息被标记的原因以及如何适当重新表述。在前面的编码示例中,这是通过 Claude 响应中的 explanation 字段完成的。

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

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


提升性能

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

定义主题并提供示例

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

import anthropic
import json

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

# 被认为不安全的内容审核类别字典及其定义
unsafe_category_definitions = {
    "Child Exploitation": "Content that depicts child nudity or that enables, encourages, excuses, or depicts the sexual abuse of children.",
    "Conspiracy Theories": """Content that promotes or endorses unfounded, false, or misleading theories about events, situations, or individuals,
        which can incite harm or undermine public trust in institutions or facts.""",
    "Hate": """Content that is hateful toward people on the basis of their protected characteristics
        (race, color, ethnicity, national origin, disability, religious affiliation, caste, sexual orientation, sex, gender identity and serious disease),
        or content that perpetuates negative stereotypes.""",
    "Indiscriminate Weapons": "Content that enables the creation of weapons of mass destruction.",
    "Intellectual Property": "Content that violates the intellectual property rights of third parties.",
    "Non-Violent Crimes": "Content that enables, encourages, or excuses the commission of non-violent crimes.",
    "Privacy": "Content that contains sensitive, personal information about private individuals.",
    "Self-Harm": "Content that enables, encourages, or excuses acts of intentional self-harm.",
    "Sex Crimes": "Content that enables, encourages, or excuses the commission of sex crimes.",
    "Sexual Content": "Content that contains erotic descriptions or explicit depictions of sex acts.",
    "Specialized Advice": """Content that contains financial, medical, or legal advice.
        Financial advice includes guidance on investments, stocks, bonds, or any financial planning.""",
    "Violent Crimes": "Content that enables, encourages, or excuses the commission of violent crimes.",
}


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"""Determine whether the following message warrants moderation, based on the unsafe categories outlined below.

Message:
<message>{message}</message>

Unsafe Categories and Their Definitions:
<categories>
{unsafe_category_str}
</categories>

It's important that you remember all unsafe categories and their definitions.

Respond with ONLY a JSON object, using the format below:
{{
  "violation": <Boolean field denoting whether the message should be moderated>,
  "categories": [Comma-separated list of violated categories],
  "explanation": [Optional. Only include if there is a violation.]
}}"""

    # 将请求发送给 Claude 进行内容审核
    response = client.messages.create(
        model="claude-haiku-4-5-20251001",  # 使用 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"\nComment: {comment}")
    violation, violated_categories, explanation = moderate_message_with_definitions(
        comment, unsafe_category_definitions
    )

    if violation:
        print(f"Violated Categories: {', '.join(violated_categories)}")
        print(f"Explanation: {explanation}")
    else:
        print("No issues detected.")

moderate_message_with_definitions 函数在之前的 moderate_message 函数基础上进行了扩展,允许每个不安全类别与详细定义配对。在代码中,这是通过将原始函数中的 unsafe_categories 列表替换为 unsafe_category_definitions 字典来实现的。该字典将每个不安全类别映射到其对应的定义。类别名称和定义都包含在提示词中。

值得注意的是,Specialized Advice 类别的定义现在指定了应被禁止的财务建议类型。因此,之前通过 moderate_message 评估的评论 It is a great time to invest in gold! 现在会触发违规。

考虑批处理

在不需要实时审核的情况下,为了降低成本,可以考虑批量审核消息。在提示词的上下文中包含多条消息,并要求 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"""Determine the messages to moderate, based on the unsafe categories outlined below.

Messages:
<messages>
{messages_str}
</messages>

Unsafe Categories:
<categories>
{unsafe_category_str}
</categories>

Respond with ONLY a JSON object, using the format below:
{{
  "violations": [
    {{
      "id": <message id>,
      "categories": [list of violated categories],
      "explanation": <Explanation of why there's a violation>
    }},
    ...
  ]
}}

Important Notes:
- Remember to analyze every message for a violation.
- Select any number of violations that reasonably apply."""

    # 将请求发送给 Claude 进行内容审核
    response = client.messages.create(
        model="claude-haiku-4-5-20251001",  # 使用 Haiku 模型以降低成本
        max_tokens=2048,  # 增加最大 token 数以处理批量请求
        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"""Comment: {user_comments[violation["id"]]}
Violated Categories: {", ".join(violation["categories"])}
Explanation: {violation["explanation"]}
""")

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