오늘날처럼 온갖 데이터가 넘쳐나는 세상에서는 상세한 임상 기록, 장황한 법률 문서, 고객 피드백 스레드, 계속 새롭게 쏟아지는 뉴스 보도 등 비정형 텍스트에 귀중한 인사이트가 묻혀 있는 경우가 많습니다. 이러한 정보를 수동으로 선별하거나 데이터를 처리하는 맞춤형 코드를 작성하는 데는 시간이 오래 걸리고 오류도 발생하기 쉽습니다. 또한 무턱대고 최신 LLM(대형 언어 모델)을 사용하다 보면 오류가 발생할 수 있습니다. 필요한 정확한 정보를 프로그래밍 방식으로 추출하는 동시에 그 결과물이 구조화되어 있으며 소스에 안정적으로 연결될 수 있다면 어떨까요?
오늘, 개발자가 바로 그런 일을 할 수 있도록 설계된 새로운 오픈소스 Python 라이브러리인 LangExtract를 선보이게 되어 기쁩니다. LangExtract는 사용자 설정 지시문에 따라 대량의 비정형 텍스트를 구조화된 정보로 처리하기 위해서 Gemini 모델 같은 다양한 LLM에 대한 경량 인터페이스를 제공하여 유연성과 추적성을 모두 보장합니다.
의료 기록이나 재무 정보 요약 등 텍스트가 많은 분야를 다루는 어떤 경우든 LangExtract는 작업 대상물 내에서 유용한 데이터를 추출하는 유연하고 강력한 방법을 제공합니다.
LangExtract는 다음과 같이 정보 추출에 유용한 고유한 기능들을 조합해 제공합니다.
셰익스피어 작품 속 한 줄의 글에서 인물의 세부 정보를 추출하는 방법은 다음과 같습니다.
먼저, 라이브러리를 설치합니다.
가상 환경과 API 키 구성을 포함한 보다 자세한 설정 지침은 프로젝트 리드미를 참조하세요.
pip install langextract
다음으로, 추출 작업을 정의합니다. 모델을 안내하기 위해 명확한 프롬프트와 고품질의 '퓨 샷' 예를 제공하세요.
import textwrap
import langextract as lx
# 1. 간결한 프롬프트 정의
prompt = textwrap.dedent("""\
Extract characters, emotions, and relationships in order of appearance.
Use exact text for extractions. Do not paraphrase or overlap entities.
Provide meaningful attributes for each entity to add context.""")
# 2. 모델을 안내하기 위한 고품질의 예 제공
examples = [
lx.data.ExampleData(
text=(
"ROMEO. But soft! What light through yonder window breaks? It is"
" the east, and Juliet is the sun."
),
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"},
),
lx.data.Extraction(
extraction_class="relationship",
extraction_text="Juliet is the sun",
attributes={"type": "metaphor"},
),
],
)
]
# 3. 입력 텍스트에서 추출 실행
input_text = (
"Lady Juliet gazed longingly at the stars, her heart aching for Romeo"
)
result = lx.extract(
text_or_documents=input_text,
prompt_description=prompt,
examples=examples,
model_id="gemini-2.5-pro",
)
결과 객체에는 추출된 항목이 포함되어 있고, 이를 JSONL 파일에 저장할 수 있습니다. 이후 주석을 볼 수 있는 대화형 HTML 파일을 생성할 수 있습니다. 이러한 시각화는 데모 또는 추출 품질 평가에 매우 유용하며 귀중한 시간을 절약하는 데 도움이 됩니다. Google Colab과 같은 환경에서 원활하게 활용할 수 있고 또는 브라우저에서 볼 수 있는 독립 실행형 HTML 파일로 저장할 수 있습니다.
# JSONL 파일에 결과 저장
lx.io.save_annotated_documents([result], output_name="extraction_results.jsonl")
# 파일에서 대화형 시각화 생성
html_content = lx.visualize("extraction_results.jsonl")
with open("visualization.html", "w") as f:
f.write(html_content)
위와 동일한 원칙이 의학이나 금융, 공학, 법률 등의 전문 영역에도 적용됩니다. LangExtract의 기본 발상은 의료 정보 추출에 처음 적용되었으며 임상 텍스트 처리에 효과적으로 사용될 수 있습니다. 예를 들어 약물, 복용량, 기타 약물 속성을 식별한 다음 이들 간의 관계를 매핑할 수 있습니다. 바로 이 기능이 이 라이브러리 개발로 이어진 연구의 핵심이었습니다. 자세한 내용은 의료 정보 추출 가속화에 대한 논문에서 살펴보실 수 있습니다.
아래 영상은 LangExtract가 임상 텍스트를 처리하여 약물 관련 항목을 추출하고 소스 약물로 분류하는 과정을 보여줍니다.
전문 분야에서 LangExtract의 역량을 보여드리고자, Hugging Face에서 RadExtract라는 이름의 구조화된 방사선학 보고를 위한 대화형 데모를 개발했습니다. 이 데모는 LangExtract가 어떻게 자유 서술식 방사선학 보고서를 처리하고, 주요 소견을 구조화된 형식으로 자동 변환하며, 중요한 소견을 강조 표시하는지 보여줍니다. 이러한 접근 방식은 보고서를 구조화함으로써 명확성을 향상시키고, 완전성을 보장하며, 연구 및 임상 치료를 위한 데이터 상호 운용성을 개선하는 방사선학에서 중요합니다.
부인: 위의 약물 추출 예시와 구조화된 보고 데모는 LangExtract의 기본 기능을 설명하기 위한 예시일 뿐입니다. 이 데모는 완제품 또는 승인된 제품을 의미하지 않고, 질병이나 질환을 진단하거나 치료를 제안하기 위한 것도 아니며, 의학적 조언에 이를 사용해서도 안 됩니다.
개발자가 LangExtract를 사용하여 텍스트에서 인사이트를 얻을 수 있는 혁신적인 방법을 제공하게 되어 무척 기쁩니다. 지금 바로 설명서를 살펴보고 GitHub 리포지토리에 있는 예시도 둘러보면서 비정형 데이터 변환을 시작해 보세요.