Improve slide quality loop and refresh run-001 output
This commit is contained in:
@@ -169,16 +169,21 @@ def _stage_1_7(ctx: PipelineContext) -> PipelineContext:
|
||||
containers=ctx.containers,
|
||||
page_structure=ctx.page_structure.roles,
|
||||
)
|
||||
ctx.references = {
|
||||
role: BlockReference(
|
||||
block_id=ref['block_id'],
|
||||
variant=ref['variant'],
|
||||
visual_type=ref['visual_type'],
|
||||
schema_info=ref['schema_info'],
|
||||
design_reference_html=ref['design_reference_html'],
|
||||
)
|
||||
for role, ref in refs_raw.items()
|
||||
}
|
||||
normalized: dict[str, list[BlockReference]] = {}
|
||||
for role, ref in refs_raw.items():
|
||||
ref_list = ref if isinstance(ref, list) else [ref]
|
||||
normalized[role] = [
|
||||
BlockReference(
|
||||
block_id=item.get('block_id', ''),
|
||||
variant=item.get('variant', ''),
|
||||
visual_type=item.get('visual_type', ''),
|
||||
schema_info=item.get('schema_info', {}),
|
||||
design_reference_html=item.get('design_reference_html', ''),
|
||||
)
|
||||
for item in ref_list
|
||||
if isinstance(item, dict)
|
||||
]
|
||||
ctx.references = normalized
|
||||
ctx.save_snapshot('stage_1_7')
|
||||
return ctx
|
||||
|
||||
@@ -187,7 +192,8 @@ def _stage_1_5b(ctx: PipelineContext) -> PipelineContext:
|
||||
updated = {}
|
||||
font_map = {'본심': 'core', '배경': 'bg', '첨부': 'sidebar', '결론': 'core'}
|
||||
for role, ci in ctx.containers.items():
|
||||
ref = ctx.references.get(role)
|
||||
refs = ctx.references.get(role, [])
|
||||
ref = refs[0] if refs else None
|
||||
schema_info = ref.schema_info if ref else {}
|
||||
font_size = getattr(ctx.font_hierarchy, font_map.get(role, 'core'), 12.0)
|
||||
budget = calculate_design_budget(
|
||||
@@ -217,7 +223,6 @@ def _topic(ctx: PipelineContext, topic_id: int) -> Topic | None:
|
||||
|
||||
def _build_stage2_retry_html(ctx: PipelineContext, retry_plan: dict) -> dict:
|
||||
title = ctx.analysis.title
|
||||
core_message = ctx.analysis.core_message
|
||||
|
||||
problem_topic = _topic(ctx, 1)
|
||||
evidence_topic = _topic(ctx, 4)
|
||||
@@ -226,36 +231,37 @@ def _build_stage2_retry_html(ctx: PipelineContext, retry_plan: dict) -> dict:
|
||||
conclusion_topic = _topic(ctx, 6)
|
||||
dx_topic = _topic(ctx, 2)
|
||||
|
||||
problem_text = problem_topic.summary if problem_topic and problem_topic.summary else 'DX와 BIM이 혼용되며 BIM 도입을 DX 완성으로 오인하는 문제가 발생한다.'
|
||||
problem_text = problem_topic.summary if problem_topic and problem_topic.summary else '건설산업 디지털 전환 논의에서 DX와 BIM이 혼용되며 BIM 도입을 DX 완성으로 오인하는 문제가 발생하고 있다.'
|
||||
relation_text = relation_topic.summary if relation_topic and relation_topic.summary else 'DX와 GIS, BIM, Digital Twin의 관계를 시각적으로 드러낸다.'
|
||||
evidence_text = evidence_topic.summary if evidence_topic and evidence_topic.summary else '정책 문서에서도 DX와 BIM이 혼용되며 이를 바로잡을 필요가 있다.'
|
||||
dx_text = dx_topic.summary if dx_topic and dx_topic.summary else 'DX는 상위 개념이고 BIM은 핵심 기술이다.'
|
||||
dx_text = dx_topic.summary if dx_topic and dx_topic.summary else 'DX는 상위 개념이고 BIM은 이를 실행하는 핵심 기술이다.'
|
||||
compare_text = comparison_topic.summary if comparison_topic and comparison_topic.summary else '범위·프로세스·성과품·확장성의 4개 비교축으로 DX와 BIM 차이를 짧고 직접적으로 보여준다.'
|
||||
conclusion_text = conclusion_topic.summary if conclusion_topic and conclusion_topic.summary else '결론: BIM은 건설산업 DX를 수행하는 과정의 가장 기초가 되는 일부분이다.'
|
||||
|
||||
body_html = f"""
|
||||
<div style="width:100%; height:100%; box-sizing:border-box; font-family:'Segoe UI',sans-serif; color:#0f172a; display:flex; flex-direction:column; gap:10px;">
|
||||
<div style="width:100%; background:linear-gradient(135deg,#fef2f2 0%,#fee2e2 100%); border:2px solid #fca5a5; border-radius:10px; padding:12px 16px; box-sizing:border-box;">
|
||||
<div style="display:flex; gap:10px; align-items:flex-start;">
|
||||
<div style="font-size:20px; line-height:1;">⚠️</div>
|
||||
<div>
|
||||
<div style="font-size:14px; font-weight:800; color:#991b1b; margin-bottom:4px;">개념 혼용의 현실</div>
|
||||
<div style="font-size:11px; line-height:1.55; color:#7f1d1d;">{problem_text}</div>
|
||||
</div>
|
||||
<div style="display:grid; grid-template-columns:1.15fr 0.85fr; gap:10px;">
|
||||
<div style="background:linear-gradient(135deg,#fff7ed 0%,#ffedd5 100%); border:1px solid #fdba74; border-radius:12px; padding:12px 14px;">
|
||||
<div style="font-size:11px; font-weight:800; color:#c2410c; margin-bottom:4px;">왜 다시 정리해야 하는가</div>
|
||||
<div style="font-size:10px; line-height:1.55; color:#7c2d12;">{problem_text}</div>
|
||||
</div>
|
||||
<div style="background:linear-gradient(135deg,#eff6ff 0%,#dbeafe 100%); border:1px solid #93c5fd; border-radius:12px; padding:12px 14px;">
|
||||
<div style="font-size:11px; font-weight:800; color:#1d4ed8; margin-bottom:4px;">핵심 판단</div>
|
||||
<div style="font-size:13px; font-weight:800; line-height:1.45; color:#1e3a8a;">DX는 상위 개념이고, BIM은 이를 실행하는 핵심 기술이다.</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="relation-diagram-card" style="background:#ffffff; border:1px solid #cbd5e1; border-radius:14px; padding:14px 16px; box-sizing:border-box; flex:1;">
|
||||
<div style="display:flex; justify-content:space-between; align-items:flex-start; gap:12px; margin-bottom:10px;">
|
||||
<div class="relation-diagram-card" style="background:#ffffff; border:1px solid #cbd5e1; border-radius:14px; padding:14px 16px; box-sizing:border-box; display:flex; flex-direction:column; gap:10px;">
|
||||
<div style="display:flex; justify-content:space-between; align-items:flex-start; gap:12px;">
|
||||
<div>
|
||||
<div style="font-size:12px; font-weight:800; color:#1e40af; margin-bottom:4px;">{title}</div>
|
||||
<div style="font-size:11px; line-height:1.55; color:#334155;">{dx_text}</div>
|
||||
<div style="font-size:10px; line-height:1.55; color:#334155;">{dx_text}</div>
|
||||
</div>
|
||||
<div style="font-size:10px; color:#166534; background:#dcfce7; border:1px solid #86efac; border-radius:999px; padding:4px 8px; white-space:nowrap;">[그림 1] DX와 핵심기술간 상호관계</div>
|
||||
</div>
|
||||
|
||||
<div style="display:flex; align-items:flex-start; gap:16px; margin-bottom:10px;">
|
||||
<div style="width:220px; flex-shrink:0; background:#f8fafc; border:1px solid #dbeafe; border-radius:14px; padding:12px; box-sizing:border-box;">
|
||||
<div style="display:grid; grid-template-columns:220px 1fr; gap:14px; align-items:start;">
|
||||
<div style="background:#f8fafc; border:1px solid #dbeafe; border-radius:14px; padding:12px; box-sizing:border-box;">
|
||||
<div style="display:flex; align-items:center; justify-content:center; gap:8px; margin-bottom:8px;">
|
||||
<div style="min-width:72px; text-align:center; background:#1d4ed8; color:#ffffff; border-radius:999px; padding:8px 12px; font-size:14px; font-weight:800;">DX</div>
|
||||
<div style="font-size:14px; color:#94a3b8;">→</div>
|
||||
@@ -266,22 +272,35 @@ def _build_stage2_retry_html(ctx: PipelineContext, retry_plan: dict) -> dict:
|
||||
<div style="grid-column:1 / span 2; background:#ffffff; border:1px solid #cbd5e1; border-radius:10px; padding:10px; text-align:center; font-size:11px; font-weight:700;">Digital Twin</div>
|
||||
</div>
|
||||
</div>
|
||||
<div style="flex:1; font-size:11px; line-height:1.6; color:#334155;">
|
||||
<div style="margin-bottom:6px;">• {relation_text}</div>
|
||||
<div style="margin-bottom:6px;">• GIS는 공간 분석과 위치 기반 정보를 제공한다.</div>
|
||||
<div>• BIM은 형상정보와 내용정보를 함께 다루는 핵심 인프라 기술이다.</div>
|
||||
<div style="display:flex; flex-direction:column; gap:8px;">
|
||||
<div style="background:#f8fafc; border:1px solid #e2e8f0; border-radius:12px; padding:10px 12px;">
|
||||
<div style="font-size:11px; font-weight:800; color:#0f172a; margin-bottom:4px;">관계 해석</div>
|
||||
<div style="font-size:10px; line-height:1.55; color:#334155;">{relation_text}</div>
|
||||
</div>
|
||||
<div style="display:grid; grid-template-columns:1fr 1fr; gap:8px;">
|
||||
<div style="background:#ffffff; border:1px solid #cbd5e1; border-radius:10px; padding:9px 10px;">
|
||||
<div style="font-size:10px; font-weight:800; color:#0f172a; margin-bottom:3px;">GIS 역할</div>
|
||||
<div style="font-size:9px; line-height:1.5; color:#475569;">공간 분석과 위치 기반 정보를 제공한다.</div>
|
||||
</div>
|
||||
<div style="background:#ffffff; border:1px solid #cbd5e1; border-radius:10px; padding:9px 10px;">
|
||||
<div style="font-size:10px; font-weight:800; color:#0f172a; margin-bottom:3px;">BIM 역할</div>
|
||||
<div style="font-size:9px; line-height:1.5; color:#475569;">형상정보와 내용정보를 함께 다루는 핵심 인프라 기술이다.</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="comparison-summary-card" style="background:#eff6ff; border:1px solid #bfdbfe; border-radius:12px; padding:10px 12px; box-sizing:border-box;">
|
||||
<div style="font-size:11px; font-weight:800; color:#1d4ed8; margin-bottom:8px;">DX와 BIM 핵심 비교</div>
|
||||
<div style="display:grid; grid-template-columns:1fr 1fr; gap:8px; font-size:10px; line-height:1.45; color:#334155;">
|
||||
<div><span style="font-weight:800; color:#0f172a;">범위</span><br>DX는 BIM을 포함하는 상위 개념</div>
|
||||
<div><span style="font-weight:800; color:#0f172a;">프로세스</span><br>DX는 근본적 개선, BIM은 기존 2D 연장</div>
|
||||
<div><span style="font-weight:800; color:#0f172a;">성과품</span><br>DX는 공학 정보 연계, BIM은 3D 모델 중심</div>
|
||||
<div><span style="font-weight:800; color:#0f172a;">확장성</span><br>DX는 전 생애주기, BIM은 분야별 단절 위험</div>
|
||||
</div>
|
||||
<div style="margin-top:8px; font-size:10px; color:#475569; line-height:1.5;">{compare_text}</div>
|
||||
<div class="comparison-summary-card" style="background:#eff6ff; border:1px solid #bfdbfe; border-radius:12px; padding:10px 12px; box-sizing:border-box; display:grid; grid-template-columns:120px 1fr; gap:12px;">
|
||||
<div>
|
||||
<div style="font-size:11px; font-weight:800; color:#1d4ed8; margin-bottom:4px;">DX와 BIM 차이</div>
|
||||
<div style="font-size:9px; line-height:1.5; color:#475569;">{compare_text}</div>
|
||||
</div>
|
||||
<div style="display:grid; grid-template-columns:1fr 1fr; gap:8px; font-size:9px; line-height:1.45; color:#334155;">
|
||||
<div style="background:#ffffff; border:1px solid #cbd5e1; border-radius:10px; padding:8px 10px;"><span style="font-weight:800; color:#0f172a;">범위</span><br>DX는 BIM을 포함하는 상위 개념</div>
|
||||
<div style="background:#ffffff; border:1px solid #cbd5e1; border-radius:10px; padding:8px 10px;"><span style="font-weight:800; color:#0f172a;">프로세스</span><br>DX는 근본적 개선, BIM은 기존 2D 연장</div>
|
||||
<div style="background:#ffffff; border:1px solid #cbd5e1; border-radius:10px; padding:8px 10px;"><span style="font-weight:800; color:#0f172a;">성과품</span><br>DX는 공학 정보 연계, BIM은 3D 모델 중심</div>
|
||||
<div style="background:#ffffff; border:1px solid #cbd5e1; border-radius:10px; padding:8px 10px;"><span style="font-weight:800; color:#0f172a;">확장성</span><br>DX는 전 생애주기, BIM은 분야별 단절 위험</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -289,31 +308,27 @@ def _build_stage2_retry_html(ctx: PipelineContext, retry_plan: dict) -> dict:
|
||||
|
||||
sidebar_html = f"""
|
||||
<div style="width:100%; height:100%; box-sizing:border-box; font-family:'Segoe UI',sans-serif; display:flex; flex-direction:column; gap:8px;">
|
||||
<div style="display:flex; gap:12px; align-items:flex-start; padding:12px 14px; background:#f8fafc; border-radius:10px; border:1px solid #e2e8f0;">
|
||||
<div style="width:28px; height:28px; border-radius:50%; background:#2563eb; display:flex; align-items:center; justify-content:center; color:#ffffff; font-size:12px; font-weight:800; flex-shrink:0;">1</div>
|
||||
<div>
|
||||
<div style="font-size:12px; font-weight:800; color:#1e293b; margin-bottom:3px;">건설산업</div>
|
||||
<div style="font-size:10px; line-height:1.45; color:#475569;">다양한 기술을 통합해 시설물을 구현하는 종합 산업</div>
|
||||
<div style="background:#ffffff; border:1px solid #cbd5e1; border-radius:12px; padding:12px 14px;">
|
||||
<div style="font-size:11px; font-weight:800; color:#1e293b; margin-bottom:6px;">핵심 용어 정리</div>
|
||||
<div style="display:flex; flex-direction:column; gap:8px;">
|
||||
<div style="background:#f8fafc; border:1px solid #e2e8f0; border-radius:10px; padding:9px 10px;">
|
||||
<div style="font-size:10px; font-weight:800; color:#0f172a; margin-bottom:3px;">건설산업</div>
|
||||
<div style="font-size:9px; line-height:1.5; color:#475569;">다양한 기술을 통합해 시설물을 구현하는 종합 산업</div>
|
||||
</div>
|
||||
<div style="background:#eff6ff; border:1px solid #93c5fd; border-radius:10px; padding:9px 10px;">
|
||||
<div style="font-size:10px; font-weight:800; color:#1e3a8a; margin-bottom:3px;">BIM</div>
|
||||
<div style="font-size:9px; line-height:1.5; color:#334155;">3차원 모델 기반의 정보관리 도구이자 협업 인프라</div>
|
||||
<div style="font-size:8px; color:#64748b; margin-top:4px;">출처: 국토교통부 BIM 기본지침</div>
|
||||
</div>
|
||||
<div style="background:#eff6ff; border:1px solid #bfdbfe; border-radius:10px; padding:9px 10px;">
|
||||
<div style="font-size:10px; font-weight:800; color:#1e3a8a; margin-bottom:3px;">DX</div>
|
||||
<div style="font-size:9px; line-height:1.5; color:#334155;">디지털 기술 기반으로 업무방식과 가치구조를 전환하는 상위 개념</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div style="display:flex; gap:12px; align-items:flex-start; padding:12px 14px; background:#f8fafc; border-radius:10px; border:1px solid #e2e8f0;">
|
||||
<div style="width:28px; height:28px; border-radius:50%; background:#2563eb; display:flex; align-items:center; justify-content:center; color:#ffffff; font-size:12px; font-weight:800; flex-shrink:0;">2</div>
|
||||
<div>
|
||||
<div style="font-size:12px; font-weight:800; color:#1e293b; margin-bottom:3px;">BIM</div>
|
||||
<div style="font-size:10px; line-height:1.45; color:#475569;">3차원 모델 기반의 정보관리 도구이자 협업 인프라</div>
|
||||
<div style="font-size:9px; color:#64748b; margin-top:4px;">출처: 국토교통부 BIM 기본지침</div>
|
||||
</div>
|
||||
</div>
|
||||
<div style="display:flex; gap:12px; align-items:flex-start; padding:12px 14px; background:#f8fafc; border-radius:10px; border:1px solid #e2e8f0;">
|
||||
<div style="width:28px; height:28px; border-radius:50%; background:#2563eb; display:flex; align-items:center; justify-content:center; color:#ffffff; font-size:12px; font-weight:800; flex-shrink:0;">3</div>
|
||||
<div>
|
||||
<div style="font-size:12px; font-weight:800; color:#1e293b; margin-bottom:3px;">DX</div>
|
||||
<div style="font-size:10px; line-height:1.45; color:#475569;">디지털 기술 기반으로 업무방식과 가치구조를 전환하는 상위 개념</div>
|
||||
</div>
|
||||
</div>
|
||||
<div style="background:#fff7ed; border:1px solid #fdba74; border-radius:10px; padding:12px 14px; box-sizing:border-box; margin-top:2px;">
|
||||
<div style="font-size:11px; font-weight:800; color:#c2410c; margin-bottom:5px;">정책 혼용 사례</div>
|
||||
<div style="font-size:10px; line-height:1.5; color:#7c2d12;">{evidence_text}</div>
|
||||
<div style="background:#fff7ed; border:1px solid #fdba74; border-radius:12px; padding:12px 14px; box-sizing:border-box;">
|
||||
<div style="font-size:11px; font-weight:800; color:#c2410c; margin-bottom:5px;">왜 혼용이 문제인가</div>
|
||||
<div style="font-size:10px; line-height:1.55; color:#7c2d12;">{evidence_text}</div>
|
||||
</div>
|
||||
</div>
|
||||
""".strip()
|
||||
@@ -357,7 +372,7 @@ async def _stage_2(ctx: PipelineContext, retry_plan: dict | None = None) -> Pipe
|
||||
analysis_dict['phase_t'] = {
|
||||
'font_hierarchy': ctx.font_hierarchy.model_dump(),
|
||||
'container_ratio': ctx.container_ratio,
|
||||
'references': {role: ref.model_dump() for role, ref in ctx.references.items()},
|
||||
'references': {role: [item.model_dump() for item in refs] for role, refs in ctx.references.items()},
|
||||
'design_budgets': {
|
||||
role: ci.design_budget.model_dump() if ci.design_budget else {}
|
||||
for role, ci in ctx.containers.items()
|
||||
|
||||
Reference in New Issue
Block a user