긴 문서 추출 📚
LangExtract는 URL에서 직접 전체 문서를 처리하고, 병렬 처리와 향상된 감도 기능을 통해 대용량 텍스트를 높은 정확도로 처리할 수 있습니다.
접근 방식
LangExtract는 긴 문서를 자동으로 처리합니다:
- 텍스트를 관리 가능한 청크로 분할
- 각 청크에서 병렬로 추출
- 결과를 집계하고 중복 제거
코드 예제: 『로미오와 줄리엣』 전문
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 출력: 휴대 가능하고 상호 운용 가능한 데이터 형식
- 인터랙티브 시각화: 대규모로 컨텍스트 내 엔티티 탐색