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

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

使用 Claude 构建之前

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

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

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

生成需要审核的内容示例

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

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!'
]

# Sample user comments to test the content moderation
user_comments = allowed_user_comments + disallowed_user_comments

# List of categories considered unsafe for content moderation
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 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.5 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

# Initialize the Anthropic client
client = anthropic.Anthropic()

def moderate_message(message, unsafe_categories):
    # Convert the list of unsafe categories into a string, with each category on a new line
    unsafe_category_str = '\n'.join(unsafe_categories)
    
    # Construct the prompt for Claude, including the message and unsafe categories
    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.]
    }}"""

    # Send the request to Claude for content moderation
    response = client.messages.create(
        model="claude-3-haiku-20240307",  # Using the Haiku model for lower costs
        max_tokens=200,
        temperature=0,   # Use 0 temperature for increased consistency
        messages=[
            {"role": "user", "content": assessment_prompt}
        ]
    )
    
    # Parse the JSON response from Claude
    assessment = json.loads(response.content[0].text)
    
    # Extract the violation status from the assessment
    contains_violation = assessment['violation']
    
    # If there's a violation, get the categories and explanation; otherwise, use empty defaults
    violated_categories = assessment.get('categories', []) if contains_violation else []
    explanation = assessment.get('explanation') if contains_violation else None
    
    return contains_violation, violated_categories, explanation

# Process each comment and print the results
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 还会返回被违反的类别列表,以及解释为什么该消息不安全的原因。

评估您的提示

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

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

import anthropic
import json

# Initialize the Anthropic client
client = anthropic.Anthropic()

def assess_risk_level(message, unsafe_categories):
    # Convert the list of unsafe categories into a string, with each category on a new line
    unsafe_category_str = '\n'.join(unsafe_categories)
    
    # Construct the prompt for Claude, including the message, unsafe categories, and risk level definitions
    assessment_prompt = f"""
    Assess the risk level of the following message warrants moderation, 
    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>
}}"""

    # Send the request to Claude for risk assessment
    response = client.messages.create(
        model="claude-3-haiku-20240307",  # Using the Haiku model for lower costs
        max_tokens=200,
        temperature=0,   # Use 0 temperature for increased consistency
        messages=[
            {"role": "user", "content": assessment_prompt}
        ]
    )
    
    # Parse the JSON response from Claude
    assessment = json.loads(response.content[0].text)
    
    # Extract the risk level, violated categories, and explanation from the assessment
    risk_level = assessment["risk_level"]
    violated_categories = assessment["categories"]
    explanation = assessment.get("explanation")
    
    return risk_level, violated_categories, explanation

# Process each comment and print the results
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

# Initialize the Anthropic client
client = anthropic.Anthropic()

# Dictionary of categories considered unsafe for content moderation, with their definitions
unsafe_category_definitions = {
    'Child Exploitation': '描绘儿童裸露或者使能、鼓励、辩解或描绘儿童性虐待的内容。',
    'Conspiracy Theories': """推广或支持关于事件、情况或个人的未经证实、虚假或误导性理论的内容,
        这些内容可能会引起伤害或破坏公众对机构或事实的信任。""",
    'Hate': """基于受保护特征(种族、肤色、民族、国籍、残疾、宗教信仰、种姓、性取向、性别、性别认同和严重疾病)
        而对人表现出仇恨的内容,或者传播负面刻板印象的内容。""",
    'Indiscriminate Weapons': '使能创造大规模杀伤性武器的内容。', 
    'Intellectual Property': '侵犯第三方知识产权的内容。',
    'Non-Violent Crimes': '使能、鼓励或辩解非暴力犯罪的内容。', 
    'Privacy': '包含私人个人敏感信息的内容。',
    'Self-Harm': '使能、鼓励或辩解故意自我伤害行为的内容。',
    'Sex Crimes': '使能、鼓励或辩解性犯罪的内容。',
    'Sexual Content': '包含色情描述或明确描绘性行为的内容。',
    'Specialized Advice': """包含财务、医疗或法律建议的内容。
        财务建议包括关于投资、股票、债券或任何财务规划的指导。""",
    'Violent Crimes': '使能、鼓励或辩解暴力犯罪的内容。', 
}


def moderate_message_with_definitions(message, unsafe_category_definitions):
    # Format unsafe categories string, with each category and its definition on a new line
    unsafe_category_str = '\n'.join(f'{category}: {definition}' 
        for category, definition in unsafe_category_definitions.items()
    )
    
    # Construct the prompt for Claude, including the message and unsafe categories
    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.]
}}"""

    # Send the request to Claude for content moderation
    response = client.messages.create(
        model="claude-3-haiku-20240307",  # Using the Haiku model for lower costs
        max_tokens=200,
        temperature=0,   # Use 0 temperature for increased consistency
        messages=[
            {"role": "user", "content": assessment_prompt}
        ]
    )
    
    # Parse the JSON response from Claude
    assessment = json.loads(response.content[0].text)
    
    # Extract the violation status from the assessment
    contains_violation = assessment['violation']
    
    # If there's a violation, get the categories and explanation; otherwise, use empty defaults
    violated_categories = assessment.get('categories', []) if contains_violation else []
    explanation = assessment.get('explanation') if contains_violation else None
    
    return contains_violation, violated_categories, explanation


# Process each comment and print the results
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类别的定义现在指定了应该禁止的财务建议类型。因此,评论”It’s a great time to invest in gold!”,之前通过了moderate_message评估,现在触发了违规。

考虑批处理

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

import anthropic
import json

# Initialize the Anthropic client
client = anthropic.Anthropic()

def batch_moderate_messages(messages, unsafe_categories):
    # Convert the list of unsafe categories into a string, with each category on a new line
    unsafe_category_str = '\n'.join(unsafe_categories)
    
    # Format messages string, with each message wrapped in XML-like tags and given an ID
    messages_str = '\n'.join([f'<message id={idx}>{msg}</message>' for idx, msg in enumerate(messages)])
    
    # Construct the prompt for Claude, including the messages and unsafe categories
    assessment_prompt = f"""Determine the messages to moderate, based on the unsafe categories outlined below.

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

Unsafe categories and their definitions:
<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."""

    # Send the request to Claude for content moderation
    response = client.messages.create(
        model="claude-3-haiku-20240307",  # Using the Haiku model for lower costs
        max_tokens=2048,  # Increased max token count to handle batches
        temperature=0,    # Use 0 temperature for increased consistency
        messages=[
            {"role": "user", "content": assessment_prompt}
        ]
    )
    
    # Parse the JSON response from Claude
    assessment = json.loads(response.content[0].text)
    return assessment


# Process the batch of comments and get the response
response_obj = batch_moderate_messages(user_comments, unsafe_categories)

# Print the results for each detected violation
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参数以适应更长的响应。有关您选择的模型可以输出的最大令牌数的详细信息,请参考模型比较页面