コンテンツモデレーションクックブックにアクセスして、Claudeを使用したコンテンツモデレーション実装の例を確認してください。
従来のML手法またはルールベースのアプローチの代わりに、Claudeのようなエンタープライズ向けLLMを使用すべき主な指標は以下の通りです:
コンテンツモデレーションソリューションを開発する前に、まずフラグを立てるべきコンテンツとフラグを立てるべきではないコンテンツの例を作成します。エッジケースと、コンテンツモデレーションシステムが効果的に処理するのが難しい可能性のある課題のあるシナリオを含めるようにしてください。その後、例を確認して、明確に定義されたモデレーションカテゴリのリストを作成します。 たとえば、ソーシャルメディアプラットフォームによって生成された例には、以下が含まれる可能性があります:
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 Haiku 3のような小さいモデルはコスト効率の良さのため優れた選択肢です。以下は、月に10億件の投稿を受け取るソーシャルメディアプラットフォームのテキストをモデレートするコストの推定値です:
コンテンツサイズ
推定トークン数
Claude Haiku 3推定コスト
Claude Opus 4.7推定コスト
explanationフィールドを削除することでさらに削減できます。Claudeをコンテンツモデレーションに使用するには、Claudeがアプリケーションのモデレーション要件を理解する必要があります。モデレーションニーズを定義できるプロンプトを作成することから始めましょう:
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 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}")このコードは、メッセージのリスクレベルを評価するためにClaudeを使用するassess_risk_level関数を実装しています。この関数は、メッセージと安全でないカテゴリのリストを入力として受け入れます。
関数内では、評価するメッセージ、安全でないカテゴリ、およびリスクレベルを評価するための具体的な指示を含むClaudeのプロンプトが生成されます。プロンプトは、リスクレベル、違反したカテゴリ、およびオプションの説明を含むJSONオブジェクトで応答するようClaudeに指示します。
このアプローチにより、リスクレベルを割り当てることで柔軟なコンテンツモデレーションが可能になります。これは、評価されたリスクレベルに基づいてコンテンツフィルタリングを自動化するか、コメントを人間によるレビューのためにフラグを立てるより大きなシステムにシームレスに統合できます。たとえば、このコードを実行する場合、コメント「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 json
# Initialize the Anthropic client
client = anthropic.Anthropic()
# Dictionary of categories considered unsafe for content moderation, with their definitions
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):
# 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カテゴリの定義は、禁止されるべき金融アドバイスのタイプを指定しています。その結果、以前はmoderate_message評価に合格していたコメント「It's a great time to invest in gold!」は、現在違反をトリガーします。
リアルタイムモデレーションが必要ない状況でコストを削減するには、メッセージをバッチでモデレートすることを検討してください。プロンプトのコンテキスト内に複数のメッセージを含め、Claudeにどのメッセージをモデレートすべきかを評価するよう求めます。
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コールでメッセージのバッチ全体のモデレーションを処理します。
関数内では、評価するメッセージのリスト、定義された安全でないコンテンツカテゴリ、およびそれらの説明を含むプロンプトが作成されます。プロンプトは、違反を含むすべてのメッセージをリストするJSONオブジェクトを返すようClaudeに指示します。レスポンス内の各メッセージは、入力リスト内のメッセージの位置に対応するIDで識別されます。
最適なバッチサイズを特定のニーズに合わせて見つけるには、いくつかの実験が必要になる場合があることに注意してください。より大きなバッチサイズはコストを低下させることができますが、品質がわずかに低下する可能性もあります。さらに、より長いレスポンスに対応するために、Claude APIコールのmax_tokensパラメータを増やす必要がある場合があります。選択したモデルが出力できる最大トークン数の詳細については、モデル比較ページを参照してください。
Claudeをコンテンツモデレーションに使用する方法の完全に実装されたコードベースの例を表示します。
Claudeとのインタラクションをモデレートするための技術についてのガードレールガイドを探索します。
Was this page helpful?