์์์ ์ผ๋ก ๋ฐ๋ณตํ๋ ๋ฌธ์ ๋ถ๋ฅ, ํ์ ํญ๋ชฉ ํ์ธ, ํต์ฌ ์ ๋ณด ์ถ์ถ, ๊ฒฐ๊ณผ ์ ๋ฆฌ๋ฅผ ํ๋์ ์๋ํ ํ๋ฆ์ผ๋ก ์ฐ๊ฒฐํ๋ ๋ฌธ์ ์ ๋ฌด ์๋ํ ์ฑ์ ๋๋ค.
Workflow Builder
Document Library
Document Classifier
Required Field Checker
Key Information Extractor
Raw Data Extractor
uv venv --python 3.11 .venv
uv pip install -e 'backend[dev]'
./scripts/run_dev.sh์คํ ํ ๋ธ๋ผ์ฐ์ ์์ http://127.0.0.1:5173/์ ์ฝ๋๋ค. ๊ธฐ๋ณธ ๋ก์ปฌ ๊ตฌ์ฑ์ VLM_PROVIDER=mock์ผ๋ก ์ธ๋ถ AI ํธ์ถ ์์ด UI์ workflow ํ๋ฆ์ ํ์ธํ ์ ์์ต๋๋ค. ์ค์ provider๋ฅผ ํธ์ถํ๋ ค๋ฉด .env.example์ .env๋ก ๋ณต์ฌํ ๋ค VLM_PROVIDER, VLM_API_KEY, VLM_MODEL_NAME์ ์ค์ ํฉ๋๋ค.
| Module | Purpose |
|---|---|
| Document Library | ํ์ผ/ํด๋๋ฅผ ๋จผ์ ๋ณด๊ดํจ์ ์ฌ๋ฆฌ๊ณ , ๋ฐฑ๊ทธ๋ผ์ด๋ ๋ณํ ํ ๋ชจ๋ ๋ชจ๋๊ณผ ์ํฌํ๋ก์ฐ์์ ์ฌ์ฌ์ฉํฉ๋๋ค. |
| Workflow Builder | ๋ฌธ์ ์ ๋ ฅ, ๋ถ๋ฅ, ๋ถ๊ธฐ, ์ถ์ถ, ํ์ ํญ๋ชฉ ํ์ธ, ๋ณํฉ, export ๋ ธ๋๋ฅผ ์ฐ๊ฒฐํฉ๋๋ค. |
| Document Classifier | ์ฌ์ฉ์๊ฐ ์ ์ํ class ํ๋ณด์ unknown ๊ธฐ์ค์ผ๋ก ๋ฌธ์๋ฅผ ๋ถ๋ฅํฉ๋๋ค. |
| Required Field Checker | ์ฑ๋ช , ๋ ์ง, ์๋ช , ์ฒดํฌ๋ฐ์ค ๋ฑ ํ์ ํญ๋ชฉ์ ์กด์ฌ ์ฌ๋ถ๋ฅผ ํ์ธํฉ๋๋ค. |
| Key Information Extractor | ์ ์ฅ๋ schema ๊ธฐ์ค์ผ๋ก field, value, confidence, evidence๋ฅผ ์ถ์ถํฉ๋๋ค. |
| Raw Data Extractor | PDF, Office ๋ฌธ์, ์ด๋ฏธ์ง์ preview์ ์๋ฌธ ๋ฐ์ดํฐ๋ฅผ ์์ฑํฉ๋๋ค. |
- ํ์
๋ฌธ์ ๋ณด๊ดํจ์์ ํ์ผ ๋๋ ํด๋๋ฅผ ๊ณ์ ์ถ๊ฐํ ์ ์์ต๋๋ค. - ์ ๋ก๋ ๋๊ธฐ์ด์ ํ์ฌ ์ ๋ก๋๊ฐ ์งํ ์ค์ด์ด๋ ๋ค์ ํ์ผ/ํด๋๋ฅผ ๋ฐ์ ์์๋๋ก ์ฒ๋ฆฌํฉ๋๋ค.
- ๋ณด๊ดํจ์ ์๋ณธ ํ์ผ, ์๋ ๊ฒฝ๋ก, ๋ณํ ์ํ, page image/meta๋ฅผ ๊ด๋ฆฌํฉ๋๋ค.
- ๋ณด๊ดํจ์ ๋น ํด๋ ์์ฑ, ์ ์ฒด ์ ํ, ๋ณต์ฌ, ์ด๋, ์๋ผ๋ด๊ธฐ, ๋ถ์ฌ๋ฃ๊ธฐ ํ๋ฆ์ ์ง์ํฉ๋๋ค.
- ๋ฌธ์/ํด๋ ๋ณต์ฌ๋ ์๋ณธ payload๋ฅผ ๊ณต์ ํ์ง ์๊ณ ์ storage ๊ฒฝ๋ก์ ์ document id๋ฅผ ๋ง๋ญ๋๋ค.
- ์ ํ ์ญ์ ๋ ํ์ธ ํ์ ํ ์ฌ๋ฌ ๋ฌธ์์ ์๋ณธ payload๋ฅผ ํ ๋ฒ์ ์ญ์ ํฉ๋๋ค.
- ๋ณด๊ดํจ์ ๋ชฉ๋ก ๋ณด๊ธฐ์ ์์ด์ฝ ๋ณด๊ธฐ๋ฅผ ์ ํํ ์ ์์ผ๋ฉฐ, ๋ฌธ์ ์์ญ์ ๋๊ฒ ์ฐ๋๋ก ๊ตฌ์ฑ๋์ด ์์ต๋๋ค.
- ๋ณด๊ดํจ์์๋
Command/Ctrl+A/C/X/V,Delete,Esc๋จ์ถํค๋ก ์ ์ฒด ์ ํ, ๋ณต์ฌ, ์ด๋, ๋ถ์ฌ๋ฃ๊ธฐ, ์ ํ ์ญ์ , ์ ํ ํด์ ๋ฅผ ์คํํ ์ ์์ต๋๋ค. - ๋ณด๊ดํจ ์์ ์งํ/์๋ฃ ์ํ๋ ๋ณธ๋ฌธ์ ๋ฐ์ด๋ด์ง ์๊ณ ์ฐ์ธก ์๋จ ์๋ฆผ์ผ๋ก ํ์๋ฉ๋๋ค.
ready๋ฌธ์๋ ์ฆ์ ์คํ๋๊ณ ,queued/preprocessing๋ฌธ์๋ ์ค๋น๋๋ฉด ์คํ ์ํ๋ก ๋ชจ๋/์ํฌํ๋ก์ฐ ์์ ์ ์ฐ๊ฒฐ๋ฉ๋๋ค.- ๋ฌธ์ ์ญ์ ๋ ์๋ณธ๊ณผ page image payload๋ง ์ญ์ ํ๊ณ , ๊ณผ๊ฑฐ ๊ฒฐ๊ณผ row์ ์คํ ๊ธฐ๋ก์ ๋ณด์กดํฉ๋๋ค.
- React Flow ์บ๋ฒ์ค์์ ๋ฌธ์ ์ฒ๋ฆฌ ๋ชจ๋์ ์ฐ๊ฒฐํฉ๋๋ค.
AI ์์ฑ์ผ๋ก ์ํ ์ด๋ฏธ์ง ์ต๋ 10์ฅ์ ๋ถ์ํด workflow/schema/checklist ์ด์์ ๋ง๋ค ์ ์์ต๋๋ค.- AI workflow draft ์์ฑ์ ์์ฒญ ์ฒ๋ฆฌ ์ค ์์ ๊ณต๊ฐ๋ง ์ฌ์ฉํ๋ฉฐ, ์ํ์ ๋ณด๊ดํจ์ ์ ์ฅํ๋ ๊ฒ์ ๋ณ๋ ์ ํ ๋์์ ๋๋ค.
- KIE ๋ ธ๋ ์ ํ ์ Workflow Builder ์์์ ๊ธฐ์กด schema field๋ฅผ ์์ ํ๊ฑฐ๋ ์ schema ์ด์์ ๋ง๋ค ์ ์์ผ๋ฉฐ, ์ ์ฅ/์คํ ์ schema ์ด์์ด ๋จผ์ ์ ์ฅ ๋๋ ์ ๋ฐ์ดํธ๋ ๋ค workflow์ ์ฐ๊ฒฐ๋ฉ๋๋ค.
์ ๋ก๋๋ก ์ ๋ฌธ์๋ฅผ ๋ณด๊ดํจ์ ์ถ๊ฐํ๊ฑฐ๋,๋ฌธ์ ๋ณด๊ดํจ์์ ๊ธฐ์กด ๋ฌธ์๋ฅผ ์ ํํด ์คํํฉ๋๋ค.- ์ ์ ๋ก๋๋ ๋จผ์ ๋ณด๊ดํจ์ ์ ์ฅ๋๊ณ , workflow run์ ๋ณด๊ดํจ document id๋ฅผ ์ฐธ์กฐํฉ๋๋ค.
- ๋ณด๊ดํจ ๋ฌธ์๋ฅผ ์ ํํ๋ฉด ์ ๋ก๋๋ฅผ ๋ฐ๋ณตํ์ง ์๊ณ ๊ฐ์ ์๋ณธ payload๋ฅผ ์ฌ์ฌ์ฉํฉ๋๋ค.
- ์๋ก๊ณ ์นจ์ด๋ ๋คํธ์ํฌ ๋๊น ํ์๋
์ด์ด๊ฐ๊ธฐ๋ก ๊ฐ์ ์๋ณธ์ ๋ค์ ์ ํํด ๋จ์ ํญ๋ชฉ๋ง ์ ๋ก๋ํ ์ ์์ต๋๋ค. - ์คํ ์ค์๋
์ถ๋ก ์ผ์์ค๋จ,์ด์ดํ๊ธฐ,์คํ ์์ฝ,์ถ๋ก ์ค๋จ์ผ๋ก ์ํ๋ฅผ ์ ์ดํฉ๋๋ค. - ์ํฌํ๋ก์ฐ ์ค๋จ์ ๋ณด๊ดํจ ๋ฌธ์๋ฅผ ์ญ์ ํ์ง ์๊ณ ์งํ ์ค์ธ ์ถ๋ก ๋ง ๋ฉ์ถฅ๋๋ค. ์๋ณธ ์ญ์ ๋ ๋ฌธ์ ๋ณด๊ดํจ์์๋ง ์ํํฉ๋๋ค.
์คํ ์์ฝ์ ์ ๋ก๋๋ ์๋ณธ ๋ฌธ์๋ฅผ ๋ณต์ฌํ์ง ์๊ณ ๋ค์ workflow run์waiting์ํ๋ก ๋ฑ๋กํ๋ฉฐ, ์์ run์ด ๋๋๋ฉด ์๋์ผ๋ก ์์ํฉ๋๋ค.- ์งํ ์ํ๋
์ ๋ก๋๋จ,์ ์ฒ๋ฆฌ,์คํ ์ค,๋๊ธฐ,์๋ฃ/๊ฒํ /์คํจcounter๋ก ๋ถ๋ฆฌํด ํ์ํฉ๋๋ค. - ๊ฒฐ๊ณผ ํ๋ฉด์ ๋ฌธ์ ๋ชฉ๋ก ์คํฌ๋กค ์์น๋ฅผ ์ ์งํ๊ณ , ์์ธ ๊ฒฐ๊ณผ์์ ๋ฌธ์ ์ด๋ฏธ์ง์ module output์ ํจ๊ป ๊ฒ์ํฉ๋๋ค.
- ๊ฒฐ๊ณผ CSV/JSON/XLSX์๋ ๋ฌธ์๋ณ
upload_duration_ms,inference_duration_ms๊ฐ ํฌํจ๋ฉ๋๋ค.
์ ๊ท UX์ ๊ธฐ๋ณธ ์
๋ ฅ ๊ฒฝ๋ก๋ ๋ฌธ์ ๋ณด๊ดํจ์
๋๋ค. ๊ธฐ์กด init -> items -> start multipart API๋ ํธํ์ฑ๊ณผ ์
๋ก๋ ์ด์ด๊ฐ๊ธฐ๋ฅผ ์ํด ์ ์งํฉ๋๋ค.
| Step | Description |
|---|---|
library upload |
/api/library/uploads๊ฐ ์๋ณธ ํ์ผ์ ์ ์ฅํ๊ณ document conversion job์ ๋ฑ๋กํฉ๋๋ค. |
conversion |
๋ฐฑ๊ทธ๋ผ์ด๋ worker๊ฐ PDF/page image/meta๋ฅผ ๋ง๋ค๊ณ document๋ฅผ ready๋ก ๋ฐ๊ฟ๋๋ค. |
from-documents |
๋ชจ๋/์ํฌํ๋ก์ฐ๋ document_ids๋ง ๋ฐ์ batch/run item์ ๋ง๋ญ๋๋ค. |
ready dispatch |
์ด๋ฏธ ready์ธ ๋ฌธ์๋ ์ฆ์ ์คํํ๊ณ , ๋ณํ ์ค์ธ ๋ฌธ์๋ ์ค๋น ํ ์๋ ์คํํฉ๋๋ค. |
summary |
polling์ summary endpoint๋ก counter๋ง ๊ฐ์ ธ์ค๊ณ , ์์ธ ํ๋ฉด์์๋ง item page๋ฅผ ์กฐํํฉ๋๋ค. |
๊ณตํต ์ํ๋ uploading, preprocessing, waiting, running, paused, completed, needs_review, completed_with_errors, failed, canceled๋ฅผ ์ฌ์ฉํฉ๋๋ค.
์ด public repository๋ ๋ฌธ์ ์๋ํ ์ ํ ํ๋ฉด์ ์ง์คํฉ๋๋ค: upload, extraction, classification, validation, workflow building, execution, review, export.
์๋น์ค ์ด์ ์ ์ฉ ๊ตฌํ๊ณผ ์ ์ฑ ๋ฌธ๊ตฌ๋ public README์ ํฌํจํ์ง ์์ต๋๋ค.
| Document | Purpose |
|---|---|
| DEVELOPMENT_DEFINITION.md | ์ ํ ๋ฒ์, public feature contract, ํต์ฌ API ๊ทธ๋ฃน, ๊ฒ์ฆ ๊ธฐ์ค |
| DEVELOPMENT_PLAN.md | ํ์ฌ focus, ์ต๊ทผ ๋ฐ์ ๊ธฐ๋ฅ, ๋ค์ product task |
| ERROR_NOTE.md | ์ฅ์ /์ค๋ฅ ์์ธ, ์์ , ์ฌ๋ฐ ๋ฐฉ์ง ๊ธฐ๋ก |
| docs/project-insights.md | ์ ํ/์ํคํ ์ฒ/VLM/์ํฌํ๋ก์ฐ ์ค๊ณ ์ธ์ฌ์ดํธ |
| docs/templates/bank-documents-poc.json | ์ํ ์๋ฅ ๋ฐ๋ชจ์ฉ schema/classifier/checklist/workflow template |
| docs/readme-media.html | README ์ด๋ฏธ์ง ์ฌ์์ฑ์ฉ media source |
ํ์ ์ํ ์๋ฅ ๋ฐ๋ชจ ์์ ๋ฒํผ์ ์ํ ์๋ฅ์ฉ schema, classifier, checklist, workflow, ์ํ ๋ณด๊ด ๋ฌธ์ 3์ฅ์ ์์ฑํ๊ฑฐ๋ ๊ธฐ์กด ํญ๋ชฉ์ ์ฌ์ฌ์ฉํ ๋ค seed๋ Workflow Builder๋ก ์ด๋ํฉ๋๋ค. ์ํ ์ถ์ฒ๋ ์ด ์ ์ฅ์์ assets/sample ๋ก์ปฌ ์์ฐ์ด๋ฉฐ, ํ
ํ๋ฆฟ ์๋ณธ์ docs/templates/bank-documents-poc.json์ ๋ก๋๋ค.
| Input | Handling |
|---|---|
| page image๋ก rasterize ํ preview์ VLM context์ ์ฌ์ฉ | |
| PNG/JPG/JPEG | ์๋ณธ์ ๊ทธ๋๋ก ๋ณด์กดํ๊ณ preview/VLM์ฉ JPEG๋ฅผ ์์ฑ |
| DOCX/PPTX | LibreOffice๋ก PDF ๋ณํ ํ ์ฒ๋ฆฌ |
| XLSX | sheet HTML๊ณผ PDF preview ์์ฑ |
| Output | Format |
|---|---|
| KIE | field, value, normalized value, confidence, evidence |
| Classification | class name, confidence, reason, evidence |
| Required Check | item๋ณ present/missing/uncertain/not_applicable |
| Workflow Export | branch๋ณ union-column CSV/JSON/XLSX, upload/inference duration |
| Layer | Tech |
|---|---|
| Frontend | Vite, React, TypeScript, React Flow |
| Backend | FastAPI, SQLAlchemy, Alembic-compatible lightweight migration |
| Storage | Local filesystem, optional S3-compatible adapter |
| Document Preview | PyMuPDF, LibreOffice headless |
| VLM | Gemini/OpenAI-compatible/mock provider |
Requirements:
- Python 3.11
- Node.js 20+
- LibreOffice for DOCX/PPTX/XLSX conversion
uv venv --python 3.11 .venv
uv pip install -e 'backend[dev]'
cd frontend
npm ci
cd ..
./scripts/run_dev.sh| Server | URL |
|---|---|
| Frontend | http://127.0.0.1:5173 |
| Backend | http://127.0.0.1:8000 |
Mock VLM์ผ๋ก UI์ workflow๋ง ํ์ธํ ๋:
VLM_PROVIDER=mock
VLM_MODEL_NAME=mock-vlm๋ก์ปฌ OpenAI-compatible VLM์ผ๋ก ์ค์ ์ถ๋ก ํ ๋:
VLM_PROVIDER=auto
VLM_MODEL_NAME=google/gemma-4-26b-a4b
VLM_BASE_URL=http://127.0.0.1:1234/v1
VLM_API_KEY=
VLM_INFERENCE_PARAMS='{"reasoning_effort":"off","thinking":"off","temperature":"0","verbosity":"","max_completion_tokens":"","top_p":"","service_tier":""}'
VLM_TIMEOUT_SECONDS=600
KIE_FIELD_GROUP_SIZE=1๋ก์ปฌ 26B๊ธ ๋ชจ๋ธ์ ๊ณต์ API๋ณด๋ค ์๋ต ์๊ฐ์ด ๊ธธ ์ ์์ต๋๋ค. ๊ธฐ๋ณธ inference parameter๋ reasoning/thinking off์ด๋ฉฐ, KIE ๋จ์ผ ์คํ ํ๋ฉด์ backend job์ด completed, needs_review, failed, canceled๋ก ๋๋ ๋๊น์ง ๊ณ์ pollingํฉ๋๋ค. provider request ์์ฒด์ ์ต๋ ๋๊ธฐ ์๊ฐ์ VLM_TIMEOUT_SECONDS๋ก ์กฐ์ ํฉ๋๋ค.
VLM_BASE_URL์ด ์ค์ ๋ OpenAI-compatible ๋ก์ปฌ ์๋ฒ๋ provider๋ณ strict json_schema ์ง์ ์์ค์ด ๋ค๋ฅผ ์ ์์ต๋๋ค. ์ด ๊ฒฝ์ฐ backend๋ raw message.content๋ฅผ ๋ฐ์ JSON object๋ฅผ ํ์ฑํ๊ณ , markdown fence, ์๋ค ์ค๋ช
, ๊ธด ๊ณต๋ฐฑ ํ ๋จ์ brace ๋๋ฝ ๊ฐ์ ์๋ต์ ๊ฐ๋ฅํ ๋ฒ์์์ ๋ณต๊ตฌํฉ๋๋ค. ๊ทธ๋๋ VLM_RESPONSE_INVALID_JSON์ด ๋ฐ์ํ๋ฉด ๋ชจ๋ธ์ด JSON์ ๋๊น์ง ์์ฑํ์ง ๋ชปํ ๊ฒ์ด๋ฏ๋ก KIE_FIELD_GROUP_SIZE=1์ ์ ์งํ๊ณ , VLM_INFERENCE_PARAMS์ max_completion_tokens๋ฅผ ๋ณด์์ ์ผ๋ก ์ ํํ๊ฑฐ๋ ์๋ฒ/model์ ๋ฐ๊ฟ ํ์ธํฉ๋๋ค.
Backend tests:
cd backend
../.venv/bin/python -m pytest testsFrontend build:
npm run build --prefix frontendLarge mock smoke:
./.venv/bin/python scripts/run_large_mock_smoke.py --count 1000PoC UI smoke:
./.venv/bin/python scripts/run_poc_ui_smoke.pyDiff whitespace check:
git diff --check| Env | Default | Description |
|---|---|---|
UPLOAD_CHUNK_FILES |
10 |
frontend๊ฐ system status์์ ์ฝ๋ chunk ํ์ผ ์ |
PREPROCESS_MAX_WORKERS |
2 |
๋ฌธ์ ์ ์ฒ๋ฆฌ ๋์์ฑ |
WORKFLOW_MAX_WORKERS |
16 |
๋ฌธ์๋ณ workflow local ์์ ๋์์ฑ |
DOCUMENT_PAGE_MAX_LONG_EDGE |
3000 |
preview/VLM์ฉ JPEG ๊ธด ๋ณ ์ ํ |
DOCUMENT_PAGE_JPEG_QUALITY |
88 |
preview/VLM์ฉ JPEG ํ์ง |
VLM_BASE_URL |
"" |
๋ก์ปฌ ๋๋ ์ฌ์ค OpenAI-compatible VLM endpoint |
VLM_INFERENCE_PARAMS |
reasoning/thinking off |
VLM ์ถ๋ก ํ๋ผ๋ฏธํฐ JSON. reasoning_effort, thinking, temperature, verbosity, max_completion_tokens, top_p, service_tier๋ฅผ ์ค์ |
VLM_TIMEOUT_SECONDS |
120 |
provider request 1ํ ์ต๋ ๋๊ธฐ ์๊ฐ. ๋ก์ปฌ ๋ํ ๋ชจ๋ธ์ 300~900 ๊ถ์ฅ |
VLM_MAX_CONCURRENT_REQUESTS |
8 |
provider๋ก ๋๊ฐ๋ AI ๋์ ์์ฒญ ์ |
KIE_FIELD_GROUP_SIZE |
2 |
KIE ์์ฒญ 1ํ์ ๋ฌถ๋ field ์. ๋ก์ปฌ VLM์ 1๋ก ์ค์ด๋ฉด timeout/JSON ์คํจ๋ฅผ ์ค์ผ ์ ์์ |
DATABASE_POOL_SIZE |
8 |
SQLAlchemy DB connection pool ํฌ๊ธฐ |
DATABASE_MAX_OVERFLOW |
0 |
pool ํฌ๊ธฐ๋ฅผ ๋๋ ์์ connection ํ์ฉ ์ |
DATABASE_POOL_TIMEOUT_SECONDS |
30 |
DB connection ๋๊ธฐ timeout |
UPLOAD_MAX_BATCH_FILES |
10000 |
ํ ๋ฒ์ ์ ๋ก๋ํ ์ ์๋ batch ํ์ผ ์ |
UPLOAD_RETENTION_HOURS |
0 |
๋ก์ปฌ ๊ธฐ๋ณธ ๋ฌธ์ ๋ณด์กด ์๊ฐ |
Workflow local blocking work๋ WORKFLOW_MAX_WORKERS ํฌ๊ธฐ์ ์ ์ฉ executor ํ๋ก ์ ํํฉ๋๋ค. ๋๋ ๋ฌธ์ ์คํ์์ worker ๋๊ธฐ ์์ฒด๊ฐ Python default threadpool์ ์ ์ ํ์ง ์๋๋ก ํ๊ธฐ ์ํ ๊ตฌ์กฐ์
๋๋ค.
Workflow ํ๋ฉด์ ์ฒ๋ฆฌ ์ค์ workflow item์ด ๋ชจ๋ ๋จ๊ณ์ ์ง์
ํ ๋ฌธ์ ์์
๋๋ค. ์ค์ provider ๋์ ํธ์ถ ์๋ ๋ณ๋ KPI์ธ AI ์์ฒญ ์ค / AI ์์ฒญ ํ๋, provider ํธ์ถ ๋๊ธฐ๋ AI ์์ฒญ ๋๊ธฐ๋ก ํ์๋ฉ๋๋ค. async VLM ํธ์ถ์ VLM_TIMEOUT_SECONDS ์์ ์๋ฃ๋์ง ์์ผ๋ฉด ์คํจ/์ฌ์๋ ๊ฒฝ๋ก๋ก ์๋ ดํฉ๋๋ค. KIE ๋จ์ผ ์คํ ํ๋ฉด์ frontend ์์ฒด ์ ํ ์๊ฐ์ผ๋ก ์คํจ ์ฒ๋ฆฌํ์ง ์๊ณ backend job ์ํ๋ฅผ ๊ณ์ ๋ฐ๋ผ๊ฐ๋๋ค. ๋ก์ปฌ OpenAI-compatible ์๋ฒ๋ strict structured output ๋์ raw JSON fallback ๊ฒฝ๋ก๋ฅผ ์ฌ์ฉํ๋ฏ๋ก, ์๋ต์ด ๋์ฐฉํ๋๋ฐ ํ๋ฉด์ด ์งํ๋์ง ์๋๋ค๋ฉด backend job์ error_message์ VLM_RESPONSE_INVALID_JSON ์ฌ๋ถ๋ฅผ ๋จผ์ ํ์ธํฉ๋๋ค.
์ด์์์ 5,000์ฅ ์ด์ ๋๋ ์ฒ๋ฆฌ๋ฅผ ์์ฃผ ์คํํ๋ค๋ฉด SQLite๋ณด๋ค Postgres ์ฌ์ฉ์ ๊ถ์ฅํฉ๋๋ค.
backend/ FastAPI API, document processing, workflow execution
frontend/ React application
scripts/ local run and mock smoke scripts
docs/ template JSON and README media source
assets/ README images and local sample documents




