LangExtract: 구글의 LLM 기반 비정형 텍스트 구조화 추출 오픈소스 완벽 가이드
- 공유 링크 만들기
- X
- 이메일
- 기타 앱
LangExtract: 구글의 LLM 기반 비정형 텍스트 구조화 추출 오픈소스 완벽 가이드
구글이 개발한 LangExtract는 Gemini, OpenAI, Ollama 등 다양한 LLM을 활용하여 비정형 텍스트에서 정확한 소스 그라운딩과 HTML 시각화를 제공하는 Python 오픈소스 라이브러리입니다.
LangExtract란 무엇인가?
LangExtract는 구글이 개발한 Python 라이브러리로, 대규모 언어모델(LLM)을 사용하여 비정형 텍스트 문서에서 사용자 정의 지시사항에 따라 구조화된 정보를 추출합니다.
이 라이브러리는 의료 노트, 법적 문서, 금융 보고서 등 다양한 도메인의 텍스트에서 핵심 정보를 식별하고 정리하면서, 추출된 데이터가 원본 텍스트에 정확히 대응되도록 보장합니다.
AI 데이터 추출의 혁명
기존의 정보 추출 방법들이 복잡한 정규식 패턴이나 대규모 모델 파인튜닝을 요구했다면, LangExtract는 자연어 프롬프트와 몇 가지 예시만으로도 강력한 추출 성능을 제공합니다.
LangExtract는 단순히 텍스트에서 정보를 추출하는 것을 넘어, 모델의 세계 지식을 활용하여 명시적 정보(원본 텍스트에서 도출)와 추론적 정보(모델의 내재적 지식에서 도출)를 모두 제공할 수 있습니다.
주요 특징과 장점
정확한 소스 그라운딩
LangExtract의 가장 핵심적인 특징은 정확한 소스 그라운딩입니다. 모든 추출 결과를 원본 텍스트의 정확한 위치에 매핑하여 시각적 하이라이팅을 통한 쉬운 추적성과 검증을 가능하게 합니다.
신뢰할 수 있는 구조화 출력
LangExtract는 Few-shot 예제를 기반으로 일관된 출력 스키마를 강제하며, Gemini와 같은 지원 모델에서 제어된 생성을 활용하여 견고하고 구조화된 결과를 보장합니다.
대용량 문서 최적화
대용량 문서 추출의 “바늘 찾기” 문제를 해결하기 위해 최적화된 텍스트 청킹, 병렬 처리, 다중 패스 전략을 사용하여 높은 재현율을 달성합니다.
다양한 LLM 지원
LLM 제공업체 | 지원 모델 | API 키 필요 | 특징 |
---|---|---|---|
구글 Gemini | Gemini-2.5-Flash, Gemini-2.5-Pro | ✅ | 제어된 생성, 높은 정확도 |
OpenAI | GPT-4o, GPT-4o-mini | ✅ | 강력한 언어 이해 |
Ollama | 로컬 모델들 | ❌ | 오프라인 사용 가능 |
대화형 HTML 시각화
추출 결과를 자체 포함된 인터랙티브 HTML 파일로 즉시 생성하여 수천 개의 추출된 엔티티를 원본 컨텍스트에서 시각화하고 검토할 수 있습니다.
LangExtract 설치 방법
PyPI를 통한 기본 설치
가장 간단한 LangExtract 설치 방법은 pip를 사용하는 것입니다.
# 기본 설치
pip install langextract
# 가상환경 권장 설치 방법
python -m venv langextract_env
source langextract_env/bin/activate # Windows: langextract_env\Scripts\activate
pip install langextract
GitHub에서 개발 버전 설치
최신 기능을 사용하거나 개발에 참여하고 싶다면 GitHub에서 직접 설치할 수 있습니다
git clone https://github.com/google/langextract.git
cd langextract
# 기본 설치
pip install -e .
# 개발용 설치 (린팅 도구 포함)
pip install -e ".[dev]"
# 테스트용 설치 (pytest 포함)
pip install -e ".[test]"
API 키 설정
클라우드 기반 모델을 사용할 때는 API 키 설정이 필요합니다
# 환경 변수로 설정
export LANGEXTRACT_API_KEY="your-api-key-here"
# .env 파일 사용 (권장)
echo 'LANGEXTRACT_API_KEY=your-api-key-here' >> .env
echo '.env' >> .gitignore
API 키 획득처:
기본 사용법과 예제 코드
간단한 텍스트 추출 예제
다음은 LangExtract의 기본적인 사용 방법을 보여주는 예제입니다
import langextract as lx
import textwrap
# 1. 추출 규칙 정의
prompt = textwrap.dedent("""\
등장 순서대로 인물, 감정, 관계를 추출하세요.
정확한 텍스트를 사용하여 추출하고, 의역하거나 겹치는 엔티티는 피하세요.
각 엔티티에 컨텍스트를 추가할 의미있는 속성을 제공하세요.""")
# 2. 고품질 예제 제공
examples = [
lx.data.ExampleData(
text="로미오. 하지만 조용히! 저 창문으로 어떤 빛이 비치는가? 동쪽이고, 줄리엣이 태양이다.",
extractions=[
lx.data.Extraction(
extraction_class="character",
extraction_text="로미오",
attributes={"emotional_state": "경이로움"}
),
lx.data.Extraction(
extraction_class="emotion",
extraction_text="하지만 조용히!",
attributes={"feeling": "부드러운 경외감"}
),
lx.data.Extraction(
extraction_class="relationship",
extraction_text="줄리엣이 태양이다",
attributes={"type": "은유"}
),
]
)
]
# 3. 입력 텍스트 처리
input_text = "줄리엣 부인이 별들을 그리워하며 바라보았다, 그녀의 마음은 로미오를 향한 아픔으로 가득했다"
# 4. 추출 실행
result = lx.extract(
text_or_documents=input_text,
prompt_description=prompt,
examples=examples,
model_id="gemini-2.5-flash",
)
print("추출 결과:")
for extraction in result.extractions:
print(f"- {extraction.extraction_class}: {extraction.extraction_text}")
print(f" 속성: {extraction.attributes}")
JSONL 저장과 HTML 시각화
# 결과를 JSONL 파일로 저장
lx.io.save_annotated_documents([result], output_name="extraction_results.jsonl")
# 인터랙티브 HTML 시각화 생성
html_content = lx.visualize("extraction_results.jsonl")
with open("visualization.html", "w", encoding="utf-8") as f:
f.write(html_content)
print("시각화 파일이 생성되었습니다: visualization.html")
고급 기능 활용하기
대용량 문서 처리
LangExtract는 URL에서 직접 전체 문서를 처리할 수 있으며, 병렬 처리와 향상된 민감도 기능을 통해 대용량 텍스트를 높은 정확도로 처리합니다.
# 로미오와 줄리엣 전체 텍스트를 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 # 더 나은 정확도를 위한 작은 컨텍스트
)
Ollama를 활용한 로컬 LLM 사용
# Ollama 로컬 모델 사용 예제
result = lx.extract(
text_or_documents=input_text,
prompt_description=prompt,
examples=examples,
language_model_type=lx.inference.OllamaLanguageModel,
model_id="gemma2:2b",
model_url="http://localhost:11434",
fence_output=False,
use_schema_constraints=False
)
Ollama 설정 방법:
- Ollama 공식 사이트에서 설치
ollama pull gemma2:2b
명령으로 모델 다운로드ollama serve
명령으로 서버 실행
OpenAI 모델 통합
# OpenAI GPT 모델 사용
result = lx.extract(
text_or_documents=input_text,
prompt_description=prompt,
examples=examples,
language_model_type=lx.inference.OpenAILanguageModel,
model_id="gpt-4o",
api_key="your-openai-api-key" # 또는 환경변수 사용
)
실제 프로젝트 적용 사례
의료 문서 처리
LangExtract는 의료 보고서에서 구조화된 의료 정보를 추출하는 데 뛰어난 성능을 보입니다.
medical_prompt = textwrap.dedent("""\
의료 문서에서 약물명, 용량, 투여 경로, 증상을 추출하세요.
정확한 의학 용어를 사용하고 용량 정보는 숫자와 단위를 포함하세요.""")
medical_examples = [
lx.data.ExampleData(
text="환자에게 이부프로펜 400mg을 경구로 하루 3회 투여",
extractions=[
lx.data.Extraction(
extraction_class="medication",
extraction_text="이부프로펜",
attributes={"dosage": "400mg", "route": "경구", "frequency": "하루 3회"}
)
]
)
]
법률 문서 분석
legal_prompt = textwrap.dedent("""\
계약서에서 당사자, 의무사항, 날짜, 금액을 추출하세요.
정확한 법률 용어와 숫자 정보를 보존하세요.""")
legal_examples = [
lx.data.ExampleData(
text="갑은 을에게 2024년 12월 31일까지 5,000만원을 지급할 의무가 있다",
extractions=[
lx.data.Extraction(
extraction_class="party",
extraction_text="갑",
attributes={"role": "채무자"}
),
lx.data.Extraction(
extraction_class="obligation",
extraction_text="5,000만원을 지급",
attributes={"amount": "5,000만원", "deadline": "2024년 12월 31일"}
)
]
)
]
고객 리뷰 감정 분석
sentiment_prompt = textwrap.dedent("""\
고객 리뷰에서 제품명, 감정, 특징, 평점을 추출하세요.
긍정/부정/중립 감정을 명확히 구분하세요.""")
sentiment_examples = [
lx.data.ExampleData(
text="아이폰 15는 정말 놀라운 카메라 품질을 가지고 있어요. 5점 만점에 5점!",
extractions=[
lx.data.Extraction(
extraction_class="product",
extraction_text="아이폰 15",
attributes={"category": "스마트폰"}
),
lx.data.Extraction(
extraction_class="sentiment",
extraction_text="정말 놀라운",
attributes={"polarity": "긍정", "intensity": "강함"}
),
lx.data.Extraction(
extraction_class="feature",
extraction_text="카메라 품질",
attributes={"aspect": "하드웨어"}
),
lx.data.Extraction(
extraction_class="rating",
extraction_text="5점 만점에 5점",
attributes={"score": "5/5"}
)
]
)
]
성능 최적화 팁
청킹 전략 최적화
LangExtract는 텍스트 구분자(예: 문단 나누기)를 존중하는 스마트 청킹 전략을 사용하여 컨텍스트를 온전하고 잘 구성된 상태로 모델에 전달합니다.
# 최적화된 청킹 설정
result = lx.extract(
text_or_documents=large_document,
prompt_description=prompt,
examples=examples,
model_id="gemini-2.5-flash",
max_char_buffer=1500, # 적절한 청크 크기
extraction_passes=2, # 놓친 엔티티 포착을 위한 다중 패스
max_workers=10 # 시스템 리소스에 맞는 병렬 처리
)
메모리 효율적인 처리
# 대용량 문서 배치 처리
def process_documents_batch(documents, batch_size=5):
results = []
for i in range(0, len(documents), batch_size):
batch = documents[i:i+batch_size]
batch_result = lx.extract(
text_or_documents=batch,
prompt_description=prompt,
examples=examples,
model_id="gemini-2.5-flash"
)
results.extend(batch_result)
return results
비용 최적화 전략
# 비용 효율적인 모델 선택
def cost_optimized_extraction(text_length):
if text_length < 1000:
model_id = "gemini-2.5-flash" # 짧은 텍스트용
elif text_length < 10000:
model_id = "gemini-2.5-flash" # 중간 길이 텍스트용
else:
model_id = "gemini-2.5-pro" # 복잡한 장문용
return model_id
문제 해결과 디버깅
일반적인 문제와 해결책
1. API 키 오류
import os
from dotenv import load_dotenv
load_dotenv()
api_key = os.getenv('LANGEXTRACT_API_KEY')
if not api_key:
raise ValueError("API 키가 설정되지 않았습니다.")
2. 메모리 부족 문제
# 청크 크기 조정으로 메모리 사용량 감소
result = lx.extract(
text_or_documents=text,
prompt_description=prompt,
examples=examples,
max_char_buffer=800, # 기본값보다 작게 설정
max_workers=2 # 동시 처리 수 제한
)
3. 추출 품질 개선
# 더 상세한 예제 제공
detailed_examples = [
lx.data.ExampleData(
text="복잡한 입력 텍스트 예시...",
extractions=[
lx.data.Extraction(
extraction_class="entity",
extraction_text="정확한 추출 텍스트",
attributes={
"detailed_attr1": "상세 속성1",
"detailed_attr2": "상세 속성2",
"confidence": "high"
}
)
]
)
]
성능 모니터링
import time
import logging
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
def monitored_extraction(text_or_documents, **kwargs):
start_time = time.time()
logger.info(f"추출 시작: 텍스트 길이 {len(str(text_or_documents))}")
try:
result = lx.extract(text_or_documents=text_or_documents, **kwargs)
duration = time.time() - start_time
logger.info(f"추출 완료: {duration:.2f}초, {len(result.extractions)}개 엔티티")
return result
except Exception as e:
logger.error(f"추출 실패: {str(e)}")
raise
커뮤니티와 기여
GitHub 프로젝트 참여
LangExtract는 오픈소스 프로젝트로 기여를 환영합니다. CONTRIBUTING.md를 참조하여 개발, 테스트, 풀 리퀘스트를 시작할 수 있습니다.
참여 방법
- LangExtract GitHub 저장소 포크
- 기능 개발 또는 버그 수정
- 테스트 코드 작성
- Contributor License Agreement 서명
- Pull Request 제출
테스트 실행
# 저장소 클론
git clone https://github.com/google/langextract.git
cd langextract
# 테스트 의존성과 함께 설치
pip install -e ".[test]"
# 모든 테스트 실행
pytest tests
# 전체 CI 매트릭스 재현 (tox 사용)
tox # Python 3.10, 3.11에서 pylint + pytest 실행
도움 받기
- 공식 문서: LangExtract 공식 문서
- GitHub 이슈: 문제 보고 및 기능 요청
- 커뮤니티 토론: GitHub Discussions 활용
마무리
LangExtract는 비정형 텍스트에서 구조화된 정보를 추출하는 강력한 도구로, 정확한 소스 그라운딩과 인터랙티브 시각화를 제공합니다.
이 라이브러리의 핵심 장점들을 다시 정리하면
- 정확성: 모든 추출 결과가 원본 텍스트의 정확한 위치와 연결
- 유연성: Gemini, OpenAI, Ollama 등 다양한 LLM 지원
- 확장성: 대용량 문서 처리를 위한 병렬 처리와 최적화
- 사용 편의성: 간단한 프롬프트와 예제만으로 강력한 추출 성능
- 시각화: 추출 결과를 즉시 확인할 수 있는 HTML 인터페이스
다음 단계 추천
- 시작하기: 간단한 예제로 LangExtract 설치 방법과 기본 사용법 익히기
- 도메인 적용: 자신의 도메인에 맞는 프롬프트와 예제 개발
- 성능 튜닝: 대용량 문서 처리를 위한 파라미터 최적화
- 고급 기능: JSONL 저장, HTML 시각화, 병렬 처리 활용
- 커뮤니티 참여: GitHub을 통한 기여와 피드백 공유
LangExtract는 AI 기반 데이터 추출의 새로운 표준을 제시하며, 개발자와 데이터 사이언티스트들이 비정형 텍스트에서 가치있는 인사이트를 효율적으로 추출할 수 있도록 돕습니다.
구조화 데이터 변환의 미래는 이미 시작되었습니다. 지금 바로 LangExtract를 통해 여러분의 텍스트 데이터를 구조화된 지식으로 변환해보세요.
관련 리소스
- 공식 저장소: Google LangExtract GitHub
- PyPI 패키지: LangExtract PyPI
- 라이브 데모: RadExtract HuggingFace Spaces
- 구글 개발자 블로그: LangExtract 소개 포스트
이 글이 도움이 되었다면 공유하고 댓글로 여러분의 LangExtract 활용 경험을 들려주세요!
- 공유 링크 만들기
- X
- 이메일
- 기타 앱
댓글
댓글 쓰기