AI로 긴 문서를 요약할 때 어떤 전략을 선택하느냐에 따라 결과 품질, 비용, 처리 속도가 크게 달라집니다. 이 가이드에서는 Stuff, Map-Reduce, Refine 세 가지 핵심 전략을 실제 코드와 함께 단계별로 설명합니다. HolySheep AI를 사용하면 단일 API 키로 여러 모델을 쉽게 비교하고 최적의 전략을 찾을 수 있습니다.

왜 문서 요약 전략이 중요한가

1,000페이지짜리 계약서나 수십 개의 회의록을 AI로 요약한다고 상상해 보세요. 단순히 전체 텍스트를 AI에 던지면 context window 제한에 걸리거나 비용이 폭발적으로 늘어납니다. 반면 적절한 전략을 선택하면 비용을 70% 절감하면서도 더 정확한 요약을 얻을 수 있습니다.

저는 실제로 백화점 본사 계약팀에서 AI 문서 분석 시스템을 구축할 때 처음 이 세 가지 전략을 비교했습니다. 초기에는 Stuff 방식으로 시도했다가 128K 토큰 제한에 막혀 애를 먹었죠. Map-Reduce로 전환 후 처리 속도와 정확도 모두 개선되었습니다.

세 가지 전략 핵심 비교

전략 동작 방식 적합한 문서 길이 비용 효율성 처리 속도 품질 일관성
Stuff 전체 문서를 한 번에 프롬프트에 삽입 짧은 문서 (16K 토큰 이하) ⭐⭐⭐⭐⭐ 최고 ⭐⭐⭐⭐⭐ 가장 빠름 ⭐⭐⭐ 보통
Map-Reduce 청크별 독립 처리 후 결과 병합 중간~긴 문서 (16K~128K 토큰) ⭐⭐⭐⭐ 보통 ⭐⭐⭐ 보통 ⭐⭐⭐⭐ 높음
Refine 순차적으로 요약을 점진적으로 개선 긴 문서 (128K 토큰 이상) ⭐⭐⭐ 낮음 ⭐⭐⭐⭐ 낮음 ⭐⭐⭐⭐⭐ 가장 높음

전략 1: Stuff — 가장 간단한 방법

원리 설명

Stuff 방식은 말 그대로 문서의 모든 내용을 하나의 프롬프트에 넣고 한 번에 처리하는 것입니다. 마치 긴 편지를 읽고 요약을 요청하는 것과 같습니다.

import requests
import json

def summarize_stuff(document_text, api_key):
    """
    Stuff 방식: 전체 문서를 한 번의 API 호출로 요약
    - 장점: 단일 API 호출로 비용 최소화, 구현非常简单
    - 단점: context window 제한으로 긴 문서 처리 불가
    """
    
    prompt = f"""당신은 전문적인 문서 요약가입니다. 다음 문서를 한국어로 간결하게 요약해주세요.

요약 규칙:
1. 핵심 주장 3가지를 반드시 포함
2. 중요 데이터와 수치는 그대로 유지
3. 필사적 의미 없이 핵심만 추출
4. 500자 이내로 작성

---

문서 내용:
{document_text}

---

요약:"""

    response = requests.post(
        "https://api.holysheep.ai/v1/chat/completions",
        headers={
            "Authorization": f"Bearer {api_key}",
            "Content-Type": "application/json"
        },
        json={
            "model": "gpt-4.1",
            "messages": [{"role": "user", "content": prompt}],
            "max_tokens": 1000,
            "temperature": 0.3
        }
    )
    
    result = response.json()
    return result["choices"][0]["message"]["content"]

사용 예시

api_key = "YOUR_HOLYSHEEP_API_KEY" sample_doc = "여기에 긴 문서를 넣으세요..." summary = summarize_stuff(sample_doc, api_key) print(summary)

Stuff가 적합한 경우

Stuff가 비적합한 경우

전략 2: Map-Reduce — 대규모 문서의 표준

원리 설명

Map-Reduce는 Apache Hadoop의 개념에서 유래했습니다. Map 단계에서 문서를 작은 청크로 나누어 각각 요약하고, Reduce 단계에서 모든 청크 요약을 종합하여 최종 결과를 만듭니다.

import requests
import json
import tiktoken  # 토큰 카운팅용

def chunk_text(text, max_tokens=4000, overlap=200):
    """
    문서를 max_tokens 크기의 청크로 분할
    overlap: 청크 간 중복으로 맥락 유지
    """
    encoder = tiktoken.get_encoding("cl100k_base")
    tokens = encoder.encode(text)
    
    chunks = []
    start = 0
    
    while start < len(tokens):
        end = start + max_tokens
        chunk_tokens = tokens[start:end]
        chunk_text = encoder.decode(chunk_tokens)
        chunks.append(chunk_text)
        start = end - overlap  # overlap 적용
    
    return chunks

def summarize_chunk(chunk, chunk_index, total_chunks, api_key):
    """
    Map 단계: 개별 청크 요약
    """
    prompt = f"""이 텍스트는 전체 문서의 {chunk_index + 1}/{total_chunks}번째 부분입니다.
    이 부분의 핵심 내용을 3~5개의 불릿 포인트로 요약해주세요.
    다른 부분과의 연결고리는 고려하지 않고 이 부분만의 핵심만 추출하세요.

    텍스트:
    {chunk}

    요약:"""

    response = requests.post(
        "https://api.holysheep.ai/v1/chat/completions",
        headers={
            "Authorization": f"Bearer {api_key}",
            "Content-Type": "application/json"
        },
        json={
            "model": "g