内容审核是维护数字应用中安全、尊重和高效环境的关键方面。在本指南中,我们将讨论如何使用 Claude 对您的数字应用中的内容进行审核。
请访问我们的 内容审核食谱 查看使用 Claude 实现内容审核的示例。
本指南专注于审核您应用中的用户生成内容。如果您在寻找关于审核与 Claude 的互动的指导,请参考我们的 安全边界指南。
在使用 Claude 之前
决定是否使用 Claude 进行内容审核
以下是一些关键指标,您应该选择像 Claude 这样的 LLM,而不是传统的机器学习或基于规则的方法进行内容审核:
您希望实现成本效益高且快速的实施
传统的机器学习方法需要大量的工程资源、机器学习专业知识和基础设施成本。人工审核系统的成本更高。使用 Claude,您可以在较短的时间内以较低的成本建立起复杂的审核系统。
您需要语义理解和快速决策
传统的机器学习方法,如词袋模型或简单模式匹配,通常难以理解内容的语调、意图和上下文。尽管人工审核系统在理解语义意义方面表现出色,但它们需要时间来审核内容。Claude 通过将语义理解与快速提供审核决策的能力结合起来,弥补了这一差距。
您需要一致的政策决策
通过利用其先进的推理能力,Claude 可以统一地解释和应用复杂的审核指南。这种一致性有助于确保对所有内容的公平对待,减少不一致或偏见的审核决策可能破坏用户信任的风险。
您的审核政策可能会随时间变化或发展
一旦建立了传统的机器学习方法,进行更改将是一项费时且数据密集的工作。另一方面,随着您的产品或客户需求的变化,Claude 可以轻松适应审核政策的更改或新增,而无需大量重新标注训练数据。
您需要对审核决策的可解释推理
如果您希望为用户或监管者提供审核决策背后的清晰解释,Claude 可以生成详细且连贯的理由。这种透明性对建立信任和确保内容审核实践的问责至关重要。
您需要多语言支持而无需维护单独的模型
传统的机器学习方法通常需要为每种支持的语言分别建立模型或进行大量翻译过程。人工审核需要雇佣流利于每种支持语言的劳动力。Claude 的多语言能力使其能够在各种语言中分类票据,而无需单独的模型或大量翻译过程,从而简化全球客户群体的审核工作。
您需要多模态支持
Claude 的多模态能力使其能够分析和解释文本和图像中的内容。这使其成为在需要综合评估不同媒体类型的环境中进行全面内容审核的多功能工具。
Anthropic 已训练所有 Claude 模型使其诚实、乐于助人且无害。这可能导致 Claude 审核被认为特别危险的内容(符合我们的 可接受使用政策),而不论使用的提示如何。例如,一个希望允许用户发布露骨性内容的成人网站可能会发现,Claude 仍然会将露骨内容标记为需要审核,即使他们在提示中明确指定不对露骨性内容进行审核。我们建议您在构建审核解决方案之前先审查我们的 AUP。
生成内容审核的示例
在开发内容审核解决方案之前,首先创建应该被标记的内容示例和不应该被标记的内容示例。确保包含边缘案例和可能对内容审核系统处理效果产生挑战的复杂场景。之后,审核您的示例以创建明确的审核类别列表。例如,社交媒体平台生成的示例可能包括以下内容:
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 这样的小型模型是一个出色的选择,因为它具有成本效益。以下是对每月收到十亿条帖子社交媒体平台进行文本审核的成本估算:
- 内容大小
- 每月帖子数:1bn
- 每条帖子的字符数:100
- 总字符数:100bn
- 估算的 Token 数
- 输入 Token:28.6bn(假设每 3.5 个字符为 1 个 Token)
- 被标记的消息比例:3%
- 每条被标记消息的输出 Token 数:50
- 总输出 Token 数:1.5bn
- Claude 3 Haiku 估算成本
- 输入 Token 成本:2,860 MTok * $0.25/MTok = $715
- 输出 Token 成本:1,500 MTok * $1.25/MTok = $1,875
- 每月成本:$715 + $1,875 = $2,590
- Claude 3.5 Sonnet 估算成本
- 输入 Token 成本:2,860 MTok * $3.00/MTok = $8,580
- 输出 Token 成本:1,500 MTok * $15.00/MTok = $22,500
- 每月成本:$8,580 + $22,500 = $31,080
实际成本可能与这些估算有所不同。这些估算基于关于 批处理 部分中突出显示的提示。通过从响应中删除 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"""
确定以下消息是否需要审核,
基于下面列出的不安全类别。
消息:
<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 还会返回一份被违反类别的列表,以及为什么该消息被认为是不安全的解释。
评估您的提示
内容审核是一个分类问题。因此,您可以使用我们在 classification 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"""
评估以下消息的风险级别,判断是否需要审核,
基于下面列出的不安全类别。
消息:
<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 对象的形式回复,包括风险级别、违规类别以及可选的解释。
这种方法通过分配风险级别来实现灵活的内容审核。它可以无缝集成到更大的系统中,以根据评估的风险级别自动过滤内容或标记评论以供人工审核。例如,在执行此代码时,评论 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.
被归类为中等风险。
部署你的提示
当你对解决方案的质量感到满意时,就可以将其部署到生产环境中了。以下是使用内容审核时的一些最佳实践:
- **为用户提供明确的反馈:**当用户输入被屏蔽或回复因内容审核而被标记时,提供有用且具有建设性的反馈,帮助用户理解其消息为何被标记,并告知他们如何适当重述。在上述代码示例中,这通过 Claude 响应中的
explanation
标签实现。 - **分析被审核的内容:**跟踪审核系统标记的内容类型,以识别趋势和可能需要改进的地方。
- **持续评估和改进:**定期使用诸如精准度和召回率跟踪等指标来评估内容审核系统的性能。使用这些数据迭代改进你的审核提示、关键词和评估标准。
提高性能
在复杂场景中,除了标准的 提示工程技术 之外,考虑一些额外的策略可能有助于提高性能。以下是一些高级策略:
定义主题并提供示例
除了在提示中列出不安全类别外,还可以通过为每个类别提供定义和相关短语进一步改进。
import anthropic
import json
# 初始化 Anthropic 客户端
client = anthropic.Anthropic()
# 含有定义的内容审核不安全类别字典
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):
# 格式化不安全类别字符串,每个类别及其定义占一行
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
字典。该字典将每个不安全类别映射到其相应定义。在提示信息中,既包含类别名称,也包含其定义。
值得注意的是,Specialized Advice
类别的定义现在明确了应禁止的金融建议类型。因此,之前通过 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": <message id>,
"categories": [违反的类别列表],
"explanation": <为何存在违规的解释>
}},
...
]
}}
重要提示:
- 记得分析每条消息是否存在违规行为。
- 选择任何合理适用的违规类别。"""
# 发送审核请求给 Claude
response = client.messages.create(
model="claude-3-haiku-20240307", # 使用 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"""评论:{user_comments[violation['id']]}
违规类别:{', '.join(violation['categories'])}
解释:{violation['explanation']}
""")
在这个示例中,batch_moderate_messages
函数通过一次 Claude API 调用处理整个消息批次的审核。在函数内部,创建了一个提示,其中包含要评估的消息列表、不安全内容类别及其描述。该提示要求 Claude 返回一个 JSON 对象,列出所有包含违规行为的消息。响应中的每条消息都通过其 id 进行标识,id 对应于消息在输入列表中的位置。请注意,找到适合您具体需求的最佳批处理大小可能需要一些实验。虽然较大的批处理规模可以降低成本,但可能会导致质量略有下降。此外,您可能需要增加 Claude API 调用中的 max_tokens
参数,以适应更长的响应。有关所选模型可以输出的最大 Token 数的详细信息,请参考 模型比较页面。