"""Phase 1~4 prompt templates for the translation pipeline.""" # ── Phase 1: 초벌 번역 + 고유명사 추출 + 요약 + 문체 분석 ─ SYSTEM_PROMPT_PHASE1 = """\ 당신은 전문 번역가입니다. 사용자의 지시에 따라 원문을 도착 언어로 번역하고, \ 고유명사를 추출하며, 내용 요약을 작성하고, 문체를 분석합니다. 번역할 때 원문의 \ 주어와 목적어, 인칭, 시제, 양태, 높임 수준을 정확히 보존합니다.\ """ def build_phase1_user_prompt( source_text: str, source_language: str, target_language: str ) -> str: source_instruction = ( "원문의 언어를 자동으로 판단하고" if source_language == "auto" else f'원문이 "{source_language}"임을 전제로' ) return f"""\ {source_instruction} 다음 원문을 "{target_language}"으로 번역하세요. 번역 결과를 반드시 아래 JSON 포맷으로만 반환하세요 (마크다운 코드 블록 없이 순수 JSON): {{ "translated": "(도착어 번역문)", "proper_nouns": [ {{"original": "(원문 고유명사)", "suggested": "(제안 도착어 번역)"}} ], "summary": "(내용 요약, 2-3문장以内)", "style": "(문체 분석: 예: '공식적인', '친근한', '학술적', '보도풍', '문학적이고 서정적인' 등)" }} 고유명사 추출 규칙: - 인물명,地名, 기관명, 제품명, 작품명 등 고유 명사를 포함 - 일반 명사는 제외 (예: "정부", "회사"는 제외) - 없는 경우 빈 배열 []로 반환 원문: --- {source_text} ---""" # ── Phase 3: 재번역 (고유명사 + 문체 적용) ─────────────── SYSTEM_PROMPT_PHASE3 = """\ 당신은 숙련된 번역 교정가입니다. 제공된 초벌 번역문을 고유명사 매핑과 \ 문체 지시를 엄격히 적용하여 재번역하세요.\ """ def build_phase3_user_prompt( source_text: str, phase1_translated: str, proper_nouns: list[dict], style: str, target_language: str, ) -> str: pn_lines = "\n".join( f" - {pn['original']} → {pn.get('final') or pn.get('suggested', '')}" for pn in proper_nouns if pn.get("original") or pn.get("suggested") ) return f"""\ 다음 초벌 번역문을 "{target_language}"으로 재번역하세요. 고유명사 매핑 (반드시 적용): {pn_lines} 문체: {style} 재번역 규칙: 1. 위 고유명사 매핑을 반드시 준수하세요 2. 지시된 문체에 맞게 어조를 조정하세요 3. 원문을 기준으로 초벌 번역의 누락이나 오역을 바로잡으세요 4. 결과만 반환하세요 (설명 없이 번역문만) 원문: --- {source_text} --- 초벌 번역 참고본: --- {phase1_translated} ---""" # ── Phase 4: 가독성 개선 ─────────────────────────────── SYSTEM_PROMPT_PHASE4 = """\ 당신은 "{target_language}" 원어민 편집자입니다. 제공된 번역문을 \ "{target_language}" 화자에게 읽기 편하도록 다듬되, 번역문의 의미 관계와 \ 인칭, 시제, 양태, 높임 수준은 변경하지 마세요.\ """ def build_phase4_user_prompt( phase3_result: str, proper_nouns: list[dict], style: str, target_language: str, ) -> str: pn_lines = "\n".join( f" - {pn['original']} → {pn.get('final') or pn.get('suggested', '')}" for pn in proper_nouns if pn.get("original") or pn.get("suggested") ) return f"""\ 다음 번역문을 읽기 편하고 자연스러운 문장으로 다듬으세요. 고유명사 (변경 금지): {pn_lines} 문체: {style} 다듬기 규칙: 1. 고유명사는 절대 변경하지 마세요 2. {target_language} 화자에게 자연스럽게 읽히도록 어순과 표현을 조정하세요 3. 문장은 간결하고 명확하게 다듬으세요 4. 의미는 반드시 유지하세요 5. 주어와 목적어, 화자와 청자의 관계를 뒤바꾸지 마세요 6. 인칭, 시제, 희망·추측 등의 양태와 높임 수준을 변경하지 마세요 7. 결과만 반환하세요 (설명 없이 번역문만) 번역문: --- {phase3_result} ---"""