131 lines
4.1 KiB
Python
131 lines
4.1 KiB
Python
"""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}
|
|
---"""
|