Skip to content

긴 문서 추출 📚

LangExtract는 URL에서 직접 전체 문서를 처리하고, 병렬 처리와 향상된 감도 기능을 통해 대용량 텍스트를 높은 정확도로 처리할 수 있습니다.

접근 방식

LangExtract는 긴 문서를 자동으로 처리합니다:

  1. 텍스트를 관리 가능한 청크로 분할
  2. 각 청크에서 병렬로 추출
  3. 결과를 집계하고 중복 제거

코드 예제: 『로미오와 줄리엣』 전문

WARNING

이 예제를 실행하면 대용량 문서(약 44,000 토큰)를 처리하며 API 비용이 발생합니다. 대규모 사용에는 Tier 2 Gemini 할당량이 권장됩니다.

python
import langextract as lx
import textwrap

# 복잡한 문학 텍스트를 위한 포괄적인 프롬프트와 예제 정의
prompt = textwrap.dedent("""\
    주어진 텍스트에서 캐릭터, 감정, 관계를 추출하세요.

    모든 엔티티에 의미 있는 속성을 제공하여 맥락과 깊이를 더하세요.

    중요: extraction_text에는 입력의 정확한 텍스트를 사용하세요. 다른 표현으로 바꾸지 마세요.
    출현 순서대로 엔티티를 추출하고, 텍스트 범위가 겹치지 않도록 하세요.

    참고: 희곡 대본에서 화자 이름은 대문자로 표시되고 마침표가 뒤따릅니다.""")

examples = [
    lx.data.ExampleData(
        text=textwrap.dedent("""\
            ROMEO. But soft! What light through yonder window breaks?
            It is the east, and Juliet is the sun.
            JULIET. O Romeo, Romeo! Wherefore art thou Romeo?"""),
        extractions=[
            lx.data.Extraction(
                extraction_class="character",
                extraction_text="ROMEO",
                attributes={"emotional_state": "wonder"}
            ),
            lx.data.Extraction(
                extraction_class="emotion",
                extraction_text="But soft!",
                attributes={"feeling": "gentle awe", "character": "Romeo"}
            ),
            lx.data.Extraction(
                extraction_class="relationship",
                extraction_text="Juliet is the sun",
                attributes={"type": "metaphor", "character_1": "Romeo", "character_2": "Juliet"}
            ),
            lx.data.Extraction(
                extraction_class="character",
                extraction_text="JULIET",
                attributes={"emotional_state": "yearning"}
            ),
            lx.data.Extraction(
                extraction_class="emotion",
                extraction_text="Wherefore art thou Romeo?",
                attributes={"feeling": "longing question", "character": "Juliet"}
            ),
        ]
    )
]

# Project Gutenberg에서 『로미오와 줄리엣』 직접 처리
print("Project Gutenberg에서 『로미오와 줄리엣』을 다운로드하고 처리 중...")

result = lx.extract(
    text_or_documents="https://www.gutenberg.org/files/1513/1513-0.txt",
    prompt_description=prompt,
    examples=examples,
    model_id="gemini-2.5-flash",
    extraction_passes=3,      # 여러 패스로 재현율 향상
    max_workers=20,           # 병렬 처리로 속도 향상
    max_char_buffer=1000      # 작은 컨텍스트로 정확도 향상
)

print(f"{len(result.text):,}자에서 {len(result.extractions)}개의 엔티티를 추출했습니다")

# 결과 저장 및 시각화
lx.io.save_annotated_documents([result], output_name="romeo_juliet_extractions.jsonl", output_dir=".")

# 인터랙티브 시각화 생성
html_content = lx.visualize("romeo_juliet_extractions.jsonl")
with open("romeo_juliet_visualization.html", "w") as f:
    if hasattr(html_content, 'data'):
        f.write(html_content.data)
    else:
        f.write(html_content)

print("인터랙티브 시각화가 romeo_juliet_visualization.html에 저장되었습니다")

긴 문서의 주요 기능

  • URL 처리: URL에서 직접 문서 처리
  • 다중 패스 추출: 복잡한 텍스트의 재현율 향상
  • 병렬 처리: max_workers 매개변수로 동시 청크 처리
  • 최적의 청킹: max_char_buffer로 컨텍스트 크기를 제어하여 정확도 향상
  • JSONL 출력: 휴대 가능하고 상호 운용 가능한 데이터 형식
  • 인터랙티브 시각화: 대규모로 컨텍스트 내 엔티티 탐색

비공식 가이드. Google과 관련 없음.