요약 쿡북을 방문하여 Claude를 사용한 법률 문서 요약 구현 예시를 확인하세요.

Claude로 구축하기 전에

Claude를 사용한 법률 문서 요약이 적절한지 결정하기

다음은 Claude와 같은 LLM을 사용하여 법률 문서를 요약해야 하는 주요 지표입니다:

요약에서 추출할 세부 정보 결정하기

어떤 문서에도 단 하나의 정확한 요약은 없습니다. 명확한 방향이 없으면 Claude가 어떤 세부 사항을 포함해야 할지 결정하기 어려울 수 있습니다. 최적의 결과를 얻으려면 요약에 포함하고 싶은 특정 정보를 식별하세요.

예를 들어, 전대차 계약을 요약할 때 다음과 같은 핵심 사항을 추출하고 싶을 수 있습니다:

details_to_extract = [
    '관련 당사자(전대인, 전차인 및 원 임대인)',
    '부동산 세부사항(주소, 설명 및 허용된 용도)', 
    '기간 및 임대료(시작일, 종료일, 월 임대료 및 보증금)',
    '책임사항(공과금, 유지보수 및 수리)',
    '동의 및 통지(임대인의 동의 및 통지 요건)',
    '특별 조항(가구, 주차 및 전대 제한사항)'
]

성공 기준 수립하기

요약의 품질을 평가하는 것은 매우 어려운 작업입니다. 다른 많은 자연어 처리 작업과 달리, 요약 평가에는 명확하고 객관적인 지표가 부족한 경우가 많습니다. 이 과정은 매우 주관적일 수 있으며, 다른 독자들이 요약의 다른 측면을 중요하게 여길 수 있습니다. 다음은 Claude의 법률 문서 요약 성능을 평가할 때 고려할 수 있는 기준입니다.

자세한 내용은 성공 기준 수립 가이드를 참조하세요.


Claude를 사용하여 법률 문서를 요약하는 방법

적절한 Claude 모델 선택하기

모델의 정확성은 법률 문서를 요약할 때 매우 중요합니다. Claude 3.5 Sonnet은 이와 같이 높은 정확성이 요구되는 사용 사례에 탁월한 선택입니다. 문서의 크기와 수량이 많아 비용이 문제가 되기 시작하면 Claude 3 Haiku와 같은 더 작은 모델을 사용해 볼 수도 있습니다.

이러한 비용을 추정하는 데 도움이 되도록, Sonnet과 Haiku를 모두 사용하여 1,000개의 전대차 계약을 요약하는 비용을 비교해보겠습니다:

  • 콘텐츠 크기

    • 계약 수: 1,000
    • 계약당 문자 수: 300,000
    • 총 문자 수: 300M
  • 예상 토큰

    • 입력 토큰: 86M (문자당 3.5 토큰 가정)
    • 요약당 출력 토큰: 350
    • 총 출력 토큰: 350,000
  • Claude 3.5 Sonnet 예상 비용

    • 입력 토큰 비용: 86 MTok * 3.00/MTok=3.00/MTok = 258
    • 출력 토큰 비용: 0.35 MTok * 15.00/MTok=15.00/MTok = 5.25
    • 총 비용: 258.00+258.00 + 5.25 = $263.25
  • Claude 3 Haiku 예상 비용

    • 입력 토큰 비용: 86 MTok * 0.25/MTok=0.25/MTok = 21.50
    • 출력 토큰 비용: 0.35 MTok * 1.25/MTok=1.25/MTok = 0.44
    • 총 비용: 21.50+21.50 + 0.44 = $21.96
실제 비용은 이러한 추정치와 다를 수 있습니다. 이 추정치들은 프롬프팅 섹션에서 강조된 예시를 기반으로 합니다.

Claude가 처리할 수 있는 형식으로 문서 변환하기

문서 요약을 시작하기 전에 데이터를 준비해야 합니다. 여기에는 PDF에서 텍스트를 추출하고, 텍스트를 정리하며, Claude가 처리할 수 있도록 준비하는 작업이 포함됩니다.

샘플 PDF에서 이 프로세스를 시연해보겠습니다:

from io import BytesIO
import re

import pypdf
import requests

def get_llm_text(pdf_file):
    reader = pypdf.PdfReader(pdf_file)
    text = "\n".join([page.extract_text() for page in reader.pages])

    # 추가 공백 제거
    text = re.sub(r'\s+', ' ', text) 

    # 페이지 번호 제거
    text = re.sub(r'\n\s*\d+\s*\n', '\n', text) 

    return text


# GitHub 저장소에서 전체 URL 생성
url = "https://raw.githubusercontent.com/anthropics/anthropic-cookbook/main/skills/summarization/data/Sample Sublease Agreement.pdf"
url = url.replace(" ", "%20")

# PDF 파일을 메모리로 다운로드
response = requests.get(url)

# 메모리에서 PDF 로드
pdf_file = BytesIO(response.content)

document_text = get_llm_text(pdf_file) 
print(document_text[:50000]) 

이 예시에서는 먼저 요약 쿡북에서 사용된 샘플 전대차 계약의 PDF를 다운로드합니다. 이 계약서는 sec.gov 웹사이트에서 공개적으로 사용 가능한 전대차 계약서에서 가져온 것입니다.

pypdf 라이브러리를 사용하여 PDF의 내용을 추출하고 텍스트로 변환합니다. 그런 다음 추가 공백과 페이지 번호를 제거하여 텍스트 데이터를 정리합니다.

강력한 프롬프트 구축하기

Claude는 다양한 요약 스타일에 적응할 수 있습니다. 프롬프트의 세부 사항을 변경하여 Claude가 더 자세하거나 간단하게, 더 많거나 적은 기술 용어를 포함하도록, 또는 해당 맥락에 대해 더 높거나 낮은 수준의 요약을 제공하도록 안내할 수 있습니다.

다음은 전대차 계약을 분석할 때 생성된 요약이 일관된 구조를 따르도록 하는 프롬프트를 만드는 예시입니다:

import anthropic

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

def summarize_document(text, details_to_extract, model="claude-3-5-sonnet-20241022", max_tokens=1000):

    

    # 추출할 세부사항을 프롬프트의 맥락 내에 배치하도록 형식화
    details_to_extract_str = '\n'.join(details_to_extract)
    
    # 모델에게 전대차 계약 요약을 요청
    prompt = f"""다음 전대차 계약을 요약하세요. 다음 핵심 측면에 집중하세요:

    {details_to_extract_str}

    각 섹션에 대한 요약을 XML 헤더 내에 중첩된 글머리 기호로 제공하세요. 예시:

    <parties involved>
    - 전대인: [이름]
    // 필요에 따라 더 많은 세부사항 추가
    </parties involved>
    
    문서에 명시적으로 언급되지 않은 정보는 "명시되지 않음"으로 표시하세요. 서문을 작성하지 마세요.

    전대차 계약 텍스트:
    {text}
    """

    response = client.messages.create(
        model=model,
        max_tokens=max_tokens,
        system="당신은 부동산법을 전문으로 하는 법률 분석가로, 전대차 계약에 대한 매우 정확하고 상세한 요약으로 유명합니다.",
        messages=[
            {"role": "user", "content": prompt},
            {"role": "assistant", "content": "다음은 전대차 계약의 요약입니다: <summary>"}
        ],
        stop_sequences=["</summary>"]
    )

    return response.content[0].text

sublease_summary = summarize_document(document_text, details_to_extract)
print(sublease_summary)

이 코드는 Claude를 사용하여 전대차 계약의 내용을 요약하는 summarize_document 함수를 구현합니다. 이 함수는 텍스트 문자열과 추출할 세부사항 목록을 입력으로 받습니다. 이 예시에서는 이전 코드 스니펫에서 정의된 document_textdetails_to_extract 변수로 함수를 호출합니다.

함수 내에서는 요약할 문서, 추출할 세부사항, 문서 요약을 위한 구체적인 지침을 포함하는 프롬프트가 Claude를 위해 생성됩니다. 프롬프트는 Claude에게 각 추출할 세부사항의 요약을 XML 헤더 내에 중첩하여 응답하도록 지시합니다.

각 섹션의 요약을 태그 내에 출력하기로 결정했기 때문에, 각 섹션을 후처리 단계에서 쉽게 파싱할 수 있습니다. 이 접근 방식을 통해 사용 사례에 맞게 조정할 수 있는 구조화된 요약이 가능하므로 각 요약이 동일한 패턴을 따르게 됩니다.

프롬프트 평가하기

프롬프트는 프로덕션 준비가 되기 위해 테스트와 최적화가 필요한 경우가 많습니다. 솔루션의 준비 상태를 결정하려면 정량적 및 정성적 방법을 결합한 체계적인 프로세스를 사용하여 요약의 품질을 평가하세요. 정의된 성공 기준을 기반으로 강력한 경험적 평가를 만들면 프롬프트를 최적화할 수 있습니다. 다음은 경험적 평가에 포함할 수 있는 몇 가지 지표입니다:

프롬프트 배포하기

솔루션을 프로덕션에 배포할 때 고려해야 할 추가 사항들입니다.

  1. 책임 없음 보장: 요약의 오류로 인해 발생할 수 있는 조직이나 클라이언트에 대한 법적 책임의 의미를 이해하세요. 요약이 AI에 의해 생성되었으며 법률 전문가가 검토해야 한다는 것을 명시하는 면책 조항이나 법적 고지를 제공하세요.

  2. 다양한 문서 유형 처리: 이 가이드에서는 PDF에서 텍스트를 추출하는 방법에 대해 논의했습니다. 실제로는 문서가 다양한 형식(PDF, Word 문서, 텍스트 파일 등)으로 제공될 수 있습니다. 데이터 추출 파이프라인이 수신할 것으로 예상되는 모든 파일 형식을 변환할 수 있는지 확인하세요.

  3. Claude에 대한 API 호출 병렬화: 토큰이 많은 긴 문서의 경우 Claude가 요약을 생성하는 데 최대 1분이 걸릴 수 있습니다. 대규모 문서 컬렉션의 경우 합리적인 시간 내에 요약을 완료할 수 있도록 Claude에 대한 API 호출을 병렬로 보내고 싶을 수 있습니다. 병렬로 수행할 수 있는 최대 API 호출 수를 결정하려면 Anthropic의 속도 제한을 참조하세요.


성능 개선하기

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

긴 문서를 요약하기 위한 메타 요약 수행하기

법률 요약은 종종 Claude의 컨텍스트 윈도우를 초과하는 긴 문서나 많은 관련 문서를 한 번에 처리하는 것을 포함합니다. 이러한 사용 사례를 처리하기 위해 메타 요약이라고 알려진 청킹 방법을 사용할 수 있습니다. 이 기술은 문서를 더 작고 관리하기 쉬운 청크로 나누고 각 청크를 별도로 처리하는 것을 포함합니다. 그런 다음 각 청크의 요약을 결합하여 전체 문서의 메타 요약을 만들 수 있습니다.

다음은 메타 요약을 수행하는 방법의 예시입니다:

import anthropic

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

def chunk_text(text, chunk_size=20000):
    return [text[i:i+chunk_size] for i in range(0, len(text), chunk_size)]

def summarize_long_document(text, details_to_extract, model="claude-3-5-sonnet-20241022", max_tokens=1000):

    # 추출할 세부사항을 프롬프트의 맥락 내에 배치하도록 형식화
    details_to_extract_str = '\n'.join(details_to_extract)

    # 청크를 반복하고 각각 요약
    chunk_summaries = [summarize_document(chunk, details_to_extract, model=model, max_tokens=max_tokens) for chunk in chunk_text(text)]
    
    final_summary_prompt = f"""
    
    당신은 모두 관련된 여러 문서의 청크 요약을 보고 있습니다.
    다음과 같은 다양한 신뢰할 수 있는 출처의 문서 요약을 일관된 전체 요약으로 결합하세요:

    <chunked_summaries>
    {"".join(chunk_summaries)}
    </chunked_summaries>

    다음 핵심 측면에 집중하세요:
    {details_to_extract_str})

    각 섹션에 대한 요약을 XML 헤더 내에 중첩된 글머리 기호로 제공하세요. 예시:

    <parties involved>
    - 전대인: [이름]
    // 필요에 따라 더 많은 세부사항 추가
    </parties involved>
    
    문서에 명시적으로 언급되지 않은 정보는 "명시되지 않음"으로 표시하세요. 서문을 작성하지 마세요.
    """

    response = client.messages.create(
        model=model,
        max_tokens=max_tokens,
        system="당신은 하나의 문서에 대한 노트를 요약하는 법률 전문가입니다.",
        messages=[
            {"role": "user",  "content": final_summary_prompt},
            {"role": "assistant", "content": "다음은 전대차 계약의 요약입니다: <summary>"}

        ],
        stop_sequences=["</summary>"]
    )
    
    return response.content[0].text

long_summary = summarize_long_document(document_text, details_to_extract)
print(long_summary)

summarize_long_document 함수는 문서를 더 작은 청크로 분할하고 각 청크를 개별적으로 요약함으로써 이전의 summarize_document 함수를 기반으로 합니다.

코드는 원본 문서 내의 20,000자 청크 각각에 summarize_document 함수를 적용하여 이를 달성합니다. 개별 요약은 그런 다음 결합되고, 이러한 청크 요약에서 최종 요약이 생성됩니다.

summarize_long_document 함수는 우리의 예시 PDF의 경우 엄격히 필요하지는 않습니다. 전체 문서가 Claude의 컨텍스트 윈도우에 맞기 때문입니다. 그러나 이는 Claude의 컨텍스트 윈도우를 초과하는 문서나 여러 관련 문서를 함께 요약할 때 필수적입니다. 그럼에도 불구하고, 이 메타 요약 기술은 종종 이전의 단일 요약 접근 방식에서 놓친 추가적인 중요한 세부사항을 최종 요약에서 포착합니다.

대규모 문서 컬렉션을 탐색하기 위해 요약 인덱싱된 문서 사용하기

LLM을 사용한 문서 컬렉션 검색은 일반적으로 검색 증강 생성(RAG)을 포함합니다. 그러나 큰 문서가 포함된 시나리오나 정확한 정보 검색이 중요한 경우에는 기본적인 RAG 접근 방식이 불충분할 수 있습니다. 요약 인덱싱된 문서는 전통적인 RAG 방법보다 적은 컨텍스트를 사용하여 검색을 위한 문서 순위를 매기는 더 효율적인 방법을 제공하는 고급 RAG 접근 방식입니다. 이 접근 방식에서는 먼저 Claude를 사용하여 코퍼스의 각 문서에 대한 간결한 요약을 생성한 다음, Clade를 사용하여 요청된 쿼리에 대한 각 요약의 관련성 순위를 매깁니다. 이 접근 방식에 대한 자세한 내용과 코드 기반 예시는 요약 쿡북의 요약 인덱싱된 문서 섹션을 확인하세요.

데이터셋에서 학습하도록 Claude 미세 조정하기

Claude의 요약 생성 능력을 향상시키는 또 다른 고급 기술은 미세 조정입니다. 미세 조정은 Claude를 귀하의 법률 요약 요구사항에 특별히 부합하는 사용자 정의 데이터셋에서 훈련시켜 Claude가 귀하의 사용 사례에 적응하도록 하는 것을 포함합니다. 다음은 미세 조정을 수행하는 방법에 대한 개요입니다:

  1. 오류 식별: Claude의 요약이 부족한 경우를 수집하는 것으로 시작하세요 - 여기에는 중요한 법적 세부사항 누락, 맥락 오해, 또는 부적절한 법률 용어 사용이 포함될 수 있습니다.

  2. 데이터셋 큐레이션: 이러한 문제를 식별한 후에는 이러한 문제가 있는 예시들의 데이터셋을 컴파일하세요. 이 데이터셋에는 Claude가 원하는 행동을 학습하도록 하기 위해 원본 법률 문서와 함께 귀하가 수정한 요약이 포함되어야 합니다.

  3. 미세 조정 수행: 미세 조정에는 모델의 가중치와 매개변수를 조정하기 위해 귀하의 큐레이션된 데이터셋에서 모델을 재훈련하는 것이 포함됩니다. 이 재훈련은 Claude가 귀하의 법률 도메인의 특정 요구사항을 더 잘 이해하도록 도와 귀하의 기준에 따라 문서를 요약하는 능력을 향상시킵니다.

  4. 반복적 개선: 미세 조정은 일회성 프로세스가 아닙니다. Claude가 계속해서 요약을 생성함에 따라 성능이 부족한 새로운 예시를 반복적으로 추가하여 그 능력을 더욱 개선할 수 있습니다. 시간이 지남에 따라 이러한 지속적인 피드백 루프는 귀하의 법률 요약 작업에 매우 특화된 모델로 이어질 것입니다.

미세 조정은 현재 Amazon Bedrock을 통해서만 사용할 수 있습니다. 자세한 내용은 AWS 출시 블로그에서 확인할 수 있습니다.