LangExtract 소개: Gemini 기반 정보 추출 라이브러리

2025년 7월 30일
Akshay Goel ML Software Engineer
Atilla Kiraly ML Software Engineer

오늘날처럼 온갖 데이터가 넘쳐나는 세상에서는 상세한 임상 기록, 장황한 법률 문서, 고객 피드백 스레드, 계속 새롭게 쏟아지는 뉴스 보도 등 비정형 텍스트에 귀중한 인사이트가 묻혀 있는 경우가 많습니다. 이러한 정보를 수동으로 선별하거나 데이터를 처리하는 맞춤형 코드를 작성하는 데는 시간이 오래 걸리고 오류도 발생하기 쉽습니다. 또한 무턱대고 최신 LLM(대형 언어 모델)을 사용하다 보면 오류가 발생할 수 있습니다. 필요한 정확한 정보를 프로그래밍 방식으로 추출하는 동시에 그 결과물이 구조화되어 있으며 소스에 안정적으로 연결될 수 있다면 어떨까요?

오늘, 개발자가 바로 그런 일을 할 수 있도록 설계된 새로운 오픈소스 Python 라이브러리LangExtract를 선보이게 되어 기쁩니다. LangExtract는 사용자 설정 지시문에 따라 대량의 비정형 텍스트를 구조화된 정보로 처리하기 위해서 Gemini 모델 같은 다양한 LLM에 대한 경량 인터페이스를 제공하여 유연성과 추적성을 모두 보장합니다.

의료 기록이나 재무 정보 요약 등 텍스트가 많은 분야를 다루는 어떤 경우든 LangExtract는 작업 대상물 내에서 유용한 데이터를 추출하는 유연하고 강력한 방법을 제공합니다.


LangExtract가 정보 추출에 효과적인 이유

LangExtract는 다음과 같이 정보 추출에 유용한 고유한 기능들을 조합해 제공합니다.

  • 정밀한 소스 그라운딩: 추출된 모든 항목은 원본 텍스트의 정확한 문자 오프셋으로 다시 매핑됩니다. 아래 영상에서 볼 수 있듯이, 이 기능은 원본 텍스트의 각 추출 내용을 시각적으로 강조 표시하여 추적성을 제공하므로 추출된 정보를 훨씬 더 쉽게 평가하고 확인할 수 있습니다.

  • 신뢰할 수 있는 구조화된 출력: LangExtracts 데이터 표현을 사용하여 원하는 출력을 정의하고 '퓨 샷' 예시를 제공하세요. LangExtract는 이를 사용해 스키마를 적용하고, Gemini 같은 지원 모델에서 Controlled Generation을 활용해 일관적으로 구조화된 출력을 보장합니다. 그래서 로미오와 줄리엣 전문 분석에서 입증된 바와 같이 매우 우수한 결과를 제공합니다.

  • 최적화된 긴 컨텍스트 정보 추출: 대용량 문서에서 정보를 검색하는 작업은 복잡할 수 있습니다. 예를 들어, LLM은 많은 벤치마크에서 우수한 성능을 보여주지만, 백만 개 수준의 토큰 컨텍스트에서 이루어지는 건초더미에서 바늘 찾기 테스트는 다중 사실 검색 상황에서는 재현율이 감소할 수 있음을 보여줍니다. LangExtract는 더 작고 집중된 컨텍스트에 대해 청킹 전략과 병렬 처리, 다중 추출 과정을 거쳐 이를 처리하도록 설계되었습니다.

  • 대화형 시각화: 단 몇 분 만에 원시 텍스트를 대화 방식의 독립형 HTML 시각화로 변환할 수 있습니다. LangExtract는 수천 개의 주석을 탐색할 수 있는 기능을 지원하므로 추출된 항목을 맥락에 맞게 쉽게 검토할 수 있습니다.

  • LLM 백엔드에 대한 유연한 지원: 클라우드 기반 LLM(예: Google의 Gemini 제품군) 또는 오픈소스 온디바이스 모델 등 원하는 모델을 사용해 작업할 수 있습니다.

  • 영역 간 유연성: LLM을 파인 튜닝할 필요 없이 엄선한 몇 가지 예시만으로 어떤 영역에 대해서든 정보 추출 작업을 정의할 수 있습니다. LangExtract는 원하는 출력을 '학습'하여 대규모의 새로운 텍스트 입력에 적용할 수 있습니다. 이 약물 추출 예시에서 그 작동 방식을 확인해 보세요.

  • LLM의 세계 지식 활용: LangExtract는 그라운딩된 항목을 추출하는 것 외에도 모델의 세계 지식을 활용하여 추출된 정보를 보완할 수 있습니다. 이러한 정보는 명시적(즉, 원본 텍스트에서 파생됨)이거나 추론적(즉, 모델의 내재된 세계 지식에서 파생됨)일 수 있습니다. 이러한 보완적 지식의 정확성과 관련성은 선택한 LLM의 성능과 추출을 안내하는 프롬프트 예시의 정밀도에 크게 좌우되는데, 특히 추론의 경우 더욱 그러합니다.


빠른 시작: 셰익스피어부터 구조화된 객체까지

셰익스피어 작품 속 한 줄의 글에서 인물의 세부 정보를 추출하는 방법은 다음과 같습니다.

먼저, 라이브러리를 설치합니다.

가상 환경과 API 키 구성을 포함한 보다 자세한 설정 지침은 프로젝트 리드미를 참조하세요.

pip install langextract
Python

다음으로, 추출 작업을 정의합니다. 모델을 안내하기 위해 명확한 프롬프트와 고품질의 '퓨 샷' 예를 제공하세요.

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",
)
Python

결과 객체에는 추출된 항목이 포함되어 있고, 이를 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)
Python

전문 영역에서의 유연성

위와 동일한 원칙이 의학이나 금융, 공학, 법률 등의 전문 영역에도 적용됩니다. LangExtract의 기본 발상은 의료 정보 추출에 처음 적용되었으며 임상 텍스트 처리에 효과적으로 사용될 수 있습니다. 예를 들어 약물, 복용량, 기타 약물 속성을 식별한 다음 이들 간의 관계를 매핑할 수 있습니다. 바로 이 기능이 이 라이브러리 개발로 이어진 연구의 핵심이었습니다. 자세한 내용은 의료 정보 추출 가속화에 대한 논문에서 살펴보실 수 있습니다.

아래 영상은 LangExtract가 임상 텍스트를 처리하여 약물 관련 항목을 추출하고 소스 약물로 분류하는 과정을 보여줍니다.

구조화된 방사선학 보고 데모

전문 분야에서 LangExtract의 역량을 보여드리고자, Hugging Face에서 RadExtract라는 이름의 구조화된 방사선학 보고를 위한 대화형 데모를 개발했습니다. 이 데모는 LangExtract가 어떻게 자유 서술식 방사선학 보고서를 처리하고, 주요 소견을 구조화된 형식으로 자동 변환하며, 중요한 소견을 강조 표시하는지 보여줍니다. 이러한 접근 방식은 보고서를 구조화함으로써 명확성을 향상시키고, 완전성을 보장하며, 연구 및 임상 치료를 위한 데이터 상호 운용성을 개선하는 방사선학에서 중요합니다.

HuggingFace에서 데모를 살펴보세요. https://google-radextract.hf.space


부인: 위의 약물 추출 예시와 구조화된 보고 데모는 LangExtract의 기본 기능을 설명하기 위한 예시일 뿐입니다. 이 데모는 완제품 또는 승인된 제품을 의미하지 않고, 질병이나 질환을 진단하거나 치료를 제안하기 위한 것도 아니며, 의학적 조언에 이를 사용해서도 안 됩니다.


LangExtract 시작하기: 리소스와 다음 단계

개발자가 LangExtract를 사용하여 텍스트에서 인사이트를 얻을 수 있는 혁신적인 방법을 제공하게 되어 무척 기쁩니다. 지금 바로 설명서를 살펴보고 GitHub 리포지토리에 있는 예시도 둘러보면서 비정형 데이터 변환을 시작해 보세요.