웹 플레이그라운드는 데모용으로 훌륭합니다. 텍스트 블록을 붙여넣고 모델이 깔끔하게 요약하는 것을 지켜본 뒤 탭을 닫으면 끝이죠. 하지만 그것은 엔지니어링이 아닙니다. 프로덕션 작업은 API, 에러 처리, 그리고 당신이 잠든 사이에도 실행되는 코드를 의미합니다. 회의록, 고객 지원 티켓, 또는 연구 논문을 정기적으로 처리해야 한다면 파이프라인이 필요합니다.

이 가이드는 바로 그것, 즉 Python, AWS SDK for Python (boto3), 그리고 Amazon Bedrock을 사용하여 가볍고 자동화된 문서 요약 스크립트를 구축하는 과정을 안내합니다. 텍스트 요약 작업에서 속도와 비용의 최적의 균형을 맞춘 모델인 Anthropic의 Claude 3 Haiku를 사용할 것입니다.

Why Bedrock and Claude 3 Haiku?

Amazon Bedrock은 단일 AWS API 세트를 통해 파운데이션 모델을 제공하는 관리형 서비스입니다. 외부 엔드포인트를 하나씩 연결하고 별도의 과금 및 보안 모델과 씨름하는 대신, 표준 IAM 제어를 사용하여 AWS 엔드포인트를 호출할 수 있습니다. 데이터는 사용자의 AWS 환경 내에 머뭅니다.

Claude 3 Haiku는 Anthropic의 Claude 3 제품군 중 가장 가벼운 모델입니다. 응답성과 저비용에 최적화되어 있어, 단순한 읽기 작업에 더 큰 모델의 성능을 위해 비용을 지불하지 않고도 예측 가능한 결과물을 얻고자 하는 대량 요약 작업에 이상적입니다.

What You Need

코드를 작성하기 전에 다음 사항이 준비되었는지 확인하세요:

  • 활성화된 AWS 계정.
  • 로컬에 설치된 Python 3.9 이상 버전.
  • Bedrock 모델을 호출할 권한이 있는 자격 증명으로 구성된 AWS CLI. 아직 aws configure를 실행하지 않았다면 지금 실행하세요. 나중에 권한 에러가 발생하면 IAM 사용자 또는 역할에 적절한 Bedrock 호출 권한을 연결해야 할 수도 있습니다.
  • AWS Bedrock 콘솔 내에서 Anthropic Claude 3 Haiku에 대한 모델 액세스가 활성화되어 있어야 합니다. AWS에서는 모델을 호출하기 전에 각 모델 제공업체에 대해 명시적으로 액세스 권한을 요청(opt in)해야 합니다.

Step 1: Enable Model Access

Bedrock은 기본적으로 모델 호출을 허용하지 않습니다. 먼저 콘솔에서 설정을 변경해야 합니다.

  1. AWS Management Console에 로그인합니다.
  2. 검색창을 사용하여 Amazon Bedrock을 찾습니다.
  3. 왼쪽 탐색 패널에서 Model access를 선택합니다.
  4. Modify model access를 클릭합니다.
  5. Anthropic (Claude 3 Haiku) 체크박스를 선택하고 요청을 제출합니다.

상태가 "Access granted"로 바뀌면 코드에서 모델을 호출할 수 있습니다.

Step 2: Set Up Your Environment

깨끗한 Python 환경을 사용하면 종속성을 격리하고 재현할 수 있습니다. 터미널을 열고 다음 명령어를 실행하세요:

mkdir bedrock-summarizer && cd bedrock-summarizer
python3 -m venv venv
source venv/bin/activate
pip install boto3

Windows 사용자는 활성화 명령어를 venv\Scripts\activate로 바꿔야 합니다. pip install boto3가 완료되면 AWS API와 통신하는 데 필요한 모든 준비가 끝납니다.

Step 3: Write the Script

summarize.py라는 이름의 파일을 생성합니다. 목표는 디스크에서 문서를 읽어 Bedrock Converse API에 전달하고 간결한 요약본을 출력하는 것입니다.

아래는 바로 실행 가능한 전체 구현 코드입니다. Converse API를 사용하는 이유는 서로 다른 모델 제공업체가 요구하는 원시 JSON 형식을 추상화해주기 때문입니다. 메시지 목록과 추론 설정을 전달하기만 하면 됩니다.

import boto3

def summarize_document(text: str) -> str:
    client = boto3.client("bedrock-runtime")
    
    model_id = "anthropic.claude-3-haiku-20240307-v1:0"
    
    messages = [
        {
            "role": "user",
            "content": [
                {
                    "text": (
                        "Provide a concise summary of the following document. "
                        "Focus on the main points and avoid unnecessary detail:\n\n"
                        f"{text}"
                    )
                }
            ]
        }
    ]
    
    response = client.converse(
        modelId=model_id,
        messages=messages,
        inferenceConfig={
            "temperature": 0.3,
            "maxTokens": 512
        }
    )
    
    summary = response["output"]["message"]["content"][0]["text"]
    return summary.strip()


if __name__ == "__main__":
    with open("document.txt", "r", encoding="utf-8") as f:
        document_text = f.read()
    
    result = summarize_document(document_text)
    print("\n--- Summary ---\n")
    print(result)

여기서 강조할 만한 몇 가지 실무적인 세부 사항은 다음과 같습니다:

  • **boto3.client("bedrock-runtime")**는 추론을 처리하는 런타임 엔드포인트를 대상으로 합니다. ~/.aws/config의 AWS 리전이 Bedrock을 지원하는지, 그리고 해당 리전에서 Haiku를 활성화했는지 확인하세요.
  • Model ID anthropic.claude-3-haiku-20240307-v1:0는 Bedrock이 기대하는 정확한 식별자입니다. 정확하게 복사하여 사용하세요.
  • Temperature를 0.3으로 설정하면 출력이 근거에 충실하게 유지됩니다. 요약 작업에서는 창의적인 미사여구보다는 원문과의 일관성과 충실도가 중요합니다. 온도를 1.0에 가깝게 높이면 모델이 문구를 임의로 수정하거나 때때로 세부 사항을 지어내기 시작합니다.
  • 프롬프트 자체가 구체적입니다. 모델에 막연하게 "이것을 요약해줘"라고 원문을 던지는 대신, 주요 포인트를 명시적으로 요청하고 불필요한 내용은 건너뛰도록 지시합니다. 이러한 명확성이 쓸모없는 결과물과 실제로 배포 가능한 결과물을 가르는 차이입니다.

요약하려는 텍스트 파일을 동일한 디렉토리에 두고 이름을 document.txt로 지정하세요.

Step 4: Run It

가상 환경이 활성화된 상태에서 다음을 실행합니다:

python summarize.py

자격 증명과 모델 액세스 권한이 올바르다면, 몇 초 안에 터미널에 깔끔한 요약본이 출력될 것입니다. 액세스 에러가 발생하면 IAM 권한을 다시 확인하고 콘솔에서 Claude 3 Haiku를 활성화했는지 확인하세요.

Pushing Beyond the Script

이 파이프라인은 의도적으로 단순하게 설계되었지만, 실제 자동화를 위한 토대가 됩니다. 불필요한 복잡성을 더하지 않고도 이를 확장할 수 있는 방법은 다음과 같습니다.

배치 처리(Batch processing). 단일 파일 읽기 대신 디렉터리를 순회하는 루프를 사용하세요. 입력 폴더에 50개의 PDF 또는 텍스트 파일을 넣고, 이를 반복 처리하여 요약본을 출력 폴더에 저장하면 됩니다. PDF를 직접 입력하려면 Bedrock에 전달하기 전에 PyPDF2나 pdfplumber와 같은 라이브러리를 사용하여 원시 텍스트를 추출하는 전처리 단계가 필요합니다.

청킹 전략(Chunking strategy). 매우 긴 문서는 모델의 컨텍스트 제한을 초과할 수 있습니다. 이 경우 텍스트를 단락이나 섹션별로 논리적인 청크(chunk)로 나누고, 각 청크를 개별적으로 요약한 다음, 중간 요약본들을 다시 모델에 전달하여 최종적으로 종합합니다. 이러한 2단계 접근 방식은 토큰 제한을 준수하면서도 문서 전체의 내용을 놓치지 않게 해줍니다.

에러 처리(Error handling). 프로덕션 코드에서는 boto3.exceptions.ClientError를 구체적으로 포착해야 합니다. API를 너무 공격적으로 호출하면 AWS에서 요청을 제한(throttle)할 수 있습니다. converse 호출을 지수 백오프(exponential backoff)가 적용된 재시도 루프로 감싸거나, tenacity와 같은 라이브러리를 사용하여 속도 제한(rate limit)을 유연하게 처리하세요.

프롬프트 엔지니어링(Prompt engineering). 평범한 요약과 유용한 요약의 차이는 종종 프롬프트에서 결정됩니다. 가독성이 중요하다면 불렛 포인트를 요청하세요. 대상이 경영진이라면 한 단락으로 된 핵심 요약(executive summary)을 요청하세요. "요약을 세 문장 이내로 제한해줘" 또는 "topic, key_points, action_items 키를 가진 JSON 형식으로 출력해줘"와 같이 서식 제약 조건을 전달할 수도 있습니다.

핵심 요약

채팅 플레이그라운드에서 실제 작동하는 스크립트로 넘어가는 것은 AI가 인프라로 변모하는 변곡점입니다. 이 파이프라인이 로컬에서 실행되기 시작하면, S3 업로드에 의해 트리거되는 AWS Lambda 함수로 옮기거나, ECS Fargate에 스케줄링하거나, 기존 데이터 워크플로우에 연결할 수 있습니다. API 호출은 쉬운 부분입니다. 진정한 엔지니어링 가치는 파일, 에러, 서식을 처리하는 로직으로 해당 호출을 감싸서, 더 이상 브라우저에 텍스트를 복사해서 붙여넣을 필요가 없게 만드는 데 있습니다.

이 설정에 대한 추가적인 맥락과 다양한 변형을 확인하려면 Dev.to의 원본 가이드를 참조하세요. 빌더 커뮤니티와 함께 AWS 아키텍처, LLM 파이프라인 또는 프롬프트 엔지니어링에 대해 논의하고 싶다면 [GyaanSetu AI on Telegram](https://t.me/GyaanSet