Skip to content

About

Docling Document Converter API

Resources

Stars

5 stars

Watchers

0 watching

Forks

Latest commit

 

History

7 Commits

Folders and files

Repository files navigation

Docling Document Converter API

Docling HybridChunker와 Contextualize를 활용한 다양한 파일 형식을 Markdown으로 변환하는 FastAPI 기반 REST API입니다.

중요 - Docling API를 사용하는 n8n chatbot workflow를 추가했습니다. (2026년 1월 5일)

📋 개요

이 API는 Docling 라이브러리를 사용하여 다양한 문서 형식을 Markdown으로 변환하고, HybridChunker를 통해 지능적인 문서 청킹(chunking) 및 컨텍스트 강화 기능을 제공합니다.

✨ 주요 기능

  • 다양한 파일 형식 지원: PDF, Word, Excel, PowerPoint, HTML, 이미지 등
  • HybridChunker: 문서를 의미있는 청크로 지능적으로 분할
  • Contextualize: 각 청크의 컨텍스트를 메타데이터로 강화
  • 비동기 작업: 대용량 파일 처리 시 타임아웃 방지
  • 다국어 지원: 한글 처리에 최적화된 토크나이저 사용
  • 일괄 처리: 여러 파일을 한 번에 변환
  • 유연한 출력: Markdown, JSON, ZIP 형식 지원
  • n8n 통합: 워크플로우 자동화 도구와 완벽한 호환

🚀 시작하기

방법 1: 로컬 Python 환경

필수 요구사항

  • Python 3.11+
  • pip 패키지 관리자

설치 및 실행

# 의존성 설치
pip install -r requirements.txt

# 서버 실행
python docling-rag-server.py

접속 정보

  • 서버 주소: http://localhost:10002
  • API 문서: http://localhost:10002/docs
  • OpenAPI 스펙: http://localhost:10002/openapi.json

📚 지원되는 파일 형식

문서

  • .pdf - PDF 문서
  • .docx - Word 문서
  • .xlsx - Excel 스프레드시트
  • .pptx - PowerPoint 프레젠테이션

웹 및 데이터

  • .html, .htm - HTML 파일
  • .md - Markdown 파일
  • .csv - CSV 파일
  • .json - JSON 파일
  • .xml - XML 파일

이미지

  • .jpg, .jpeg - JPEG 이미지
  • .png - PNG 이미지
  • .gif - GIF 이미지
  • .bmp - BMP 이미지

텍스트

  • .txt - 텍스트 파일

🔧 API 엔드포인트

1. 루트 엔드포인트

GET /

API 상태 및 지원 파일 형식 확인

응답 예시:

{
  "message": "Docling Document Converter API",
  "status": "running",
  "supported_formats": {...},
  "chunking": {
    "engine": "HybridChunker",
    "tokenizer": "sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2",
    "max_tokens": 512,
    "contextualize": true
  }
}

2. 상태 확인

GET /health

서버 상태 확인

3. 단일 파일 변환

POST /convert

파라미터:

  • file (required): 변환할 파일
  • output_filename (optional): 출력 파일명 (확장자 제외)
  • include_metadata (optional): 메타데이터 포함 여부 (기본: false)
  • use_chunking (optional): HybridChunker 청킹 적용 여부 (기본: false)
  • contextualize (optional): 청크 컨텍스트 강화 적용 (기본: true)

응답: Markdown 파일 다운로드

cURL 예시:

curl -X POST "http://localhost:10002/convert?use_chunking=true&contextualize=true" \
  -F "file=@document.pdf" \
  -o output.md

4. 청크별 변환 (JSON 응답)

POST /convert-chunked

파라미터:

  • file (required): 변환할 파일
  • include_metadata (optional): 청크 메타데이터 포함 (기본: false)
  • contextualize (optional): 청크 컨텍스트 강화 적용 (기본: true)
  • max_tokens (optional): 최대 토큰 수 (기본: 512)

응답 예시:

{
  "success": true,
  "filename": "document.pdf",
  "file_type": "PDF 문서",
  "total_chunks": 15,
  "chunking_config": {
    "tokenizer": "sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2",
    "max_tokens": 512,
    "merge_peers": true,
    "contextualize": true
  },
  "chunks": [
    {
      "chunk_id": 1,
      "text": "원본 텍스트...",
      "contextualized_text": "컨텍스트가 강화된 텍스트...",
      "text_length": 450,
      "contextualized_length": 520,
      "page_info": [1, 2],
      "bbox_info": [...]
    }
  ]
}

5. 비동기 청킹 (대용량 파일용) ⭐ 신규

POST /convert-chunked-async

파라미터:

  • file (required): 변환할 파일
  • include_metadata (optional): 청크 메타데이터 포함 (기본: false)
  • contextualize (optional): 청크 컨텍스트 강화 적용 (기본: true)
  • max_tokens (optional): 최대 토큰 수 (기본: 512)

응답 예시:

{
  "job_id": "550e8400-e29b-41d4-a716-446655440000",
  "status": "queued",
  "message": "작업이 시작되었습니다. /job/{job_id} 엔드포인트로 상태를 확인하세요.",
  "filename": "large_document.pdf",
  "file_size": 10485760,
  "created_at": "2025-10-04T12:00:00"
}

사용 이유:

  • 대용량 파일 처리 시 HTTP 타임아웃 방지
  • n8n, Zapier 등 워크플로우 도구와 통합
  • 긴 작업의 진행 상황 추적

6. 작업 상태 조회 ⭐ 신규

GET /job/{job_id}

응답 예시 (처리 중):

{
  "job_id": "550e8400-e29b-41d4-a716-446655440000",
  "status": "processing",
  "progress": 60,
  "message": "청킹 중...",
  "filename": "document.pdf",
  "created_at": "2025-10-04T12:00:00"
}

응답 예시 (완료):

{
  "job_id": "550e8400-e29b-41d4-a716-446655440000",
  "status": "completed",
  "progress": 100,
  "message": "처리 완료",
  "filename": "document.pdf",
  "created_at": "2025-10-04T12:00:00",
  "completed_at": "2025-10-04T12:02:30",
  "result": {
    "success": true,
    "total_chunks": 15,
    "chunks": [...]
  }
}

상태 값:

  • queued: 대기 중
  • processing: 처리 중
  • completed: 완료
  • failed: 실패

7. 모든 작업 조회 ⭐ 신규

GET /jobs

모든 진행 중/완료된 작업 목록 반환

8. 작업 삭제 ⭐ 신규

DELETE /job/{job_id}

완료된 작업을 삭제하고 임시 파일 정리

9. 여러 파일 일괄 변환

POST /convert-multiple

파라미터:

  • files (required): 변환할 파일들 (최대 10개)
  • output_format (optional): 출력 형식 - "zip" 또는 "json" (기본: zip)
  • use_chunking (optional): HybridChunker 청킹 적용 (기본: false)
  • contextualize (optional): 청크 컨텍스트 강화 적용 (기본: true)

응답: ZIP 파일 또는 JSON

cURL 예시:

curl -X POST "http://localhost:10002/convert-multiple?output_format=zip" \
  -F "files=@doc1.pdf" \
  -F "files=@doc2.docx" \
  -F "files=@doc3.xlsx" \
  -o converted_files.zip

10. 지원 형식 조회

GET /supported-formats

지원되는 모든 파일 형식 및 청킹 정보 반환

11. 청킹 정보 조회

GET /chunking-info

HybridChunker 설정 및 기능 정보 반환

🔄 비동기 워크플로우 (n8n, Zapier 등)

대용량 파일 처리 시 다음과 같은 워크플로우를 사용하세요:

기본 워크플로우

1. POST /convert-chunked-async
   ↓ (job_id 수신)
2. GET /job/{job_id} (5초마다 polling)
   ↓ (status 확인)
3. status === 'completed'
   ↓
4. result에서 청크 데이터 획득
   ↓
5. DELETE /job/{job_id} (정리)

n8n 워크플로우 예시

자세한 n8n 통합 가이드는 N8N_WORKFLOW_GUIDE.md를 참고하세요.

간단 예시:

// 1. 작업 시작
const startResponse = await $http.post('http://localhost:10002/convert-chunked-async', {
  file: $binary.data
});
const jobId = startResponse.job_id;

// 2. 상태 polling (Loop 노드 사용)
let status = 'processing';
while (status === 'processing' || status === 'queued') {
  await new Promise(r => setTimeout(r, 5000)); // 5초 대기
  const statusResponse = await $http.get(`http://localhost:10002/job/${jobId}`);
  status = statusResponse.status;
  
  if (status === 'completed') {
    return statusResponse.result; // 완료된 청크 데이터
  } else if (status === 'failed') {
    throw new Error(statusResponse.error);
  }
}

6. 지원 형식 조회

POST /convert-multiple

파라미터:

  • files (required): 변환할 파일들 (최대 10개)
  • output_format (optional): 출력 형식 - "zip" 또는 "json" (기본: zip)
  • use_chunking (optional): HybridChunker 청킹 적용 (기본: false)
  • contextualize (optional): 청크 컨텍스트 강화 적용 (기본: true)

응답: ZIP 파일 또는 JSON

cURL 예시:

curl -X POST "http://localhost:10002/convert-multiple?output_format=zip" \
  -F "files=@doc1.pdf" \
  -F "files=@doc2.docx" \
  -F "files=@doc3.xlsx" \
  -o converted_files.zip

6. 지원 형식 조회

GET /supported-formats

지원되는 모든 파일 형식 및 청킹 정보 반환

7. 청킹 정보 조회

GET /chunking-info

HybridChunker 설정 및 기능 정보 반환

🧩 HybridChunker 기능

Contextualize (컨텍스트 강화)

각 청크에 문서의 전체 컨텍스트를 포함하여 독립적으로 이해 가능한 텍스트를 생성합니다.

활용 예시:

  • RAG (Retrieval-Augmented Generation) 시스템
  • 문서 검색 및 인덱싱
  • 문맥 기반 질의응답 시스템

Merge Peers (인접 청크 병합)

유사한 내용을 가진 인접 청크를 자동으로 병합하여 의미있는 단위로 관리합니다.

Hierarchical Chunking (계층적 청킹)

문서의 구조(제목, 섹션, 단락)를 고려하여 계층적으로 청킹합니다.

🎯 사용 예시

Python에서 API 호출

import requests

# 단일 파일 변환
with open('document.pdf', 'rb') as f:
    files = {'file': f}
    params = {
        'use_chunking': True,
        'contextualize': True
    }
    response = requests.post('http://localhost:10002/convert', 
                           files=files, 
                           params=params)
    
    with open('output.md', 'wb') as out:
        out.write(response.content)

# 청크별 JSON 응답 받기
with open('document.pdf', 'rb') as f:
    files = {'file': f}
    response = requests.post('http://localhost:10002/convert-chunked', files=files)
    data = response.json()
    
    print(f"총 청크 수: {data['total_chunks']}")
    for chunk in data['chunks']:
        print(f"청크 {chunk['chunk_id']}: {chunk['text_length']} 문자")
        if 'page_info' in chunk:
            print(f"  페이지: {chunk['page_info']}")

JavaScript/TypeScript에서 API 호출

// 파일 업로드 및 변환
const formData = new FormData();
formData.append('file', fileInput.files[0]);

const response = await fetch('http://localhost:10002/convert?use_chunking=true', {
  method: 'POST',
  body: formData
});

const markdown = await response.text();
console.log(markdown);

// 청크별 JSON 데이터 받기
const chunkedResponse = await fetch('http://localhost:10002/convert-chunked', {
  method: 'POST',
  body: formData
});

const data = await chunkedResponse.json();
console.log(`총 ${data.total_chunks}개의 청크가 생성되었습니다.`);

🛠️ 기술 스택

  • FastAPI: 고성능 비동기 웹 프레임워크
  • Docling: 문서 변환 및 처리 라이브러리
  • HybridChunker: 지능형 문서 청킹 엔진
  • Transformers: HuggingFace 토크나이저
  • sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2: 다국어 지원 임베딩 모델 (한글 최적화)

⚙️ 설정

토크나이저 설정

EMBED_MODEL_ID = "sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2"
MAX_TOKENS = 512  # 청크당 최대 토큰 수

CORS 설정

모든 출처에서의 요청을 허용하도록 설정되어 있습니다. 프로덕션 환경에서는 특정 도메인으로 제한하는 것을 권장합니다.

app.add_middleware(
    CORSMiddleware,
    allow_origins=["*"],  # 프로덕션에서는 특정 도메인으로 변경
    allow_credentials=True,
    allow_methods=["*"],
    allow_headers=["*"],
)

📊 청크 메타데이터

각 청크는 다음과 같은 메타데이터를 포함합니다:

  • chunk_id: 청크 번호
  • text: 원본 텍스트
  • text_length: 텍스트 길이
  • token_count: 토큰 수
  • contextualized_text: 컨텍스트가 강화된 텍스트
  • page_info: 페이지 정보 (PDF 등)
  • sheet_names: 시트 이름 (Excel)
  • bbox_info: 바운딩 박스 정보 (위치 정보)
  • metadata: 추가 메타데이터

🔍 특수 기능

Excel 파일 처리

Excel 파일의 경우 시트별로 구분하여 처리하며, 각 청크에 시트 이름과 인덱스 정보를 포함합니다.

이미지 처리

이미지 파일은 OCR을 통해 텍스트를 추출하여 Markdown으로 변환합니다.

페이지 정보 추적

PDF 및 페이지 기반 문서의 경우 각 청크가 어느 페이지에서 추출되었는지 추적합니다.

🐛 문제 해결

파일 업로드 크기 제한

대용량 파일 처리 시 FastAPI의 업로드 크기 제한을 늘려야 할 수 있습니다.

메모리 부족

대량의 파일을 처리할 때 메모리 부족이 발생할 수 있습니다. 이 경우 파일 수를 제한하거나 서버의 메모리를 증가시키세요.

한글 처리

현재 paraphrase-multilingual-MiniLM-L12-v2 모델을 사용하여 한글 처리에 최적화되어 있습니다.

📝 라이선스

이 프로젝트는 관련 라이브러리의 라이선스를 따릅니다.

🤝 기여

버그 리포트나 기능 제안은 이슈를 통해 제출해주세요.

📞 지원

문의사항이 있으시면 이슈를 등록해주세요. hellocosmos@gmail.com

Version: 1.0.0
Port: 10002
Host: 0.0.0.0

About

Docling Document Converter API

Resources

Stars

5 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages