전체를 도는 것은 AgenticRLSCStructuriserManager 하나다.
ID를 단순화해 두고, 아래 ①–③ 루프를 돌린 뒤, 가장 좋은 결과를 골라 원본 ID로 되돌린다.
AgenticRLSCStructuriserManager
createIdMapping(단순 ID) → 아래 루프 반복 → selectBestRLSC → restoreRLSCIds(원본 ID)
⓪ 전처리는 이 루프보다 앞단에서 한 번만 돈다.
Full Sheet를 그대로 LLM에 넣지 않는다. 절대좌표로 펴고, 페이지 role을 판정하고,
배경을 떼어 낸 뒤 전경만 구조화 대상으로 넘긴다 — 토큰이 줄고 정확도가 오른다.
Full Sheet
원본 레이아웃 시트 · PageJson
TemplateDefiner
페이지 role 판정 · per_page_page_role
BackgroundExtractor
배경/전경 분리 (slidemaster / foreground)
foreground ALSC
구조화 대상 (배경 제외 → 토큰↓ · 정확도↑)
전처리 산출물 foreground ALSC가 ①의 입력이 된다.
§1
구조(type) 결정 — LLM이 '어떻게 묶을지'를 정한다
IN: foreground ALSC
⓪ 산출 · 단순 ID
callLLMForLayoutFunctions
→ LayoutFunction[] · 모드: LLM / CustomModel
applyPostProcessing
1×N Grid 등 비효율 구조 정규화
applyLayoutFunctions
명령 → 실제 트리 생성
OUT: 트리 (아직 role 없음)
newRlscNoRole
여기가 추론이다
말단 type은 원본에서 그대로 가져오지만, 컨테이너(그룹핑)는 여기서 LLM이 만들어 낸다.
즉 구조는 '자동 계산'이 아니라 추론 결과다.
§2
role 부여 — 생성된 트리에 의미역할 얹기
callLLMForRoleAssignment
→ 각 요소의 role 후보 (roleFunctionsYaml)
confidence ≥ 0.7 필터
ROLE_ASSIGNMENT_CONFIDENCE_THRESHOLD
applyRoleAssignments
통과한 role만 트리에 반영
OUT: 트리 + role = 후보 RLSC
rlsc (with role)
임계 미만 role은 버린다 — 무리한 추론을 방지한다. role은 optional이라 이렇게 나중에 얹힌다.
화면에 보이는 Inference Model Type이 바로 이 모델이다.
구조가 옳은지 점수화하며 개선한다. 규칙 기반 분석 → 채점 → 계속할지 결정, 세 부품이 한 바퀴를 이룬다.
반복 루프 (상세: 도식 8)
- ContextGenerator — 규칙 기반 구조 분석
- Evaluator — 0~1 점수 (role 가중 0.30 최대)
- Iterator — generate / complete / abort
generate → ①로 복귀(피드백 반영) · complete·abort → 루프 탈출
selectBestRLSC
히스토리 중 최고 overall 점수 선택
restoreRLSCIds
단순 ID → 원본 요소 ID 복원
최종 RLSC
layouts.structured_content_agentic_jsonb
generate일 때는 피드백을 안고 §1 구조 결정으로 되돌아간다 — 이 되돌이가 반복 개선의 실체다.