Unstract: 프롬프트로 비정형 문서에서 구조화된 JSON을 추출하는 LLM 플랫폼

Unstract 소개

기업이 다루는 데이터의 상당 부분은 계약서, 청구서, 보험 서류, 이력서처럼 정해진 틀이 없는 비정형 문서에 담겨 있습니다. 이런 문서에서 필요한 값만 뽑아 데이터베이스에 넣으려면 보통 문서 종류마다 정규식과 템플릿을 따로 만들어야 했고, 같은 청구서라도 공급업체가 바뀌면 양식이 달라져 파이프라인을 다시 손봐야 했습니다. 새로운 문서 유형 하나를 추가하는 데 며칠씩 걸리는 일이 드물지 않았습니다.

Unstract은 이 과정을 대규모 언어 모델(LLM)로 바꾸는 문서 데이터 추출 플랫폼입니다. 무엇을 뽑아낼지 정규식이 아니라 자연어 프롬프트로 정의하면, LLM이 PDF, 스캔본, 이미지 같은 다양한 형태의 문서를 읽어 구조화된 JSON으로 돌려줍니다. 한 번 작성한 프롬프트가 양식의 변형까지 처리하므로, 공급업체마다 템플릿을 새로 만들 필요가 줄어듭니다. 완성한 추출 로직은 REST API나 ETL 파이프라인으로 배포해 실제 업무에 연결합니다.

Unstract은 Zipstack이 만든 Python 기반 오픈소스 프로젝트이며, 금융, 보험, 헬스케어, KYC/규정 준수처럼 문서 처리량이 많은 분야를 겨냥합니다. Docker Compose로 자체 호스팅할 수 있고, OpenAI와 Anthropic Claude부터 로컬 Ollama까지 여러 LLM 제공자를 골라 붙일 수 있습니다. 이 게시물에서는 Unstract의 동작 방식과 아키텍처, 지원 커넥터, 설치 방법을 정리합니다.

Unstract의 동작 방식

Unstract의 출발점은 프롬프트 스튜디오(Prompt Studio) 입니다. 여기서 사용자는 "이 문서에서 어떤 값을 어떤 형태로 뽑을지" 를 자연어로 정의합니다. 예를 들어 청구서라면 공급자명, 사업자등록번호, 발행일, 항목별 금액 같은 필드를 프롬프트로 기술하고, 결과가 어떤 JSON 구조로 나와야 하는지 함께 지정합니다. 정규식이나 좌표 기반 템플릿과 달리, 같은 필드라도 문서 레이아웃이 조금씩 다른 여러 양식을 하나의 프롬프트로 다룰 수 있습니다.

이렇게 검증한 추출 로직은 두 가지 방식으로 실제 시스템에 연결됩니다. API 배포(API Deployment) 는 문서를 REST API로 보내면 JSON을 돌려주는 형태로, 기존 애플리케이션에 문서 인식 기능을 붙일 때 쓰입니다. ETL 파이프라인(ETL Pipeline) 은 지정한 폴더나 스토리지에서 문서를 주기적으로 가져와 처리한 뒤 데이터 웨어하우스에 적재하는 배치 처리에 적합합니다. 이 밖에도 Model Context Protocol(MCP) 서버로 Claude 같은 AI 에이전트와 연결하거나, n8n 커스텀 노드로 기존 자동화 워크플로우에 끼워 넣을 수 있습니다.

Unstract의 아키텍처

Unstract은 여러 서비스가 조합된 플랫폼 형태로 동작합니다. 저장소가 제시하는 구성은 다음과 같습니다.

┌──────────────────────────────────────────────────┐
│                     Unstract                      │
├────────────┬────────────┬───────────┬────────────┤
│  Frontend  │   Backend  │   Worker  │  Platform  │
│  (React)   │  (Django)  │  (Celery) │  Service   │
├────────────┴────────────┴───────────┴────────────┤
│                   Cache (Redis)                   │
├──────────────────────────────────────────────────┤
│              Message Queue (RabbitMQ)             │
├──────────────────────────────────────────────────┤
│               Database (PostgreSQL)               │
├──────────────────────────────────────────────────┤
│  LLM Adapters  │  Vector DBs  │  Text Extractors  │
│  (OpenAI 등)   │ (Qdrant 등)  │  (LLMWhisperer)   │
└──────────────────────────────────────────────────┘

프런트엔드는 React, 백엔드는 Django, 비동기 작업은 Celery 워커가 맡고, 별도의 플랫폼 서비스(FastAPI)가 어댑터 관련 기능을 담당합니다. 여기에 Redis 캐시, RabbitMQ 메시지 큐, PostgreSQL 데이터베이스가 뒷받침하며, 실제 LLM 호출과 벡터 저장, 텍스트 추출은 각각 어댑터 계층으로 분리되어 있습니다. 어댑터 자격 증명은 암호화되어 저장되므로, 저장소는 이 암호화 키(ENCRYPTION_KEY)를 잃어버리면 기존 어댑터에 접근할 수 없다는 점을 경고하고 있습니다.

Unstract가 지원하는 LLM과 커넥터

Unstract은 특정 LLM 제공자에 묶이지 않도록 어댑터 계층으로 여러 서비스를 연결합니다.

  • LLM 제공자: OpenAI, Azure OpenAI, Anthropic Claude, AWS Bedrock, Google Gemini, Mistral AI, Anyscale, 그리고 로컬 실행이 가능한 Ollama와 OpenAI 호환 엔드포인트를 지원합니다.
  • 벡터 데이터베이스: Qdrant, Weaviate, Milvus, Pinecone, PostgreSQL 을 연결할 수 있습니다.
  • 텍스트 추출기: 문서에서 텍스트를 뽑아내는 단계에는 LLMWhisperer, Unstructured.io, LlamaIndex Parse 를 쓸 수 있습니다.
  • ETL 소스와 목적지: 입력은 AWS S3, MinIO, Google Cloud Storage, Azure Blob, Google Drive, Dropbox, SFTP 등에서 받고, 결과는 Snowflake, Amazon Redshift, Google BigQuery, PostgreSQL, MySQL 같은 저장소로 내보냅니다.

처리할 수 있는 문서 형식도 PDF와 DOCX 같은 문서, XLSX 등 스프레드시트, PPTX 등 프레젠테이션, PNG/JPG/TIFF 등 이미지까지 폭넓습니다.

Unstract 설치 및 사용법

실행에는 Linux 또는 macOS 환경과 Docker 및 Docker Compose, 최소 8GB 메모리, Git이 필요합니다. 저장소를 내려받고 제공되는 스크립트를 실행하면 플랫폼 전체가 컨테이너로 뜹니다.

git clone https://github.com/Zipstack/unstract.git
cd unstract
./run-platform.sh

실행이 끝나면 브라우저에서 http://frontend.unstract.localhost 에 접속하고, 기본 계정(아이디 unstract, 비밀번호 unstract)으로 로그인해 바로 추출을 시작할 수 있습니다. 특정 버전으로 실행하거나 업그레이드할 때는 ./run-platform.sh -v <버전>, ./run-platform.sh -u 처럼 옵션을 붙입니다. 자체 호스팅 외에 관리형 인프라와 이중 LLM 검증, 사람 검토(Human-in-the-Loop) 같은 추가 기능이 필요한 경우를 위한 클라우드/엔터프라이즈 버전도 별도로 제공됩니다.

Unstract의 라이선스

Unstract은 AGPL-3.0 라이선스로 공개되어 있습니다. AGPL-3.0은 강한 카피레프트 라이선스로, 소스를 수정해 배포하거나 네트워크 서비스 형태로 제공하는 경우에도 그 소스 코드를 동일한 조건으로 공개해야 합니다. 사내 도구로 자체 호스팅해 사용하는 것은 자유롭지만, 이를 변형해 외부에 서비스로 제공할 계획이라면 라이선스 조건을 먼저 확인하는 것이 좋습니다.

:house: Unstract 공식 홈페이지

:books: Unstract 문서 사이트

:github: Unstract 프로젝트 GitHub 저장소

더 읽어보기




이 글은 GPT 모델로 정리한 글을 바탕으로 한 것으로, 원문의 내용 또는 의도와 다르게 정리된 내용이 있을 수 있습니다. 관심있는 내용이시라면 원문도 함께 참고해주세요! 읽으시면서 어색하거나 잘못된 내용을 발견하시면 덧글로 알려주시기를 부탁드립니다. :hugs:

:pytorch:파이토치 한국 사용자 모임:south_korea:이 정리한 이 글이 유용하셨나요? 회원으로 가입하시면 주요 글들을 이메일:love_letter:로 보내드립니다! 텔레그램(Telegram)이나 Slack/Discord/Teams/Dooray/GoogleChat 등으로도 새 글 알림을 받으실 수 있습니다. :smiley:

:wrapped_gift: 아래:down_right_arrow:쪽에 좋아요:+1:를 눌러주시면 새로운 소식들을 정리하고 공유하는데 힘이 됩니다~ :star_struck: