Skip to content

111jjj111/openpaper

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

2 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

OpenPaper πŸ“„

λ…Όλ¬Έ 리딩 보쑰 μ‹œμŠ€ν…œ β€” AI 기반 PDF λ²ˆμ—­ + ν‘œ/κ·Έλ¦Ό/μˆ˜μ‹ ν•΄μ„€

λ…Όλ¬Έ PDFλ₯Ό μ—…λ‘œλ“œν•˜λ©΄ Docling AIκ°€ λ¬Έμ„œ ꡬ쑰λ₯Ό μ •λ°€ νŒŒμ‹±ν•˜κ³ , Gemini/OpenAIλ₯Ό 톡해 λ²ˆμ—­κ³Ό μ‹œκ°μ  μš”μ†Œ(ν‘œΒ·κ·Έλ¦ΌΒ·μˆ˜μ‹) 해섀을 μ œκ³΅ν•©λ‹ˆλ‹€.


기술 μŠ€νƒ

ꡬ뢄 기술
Backend Python 3.10+, FastAPI, SQLAlchemy (async), PostgreSQL
Frontend React 18, Vite, pdfjs-dist
AI νŒŒμ‹± Docling (Heron AI λ ˆμ΄μ•„μ›ƒ λͺ¨λΈ)
LLM Google Gemini / OpenAI GPT
μŠ€ν† λ¦¬μ§€ AWS S3 / MinIO (S3 ν˜Έν™˜)
νŒ¨ν‚€μ§€ 관리 uv (ꢌμž₯) / pip

λΉ λ₯Έ μ‹œμž‘ (Quick Start)

1. μ €μž₯μ†Œ 클둠

git clone https://github.com/<your-username>/openpaper.git
cd openpaper

2. λ°±μ—”λ“œ μ˜μ‘΄μ„± μ„€μΉ˜

uv λ₯Ό μ‚¬μš©ν•˜λ©΄ κ°€μƒν™˜κ²½ 생성 + μ˜μ‘΄μ„± μ„€μΉ˜λ₯Ό ν•œ λ²ˆμ— μ²˜λ¦¬ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

# uvκ°€ μ—†λ‹€λ©΄ λ¨Όμ € μ„€μΉ˜ (ν•œ 쀄)
curl -LsSf https://astral.sh/uv/install.sh | sh

# κ°€μƒν™˜κ²½ 생성 + μ˜μ‘΄μ„± 동기화 (ν•œ λ²ˆμ— μ™„λ£Œ!)
uv sync

# 개발 도ꡬ(ruff, pytest λ“±)κΉŒμ§€ ν¬ν•¨ν•˜λ €λ©΄:
uv sync --extra dev

pip을 μ‚¬μš©ν•˜λŠ” 경우:

python -m venv .venv
source .venv/bin/activate
pip install -e ".[dev]"

3. ν”„λ‘ νŠΈμ—”λ“œ μ˜μ‘΄μ„± μ„€μΉ˜

cd frontend
npm install
cd ..

4. ν™˜κ²½ λ³€μˆ˜ μ„€μ •

cp .env.example .env

.env νŒŒμΌμ„ μ—΄κ³  μ•„λž˜ ν•„μˆ˜ ν•­λͺ©λ“€μ„ μ‹€μ œ κ°’μœΌλ‘œ μ±„μ›Œ λ„£μŠ΅λ‹ˆλ‹€:

λ³€μˆ˜ μ„€λͺ… ν•„μˆ˜
OPENPAPER_DATABASE_URL PostgreSQL μ—°κ²° URL βœ…
OPENPAPER_S3_ACCESS_KEY AWS/MinIO μ•‘μ„ΈμŠ€ ν‚€ βœ…
OPENPAPER_S3_SECRET_KEY AWS/MinIO μ‹œν¬λ¦Ώ ν‚€ βœ…
OPENPAPER_GEMINI_API_KEY Google AI Studioμ—μ„œ λ°œκΈ‰ βœ…
OPENPAPER_S3_ENDPOINT_URL MinIO λ“± μ»€μŠ€ν…€ μ—”λ“œν¬μΈνŠΈ (AWS S3 기본이면 λΉ„μ›Œλ‘κΈ°) 선택
OPENPAPER_PARSER_BACKEND docling (AI νŒŒμ„œ, ꢌμž₯) λ˜λŠ” pymupdf 선택
OPENPAPER_TRANSLATOR_BACKEND huggingface (둜컬 NLLB) λ˜λŠ” llm (Gemini/OpenAI) 선택

5. λ°μ΄ν„°λ² μ΄μŠ€ μ€€λΉ„

# PostgreSQL이 μ‹€ν–‰ 쀑이어야 ν•©λ‹ˆλ‹€.
# DB 생성 (이미 μžˆλ‹€λ©΄ μƒλž΅)
createdb openpaper

# ν…Œμ΄λΈ” μžλ™ 생성 λͺ¨λ“œλ‘œ μ„œλ²„ μ‹œμž‘ (처음 ν•œ 번만)
OPENPAPER_DEV_CREATE_TABLES=true uv run uvicorn app.main:app --reload

μ΄ν›„μ—λŠ” OPENPAPER_DEV_CREATE_TABLES=false (κΈ°λ³Έκ°’)둜 두고, μŠ€ν‚€λ§ˆ λ³€κ²½ μ‹œ alembic upgrade headλ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€.

6. ν”„λ‘ νŠΈμ—”λ“œ λΉŒλ“œ

cd frontend
npm run build
cd ..

7. μ„œλ²„ μ‹€ν–‰

uv run uvicorn app.main:app --reload

λΈŒλΌμš°μ €μ—μ„œ http://localhost:8000 으둜 μ ‘μ†ν•©λ‹ˆλ‹€.


ν”„λ‘œμ νŠΈ ꡬ쑰

openpaper/
β”œβ”€β”€ app/                          # λ°±μ—”λ“œ (FastAPI)
β”‚   β”œβ”€β”€ adapters/                 # μ™ΈλΆ€ μ„œλΉ„μŠ€ μ–΄λŒ‘ν„° (Docling, Gemini, S3 λ“±)
β”‚   β”œβ”€β”€ api/                      # API 라우트 (command, query 뢄리)
β”‚   β”œβ”€β”€ core/services/            # λΉ„μ¦ˆλ‹ˆμŠ€ 둜직
β”‚   β”œβ”€β”€ db/                       # DB μ„Έμ…˜ 및 base λͺ¨λΈ
β”‚   β”œβ”€β”€ models/                   # SQLAlchemy ORM λͺ¨λΈ
β”‚   β”œβ”€β”€ ports/                    # 좔상 포트 μΈν„°νŽ˜μ΄μŠ€ (ν—₯사고날)
β”‚   β”œβ”€β”€ schemas/                  # Pydantic 응닡 μŠ€ν‚€λ§ˆ
β”‚   β”œβ”€β”€ workers/                  # 비동기 Job 처리 μ›Œμ»€
β”‚   β”œβ”€β”€ config.py                 # ν™˜κ²½ λ³€μˆ˜ μ„€μ • (pydantic-settings)
β”‚   └── main.py                   # FastAPI μ—”νŠΈλ¦¬ν¬μΈνŠΈ
β”œβ”€β”€ frontend/                     # ν”„λ‘ νŠΈμ—”λ“œ (React + Vite)
β”‚   └── src/
β”‚       β”œβ”€β”€ components/           # React μ»΄ν¬λ„ŒνŠΈ
β”‚       β”œβ”€β”€ styles/               # CSS
β”‚       └── api.js                # λ°±μ—”λ“œ API 래퍼
β”œβ”€β”€ tests/                        # ν…ŒμŠ€νŠΈ
β”œβ”€β”€ alembic/                      # DB λ§ˆμ΄κ·Έλ ˆμ΄μ…˜
β”œβ”€β”€ pyproject.toml                # Python μ˜μ‘΄μ„± μ •μ˜
β”œβ”€β”€ .env.example                  # ν™˜κ²½ λ³€μˆ˜ ν…œν”Œλ¦Ώ
└── README.md

μ£Όμš” κΈ°λŠ₯

πŸ“– λ“€μ–Ό νŒ¨λ„ λ·°μ–΄

μ’ŒμΈ‘μ— PDF 원문, μš°μΈ‘μ— λ²ˆμ—­λ³Έμ„ λ‚˜λž€νžˆ ν‘œμ‹œν•©λ‹ˆλ‹€. λ”λΈ”ν΄λ¦­μœΌλ‘œ μ›λ¬Έβ†”λ²ˆμ—­ κ°„ μœ„μΉ˜λ₯Ό 동기화할 수 μžˆμŠ΅λ‹ˆλ‹€.

🌐 AI λ²ˆμ—­

Gemini/OpenAI λ˜λŠ” HuggingFace NLLB 둜컬 λͺ¨λΈλ‘œ 논문을 λ²ˆμ—­ν•©λ‹ˆλ‹€.

πŸ’‘ AI ν•΄μ„€ (ν‘œ/κ·Έλ¦Ό/μˆ˜μ‹)

PDF μœ„μ— ν‘œμ‹œλ˜λŠ” 색상별 μ˜€λ²„λ ˆμ΄(ν‘œ=νŒŒλž‘, κ·Έλ¦Ό=초둝, μˆ˜μ‹=μ£Όν™©)λ₯Ό ν΄λ¦­ν•˜λ©΄ AIκ°€ ν•΄λ‹Ή μš”μ†Œλ₯Ό λΆ„μ„ν•˜μ—¬ ν•œκ΅­μ–΄λ‘œ 상세 해섀을 μ œκ³΅ν•©λ‹ˆλ‹€.


πŸ“Έ μŠ€ν¬λ¦°μƒ· 및 μ•„ν‚€ν…μ²˜

μ‹œμŠ€ν…œ μ•„ν‚€ν…μ²˜ 및 μž‘μ—… 흐름

1️⃣ 전체 μ‹œμŠ€ν…œ μ•„ν‚€ν…μ²˜ μ‹œμŠ€ν…œ μ•„ν‚€ν…μ²˜

FastAPI 기반의 λͺ¨λ†€λ¦¬μ‹ λ°±μ—”λ“œ, 비동기 큐(ARQ), μ™ΈλΆ€ AI νŒŒμ„œ 및 LLM을 ν™œμš©ν•œ νŒŒμ΄ν”„λΌμΈ κ΅¬μ„±λ„μž…λ‹ˆλ‹€.

2️⃣ 비동기 μž‘μ—…(Job) μƒνƒœ 전이도 μž‘μ—… μƒνƒœ 전이도

λŒ€ν˜• λ¬Έμ„œλ₯Ό μ²˜λ¦¬ν•  λ•Œ νμž‰λΆ€ν„° κ²°κ³Ό λ°˜ν™˜(RUNNING β†’ DONE/FAILED)κΉŒμ§€μ˜ μƒνƒœ λ³€ν™”λ₯Ό λ‚˜νƒ€λƒ…λ‹ˆλ‹€.

μ‹€μ œ ꡬ동 ν™”λ©΄

1️⃣ AI ν•΄μ„€ (μ‹œκ°μ  μš”μ†Œ 뢄석) AI ν•΄μ„€ ν™”λ©΄

PDFμ—μ„œ λ…Όλ¬Έμ˜ λ³΅μž‘ν•œ κ·Έλ¦Όμ΄λ‚˜ ν‘œλ₯Ό ν΄λ¦­ν•˜λ©΄ 우츑 νƒ­μ—μ„œ AIκ°€ λ¬Έλ§₯에 맞좰 ν•œκ΅­μ–΄λ‘œ μ„€λͺ…ν•΄μ€λ‹ˆλ‹€.

2️⃣ λ“€μ–Ό νŒ¨λ„ 기반 AI λ²ˆμ—­ AI λ²ˆμ—­ ν™”λ©΄

원문과 λ²ˆμ—­λ³Έμ΄ 1:1둜 맀칭되며, 마우슀 λ”λΈ”ν΄λ¦­μœΌλ‘œ μ–‘μͺ½ 슀크둀 μœ„μΉ˜κ°€ λ™κΈ°ν™”λ©λ‹ˆλ‹€.


개발 λͺ…λ Ήμ–΄ λͺ¨μŒ

# μ„œλ²„ μ‹€ν–‰ (ν•« λ¦¬λ‘œλ“œ)
uv run uvicorn app.main:app --reload

# ν”„λ‘ νŠΈμ—”λ“œ 개발 μ„œλ²„
cd frontend && npm run dev

# 린트
uv run ruff check app/

# ν…ŒμŠ€νŠΈ
uv run pytest tests/ -v

# DB λ§ˆμ΄κ·Έλ ˆμ΄μ…˜
uv run alembic upgrade head

ν™˜κ²½ μš”κ΅¬μ‚¬ν•­

  • Python: 3.10 이상
  • Node.js: 18 이상
  • PostgreSQL: 14 이상
  • GPU (선택): Docling AI νŒŒμ„œ μ‚¬μš© μ‹œ CUDA 지원 GPU ꢌμž₯ (VRAM 6GB+)

λΌμ΄μ„ μŠ€

MIT License

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors