Skip to content

Commit 537c544

Browse files
DanMeonclaude
andcommitted
docs: v0.2.0 로드맵을 CLI → Document IR 로 전환
변경사항: - 상류 rhwp 크레이트가 이미 동일 이름 rhwp 바이너리를 제공하여 CLI 중복 회피 목적으로 v0.2.0 스코프를 Document IR 도입으로 변경 - v0.2.0/ir.md 신규: Pydantic V2 + JSON Schema Draft 2020-12 기반 Document IR 설계 (Section/Paragraph/Table/InlineRun/Provenance, 본문/장식 분리, 스키마 버저닝) - v0.2.0/cli.md 삭제 - design/v0.2.0/ir-design-research.md 신규: 7개 설계 의사결정(Block 유니온 확장·HTML 레이어·char 오프셋 단위·schema_version 타입·iter API·to_ir 캐싱·스키마 호스팅)을 수행자+검증자 2인 1조 병렬 리서치로 확정 - phase-2/3/4 버전 재매핑: IR 도입이 v0.2.0 으로 당겨지면서 후속 Phase 한 번씩 하향 (IR 확장 v0.3.0, view+RAG v0.4~0.6, writeback v0.7~1.0) - roadmap/README.md 버전 계획 표 갱신 + CLI 폐기 경위 각주 Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
1 parent 5b03ce1 commit 537c544

7 files changed

Lines changed: 1089 additions & 162 deletions

File tree

docs/design/v0.2.0/ir-design-research.md

Lines changed: 410 additions & 0 deletions
Large diffs are not rendered by default.

docs/roadmap/README.md

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@ rhwp-python 의 버전별 로드맵. 완료된 단계는 참고 자료, 미래
44

55
## 현재 상태
66

7-
- **v0.1.0**Phase 1 Python 바인딩 분사 + PyPI 배포 준비 (인프라 완료, 릴리스 실행 예정)
8-
- **v0.2.0**CLI 도입 (계획)
7+
- **v0.1.1**sdist 크기 수정 완료, PyPI 배포 완료
8+
- **v0.2.0**Document IR v1 (Pydantic + JSON Schema) 계획
99
- **v0.3.0+** — Phase 2 이후 기능 (설계 단계)
1010

1111
## 버전 계획
@@ -14,11 +14,13 @@ rhwp-python 의 버전별 로드맵. 완료된 단계는 참고 자료, 미래
1414

1515
| 버전·단계 | 주제 | 문서 |
1616
|---|---|---|
17-
| v0.1.0 | rhwp-python 분사 + PyPI 런칭 | [v0.1.0/rhwp-python.md](v0.1.0/rhwp-python.md) |
18-
| v0.2.0 | CLI (`rhwp` 커맨드 + 서브커맨드) | [v0.2.0/cli.md](v0.2.0/cli.md) |
19-
| Phase 2 (v0.3~0.4) | 계층 JSON IR 스키마 | [phase-2.md](phase-2.md) |
20-
| Phase 3 (v0.5~0.7) | view 렌더러 + RAG 로더 확장 | [phase-3.md](phase-3.md) |
21-
| Phase 4 (v0.8~1.0) | JSON IR → HWP 역생성 | [phase-4.md](phase-4.md) |
17+
| v0.1.0 / v0.1.1 | rhwp-python 분사 + PyPI 런칭 (sdist 보정 포함) | [v0.1.0/rhwp-python.md](v0.1.0/rhwp-python.md) |
18+
| v0.2.0 | Document IR v1 — Pydantic 모델 + JSON Schema 공개 | [v0.2.0/ir.md](v0.2.0/ir.md) |
19+
| Phase 2 (v0.3.0) | IR 확장 (이미지·수식·각주·머리글꼬리·TocEntry·Field) | [phase-2.md](phase-2.md) |
20+
| Phase 3 (v0.4~0.6) | view 렌더러 + RAG 로더 확장 | [phase-3.md](phase-3.md) |
21+
| Phase 4 (v0.7~1.0) | JSON IR → HWP 역생성 | [phase-4.md](phase-4.md) |
22+
23+
> CLI 는 v0.2.0 원안이었으나 상류 Rust 크레이트(`edwardkim/rhwp`)가 이미 동일 이름의 `rhwp` 바이너리를 제공하여 폐기. 상세 경위와 재검토 조건은 [v0.2.0/ir.md § 방향 전환 배경](v0.2.0/ir.md).
2224
2325
## 원칙
2426

@@ -32,10 +34,10 @@ rhwp-python 의 버전별 로드맵. 완료된 단계는 참고 자료, 미래
3234

3335
| 버전 | 대략 목표 시점 |
3436
|---|---|
35-
| v0.1.0 | 2026 Q2 |
37+
| v0.1.0 / v0.1.1 | 2026 Q2 (배포 완료) |
3638
| v0.2.0 | 2026 Q2 ~ Q3 |
37-
| v0.3.0 ~ v0.4.0 | 2026 Q3 ~ Q4 |
38-
| v0.5.0 ~ v0.7.0 | 2027 |
39+
| v0.3.0 | 2026 Q3 ~ Q4 |
40+
| v0.4.0 ~ v0.6.0 | 2027 |
3941
| v1.0.0 | 2027+ |
4042

4143
타임라인은 **유동적** — 상류 `edwardkim/rhwp` 진척과 커뮤니티 수요에 따라 변경.

docs/roadmap/phase-2.md

Lines changed: 46 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -1,62 +1,53 @@
1-
# Phase 2 — 계층 JSON IR 스키마
1+
# Phase 2 — Document IR 확장
22

3-
**대상 버전**: v0.3.0 ~ v0.4.0
4-
**선행 조건**: v0.1.x (Phase 1 바인딩) GA, v0.2.x (CLI) 안정
3+
**대상 버전**: v0.3.0
4+
**선행 조건**: v0.2.0 Document IR v1 (기본 스키마) GA — [v0.2.0/ir.md](v0.2.0/ir.md)
5+
6+
## 포지셔닝 변경 안내
7+
8+
Phase 2 원안은 "계층 JSON IR 스키마 도입 + 확장" (v0.3.0 ~ v0.4.0 두 릴리스) 이었으나, v0.2.0 의 CLI 계획이 폐기되면서 **IR 도입 자체를 v0.2.0 으로 당김**. Phase 2 는 이제 v0.2.0 기본 스키마 위의 **확장 타입** 만 다룬다.
9+
10+
- **v0.2.0 (Phase 2 전) — 기본 IR**: Document / Section / Paragraph / Table / Cell / InlineRun / Provenance + JSON Schema v1.0
11+
- **v0.3.0 (Phase 2) — IR 확장**: 이미지 / 수식 / 각주 / 미주 / 머리글 / 꼬리말 / 목차항목 / 필드 + JSON Schema v1.1
512

613
## 목표
714

8-
HWP 문서를 구조화된 JSON (Intermediate Representation) 으로 추출해 RAG 파이프라인에서 **의미 단위**로 활용. 텍스트 추출만 가능했던 Phase 1 을 넘어 문서의 계층 구조를 유지.
9-
10-
## 범위
11-
12-
- 재귀 중첩 표 (`TableCell` 안의 또 다른 `Table`) 를 IR 노드로 재구성
13-
- `rowspan` / `colspan` 병합 셀 보존
14-
- 비의미 셀 (레이아웃용 빈 셀 등) 에 시맨틱 태그 부여 — RAG 가 노이즈로 필터링 가능
15-
- 문단·섹션·페이지 경계 보존
16-
17-
## 예시 IR (초안)
18-
19-
```json
20-
{
21-
"type": "Document",
22-
"metadata": { "source": "a.hwp", "page_count": 3 },
23-
"sections": [
24-
{
25-
"type": "Section",
26-
"blocks": [
27-
{ "type": "Paragraph", "text": "..." },
28-
{
29-
"type": "Table",
30-
"rows": [
31-
[
32-
{ "type": "Cell", "rowspan": 2, "colspan": 1, "blocks": [...] },
33-
{ "type": "Cell", "semantic": "placeholder" }
34-
]
35-
]
36-
}
37-
]
38-
}
39-
]
40-
}
41-
```
42-
43-
## Python API (초안)
44-
45-
```python
46-
doc = rhwp.parse("a.hwp")
47-
ir = doc.to_ir() # Python dict (JSON-serializable)
48-
ir_json: str = doc.to_ir_json()
49-
```
50-
51-
## 릴리스 분할
52-
53-
| 버전 | 범위 |
54-
|---|---|
55-
| v0.3.0 | IR 기본 스키마 (Paragraph / Section / Table) |
56-
| v0.4.0 | IR 확장 (이미지 / 수식 / 각주 / 머리글꼬리) |
15+
v0.2.0 에서 확보한 RAG-친화적 기본 구조에 HWP 문서의 고유 의미 요소를 추가한다. 확장은 **후방 호환** 이 원칙 — 기존 소비자는 새 `Block.kind` 를 모르더라도 v0.2.0 시절 처리를 그대로 수행할 수 있어야 함 (unknown-kind graceful skip).
16+
17+
## 추가되는 블록 타입
18+
19+
### 일반 문서 요소 (DocLayNet 파생)
20+
21+
- **`PictureBlock`** — 이미지. `ref_mode: Literal["placeholder" | "embedded" | "external"]` (Docling `ImageRefMode` 패턴), `mime_type`, `caption`. 바이너리는 v0.3.0 에서 `placeholder` (텍스트 치환) 기본값, 임베딩은 v0.4.0+
22+
- **`FormulaBlock`** — 수식. HWP 수식은 자체 기호 체계 — `raw: str` (원본) + `tex: str | None` (향후 변환) 이중 필드
23+
- **`FootnoteBlock` / `EndnoteBlock`** — 각주/미주. `ref_id`, `number`, `content: list[Block]` (본문 재귀)
24+
- **`ListItemBlock`** — 목록 항목. `level: int`, `marker: str`, `inlines`
25+
- **`CaptionBlock`** — 표/그림 캡션. `refers_to: str | None` (대상 블록 id)
26+
27+
### HWP 고유 요소
28+
29+
- **`TocEntryBlock`** — 목차 항목. `level: int`, `page_no: int | None`, `target_id: str | None`
30+
- **`FieldBlock`** — 상호참조/변수 필드. `kind: "cross_ref" | "date" | "page_no" | ...`, `cached_value: str`
31+
- **`RevisionMark`** — 변경 이력 마커. v0.3.0 스코프 여부 재평가 (상류 지원 상태 확인 필요)
32+
33+
### Furniture 채움
34+
35+
v0.2.0 에서 `furniture.page_headers`/`page_footers` 는 빈 리스트로 출고됐으나 v0.3.0 에서 실제 내용 채움. 스키마 변화 없음 — 값 채움만.
36+
37+
## JSON Schema 변경
38+
39+
- `schema_version`: `Literal["1.0"]``Literal["1.0", "1.1"]` 확장
40+
- `Block` discriminated union 에 새 멤버 추가
41+
- `$id` URL 은 동일 유지 (`hwp_ir_v1.json`) — `v1` major 안의 minor 추가
42+
- 별도 스냅샷: `hwp_ir_v1_1.json` 게시 (구 버전 소비자를 위해)
43+
44+
## 릴리스 일정
45+
46+
단일 릴리스 (v0.3.0) — 8개 신규 블록 타입을 한 번에 안정화. 개별 타입별로 릴리스를 쪼개면 소비자가 어떤 Block 멤버가 존재하는지 반복 확인해야 함.
5747

5848
## 미확정 이슈
5949

60-
- IR 스키마를 Pydantic 모델로 노출할지 / dict 만 반환할지
61-
- JSON Schema 버전 관리 (`$schema` URL) 정책
62-
- 대용량 문서 스트리밍 IR (generator 기반 `iter_blocks()`)
50+
- **이미지 임베딩 전략**`embedded` 모드 지원 여부. base64 라 IR JSON 크기가 수 MB 단위로 증가할 수 있음. Docling 은 `PictureRefMode.PLACEHOLDER` 기본값 채택 — 동일 기본값 권장
51+
- **수식 TeX 변환** — HWP 수식 → LaTeX 매핑. 상류 지원 확인 필요. 미지원 시 v0.3.0 은 `raw` 만, v0.4.0+ 에서 TeX 추가
52+
- **`FieldBlock.kind` 열거값** — HWP 필드 타입이 수십 개. 닫힌 `Literal` 로 시작하면 미지 필드에 대해 `ValidationError`. 대안: `kind: str` + `known_kind: FieldKind | None` 이중 필드
53+
- **중첩 Footnote 블록의 재귀 깊이** — 각주 내부에 표·그림 허용할 것인가? v0.3.0 초판은 단락 + 인라인만 허용하여 검증 부담 최소화

docs/roadmap/phase-3.md

Lines changed: 33 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,38 +1,51 @@
1-
# Phase 3 — view 렌더러 + RAG 로더 확장
1+
# Phase 3 — view 렌더러 + RAG 프레임워크 통합
22

3-
**대상 버전**: v0.5.0 ~ v0.7.0
4-
**선행 조건**: Phase 2 IR 스키마 안정 (v0.4.x)
3+
**대상 버전**: v0.4.0 ~ v0.6.0
4+
**선행 조건**: Phase 2 IR 확장 (v0.3.0) 안정
5+
6+
> 원안 대비 버전이 한 번씩 당겨짐 (v0.5~v0.7 → v0.4~v0.6) — v0.2.0 에서 IR 도입이 앞당겨지면서 후속 Phase 도 일괄 하향 이동.
57
68
## 목표
79

8-
IR 을 다른 포맷으로 렌더링하고, LangChain RAG 프레임워크로 통합 확장.
10+
v0.2.0/v0.3.0 에서 확정된 IR 을 다른 포맷으로 렌더링(view) 하고, LangChain 외의 RAG 프레임워크와 통합한다. HtmlRAG (WWW 2025, arXiv:2411.02959) 등 최근 연구는 LLM 에 문서를 제공할 때 **구조를 보존하는 HTML** 이 평문화 대비 우수함을 보고하므로, view 변환 품질이 RAG 체감 성능과 직결된다.
911

1012
## 범위
1113

12-
### view 렌더러
14+
### view 렌더러 (v0.4.0)
15+
16+
- `HwpDocument.to_markdown()` — IR → CommonMark + GFM 확장
17+
- 표는 GFM `|a|b|` 형태. `rowspan`/`colspan` 이 있는 셀은 GFM 으로 표현 불가 → HTML 인라인으로 폴백
18+
- 머리글·꼬리말은 YAML frontmatter (선택) 또는 주석 블록
19+
- 각주/미주는 CommonMark footnote 확장
20+
- 수식은 `$$ ... $$` (KaTeX 호환) — `FormulaBlock.tex` 가 있을 때만
21+
- `HwpDocument.to_html()` — IR → HTML5
22+
- `<article>`, `<section>`, `<table>` 등 시맨틱 태그
23+
- 접근성: `<caption>`, `<th scope>`, `aria-*` 기본 포함
24+
- CSS 는 기본 미동봉, 별도 `to_html(include_css=True)` 옵션
25+
- 이미지 처리: `Picture.ref_mode` 를 따름 (`placeholder``<img alt>`, `embedded` → base64 `src=`, `external` → 외부 파일 + 경로 반환)
1326

14-
- `to_markdown()` — IR → CommonMark
15-
- 표는 GFM `|a|b|` 형태, 중첩 표는 GFM fenced block 또는 HTML 인라인
16-
- 머리글·꼬리글은 frontmatter 또는 주석 처리
17-
- `to_html()` — IR → HTML
18-
- minimal CSS, 접근성 고려 (semantic tags)
19-
- 이미지는 base64 inline 또는 외부 파일 참조 선택
27+
HTML 은 `TableBlock.html` 과 별개 — TableBlock 수준 HTML 은 표 하나의 HTML 조각 (RAG 주입용), 문서 전체 `to_html()` 은 완전한 HTML5 문서 (브라우저 표시용).
2028

21-
### RAG 통합 확장
29+
### RAG 통합 확장 (v0.5.0 ~ v0.6.0)
2230

23-
- `rhwp.integrations.llamaindex.HwpReader` — LlamaIndex `BaseReader` 구현
24-
- (선택) `rhwp.integrations.haystack.HwpConverter` — Haystack 2.x `Converter`
31+
- **v0.5.0**`rhwp.integrations.llamaindex.HwpReader` (LlamaIndex `BaseReader` 구현)
32+
- `load_data()` / `lazy_load_data()` 동기 + async
33+
- IR → `Document`/`TextNode` 변환, `parent_id`/`prev`/`next` 링크 보존 (연구 결과 § 1 참조)
34+
- 섹션·단락을 `NodeRelationship.PARENT/CHILD` 로 표현 → `AutoMergingRetriever` 호환
35+
- **v0.6.0**`rhwp.integrations.haystack.HwpConverter` (Haystack 2.x `Converter`) — **커뮤니티 수요 확인 후**
36+
- Haystack `Document` 로 변환, `meta` 에 섹션 경계 힌트 저장
2537

2638
## 릴리스 분할
2739

2840
| 버전 | 범위 |
2941
|---|---|
30-
| v0.5.0 | `to_markdown()` / `to_html()` view |
31-
| v0.6.0 | LlamaIndex 통합 |
32-
| v0.7.0 | (선택) Haystack 통합 커뮤니티 수요 확인 후 |
42+
| v0.4.0 | `to_markdown()` / `to_html()` view — 표 rowspan/colspan HTML 인라인 처리 포함 |
43+
| v0.5.0 | LlamaIndex 통합 (`HwpReader`, AutoMergingRetriever 호환 node 트리) |
44+
| v0.6.0 | Haystack 통합 (커뮤니티 수요 확인 후) + LangChain 로더의 IR 직접 활용 (breadcrumb 자동 삽입 등 Anthropic Contextual Retrieval 스타일) |
3345

3446
## 미확정 이슈
3547

36-
- Markdown 방언 (CommonMark vs GFM vs Pandoc) — 기본 GFM, 확장 옵션 플래그
37-
- HTML 출력의 CSS 동봉 여부 — 기본 미동봉, 별도 함수로 제공
38-
- LlamaIndex 가 IR 스키마를 그대로 소비 가능할지, 혹은 LlamaIndex-native 타입으로 변환 레이어 필요할지
48+
- **Markdown 방언** — CommonMark / GFM / Pandoc Markdown / MyST. 기본값 GFM (표·각주 지원). Pandoc-compatible 플래그는 별도 옵션
49+
- **HTML 출력의 CSS 동봉 여부** — 기본 미동봉, `include_css: bool` 또는 별도 `style_bundle()` 함수
50+
- **LlamaIndex 가 IR 스키마를 그대로 소비 가능한가** — 현재 LlamaIndex `BaseNode` 는 자유형 `metadata: dict`. 완전 호환은 불가 (IR 의 Pydantic 타입 손실). 변환 레이어 필수 — 메타데이터에 `rhwp.ir.json` 키로 원본 IR 직렬화 보존하여 라운드트립 가능하게 설계
51+
- **Contextual Retrieval 자동 지원 여부** — Anthropic 기법은 LLM 호출 비용 유발. rhwp-python 이 이를 내장하면 비용이 사용자에게 불투명 → **미내장**. 대신 `doc.breadcrumb(node_id)` 헬퍼로 사용자가 수동 결합 가능하게 설계

docs/roadmap/phase-4.md

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
# Phase 4 — JSON IR → HWP 역생성
22

3-
**대상 버전**: v1.0.0 (안정화 + writeback 지원)
4-
**선행 조건**: rhwp Rust 코어의 HWP writer API 안정
3+
**대상 버전**: v0.7.0 ~ v1.0.0 (안정화 + writeback 지원)
4+
**선행 조건**: Phase 3 (v0.6.0 까지) GA + rhwp Rust 코어의 HWP writer API 안정
55

66
## 목표
77

@@ -25,9 +25,10 @@ Phase 4 는 rhwp **Rust 코어의 쓰기 API 성숙도** 에 좌우됨. 업스
2525

2626
| 버전 | 범위 |
2727
|---|---|
28-
| v0.8.0 (예상) | HWPX writeback baseline (단순 문서 왕복) |
29-
| v0.9.0 (예상) | HWPX writeback 확장 (표·이미지·수식) |
30-
| v1.0.0 | HWP5 writeback + API 안정 선언 |
28+
| v0.7.0 | HWPX writeback baseline (단순 문서 왕복) |
29+
| v0.8.0 | HWPX writeback 확장 (표·이미지·수식) |
30+
| v0.9.0 | HWP5 writeback baseline |
31+
| v1.0.0 | HWP5 writeback 확장 + API 안정 선언 |
3132

3233
## 1.0 안정화 기준
3334

docs/roadmap/v0.2.0/cli.md

Lines changed: 0 additions & 72 deletions
This file was deleted.

0 commit comments

Comments
 (0)