콘텐츠 관리 쿡북을 방문하여 Claude를 사용한 콘텐츠 관리 구현 예시를 확인하세요.

이 가이드는 애플리케이션 내 사용자 생성 콘텐츠 관리에 중점을 둡니다. Claude와의 상호작용 관리에 대한 지침을 찾고 계시다면 가드레일 가이드를 참조하세요.

Claude로 구축하기 전에

Claude를 콘텐츠 관리에 사용할지 결정하기

다음은 전통적인 ML이나 규칙 기반 접근 방식 대신 Claude와 같은 LLM을 콘텐츠 관리에 사용해야 하는 주요 지표입니다:

Anthropic은 모든 Claude 모델이 정직하고 도움이 되며 해롭지 않도록 훈련했습니다. 이는 사용된 프롬프트와 관계없이 Claude가 특히 위험하다고 판단되는 콘텐츠를 관리하게 될 수 있습니다(이용 정책에 따라). 예를 들어, 사용자가 명시적인 성적 콘텐츠를 게시할 수 있도록 하려는 성인 웹사이트의 경우, 프롬프트에서 명시적인 성적 콘텐츠를 관리하지 말라고 지정하더라도 Claude가 여전히 명시적인 콘텐츠를 관리가 필요한 것으로 표시할 수 있습니다. 관리 솔루션을 구축하기 전에 이용 정책을 검토하는 것이 좋습니다.

관리할 콘텐츠 예시 생성하기

콘텐츠 관리 솔루션을 개발하기 전에 먼저 플래그를 지정해야 할 콘텐츠와 플래그를 지정하지 않아야 할 콘텐츠의 예시를 만드세요. 콘텐츠 관리 시스템이 효과적으로 처리하기 어려울 수 있는 경계 사례와 까다로운 시나리오를 포함해야 합니다. 그런 다음 예시를 검토하여 잘 정의된 관리 카테고리 목록을 만드세요. 예를 들어, 소셜 미디어 플랫폼에서 생성된 예시에는 다음이 포함될 수 있습니다:

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와 같은 더 작은 모델이 비용 효율성 때문에 탁월한 선택입니다. 다음은 매월 10억 개의 게시물을 받는 소셜 미디어 플랫폼의 텍스트 관리 비용 추정치입니다:

  • 콘텐츠 크기

    • 월간 게시물: 10억
    • 게시물당 문자: 100
    • 총 문자: 1,000억
  • 예상 토큰

    • 입력 토큰: 286억 (문자당 3.5 토큰 가정)
    • 플래그 지정된 메시지 비율: 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

# Anthropic 클라이언트 초기화
client = anthropic.Anthropic()

def moderate_message(message, unsafe_categories):
    # 안전하지 않은 카테고리 목록을 각 카테고리가 새 줄에 있는 문자열로 변환
    unsafe_category_str = '\n'.join(unsafe_categories)
    
    # Claude를 위한 프롬프트 구성, 메시지와 안전하지 않은 카테고리  포함
    assessment_prompt = f"""
    아래 나열된 안전하지 않은 카테고리를 기반으로 
    다음 메시지가 관리가 필요한지 판단하세요.
    
    Message:
    <message>{message}</message>

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

    아래 형식을 사용하여 JSON 객체로만 응답하세요:
    {{
    "violation": <메시지가 관리되어야 하는지를 나타내는 Boolean 필드>,
    "categories": [위반된 카테고리의 쉼표로 구분된 목록],
    "explanation": [선택 사항. 위반이 있는 경우에만 포함.]
    }}"""

    # 콘텐츠 관리를 위해 Claude에 요청 전송
    response = client.messages.create(
        model="claude-3-haiku-20240307",  # 낮은 비용을 위해 Haiku 모델 사용
        max_tokens=200,
        temperature=0,   # 일관성 향상을 위해 0 temperature 사용
        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("문제가 발견되지 않았습니다.")

이 예시에서 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}</message>

Unsafe Categories:
<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 temperature 사용
        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}")

이 코드는 Claude를 사용하여 메시지의 위험 수준을 평가하는 assess_risk_level 함수를 구현합니다. 이 함수는 메시지와 안전하지 않은 카테고리 목록을 입력으로 받습니다.

함수 내에서 평가할 메시지, 안전하지 않은 카테고리 및 위험 수준 평가를 위한 특정 지침을 포함하는 프롬프트가 Claude를 위해 생성됩니다. 프롬프트는 Claude에게 위험 수준, 위반된 카테고리 및 선택적 설명을 포함하는 JSON 객체로 응답하도록 지시합니다.

이 접근 방식은 위험 수준을 할당하여 유연한 콘텐츠 관리를 가능하게 합니다. 평가된 위험 수준에 따라 콘텐츠를 자동으로 필터링하거나 인력 검토를 위해 댓글에 플래그를 지정하는 더 큰 시스템에 원활하게 통합될 수 있습니다. 예를 들어, 이 코드를 실행할 때 ‘이 게시물을 지우지 않으면 숨어있어야 할 거예요. 당신과 당신 가족을 찾아갈 거예요.‘라는 댓글은 위험한 위협 때문에 고위험으로 식별됩니다. 반대로 ‘5G 휴대폰을 피하세요!! 5G로 당신을 조종하고 있어요.‘라는 댓글은 중위험으로 분류됩니다.

프롬프트 배포하기

솔루션의 품질에 자신이 생기면 프로덕션에 배포할 시간입니다. 프로덕션에서 콘텐츠 관리를 사용할 때 따라야 할 몇 가지 모범 사례가 있습니다:

  1. 사용자에게 명확한 피드백 제공: 콘텐츠 관리로 인해 사용자 입력이 차단되거나 응답에 플래그가 지정된 경우, 메시지가 플래그된 이유와 적절하게 다시 작성하는 방법에 대한 정보를 제공하는 유익하고 건설적인 피드백을 제공하세요. 위의 코딩 예시에서는 Claude 응답의 explanation 태그를 통해 이를 수행합니다.

  2. 관리된 콘텐츠 분석: 관리 시스템에 의해 플래그가 지정된 콘텐츠 유형을 추적하여 트렌드와 잠재적인 개선 영역을 식별하세요.

  3. 지속적인 평가 및 개선: 정밀도와 재현율 추적과 같은 메트릭을 사용하여 콘텐츠 관리 시스템의 성능을 정기적으로 평가하세요. 이 데이터를 사용하여 관리 프롬프트, 키워드 및 평가 기준을 반복적으로 개선하세요.


성능 향상하기

복잡한 시나리오에서는 표준 프롬프트 엔지니어링 기술 이외에 성능을 향상시키기 위한 추가 전략을 고려하는 것이 도움이 될 수 있습니다. 다음은 몇 가지 고급 전략입니다:

주제 정의 및 예시 제공하기

프롬프트에 안전하지 않은 카테고리를 나열하는 것 외에도 각 카테고리에 대한 정의와 관련 구문을 제공하여 추가 개선을 할 수 있습니다.

import anthropic
import json

# Anthropic 클라이언트 초기화
client = anthropic.Anthropic()

# 콘텐츠 관리에서 안전하지 않은 것으로 간주되는 카테고리와 정의 사전
unsafe_category_definitions = {
    '아동 착취': '아동 누드를 묘사하거나 아동의 성적 학대를 가능하게 하거나, 조장하거나, 변명하거나, 묘사하는 콘텐츠.',
    '음모론': """사건, 상황 또는 개인에 대한 근거 없는, 거짓이거나 오해의 소지가 있는 이론을 
        조장하거나 지지하는 콘텐츠로, 해를 끼치거나 기관이나 사실에 대한 공공의 신뢰를 훼손할 수 있는 콘텐츠.""",
    '혐오': """보호되는 특성(인종, 피부색, 민족, 출신 국가, 장애, 종교, 카스트, 성적 지향, 성별, 성 정체성 및 심각한 질병)
        기반으로 사람들에 대해 혐오적이거나 부정적인 고정관념을 영속시키는 콘텐츠.""",
    '무차별 무기': '대량 살상 무기의 제작을 가능하게 하는 콘텐츠.', 
    '지적 재산권': '제3자의 지적 재산권을 침해하는 콘텐츠.',
    '비폭력 범죄': '비폭력 범죄의 실행을 가능하게 하거나, 조장하거나, 변명하는 콘텐츠.', 
    '개인정보': '개인에 대한 민감하고 개인적인 정보를 포함하는 콘텐츠.',
    '자해': '의도적인 자해 행위를 가능하게 하거나, 조장하거나, 변명하는 콘텐츠.',
    '성범죄': '성범죄의 실행을 가능하게 하거나, 조장하거나, 변명하는 콘텐츠.',
    '성적 콘텐츠': '성행위에 대한 에로틱한 묘사나 명시적인 묘사를 포함하는 콘텐츠.',
    '전문적 조언': """재무, 의료 또는 법률 조언을 포함하는 콘텐츠. 
        재무 조언에는 투자, 주식, 채권 또는 재무 계획에 대한 지침이 포함됩니다.""",
    '폭력 범죄': '폭력 범죄의 실행을 가능하게 하거나, 조장하거나, 변명하는 콘텐츠.', 
}


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}</message>

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

모든 안전하지 않은 카테고리와 그 정의를 기억하는 것이 중요합니다.

아래 형식을 사용하여 JSON 객체로만 응답하세요:
{{
  "violation": <메시지가 관리되어야 하는지를 나타내는 Boolean 필드>,
  "categories": [위반된 카테고리의 쉼표로 구분된 목록],
  "explanation": [선택 사항. 위반이 있는 경우에만 포함.]
}}"""

    # 콘텐츠 관리를 위해 Claude에 요청 전송
    response = client.messages.create(
        model="claude-3-haiku-20240307",  # 낮은 비용을 위해 Haiku 모델 사용
        max_tokens=200,
        temperature=0,   # 일관성 향상을 위해 0 temperature 사용
        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("문제가 발견되지 않았습니다.")

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>
{messages_str}
</messages>

Unsafe categories and their definitions:
<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 temperature 사용
        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로 식별됩니다. 특정 요구사항에 맞는 최적의 배치 크기를 찾으려면 실험이 필요할 수 있습니다. 더 큰 배치 크기는 비용을 낮출 수 있지만 품질이 약간 저하될 수 있습니다. 또한 더 긴 응답을 수용하기 위해 Claude API 호출의 max_tokens 매개변수를 늘려야 할 수 있습니다. 선택한 모델이 출력할 수 있는 최대 토큰 수에 대한 자세한 내용은 모델 비교 페이지를 참조하세요.