訪問我們的內容審核指南,查看使用Claude實現內容審核的示例。

本指南主要關注在您的應用程式中審核用戶生成的內容。如果您正在尋找有關審核與Claude互動的指導,請參考我們的防護指南

使用Claude構建前的準備

決定是否使用Claude進行內容審核

以下是一些關鍵指標,表明您應該使用像Claude這樣的LLM而不是傳統的ML或基於規則的方法進行內容審核:

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 Haiku 3這樣的較小模型由於其成本效益而成為絕佳選擇。以下是為每月接收十億帖子的社交媒體平台審核文本的成本估計:

  • 內容大小

    • 每月帖子數:10億
    • 每個帖子的字符數:100
    • 總字符數:1000億
  • 估計的令牌數

    • 輸入令牌:286億(假設每3.5個字符1個令牌)
    • 被標記的消息百分比:3%
    • 每條被標記消息的輸出令牌:50
    • 總輸出令牌:15億
  • Claude Haiku 3估計成本

    • 輸入令牌成本:2,860 MTok * $0.25/MTok = $715
    • 輸出令牌成本:1,500 MTok * $1.25/MTok = $1,875
    • 每月成本:$715 + $1,875 = $2,590
  • Claude Sonnet 4估計成本

    • 輸入令牌成本:2,860 MTok * $3.00/MTok = $8,580
    • 輸出令牌成本:1,500 MTok * $15.00/MTok = $22,500
    • 每月成本:$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參數以適應更長的響應。有關您選擇的模型可以輸出的最大令牌數的詳細信息,請參考模型比較頁面