Spaces:
Running
Running
feat: switch demo to the solar-mini4 pipeline (v44 = v41 + document chunking)
Browse files단일 구성 solar-mini4 파이프라인으로 교체. 판정형 step1(5KB) + 문맥 교정 어휘/문법 2스텝 + 결정론 규칙 6층(josa_fix·diff_revert 신규). 옛 pro4 v35 x combo 자산은 이 커밋에서 삭제. 로컬 검증: 번들 내 구성 조립 11스텝 OK, 1,515자 기사 9.9초/4조각, Streamlit HTTP 200.
- README.md +13 -3
- __pycache__/runner.cpython-312.pyc +0 -0
- app.py +35 -15
- assets/pipelines/pipeline_dev_v35.yaml +0 -5
- assets/pipelines/{pipeline_dev_v34.yaml → pipeline_dev_v40.yaml} +21 -8
- assets/pipelines/pipeline_dev_v44.yaml +6 -0
- assets/prompts/prompt_dev_260825_combo/step1.txt +0 -747
- assets/prompts/prompt_dev_260825_combo/step2.txt +0 -414
- assets/prompts/prompt_dev_260825_combo/step3.txt +0 -254
- assets/prompts/prompt_dev_260917_vsplit/step1.txt +85 -0
- assets/prompts/prompt_dev_260917_vsplit/step2a.txt +36 -0
- assets/prompts/prompt_dev_260917_vsplit/step2b.txt +33 -0
- assets/resources/{vocabulary.csv → vocabulary_v2.csv} +71 -1
- runner.py +62 -25
- solar_eval/__pycache__/__init__.cpython-312.pyc +0 -0
- solar_eval/__pycache__/_version.cpython-312.pyc +0 -0
- solar_eval/__pycache__/config.cpython-312.pyc +0 -0
- solar_eval/core/__pycache__/__init__.cpython-312.pyc +0 -0
- solar_eval/core/__pycache__/dataset_loader.cpython-312.pyc +0 -0
- solar_eval/core/__pycache__/pipeline_compose.cpython-312.pyc +0 -0
- solar_eval/core/fingerprint.py +1 -1
- solar_eval/models/__pycache__/__init__.cpython-312.pyc +0 -0
- solar_eval/models/__pycache__/base.cpython-312.pyc +0 -0
- solar_eval/models/__pycache__/enums.cpython-312.pyc +0 -0
- solar_eval/models/__pycache__/prompt_version.cpython-312.pyc +0 -0
- solar_eval/models/__pycache__/sample.cpython-312.pyc +0 -0
- solar_eval/pipelines/__pycache__/__init__.cpython-312.pyc +0 -0
- solar_eval/pipelines/__pycache__/base.cpython-312.pyc +0 -0
- solar_eval/pipelines/__pycache__/errors.cpython-312.pyc +0 -0
- solar_eval/pipelines/__pycache__/judge.cpython-312.pyc +0 -0
- solar_eval/pipelines/__pycache__/pipeline.cpython-312.pyc +0 -0
- solar_eval/pipelines/__pycache__/registry.cpython-312.pyc +0 -0
- solar_eval/pipelines/__pycache__/rules.cpython-312.pyc +0 -0
- solar_eval/pipelines/__pycache__/rules_josa.cpython-312.pyc +0 -0
- solar_eval/pipelines/__pycache__/rules_revert.cpython-312.pyc +0 -0
- solar_eval/pipelines/rules_josa.py +176 -0
- solar_eval/pipelines/rules_revert.py +121 -0
- solar_eval/pipelines/steps/__pycache__/__init__.cpython-312.pyc +0 -0
- solar_eval/pipelines/steps/__pycache__/chunking.cpython-312.pyc +0 -0
- solar_eval/pipelines/steps/__pycache__/completion.cpython-312.pyc +0 -0
- solar_eval/pipelines/steps/__pycache__/judge_step.cpython-312.pyc +0 -0
- solar_eval/pipelines/steps/__pycache__/llm.cpython-312.pyc +0 -0
- solar_eval/pipelines/steps/__pycache__/rule_steps.cpython-312.pyc +0 -0
- solar_eval/pipelines/steps/chunking.py +1 -1
- solar_eval/pipelines/steps/rule_steps.py +24 -0
- solar_eval/providers/__pycache__/__init__.cpython-312.pyc +0 -0
- solar_eval/providers/__pycache__/base.cpython-312.pyc +0 -0
- solar_eval/providers/__pycache__/openai_provider.cpython-312.pyc +0 -0
- solar_eval/providers/__pycache__/upstage.cpython-312.pyc +0 -0
- solar_eval/providers/upstage.py +72 -10
README.md
CHANGED
|
@@ -10,9 +10,19 @@ pinned: false
|
|
| 10 |
|
| 11 |
# 조선일보 본문 교열 데모
|
| 12 |
|
| 13 |
-
Upstage
|
| 14 |
-
|
| 15 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 16 |
|
| 17 |
**실행 전 필요**: Space Settings → Secrets 에 `UPSTAGE_API_KEY` 를 넣으세요
|
| 18 |
(없으면 사이드바 입력을 사용합니다).
|
|
|
|
| 10 |
|
| 11 |
# 조선일보 본문 교열 데모
|
| 12 |
|
| 13 |
+
Upstage **solar-mini4** 기반 교열 파이프라인 데모입니다. 평가 하네스와 **같은 엔진 코드**를
|
| 14 |
+
실행합니다 — 데모가 보여주는 결과는 평가 run 과 같은 경로에서 나옵니다.
|
| 15 |
+
|
| 16 |
+
```
|
| 17 |
+
[규칙] 사전 치환
|
| 18 |
+
[LLM] FT 교열 (ft:solar-news-correction)
|
| 19 |
+
[LLM] 판정 — FT 결과를 keep/revert
|
| 20 |
+
[LLM] 문맥 교정 · 어휘
|
| 21 |
+
[LLM] 문맥 교정 · 문법
|
| 22 |
+
[규칙] 사전 재적용 · 복합어 복원 · 율/률 규칙 · 후처리 · 조사 교정 · 오탐 되돌림
|
| 23 |
+
```
|
| 24 |
+
|
| 25 |
+
LLM 호출 4회, 요청당 중앙 3.2초(단락 기준). 긴 기사는 문서 단위로 분할해 병렬 처리합니다.
|
| 26 |
|
| 27 |
**실행 전 필요**: Space Settings → Secrets 에 `UPSTAGE_API_KEY` 를 넣으세요
|
| 28 |
(없으면 사이드바 입력을 사용합니다).
|
__pycache__/runner.cpython-312.pyc
ADDED
|
Binary file (7.87 kB). View file
|
|
|
app.py
CHANGED
|
@@ -1,8 +1,12 @@
|
|
| 1 |
"""조선일보 본문 교열 데모 (Streamlit / HF Space).
|
| 2 |
|
| 3 |
-
|
| 4 |
-
|
| 5 |
-
사용자 입력과 결과는 logbook.py 가
|
|
|
|
|
|
|
|
|
|
|
|
|
| 6 |
"""
|
| 7 |
|
| 8 |
from __future__ import annotations
|
|
@@ -20,23 +24,33 @@ PANE_STYLE = (
|
|
| 20 |
"padding:14px 16px;line-height:1.9;font-size:1.02rem;min-height:120px"
|
| 21 |
)
|
| 22 |
|
|
|
|
|
|
|
| 23 |
SAMPLE_TEXT = (
|
| 24 |
-
"정부의 강력한 부동산 규제에도 불구하고 수도권 아파트 매매 거래 비률은 "
|
| 25 |
"오히려 증가세를 보였다. 시중 은행의 주택 담보 대출 금리가 낮아지면서 "
|
| 26 |
-
"실수요자의 구매 심리가 되살아났기 때문이라는 분석이 나온다."
|
|
|
|
|
|
|
|
|
|
| 27 |
)
|
| 28 |
|
| 29 |
-
# 스텝 이름 → 사용자에게 보여줄 라벨
|
|
|
|
| 30 |
STEP_LABELS = {
|
| 31 |
"vocabulary_sub_pre": "용어 사전 치환",
|
| 32 |
-
"proofread": "1차 교열 (교열 전용 모델)",
|
| 33 |
-
"basic_correction": "기
|
| 34 |
"context_correction": "문맥 교정",
|
|
|
|
|
|
|
| 35 |
"style_correction": "문체 교정",
|
| 36 |
"vocabulary_reapply": "용어 사전 재적용",
|
| 37 |
"compound_whitelist_restore": "복합어 화이트리스트 복원",
|
| 38 |
"yul_ryul_normalize": "율/률 규칙 적용",
|
| 39 |
-
"post_process": "후처리",
|
|
|
|
|
|
|
| 40 |
}
|
| 41 |
|
| 42 |
|
|
@@ -129,13 +143,15 @@ class ProgressView:
|
|
| 129 |
self.status.update(label="교열 실패", state="error", expanded=True)
|
| 130 |
|
| 131 |
|
| 132 |
-
@st.cache_resource
|
| 133 |
-
def get_pipeline():
|
| 134 |
-
|
|
|
|
| 135 |
|
| 136 |
|
| 137 |
st.set_page_config(page_title="조선일보 본문 교열 데모", page_icon="📰", layout="wide")
|
| 138 |
st.title("📰 조선일보 본문 교열 데모")
|
|
|
|
| 139 |
|
| 140 |
with st.sidebar:
|
| 141 |
st.subheader("설정")
|
|
@@ -147,7 +163,11 @@ with st.sidebar:
|
|
| 147 |
)
|
| 148 |
if key:
|
| 149 |
os.environ["UPSTAGE_API_KEY"] = key
|
| 150 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
| 151 |
|
| 152 |
text = st.text_area("기사 본문", value=SAMPLE_TEXT, height=320, max_chars=4000)
|
| 153 |
|
|
@@ -159,13 +179,13 @@ if st.button("교열 실행", type="primary", disabled=not text.strip()):
|
|
| 159 |
st.stop()
|
| 160 |
|
| 161 |
source = text.strip()
|
| 162 |
-
pipeline = get_pipeline()
|
| 163 |
# 입력은 실행 전에 남긴�� — 실행이 실패해도 무엇이 들어왔는지는 알 수 있게
|
| 164 |
article_id = logbook.save_article(source)
|
| 165 |
|
| 166 |
progress = ProgressView(runner.step_names(pipeline))
|
| 167 |
try:
|
| 168 |
-
result = runner.run_proofread(pipeline, source,
|
| 169 |
except Exception as e: # noqa: BLE001 — 데모 표면에서는 원인 요약만 보여준다
|
| 170 |
progress.fail()
|
| 171 |
st.error(f"실행 실패: {type(e).__name__}: {e}")
|
|
|
|
| 1 |
"""조선일보 본문 교열 데모 (Streamlit / HF Space).
|
| 2 |
|
| 3 |
+
solar-mini4 교열 파이프라인을 solar-eval 엔진 그대로 실행한다 — FT 교열 →
|
| 4 |
+
판정형 step1 → 문맥 교정 어휘/문법 2스텝 → 결정론 규칙 6층. 구성 정의와 실행은
|
| 5 |
+
전부 runner.py 이고 이 파일은 UI 만 담당한다. 사용자 입력과 결과는 logbook.py 가
|
| 6 |
+
Supabase 에 남긴다 (시크릿 없으면 조용히 건너뜀).
|
| 7 |
+
|
| 8 |
+
모델 셀렉터는 두지 않는다 — 파이프라인·프롬프트·모델은 한 묶음이고, 모델만
|
| 9 |
+
갈아끼우면 다른 구성이 된다 (runner.CONFIGS 주석 참조).
|
| 10 |
"""
|
| 11 |
|
| 12 |
from __future__ import annotations
|
|
|
|
| 24 |
"padding:14px 16px;line-height:1.9;font-size:1.02rem;min-height:120px"
|
| 25 |
)
|
| 26 |
|
| 27 |
+
# 합성 예문 — 평가셋 gold 는 쓰지 않는다(유출 방지). 각 층의 표적을 일부러 심어 둔 문장이다:
|
| 28 |
+
# 비률/갱신률/연체률(사전·율률 규칙) · WSJ은·160㎞으로(조사 교정) · ▶ 와 곡선 따옴표(오탐 되돌림 가드).
|
| 29 |
SAMPLE_TEXT = (
|
| 30 |
+
"▶정부의 강력한 부동산 규제에도 불구하고 수도권 아파트 매매 거래 비률은 "
|
| 31 |
"오히려 증가세를 보였다. 시중 은행의 주택 담보 대출 금리가 낮아지면서 "
|
| 32 |
+
"실수요자의 구매 심리가 되살아났기 때문이라는 분석이 나온다. "
|
| 33 |
+
"국토부 관계자는 “대출 갱신률과 연체률을 함께 봐야 한다”며 “당분간 이런 "
|
| 34 |
+
"흐름이 이어질 것”이라고 말했다. WSJ은 한국의 주택 시장이 수도권 중심으로 "
|
| 35 |
+
"재편되고 있다고 보도했다. 신규 광역철도는 최고 시속 160㎞으로 설계됐다."
|
| 36 |
)
|
| 37 |
|
| 38 |
+
# 스텝 이름 → 사용자에게 보여줄 라벨. 세 구성의 스텝을 모두 담는다 (모르는 스텝은 이름 그대로).
|
| 39 |
+
# basic_correction 의 라벨이 구성마다 다르다 — v44 에서는 생성이 아니라 FT 결과 판정이다.
|
| 40 |
STEP_LABELS = {
|
| 41 |
"vocabulary_sub_pre": "용어 사전 치환",
|
| 42 |
+
"proofread": "1차 교열 (교열 전용 FT 모델)",
|
| 43 |
+
"basic_correction": "기초 교정 / FT 결과 판정",
|
| 44 |
"context_correction": "문맥 교정",
|
| 45 |
+
"context_vocab": "문맥 교정 · 어휘",
|
| 46 |
+
"context_grammar": "문맥 교정 · 문법",
|
| 47 |
"style_correction": "문체 교정",
|
| 48 |
"vocabulary_reapply": "용어 사전 재적용",
|
| 49 |
"compound_whitelist_restore": "복합어 화이트리스트 복원",
|
| 50 |
"yul_ryul_normalize": "율/률 규칙 적용",
|
| 51 |
+
"post_process": "후처리 (단위·통화·쉼표)",
|
| 52 |
+
"josa_fix": "조사 교정 (기호·숫자·단위 뒤)",
|
| 53 |
+
"diff_revert": "오탐 되돌림 (글리프·구조문자·쉼표)",
|
| 54 |
}
|
| 55 |
|
| 56 |
|
|
|
|
| 143 |
self.status.update(label="교열 실패", state="error", expanded=True)
|
| 144 |
|
| 145 |
|
| 146 |
+
@st.cache_resource(show_spinner="파이프라인 준비 중…")
|
| 147 |
+
def get_pipeline(label: str):
|
| 148 |
+
"""구성 라벨로 캐시한다 — 구성이 늘면 그 구성의 파이프라인이 따로 조립된다."""
|
| 149 |
+
return runner.build_pipeline(label)
|
| 150 |
|
| 151 |
|
| 152 |
st.set_page_config(page_title="조선일보 본문 교열 데모", page_icon="📰", layout="wide")
|
| 153 |
st.title("📰 조선일보 본문 교열 데모")
|
| 154 |
+
st.caption("solar-mini4 파이프라인 · 평가 하네스와 같은 엔진 코드")
|
| 155 |
|
| 156 |
with st.sidebar:
|
| 157 |
st.subheader("설정")
|
|
|
|
| 163 |
)
|
| 164 |
if key:
|
| 165 |
os.environ["UPSTAGE_API_KEY"] = key
|
| 166 |
+
label = runner.DEFAULT_LABEL
|
| 167 |
+
cfg = runner.BY_LABEL[label]
|
| 168 |
+
st.markdown(f"**{cfg.label}**")
|
| 169 |
+
st.caption(cfg.note)
|
| 170 |
+
st.markdown(f"- 모델 `{cfg.model}`\n- 파이프라인 `{cfg.pipeline}`\n- 프롬프트 `{cfg.prompt}`")
|
| 171 |
|
| 172 |
text = st.text_area("기사 본문", value=SAMPLE_TEXT, height=320, max_chars=4000)
|
| 173 |
|
|
|
|
| 179 |
st.stop()
|
| 180 |
|
| 181 |
source = text.strip()
|
| 182 |
+
pipeline = get_pipeline(label)
|
| 183 |
# 입력은 실행 전에 남긴�� — 실행이 실패해도 무엇이 들어왔는지는 알 수 있게
|
| 184 |
article_id = logbook.save_article(source)
|
| 185 |
|
| 186 |
progress = ProgressView(runner.step_names(pipeline))
|
| 187 |
try:
|
| 188 |
+
result = runner.run_proofread(pipeline, source, label=label, on_step=progress.on_step)
|
| 189 |
except Exception as e: # noqa: BLE001 — 데모 표면에서는 원인 요약만 보여준다
|
| 190 |
progress.fail()
|
| 191 |
st.error(f"실행 실패: {type(e).__name__}: {e}")
|
assets/pipelines/pipeline_dev_v35.yaml
DELETED
|
@@ -1,5 +0,0 @@
|
|
| 1 |
-
name: pipeline_dev_v35
|
| 2 |
-
description: "v34 + 문서 단위 chunk — 입구에서 한 번 DP 분할해 chunk 마다 전 스텝(basic_correction 포함)을 돌리고 원장으로 접합. long-article 매칭 ΔF1 −0.9 → +3.5 (2026-09-10, insight 260910)."
|
| 3 |
-
extends: pipeline_dev_v34
|
| 4 |
-
overrides:
|
| 5 |
-
document_chunking: true
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
assets/pipelines/{pipeline_dev_v34.yaml → pipeline_dev_v40.yaml}
RENAMED
|
@@ -1,12 +1,12 @@
|
|
| 1 |
-
name:
|
| 2 |
-
description: "
|
| 3 |
text_split_size: 500
|
| 4 |
steps:
|
| 5 |
- name: vocabulary_sub_pre
|
| 6 |
type: rule
|
| 7 |
rule_type: vocabulary_sub
|
| 8 |
config:
|
| 9 |
-
vocab_dataset: resources/
|
| 10 |
|
| 11 |
- name: proofread
|
| 12 |
type: llm
|
|
@@ -26,18 +26,18 @@ steps:
|
|
| 26 |
{current}
|
| 27 |
</교열_모델_수정결과>
|
| 28 |
|
| 29 |
-
- name:
|
| 30 |
type: llm
|
| 31 |
-
prompt_key:
|
| 32 |
|
| 33 |
-
- name:
|
| 34 |
type: llm
|
| 35 |
-
prompt_key:
|
| 36 |
|
| 37 |
- name: vocabulary_reapply
|
| 38 |
type: rule
|
| 39 |
config:
|
| 40 |
-
vocab_dataset: resources/
|
| 41 |
|
| 42 |
- name: compound_whitelist_restore
|
| 43 |
type: rule
|
|
@@ -56,3 +56,16 @@ steps:
|
|
| 56 |
currency_compact: true
|
| 57 |
comma_removal: true
|
| 58 |
unit_unicode: true
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
name: pipeline_dev_v40
|
| 2 |
+
description: "v38(C1) + 규칙 층 3종 (2026-09-18 라운드): ① vocabulary_v2.csv — 표준어/사이시옷/외래어 혼동 71쌍 등재 (C3 실패로 소거된 'LLM 기초교열 추가'의 규칙 대체), ② josa_fix — 기호·숫자·단위 뒤 조사 결정론 교정 (풀셋 gold 15건 중 모델 적중 1건이던 클래스), ③ diff_revert — 글리프 변환·쉼표 삽입·금지 치환·격식 전환 오탐 되돌림 (paragraph 오탐 410건 중 ~100건이 이 클래스). 풀셋 재생(replay) 실측: paragraph +4.71 / ci-v0 +3.67 / ci-v1 +1.78, rep-small 3반복 재생 +2.47. 스텝 추가라 extends 불가, 전체 파일."
|
| 3 |
text_split_size: 500
|
| 4 |
steps:
|
| 5 |
- name: vocabulary_sub_pre
|
| 6 |
type: rule
|
| 7 |
rule_type: vocabulary_sub
|
| 8 |
config:
|
| 9 |
+
vocab_dataset: resources/vocabulary_v2.csv
|
| 10 |
|
| 11 |
- name: proofread
|
| 12 |
type: llm
|
|
|
|
| 26 |
{current}
|
| 27 |
</교열_모델_수정결과>
|
| 28 |
|
| 29 |
+
- name: context_vocab
|
| 30 |
type: llm
|
| 31 |
+
prompt_key: step2a
|
| 32 |
|
| 33 |
+
- name: context_grammar
|
| 34 |
type: llm
|
| 35 |
+
prompt_key: step2b
|
| 36 |
|
| 37 |
- name: vocabulary_reapply
|
| 38 |
type: rule
|
| 39 |
config:
|
| 40 |
+
vocab_dataset: resources/vocabulary_v2.csv
|
| 41 |
|
| 42 |
- name: compound_whitelist_restore
|
| 43 |
type: rule
|
|
|
|
| 56 |
currency_compact: true
|
| 57 |
comma_removal: true
|
| 58 |
unit_unicode: true
|
| 59 |
+
|
| 60 |
+
- name: josa_fix
|
| 61 |
+
type: rule
|
| 62 |
+
config: {}
|
| 63 |
+
|
| 64 |
+
- name: diff_revert
|
| 65 |
+
type: rule
|
| 66 |
+
config:
|
| 67 |
+
glyph_restore: true
|
| 68 |
+
comma_insertion_revert: true
|
| 69 |
+
forbidden_insertions:
|
| 70 |
+
- 청와대
|
| 71 |
+
register_guard: true
|
assets/pipelines/pipeline_dev_v44.yaml
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
name: pipeline_dev_v44
|
| 2 |
+
description: "v41 + 문서 단위 chunk — 데모(HF Space) 표면용. 내용상 `pipeline_dev_v41` 과 동일하고 `document_chunking: true` 하나만 다르다. **base 가 v40 인 이유**: 상속은 1단계로 제한돼 있어(core/pipeline_compose.py) v41(= v40 + punct 플래그)을 다시 extends 할 수 없다 — 그래서 v41 이 얹는 플래그를 여기서 함께 선언한다. 두 파일은 diff_revert 설정이 갈라지면 안 되므로 v41 을 고칠 때 이 파일도 같이 본다. chunk 근거: v35(= v34 + chunk)가 long-article 매칭 ΔF1 −0.9 → +3.5 (2026-09-10, `#260910_long_article_regression_set`). 단 v41 계열에서의 긴 기사 검증은 아직 없다(long-article 셋 미확보)."
|
| 3 |
+
extends: pipeline_dev_v40
|
| 4 |
+
overrides:
|
| 5 |
+
steps.diff_revert.config.punct_deletion_revert: true
|
| 6 |
+
document_chunking: true
|
assets/prompts/prompt_dev_260825_combo/step1.txt
DELETED
|
@@ -1,747 +0,0 @@
|
|
| 1 |
-
## 🧑🏫 Task
|
| 2 |
-
You are a Korean proofreading model performing a **comparison and correction task**.
|
| 3 |
-
You will be given two texts:
|
| 4 |
-
- `original_paragraph`: The original, untouched text.
|
| 5 |
-
- `proofread_paragraph`: A first-pass proofread version that may contain errors.
|
| 6 |
-
|
| 7 |
-
Your task is to **refine `proofread_paragraph`** by strictly following the `Editing Guidelines` provided below.
|
| 8 |
-
You must use `original_paragraph` as a crucial reference to **validate your corrections and fix any major errors** that may have been introduced in `proofread_paragraph`.
|
| 9 |
-
**<paragraph_separator> 및 줄바꿈 구조 절대 유지:**
|
| 10 |
-
- 입력 텍스트에 `<paragraph_separator>`가 있으면 **절대 제거, 이동, 추가 금지**
|
| 11 |
-
- `<paragraph_separator>`를 줄바꿈(`
|
| 12 |
-
`)으로 변경하거나 대체하지 마라
|
| 13 |
-
- `[IMG:~~]`, `[VIDEO:~~]` 태그가 있어도 예외 없이 동일하게 적용
|
| 14 |
-
- **원칙: 입력의 `<paragraph_separator>` 개수, 위치, 줄바꿈 패턴을 100% 그대로 출력에 복제**
|
| 15 |
-
|
| 16 |
-
---
|
| 17 |
-
### 📝 Core Principles & Rules
|
| 18 |
-
|
| 19 |
-
1. **Reference for Quality Control:** Your main working text is `proofread_paragraph`. However, you must always validate it against `original_paragraph`. If `proofread_paragraph` has been damaged by the first pass—such as by **deleting original content, fundamentally altering the meaning, or creating new grammatical errors**—you must use `original_paragraph` as the ground truth to fix these issues.
|
| 20 |
-
|
| 21 |
-
2. **Rule for Proper Nouns — 대상 보호는 절대, 표기 교정은 허용:** This is your most important instruction. It has two parts.
|
| 22 |
-
|
| 23 |
-
**(A) 대상(WHO/WHAT) 교체 절대 금지 (OVERRIDE ALL KNOWLEDGE):** `original_paragraph` 가 가리키는 인물·기관·직책·사건을 너의 지식으로 "사실 정정"하여 **다른 대상으로 바꾸는 것**을 절대 금지한다. 아래 예시의 실패는 가장 중대한 오류다.
|
| 24 |
-
|
| 25 |
-
This principle is absolute. Here are specific examples of how to apply it by overriding your knowledge:
|
| 26 |
-
|
| 27 |
-
- **Example 1 (Ignoring Strong Association):**
|
| 28 |
-
- `original`: `J D 밴스 부통령`
|
| 29 |
-
- `proofread`: `카멀라 해리스 부통령`
|
| 30 |
-
- **FINAL (Correct):** `J D 밴스 부통령`
|
| 31 |
-
|
| 32 |
-
- **Example 2 (Reverting Incorrect "Correction"):**
|
| 33 |
-
- `original`: `기시다 후미오 총리`
|
| 34 |
-
- `proofread`: `다카이치 사나에 총리`
|
| 35 |
-
- **FINAL (Correct):** `다카이치 사나에 총리`
|
| 36 |
-
|
| 37 |
-
- **Example 3 (Reverting Plausible Title Error):**
|
| 38 |
-
- `original`: `이재명 대통령`
|
| 39 |
-
- `proofread`: `이재명 대표`
|
| 40 |
-
- **FINAL (Correct):** `이재명 대통령`
|
| 41 |
-
|
| 42 |
-
- **Example 4 (Preventing Self-Generated Hallucination):**
|
| 43 |
-
- `original`: `이재명 대통령`
|
| 44 |
-
- `proofread`: `이재명 대통령`
|
| 45 |
-
- **FINAL (Correct):** `이재명 대통령`
|
| 46 |
-
- (You MUST NOT change this to `윤석열 대통령` based on your internal knowledge. This is a critical failure.)
|
| 47 |
-
|
| 48 |
-
- **Example 5 (Reverting an Existing Hallucination):**
|
| 49 |
-
- `original`: `이재명 대통령`
|
| 50 |
-
- `proofread`: `윤석열 대통령`
|
| 51 |
-
- **FINAL (Correct):** `이재명 대통령`
|
| 52 |
-
In all cases, the referent (대상) in `original_paragraph` is your only guide.
|
| 53 |
-
|
| 54 |
-
**(B) 같은 대상의 표기(SPELLING) 오류는 교정하라:** 원문이 가리키는 대상이 명백히 하나로 특정되는데 **표기 자체가 틀린 경우**는 (A)의 예외이며, 반드시 교정해야 한다. 다음 세 유형에 한한다:
|
| 55 |
-
- **명백한 오타** (대개 한두 글자 차이): `오니카와` → `오키나와`, `뮌헨글라트바흐` → `묀헨글라트바흐`
|
| 56 |
-
- **외래어 표기법 위반**: `쉥겐(Schengen)` → `솅겐(Schengen)`, `레프리` → `레퍼리`, `닛혼게이자이신문` → `니혼게이자이신문`
|
| 57 |
-
- **널리 알려진 기관·명칭의 공식 표기 오기**: `서울삼성병원` → `삼성서울병원`
|
| 58 |
-
|
| 59 |
-
**판단 기준은 단 하나다: 교정 전후가 같은 대상인가?**
|
| 60 |
-
- 같은 대상, 틀린 표기 → 교정하라 (예: `오니카와` 와 `오키나와` 는 같은 섬이다)
|
| 61 |
-
- 다른 대상으로 교체 → 절대 금지 (예: `닛혼게이자이신문` 을 `닛케이신문` 이라는 다른 약칭으로 바꾸는 것, 인물·직책을 바꾸는 것)
|
| 62 |
-
- 올바른 표기를 확실히 알지 못하면 → 원문 유지
|
| 63 |
-
`proofread_paragraph` 가 이미 이런 표기 교정을 했다면 **원문으로 되돌리지 마라.** 되돌리기는 (A) 위반(대상 교체)이 있을 때만 한다.
|
| 64 |
-
|
| 65 |
-
3. **Handling Broken Input:** In rare cases where `proofread_paragraph` is completely broken (e.g., nonsensical or empty), you should **ignore it entirely and perform the proofreading task directly on `original_paragraph`**.
|
| 66 |
-
|
| 67 |
-
---
|
| 68 |
-
### 🔧 Editing Guidelines
|
| 69 |
-
```markdown
|
| 70 |
-
🚨🚨🚨 **절대 규칙 (ABSOLUTE RULES)** 🚨🚨🚨
|
| 71 |
-
**1. 내용 절대 불변:** 원문에 없는 단어, 구, 문장, **특히 괄호 `()`를 사용한 부연 설명을 절대 추가하지 마라.**
|
| 72 |
-
**2. ��조 절대 불변:** 문단 수, 문장 순서를 절대 변경하지 마라.
|
| 73 |
-
**3. 역할 엄격 한정:** 너의 임무는 오직 기계적인 기초 교열(맞춤법, 띄어쓰기, 명백한 문법 오류)에 한정된다. **문맥을 해석하거나 의미를 보충하는 행위는 엄격히 금지된다.**
|
| 74 |
-
**4. <paragraph_separator> 절대 유지:** 입력 텍스트에 `<paragraph_separator>`가 있으면 절대 제거하지 말고 그대로 유지해야 한다. 이는 문단 구조를 정확히 반영하기 위한 필수 태그이다. 줄바꿈을 임의로 추가하거나 제거하지 마라.
|
| 75 |
-
|
| 76 |
-
# 0. 역할(Role)
|
| 77 |
-
당신은 뉴스 기사 전문 교열가입니다.
|
| 78 |
-
주어진 텍스트에 대해 맞춤법, 조사, 어미, 띄어쓰기 등의 기초 교열을 수행합니다.
|
| 79 |
-
**오직 위에 명시된 교정이 필요한 부분만 수정하고, 수정이 필요 없는 부분은 그대로 유지하세요.** **최종적으로 교열된 문단만 출력하세요.**
|
| 80 |
-
**원문에 고칠 부분이 없을 시에는, 원문을 그대로 출력하세요.**
|
| 81 |
-
|
| 82 |
-
# 교열 예시
|
| 83 |
-
|
| 84 |
-
## 사이시옷, 띄어쓰기 교정
|
| 85 |
-
Input: 더불어민주당 김성환 정책위의장은 29일 “윤석열 대통령이 무함마드 빈 살만 사우디아라비아 왕세자와 어떤 약속을 했는지 소상히 밝힐 것을 요청한다”고 했다 윤 대통령이 사우디아라비아의 670조원 규모 ‘네옴시티’ 건설 프로젝트 수주를 댓가로 2030 부산세계박람회(부산 엑스포) 유치를 포기한 것 아니냐는 음모론을 제기한 것이다. 이날 김 의장은 주장의 근거를 제시하지는 못했다. 정치권에선 “야당이 제기했던 이른바 ‘청담동 술자리 의혹’이 최근 거짓으로 판명됐는데도 정치적 목적을 위해 또 다른 의혹에 불을 지피려는 것 아니냐”는 말이 나왔다.
|
| 86 |
-
Output: 더불어민주당 김성환 정책위의장은 29일 “윤석열 대통령이 무함마드 빈 살만 사우디아라비아 왕세자와 어떤 약속을 했는지 소상히 밝힐 것을 요청한다”고 했다. 윤 대통령이 사우디아라비아의 670조원 규모 ‘네옴시티’ 건설 프로젝트 수주를 대가로 2030 부산세계박람회(부산 엑스포) 유치를 포기한 것 아니냐는 음모론을 제기한 것이다. 이날 김 의장은 주장의 근거를 제시하지는 못했다. 정치권에선 “야당이 제기했던 이른바 ‘청담동 술자리 의혹’이 최근 거짓으로 판명됐는데도 정치적 목적을 위해 또 다른 의혹에 불을 지피려는 것 아니냐”는 말이 나왔다.
|
| 87 |
-
|
| 88 |
-
### 맞춤법, 조사, 오탈자, 띄어쓰기 교정
|
| 89 |
-
Input: 그러나 400년 전 영국인 청교도들을 친절하게 맞았다는 원주민인 왐파노아그(Wampanoag)부족의 후손들을 비롯한 ‘북미 인디언 연맹’ 회원들은 이날 점오에 매사추세츠주 플리머스의 왐파노아그 부줏연맹의 대추장이었던 ‘우사메퀸’의 돟상 앞에 모여 ‘전국적인 애도이 날’을 기렷다. 우사메퀸 동상은 영국 청교도들이 쳠음 도착했다는 ‘플리머스 바위(Plymouth Rock)’와 도로 하나를 사이에 두고 있다. 이들은 “우리 공둥체에 발생한, 수세대에 걸친 트라우마(trauma)와 역사적 상처를 애도하기 위해 오늘 여기 모엿다”고 밝혔다.
|
| 90 |
-
Output: 그러나 400년 전 영국인 청교도들을 친절하게 맞았다는 원주민인 왐파노아그(Wampanoag) 부족의 후손들을 비롯한 ‘북미 인디언 연맹’ 회원들은 이날 정오에 매사추세츠주 플리머스의 왐파노아그 부족연맹의 대추장이었던 ‘우사메퀸’ 동상 앞에 모여 ‘전국적인 애도의 날’을 기렸다. 우사메퀸 동상은 영국 청교도들이 처음 도착했다는 ‘플리머스 바위(Plymouth Rock)’와 도로 하나를 사이에 두고 있다. 이들은 “우리 공동체에 발생한, 수세대에 걸친 트라우마(trauma)와 역사적 상처를 애도하기 위해 오늘 여기 모였다”고 밝혔다.
|
| 91 |
-
|
| 92 |
-
### 중복 표현 제거, 오탈자 교정
|
| 93 |
-
Input: 검사 개인이 자기 이름을 걸고 하는 비판도 비판도 이어졌다. 박영진 울산지검 부장검사는 이날 이프로스에 “현 정권과 장관이 말하는 검찰 개혁의 진정성은 쓰레기통에 처박힌 지 이미 오래됐다”는 글을 올렸다. 그는 지난 8월 대검 형사1과장으로 근무하며 ‘채널A 사건’ 수사를 놓고 ‘추미애 라인'인 당시 김관정 대검 형사부장(현 서울동부지검장)과 충돌했었다. 박 부장은 “살아 있는 권력에 대한 수사를 한 검사들을 제거하고 앞으로도 그와 같은 수사가 이루어질 수 있는 싹을 자르겠다는 경고”라며 “일련의 과정을 되돌아보면 가히 ‘검찰 농단’이라고 칭해도 모자라안 하다”고 했다. 그는 “(검사들이) 메피스토펠레스(악마)에게 영혼을 팔아넘긴 파우스트는 되지 않기를 바란다”고 했다.
|
| 94 |
-
Output: 검사 개인이 자기 이름을 걸고 하는 비판도 이어졌다. 박영진 울산지검 부장검사는 이날 이프로스에 “현 정권과 장관이 말하는 검찰 개혁의 진정성은 쓰레기통에 처박힌 지 이미 오래됐다”는 글을 올렸다. 그는 지난 8월 대검 형사1과장으로 근무하며 ‘채널A 사건’ 수사를 놓고 ‘추미애 라인'인 당시 김관정 대검 형사부장(현 서울동부지검장)과 충돌했었다. 박 부장은 “살아 있는 권력에 대한 수사를 한 검사들을 제거하고 앞으로도 그와 같은 수사가 이루어질 수 있는 싹을 자르겠다는 경고”라며 “일련의 과정을 되돌아보면 가히 ‘검찰 농단’이라고 칭해도 모자라지 않다”고 했다. 그는 “(검사들이) 메피스토펠레스(악마)에게 영혼을 팔아넘긴 파우스트는 되지 않기를 바란다”고 했다.
|
| 95 |
-
|
| 96 |
-
### 띄어쓰기 교정
|
| 97 |
-
Input: 오는 10월 이집트 피라미드 앞에 초대형 ‘한글 신전’이 들어선다. 설치미술가 강익중(64)이 유네스코 세계문화유산인 피라미드 앞에서 펼쳐지는 국제미술전시 ‘포에버 이즈 나우(FIN: Forever Is Now)’에 한국 작가 최초로 초청 받아 신작을 선보인다. 강씨는 “높이가 다른 네 개의 직육면체를 신전처럼 세워서, 외벽은 한국 민요 ‘아리랑’ 가사를 한글, 영어, 아랍어, 상형문자로 각각 채우고, 내부엔 전 세계 아이들이 각자의 꿈을 그린 5000여점의 드로잉 벽화로 구성할 것”이라고 했다.
|
| 98 |
-
Output: 오는 10월 이집트 피라미드 앞에 초대형 ‘한글 신전’이 들어선다. 설치미술가 강익중(64)이 유네스코 세계문화유산인 피라미드 앞에서 펼쳐지는 국제미술전시 ‘포에버 이즈 나우(FIN: Forever Is Now)’에 한국 작가 최초로 초청받아 신작을 선보인다. 강씨는 “높이가 다른 네 개의 직육면체를 신전처럼 세워서, 외벽은 한국 민요 ‘아리랑’ 가사를 한글, 영어, 아랍어, 상형문자로 각각 채우고, 내부엔 전 세계 아이들이 각자의 꿈을 그린 5000여 점의 드로잉 벽화로 구성할 것”이라고 했다.
|
| 99 |
-
|
| 100 |
-
### 오탈자 교정
|
| 101 |
-
Input: 정경심 교수에 대한 1심 실형 선고가 나온 뒤, 음식 평론가 황교익은 “골고다 언덕길을 조국과 그의 가족이 걸어가고 있다. 십자가를 짊어졌다. 예수의 길이다”라고 말했다. 조국이 검찰을 개혁하려다 박해를 받아야 했던 순교자였다는 이야기다. 법원은 혐의 11개에 대해 유죄 판결을 내렸고 조국은 “가시밭길을 가겠다”며며 항소했다. 법원이 571쪽에 달하는 판결문을 통해 조목조목 지적한 거짓 주장들에 대한 사과 같은 것은 찾아볼 수 없었다. 십자가를 지고 골고다 언덕을 오르던 예수가 언제 그런 거짓말을 했을까? 그가 박해받는 피해자라는 서사는 여당 정치인들에 의해 이어진다. 지지자들은 판결문에 나온 구체적인 사실에는 입을 닫고 변함없는 믿음만을 표현한다.
|
| 102 |
-
Output: 정경심 교수에 대한 1심 실형 선고가 나온 뒤, 음식 평론가 황교익은 “골고다 언덕길을 조국과 그의 가족이 걸어가고 있다. 십자가를 짊어졌다. 예수의 길이다”라고 말했다. 조국이 검찰을 개혁하려다 박해를 받아야 했던 순교자였다는 이야기다. 법원은 혐의 11개에 대해 유죄 판결을 내렸고 조국은 “가시밭길을 가겠다”며 항소했다. 법원이 571쪽에 달하는 판결문을 통해 조목조목 지적한 거짓 주장들에 대한 사과 같은 것은 찾아볼 수 없었다. 십자가를 지고 골고다 언덕을 오르던 예수가 언제 그런 거짓말을 했을까? 그가 박해받는 피해자라는 서사는 여당 정치인들에 의해 이어진다. 지지자들은 판결문에 나온 구체적인 사실에는 입을 닫고 변함없는 믿음만을 표현한다.
|
| 103 |
-
|
| 104 |
-
### 맞춤법 교정
|
| 105 |
-
Input: 2016년 11월 6일 일요일. 이날은 1면 사진이 미리 정해져 있었다. 사진 한 장을 찾기 위해 전 세계를 뒤지지 않아도(편집자의 사진 모니터엔 매일 내·외신 사진 7000장 정도가 올라온다) 됐기에 1면 편집자에겐 행복한 날이었다. 직권남용 혐의 등으로 수사를 받던 우병우 전 청와대 민정수석이 피의자 신분으로 검찰에 출두했다. 그가 포토라인에 서 있는 장면만으로도 독자의 시선을 끌기에 충분했는데, 우 전 수석 스스로 여기에 ‘플러스 알파’(+@)를 더했다. "가족회사의 자금을 유용했습니까?"라고 묻는 방송 기자를 쏘아본 것이다. 우 전 수석은 질문을 듣고 어의 없다는 듯 눈동자를 크게 한 번 굴리더니 곧바로 강렬한 ‘레이저 눈빛’을 발사했다. 수십 명의 사진 기자들 앞에서였다. 이날 카페에서도, 식사 자리에서도 사람��의 대화는 "그 장면 봤어?"로 시작했다.
|
| 106 |
-
Output: 2016년 11월 6일 일요일. 이날은 1면 사진이 미리 정해져 있었다. 사진 한 장을 찾기 위해 전 세계를 뒤지지 않아도(편집자의 사진 모니터엔 매일 내·외신 사진 7000장 정도가 올라온다) 됐기에 1면 편집자에겐 행복한 날이었다. 직권남용 혐의 등으로 수사를 받던 우병우 전 청와대 민정수석이 피의자 신분으로 검찰에 출두했다. 그가 포토라인에 서 있는 장면만으로도 독자의 시선을 끌기에 충분했는데, 우 전 수석 스스로 여기에 ‘플러스 알파’(+@)를 더했다. "가족회사의 자금을 유용했습니까?"라고 묻는 방송 기자를 쏘아본 것이다. 우 전 수석은 질문을 듣고 어이없다는 듯 눈동자를 크게 한 번 굴리더니 곧바로 강렬한 ‘레이저 눈빛’을 발사했다. 수십 명의 사진 기자들 앞에서였다. 이날 카페에서도, 식사 자리에서도 사람들의 대화는 "그 장면 봤어?"로 시작했다.
|
| 107 |
-
|
| 108 |
-
### 사이시옷 교정
|
| 109 |
-
Input: 영화든 소설이든 진범을 알고 나면 재미가 반감하는 점은 추리물의 약점. 이번 영화에서는 1차 대전 당시 푸아로가 전우들을 구하려고 나섰다가 부상당한 참전 용사라는 전사(前事)를 덧붙여서 인간적 매력을 배가했다. 푸아로의 상징인 멋진 코수염 이면에는 전쟁의 비극적 상처가 드리우고 있는 셈이다. 브래너는 벨기에 출신인 푸아로가 불어에는 능통하지만 영어에는 다소 서툴다는 면모까지 명확하게 구현한다.
|
| 110 |
-
Output: 영화든 소설이든 진범을 알고 나면 재미가 반감하는 점은 추리물의 약점. 이번 영화에서는 1차 대전 당시 푸아로가 전우들을 구하려고 나섰다가 부상당한 참전 용사라는 전사(前事)를 덧붙여서 인간적 매력을 배가했다. 푸아로의 상징인 멋진 콧수염 이면에는 전쟁의 비극적 상처가 드리우고 있는 셈이다. 브래너는 벨기에 출신인 푸아로가 불어에는 능통하지만 영어에는 다소 서툴다는 면모까지 명확하게 구현한다.
|
| 111 |
-
|
| 112 |
-
### 사이시옷 교정
|
| 113 |
-
Input: 16일 일본 언론에 따르면 대형 수퍼마켓 체인인 이온리테일이 이달 점포 약 240곳에 ‘미소와 인사’와 같은 대(對)고객 매너를 가르치는 AI 단말기 ‘스마일군’을 도입했다. 스마일군은 길쭉한 마이크처럼, 사람 눈 높이에 디스플레이가 부착된 간단한 형태다. 직원들은 아침에 출근하면 스마일군 앞에서 고객과 눈이 마주쳤을 때처럼 웃음을 짓고, 고개 숙여 인사하거나 인사말을 건넨다.
|
| 114 |
-
Output: 16일 일본 언론에 따르면 대형 수퍼마켓 체인인 이온리테일이 이달 점포 약 240곳에 ‘미소와 인사’와 같은 대(對)고객 매너를 가르치는 AI 단말기 ‘스마일군’을 도입했다. 스마일군은 길쭉한 마이크처럼, 사람 눈 높이에 디스플레이가 부착된 간단한 형태다. 직원들은 아침에 출근하면 스마일군 앞에서 고객과 눈이 마주쳤을 때처럼 웃음을 짓고, 고개 숙여 인사하거나 인삿말을 건넨다.
|
| 115 |
-
|
| 116 |
-
### 사이시옷 교정
|
| 117 |
-
Input: 재판부는 경찰관들이 A씨를 제압하면서 사용한 물리력과 그의 사망 사이에 인과관계가 인정된다고 봤다. 재판부는 “경찰관들이 테이저건으로 A씨를 제압한 후에는 그가 다른 사람에게 해를 가할 수 있는 상태가 아니었다”며 “경찰이 A씨에게 뒤수갑을 채우고 붕대로 양 발을 묶은 것은 법이 정한 물리력 행사 기준과 범위를 초과한 것”이라고 판단했다.
|
| 118 |
-
Output: 재판부는 경찰관들이 A씨를 제압하면서 사용한 물리력과 그의 사망 사이에 인과관계가 인정된다고 봤다. 재판부는 “경찰관들이 테이저건으로 A씨를 제압한 후에는 그가 다른 사람에게 해를 가할 수 있는 상태가 아니었다”며 “경찰이 A씨에게 뒷수갑을 채우고 붕대로 양 발을 묶은 것은 법이 정한 물리력 행사 기준과 범위를 초과한 것”이라고 판단했다.
|
| 119 |
-
|
| 120 |
-
### 사이시옷 교정
|
| 121 |
-
Input: 이선혜·바르드 부부는 점심을 여수비행장이 있는 신풍검문소 뒤 ‘여풍식당’(061-682-7763)으로 가려 했다. “외관은 백반집처럼 허름하지만 음식은 한정식이에요. 1인당 1만4000원에 반찬이 30여 가지나 나와요. 가지수도 가지수지만 반찬 하나하나 다 맛있고요.” 전화해보니 아쉽게도 식당이 만석인 데다 오후 4시 30분 영업 종료. 다음 여수 여행 때 찾기로 하고 여자만(汝自灣)으로 향했다.
|
| 122 |
-
Output: 이선혜·바르드 부부는 점심을 여수비행장이 있는 신풍검문소 뒤 ‘여풍식당’(061-682-7763)으로 가려 했다. “외관은 백반집처럼 허름하지만 음식은 한정식이에요. 1인당 1만4000원에 반찬이 30여 가지나 나���요. 가짓수도 가짓수지만 반찬 하나하나 다 맛있고요.” 전화해보니 아쉽게도 식당이 만석인 데다 오후 4시 30분 영업 종료. 다음 여수 여행 때 찾기로 하고 여자만(汝自灣)으로 향했다.
|
| 123 |
-
|
| 124 |
-
### 사이시옷 교정
|
| 125 |
-
Input: 닻을 올리기도 전에 암초에 부딪힌 것 같은 느낌이랄까. 쉽지 않은 대화가 될 것으로 예상하며 인터뷰 장소로 향했다. 이준익의 사무실은 엘리베이터도 없는 서울 충무로의 낡은 빌딩 5층에 있었다. 열 평 남짓한 공간은 휑뎅그렁했다. 철제 책상 하나와 책장 네 개. 날렵한 검정 재킷 차림의 이준익은 쾌활하게 "영화사 사무실이 삐까번쩍하면 '사짜'야. 원래 영화사란 '떴다방' 같은 거예요" 했다. 책상 뒤벽에 '동주' 포스터가 붙어 있었다. 5억원이라는 저예산에 흑백이라는 핸디캡을 안은 이 영화가 지난달 12일 개봉 24일 만에 누적 관객 수 100만명을 돌파했다.
|
| 126 |
-
Output: 닻을 올리기도 전에 암초에 부딪힌 것 같은 느낌이랄까. 쉽지 않은 대화가 될 것으로 예상하며 인터뷰 장소로 향했다. 이준익의 사무실은 엘리베이터도 없는 서울 충무로의 낡은 빌딩 5층에 있었다. 열 평 남짓한 공간은 휑뎅그렁했다. 철제 책상 하나와 책장 네 개. 날렵한 검정 재킷 차림의 이준익은 쾌활하게 "영화사 사무실이 삐까번쩍하면 '사짜'야. 원래 영화사란 '떴다방' 같은 거예요" 했다. 책상 뒷벽에 '동주' 포스터가 붙어 있었다. 5억원이라는 저예산에 흑백이라는 핸디캡을 안은 이 영화가 지난달 12일 개봉 24일 만에 누적 관객 수 100만명을 돌파했다.
|
| 127 |
-
|
| 128 |
-
### 사이시옷 교정
|
| 129 |
-
Input: '부황(父皇) 폐하의 높고 훌륭한 공덕은 선열보다 빛나고, 크고 깊은 혜택은 후세에 전할 것입니다. 하늘은 이 때문에 말없이 돕고 보답하려고 큰 위업을 맡기고 장수하게 하였으며 한없는 복을 주었나이다. 내년은 부황 폐하가 51세가 되고 왕위에 오른 지 40년이 되는 경사스러운 해옵니다. 소자가 동지날에 모든 관리를 거느리고 축하를 올리도록 허락함으로써 하찮은 성의나마 조금이라도 펼 수 있게 하여 주시기 바라나이다.'
|
| 130 |
-
Output: '부황(父皇) 폐하의 높고 훌륭한 공덕은 선열보다 빛나고, 크고 깊은 혜택은 후세에 전할 것입니다. 하늘은 이 때문에 말없이 돕고 보답하려고 큰 위업을 맡기고 장수하게 하였으며 한없는 복을 주었나이다. 내년은 부황 폐하가 51세가 되고 왕위에 오른 지 40년이 되는 경사스러운 해옵니다. 소자가 동짓날에 모든 관리를 거느리고 축하를 올리도록 허락함으로써 하찮은 성의나마 조금이라도 펼 수 있게 하여 주시기 바라나이다.'
|
| 131 |
-
|
| 132 |
-
### 사이시옷 교정
|
| 133 |
-
Input: 팔순 노모는 1960년대 화폐개혁을 직접 겪었다. 그 기억은 악몽에 가깝다. 세집을 옮기려고 은행에서 목돈을 찾아놨는데, 이사 며칠 전 '화폐개혁'을 단행했단다. 새 돈 교환이 1인당 500원까지밖에 안 돼 갓난아기를 업은 채 여러 은행을 전전하며 애걸복걸했다고 한다. 노모는 지금도 화폐개혁 얘기가 나오면 고개를 절레절레 흔든다.
|
| 134 |
-
Output: 팔순 노모는 1960년대 화폐개혁을 직접 겪었다. 그 기억은 악몽에 가깝다. 셋집을 옮기려고 은행에서 목돈을 찾아놨는데, 이사 며칠 전 '화폐개혁'을 단행했단다. 새 돈 교환이 1인당 500원까지밖에 안 돼 갓난아기를 업은 채 여러 은행을 전전하며 애걸복걸했다고 한다. 노모는 지금도 화폐개혁 얘기가 나오면 고개를 절레절레 흔든다.
|
| 135 |
-
|
| 136 |
-
### 사이시옷 교정
|
| 137 |
-
Input: 한편 범행에 회장 등 위선 개입이 의심된다는 보도와 관련해 오스템임플란트 측과 이씨 측 법률 대리인과 공방이 벌어졌다. 오스템 측을 대리하는 법무법인 광장 측은 지난 7일 이씨 측 법무법인 YK의 박모 변호사에게 ‘허위사실에 의한 명예훼손 내용의 기사 관련 해명 요청’이라는 제목의 문서를 보낸 것으로 확인됐다. 이에 대해 YK의 변호인은 9일 “방송사 기자에게 이 사건 보도 내용에 대해 설명한 사실이 없다”고 회신했다.
|
| 138 |
-
Output: 한편 범행에 회장 등 윗선 개입이 의심된다는 보도와 관련해 오스템임플란트 측과 이씨 측 법률 대리인과 공방이 벌어졌다. 오스템 측을 대리하는 법무법인 광장 측은 지난 7일 이씨 측 법무법인 YK의 박모 변호사에게 ‘허위사실에 의한 명예훼손 내용의 기사 관련 해명 요청’이라는 제목의 문서를 보낸 것으로 확인됐다. 이에 대해 YK의 변호인은 9일 “방송사 기자에게 이 사건 보도 내용에 대해 설명한 사실이 없다”고 회신했다.
|
| 139 |
-
|
| 140 |
-
### 사이시옷 교정
|
| 141 |
-
Input: 음식 작가 박��배씨는 “개장어는 과거 일본 수도였던 교토의 여름 마쓰리(축제)에서 반드시 있어야 하는 음식이었다”며 “특히 전남 여수, 경남 통영 등 한반도 남해안산(産) 개장어는 지금도 그렇지만 과거에도 일본산을 능가하는 품질로 유명했다”고 했다.
|
| 142 |
-
Output: 음식 작가 박정배씨는 “갯장어는 과거 일본 수도였던 교토의 여름 마쓰리(축제)에서 반드시 있어야 하는 음식이었다”며 “특히 전남 여수, 경남 통영 등 한반도 남해안산(産) 갯장어는 지금도 그렇지만 과거에도 일본산을 능가하는 품질로 유명했다”고 했다.
|
| 143 |
-
|
| 144 |
-
### 사이시옷 교정
|
| 145 |
-
Input: 자숙 경찰들의 폭주에 대응할 생각은커녕 피해를 보는 사람이 대다수다. 지난달 말 지바현에서 사탕가게를 운영하는 무라야마 야스코(74)씨는 가게 문에 붙은 붉은 글씨를 보고 피기가 가셨다고 한다. ‘아이들 모으지 마, 가게 문 닫아’라고 적힌 글이었다. 이 가게는 긴급 사태가 선언되기 전인 3월 말부터 휴업 중이었지만, 아무 이유 없이 자숙 경찰의 습격을 받았다. 무라야마씨는 이후 불면증에 시달리다 정신안정제까지 처방받았다고 니혼게이자이신문이 전했다. 최근 도쿄도 지요다구 한 당구장 경영자는 ‘자숙 경찰’의 괴롭힘이 두렵다면서 “긴급사태가 해제됐지만 다른 가게의 상황을 보고 나서 영업을 재개하겠다”고 아사히신문에 말했다.
|
| 146 |
-
Output: 자숙 경찰들의 폭주에 대응할 생각은커녕 피해를 보는 사람이 대다수다. 지난달 말 지바현에서 사탕가게를 운영하는 무라야마 야스코(74)씨는 가게 문에 붙은 붉은 글씨를 보고 핏기가 가셨다고 한다. ‘아이들 모으지 마, 가게 문 닫아’라고 적힌 글이었다. 이 가게는 긴급 사태가 선언되기 전인 3월 말부터 휴업 중이었지만, 아무 이유 없이 자숙 경찰의 습격을 받았다. 무라야마씨는 이후 불면증에 시달리다 정신안정제까지 처방받았다고 니혼게이자이신문이 전했다. 최근 도쿄도 지요다구 한 당구장 경영자는 ‘자숙 경찰’의 괴롭힘이 두렵다면서 “긴급사태가 해제됐지만 다른 가게의 상황을 보고 나서 영업을 재개하겠다”고 아사히신문에 말했다.
|
| 147 |
-
|
| 148 |
-
|
| 149 |
-
|
| 150 |
-
# 1. 교열 범위
|
| 151 |
-
다음 항목에 해당하는 오류를 모두 교정합니다:
|
| 152 |
-
- 단순 맞춤법 오류 및 오탈자
|
| 153 |
-
- 문법적 오류 중 아래 항목:
|
| 154 |
-
- 조사 오류, 조사 누락, 받침에 따른 조사 선택 오류
|
| 155 |
-
- 어간/어미, 용언 활용, 시제, 부정 표현
|
| 156 |
-
- 띄어쓰기 오류 전체
|
| 157 |
-
- 사이시옷 오류
|
| 158 |
-
|
| 159 |
-
# 2. 교열 카테고리 정의
|
| 160 |
-
|
| 161 |
-
------------------
|
| 162 |
-
|
| 163 |
-
## 2.1 단순 맞춤법 오류 교정
|
| 164 |
-
|
| 165 |
-
### 목적
|
| 166 |
-
맞춤법에 맞는 정확한 단어와 표현을 사용하여 올바른 한국어 문장을 만듭니다.
|
| 167 |
-
|
| 168 |
-
---
|
| 169 |
-
|
| 170 |
-
#### 2.1.1 단순 오탈자 교정
|
| 171 |
-
|
| 172 |
-
##### 발견해야 할 이슈
|
| 173 |
-
철자 오류, 타이핑 실수, 단어 사이 띄어쓰기 누락으로 인한 단어 결합 오류, 실제로 존재하지 않는 단어가 사용된 경우를 발견합니다.
|
| 174 |
-
|
| 175 |
-
##### 교정 방법
|
| 176 |
-
소리와 의미를 함께 고려하여 올바른 철자로 교정합니다. 문맥을 파악하여 의도된 단어를 정확히 찾아 수정하고, 잘못 결합된 단어는 분리하거나 올바른 단어로 교체합니다.
|
| 177 |
-
|
| 178 |
-
##### 교정 예시
|
| 179 |
-
- 설 대목을 앞두고 횸쇼핑 업체들은 분주해졌다 → 설 대목을 앞두고 홈쇼핑 업체들은 분주해졌다
|
| 180 |
-
- 그는 젊은 시절 권의주의에 맞서 투쟁했다 → 그는 젊은 시절 권위주의에 맞서 투쟁했다
|
| 181 |
-
|
| 182 |
-
---
|
| 183 |
-
|
| 184 |
-
#### 2.1.2 자주 틀리는 관용 표현
|
| 185 |
-
|
| 186 |
-
##### 발견해야 할 이슈
|
| 187 |
-
자주 틀리는 관용구나 고정 표현에서 잘못된 단어 사용을 발견합니다.
|
| 188 |
-
|
| 189 |
-
##### 교정 방법
|
| 190 |
-
관용구의 올바른 형태를 확인하여 정확한 표현으로 교정합니다. 소리가 비슷하지만 다른 의미의 단어들을 구분합니다.
|
| 191 |
-
|
| 192 |
-
##### 교정 예시
|
| 193 |
-
- 하루가 머다 → 하루가 멀다
|
| 194 |
-
- 눈 깜빡할 새 → 눈 깜짝할 새
|
| 195 |
-
|
| 196 |
-
---
|
| 197 |
-
|
| 198 |
-
#### 2.1.3 표준어 교정
|
| 199 |
-
|
| 200 |
-
##### 발견해야 할 이슈
|
| 201 |
-
비표준어나 방언, 잘못 굳어진 표현을 발견합니다.
|
| 202 |
-
|
| 203 |
-
##### 교정 방법
|
| 204 |
-
표준국어대사전에 등재된 표준어로 교정합니다. 비표준어를 표준어로 바꿔 일관된 언어 사용을 유지합니다.
|
| 205 |
-
|
| 206 |
-
##### 교정 예시
|
| 207 |
-
- 괴상망칙하다 → 괴상망측하다
|
| 208 |
-
- 귀뜸해주다 → 귀띔해주다
|
| 209 |
-
- 나르시즘 → 나르시시즘
|
| 210 |
-
- 나르시스트 → 나르시시스트
|
| 211 |
-
- 돗데기시장 → 도떼기시장
|
| 212 |
-
- 발뼘하다 → 발뺌하다
|
| 213 |
-
- 부황을 뜨다 → 부항을 뜨다
|
| 214 |
-
- 붓기가 있다 → 부기가 있다
|
| 215 |
-
- 시덥잖다 → 시답잖다
|
| 216 |
-
- 어지러움을 느끼다 → 어지럼을 느끼다
|
| 217 |
-
- 횡경막 → 횡격막
|
| 218 |
-
- 부비다 → 비비다
|
| 219 |
-
- 고급진 인테리어 → ���급스러운 인테리어
|
| 220 |
-
|
| 221 |
-
---
|
| 222 |
-
|
| 223 |
-
#### 2.1.4 혼동하기 쉬운 어휘
|
| 224 |
-
|
| 225 |
-
##### 발견해야 할 이슈
|
| 226 |
-
표기나 의미가 비슷해서 혼동하기 쉬운 단어들의 잘못된 사용을 발견합니다.
|
| 227 |
-
|
| 228 |
-
##### 교정 방법
|
| 229 |
-
각 단어의 정확한 의미와 용법을 구분하여 문맥에 맞는 단어를 선택합니다. 유사한 단어들의 뜻을 명확히 구분합니다.
|
| 230 |
-
|
| 231 |
-
##### 문맥 대조 스캔 (필수 절차)
|
| 232 |
-
신문 제작 과정에서 한 단어가 발음·표기가 비슷한 **다른 단어로 잘못 찍히는 오식(誤植)**이 자주 발생합니다. 모든 문장에 대해 다음 절차를 수행하세요:
|
| 233 |
-
1. 문장을 읽으며 **"이 단어의 뜻이 이 문맥에서 통하는가"** 를 검토한다.
|
| 234 |
-
2. 뜻이 통하지 않거나 어긋나는 단어를 발견하면, **발음·표기가 비슷한 다른 단어**(대개 한두 글자 차이)로 바꿨을 때 뜻이 명백히 통하는지 확인한다.
|
| 235 |
-
3. 명백히 통하면 오식으로 판단하고 교정한다. **현재 단어로도 뜻이 통하면 절대 바꾸지 않는다** — 이 절차는 오식 복원이지 어휘 선호 교체가 아니다.
|
| 236 |
-
|
| 237 |
-
##### 교정 예시
|
| 238 |
-
- 각출하다 → 갹출하다 (공동의 몫을 여럿이 나누어 낼 때)
|
| 239 |
-
- 구별하다 → 구분하다 (기준에 따라 나눌 때)
|
| 240 |
-
- 비율이 높다 → 비중이 높다 (수치화할 수 없는 중요도일 때)
|
| 241 |
-
- 승전보를 울리다 → 승전고를 울리다
|
| 242 |
-
- 자청하다 → 자처하다 (자기를 어떤 사람으로 여길 때)
|
| 243 |
-
- 2002년 전에는 → 2002년 이전에는
|
| 244 |
-
- 화장실 표식 → 화장실 표지
|
| 245 |
-
- 한국어와 한문 → 한국어와 중국어 (언어 구분)
|
| 246 |
-
- 우리말을 만든 세종대왕 → 우리글을 만든 세종대왕
|
| 247 |
-
- 햇빛이 따사롭다 → 햇볕이 따사롭다
|
| 248 |
-
- 형태로든 → 형식으로든
|
| 249 |
-
- 희귀병 → 희소병
|
| 250 |
-
- 당기다 → 댕기다 (불을 붙일 때)
|
| 251 |
-
- 얼굴이 당기다 → 얼굴이 땅기다
|
| 252 |
-
- 두꺼운 친분 → 두터운 친분
|
| 253 |
-
- 첫 번째 딸 → 첫째 딸 (순서)
|
| 254 |
-
- 한 번 먹어봤다 → 한번 먹어봤다 (생략 가능한 경우)
|
| 255 |
-
- 담다 → 담그다 (식재료를 익게 할 때)
|
| 256 |
-
- 들리다 → 들르다 (잠깐 머무를 때)
|
| 257 |
-
- 작렬하다 → 작열하다 (뜨겁게 타오를 때)
|
| 258 |
-
- 정답을 맞추다 → 정답을 맞히다 (적중은 '맞히다', 대조·조립은 '맞추다')
|
| 259 |
-
- 곤혹을 치르다 → 곤욕을 치르다 (치르는 것은 '곤욕', '곤혹'은 '곤혹스럽다' 꼴로 쓴다)
|
| 260 |
-
- 수출량이 급등하다 → 수출량이 급증하다 (수량·건수는 급증/급감, 가격·지수는 급등/급락)
|
| 261 |
-
- 대회를 재패하다 → 대회를 제패하다 (우승은 제패(制霸), '재패'는 두 번째 제패일 때만)
|
| 262 |
-
- 실수가 번복되다 → 실수가 반복되다 (되풀이는 '반복', 결정을 뒤집는 것은 '번복')
|
| 263 |
-
- 다량의 지원자 → 다수의 지원자 (셀 수 있으면 '다수', 양이면 '다량')
|
| 264 |
-
- 서류를 결제하다 → 서류를 결재하다 (승인은 '결재', 대금 지불은 '결제')
|
| 265 |
-
- 신문에 개재된 기사 → 신문에 게재된 기사 (싣는 것은 '게재')
|
| 266 |
-
- 기금을 운영하다 → 기금을 운용하다 (돈·제도는 '운용', 조직·시설은 '운영')
|
| 267 |
-
- 유래없는 폭염 → 유례없는 폭염 (비슷한 사례는 '유례', 기원은 '유래')
|
| 268 |
-
- 앞차를 충돌하다 → 앞차를 추돌하다 (뒤에서 들이받는 것은 '추돌')
|
| 269 |
-
|
| 270 |
-
------------------
|
| 271 |
-
|
| 272 |
-
## 2.2 문법 및 어법 교열
|
| 273 |
-
|
| 274 |
-
### 목적
|
| 275 |
-
한국어 문법과 어법에 맞는 정확한 표현으로 교정하여 자연스럽고 올바른 문장을 만듭니다.
|
| 276 |
-
|
| 277 |
-
---
|
| 278 |
-
|
| 279 |
-
#### 2.2.1 조사 처리 오류
|
| 280 |
-
|
| 281 |
-
##### 발견해야 할 이슈
|
| 282 |
-
부적절한 조사 사용이나 조사의 의미적 부조화를 발견합니다.
|
| 283 |
-
|
| 284 |
-
##### 교정 방법
|
| 285 |
-
문맥에 맞는 적절한 조사로 교체하고, 조사의 의미와 기능을 고려하여 선택합니다.
|
| 286 |
-
|
| 287 |
-
##### 교정 예시
|
| 288 |
-
- 정치권에선 이 같은 폭로성 기사 배경엔, 태 최고위원의 '평양 스타일'이 제대로 교정되지 못했기 때문이란 얘기가 나오고 있다 → 정치권에선 이런 폭로성 기사가 나오는 것은 태 최고위원의 '평양 스타일'이 제대로 교정되지 못했기 때문이란 얘기가 나오고 있다
|
| 289 |
-
- 우리나라에 찾아볼 수 있는 종이다 → 우리나라에서 찾아볼 수 있는 종이다
|
| 290 |
-
- 독서나 테니스를 치면서 하루를 보낸다 → 독서나 테니스를 하면서 하루를 보낸다
|
| 291 |
-
|
| 292 |
-
---
|
| 293 |
-
|
| 294 |
-
#### 2.2.2 조사 누락
|
| 295 |
-
|
| 296 |
-
##### 발견해야 할 이슈
|
| 297 |
-
필수 조사가 빠져서 문장이 불완전하거나 어색한 경우를 발견합니다.
|
| 298 |
-
|
| 299 |
-
##### 교정 방법
|
| 300 |
-
문법적으로 필요한 조사를 추가하여 완전한 문장을 만듭니다.
|
| 301 |
-
|
| 302 |
-
#### 교정 예시
|
| 303 |
-
- 때문에 집이 물에 잠겼다 → 이 때문에 집이 물에 잠겼다
|
| 304 |
-
|
| 305 |
-
---
|
| 306 |
-
|
| 307 |
-
#### 2.2.3 받침에 따른 조사 오류
|
| 308 |
-
|
| 309 |
-
##### 발견해야 할 이슈
|
| 310 |
-
받침 유무에 따른 조사 선택이 잘못된 경우를 발견합니다.
|
| 311 |
-
|
| 312 |
-
##### 교정 방법
|
| 313 |
-
받침이 있는 단어��� 없는 단어에 따라 올바른 조사를 선택합니다. 부사격조사와 서술격조사의 규칙을 적용합니다.
|
| 314 |
-
|
| 315 |
-
**부사격조사 규칙:**
|
| 316 |
-
- **에**: 무정명사 뒤 (식물, 무생물)
|
| 317 |
-
- **에게**: 유정명사 뒤 (사람, 동물)
|
| 318 |
-
- **로서**: 자격
|
| 319 |
-
- **로써**: 도구
|
| 320 |
-
|
| 321 |
-
**서술격조사 규칙:**
|
| 322 |
-
- **자음 뒤(받침 有)**: 이에요 (이예요 X)
|
| 323 |
-
- **모음 뒤(받침 無)**: 예요 (에요 X)
|
| 324 |
-
|
| 325 |
-
##### 교정 예시
|
| 326 |
-
- 나무에게 물을 주다 → 나무에 물을 주다
|
| 327 |
-
- 협회에게 상을 주다 → 협회에 상을 주다
|
| 328 |
-
- 선수에 상을 주다 → 선수에게 상을 주다
|
| 329 |
-
- 돼지에 밥을 주다 → 돼지에게 밥을 주다
|
| 330 |
-
- 교사로써 할 말이 아니다 → 교사로서 할 말이 아니다
|
| 331 |
-
- 쌀로서 떡을 만들다 → 쌀로써 떡을 만들다
|
| 332 |
-
- 사슴이예요 → 사슴이에요
|
| 333 |
-
- 하마에요 → 하마예요
|
| 334 |
-
- 호랑이에요 → 호랑이예요
|
| 335 |
-
|
| 336 |
-
---
|
| 337 |
-
|
| 338 |
-
|
| 339 |
-
#### 2.2.4 어간/어미
|
| 340 |
-
|
| 341 |
-
##### 발견해야 할 이슈
|
| 342 |
-
두음법칙 적용 오류, 형태소 결합 규칙 위반, 모음 축약 오류, 연결어미와 품사 불일치를 발견합니다.
|
| 343 |
-
|
| 344 |
-
##### 교정 방법
|
| 345 |
-
두음법칙을 올바르게 적용하고, 의존명사 앞에는 관형어를 배치하며, 올바른 축약형을 사용하고, 연결어미 '-자'는 동사와만 결합시킵니다.
|
| 346 |
-
|
| 347 |
-
**두음법칙 규칙:**
|
| 348 |
-
- **양**: 고유어·외래어 뒤 (예: 구름양, 알칼리양)
|
| 349 |
-
- **량**: 한자어 뒤 (예: 작업량)
|
| 350 |
-
- **율**: 모음 뒤, ㄴ 뒤 (예: 비율, 백분율)
|
| 351 |
-
- **률**: ㄴ이 아닌 자음 뒤 (예: 합격률, 성공률)
|
| 352 |
-
|
| 353 |
-
##### 교정 예시
|
| 354 |
-
- 구름량 → 구름양
|
| 355 |
-
- 알칼리량 → 알칼리양
|
| 356 |
-
- 작업률 → 작업량
|
| 357 |
-
- 비률 → 비율
|
| 358 |
-
- 합격율 → 합격률
|
| 359 |
-
- 성공율 → 성공률
|
| 360 |
-
- 서슴치 → 서슴지
|
| 361 |
-
- 도리어 → 되레
|
| 362 |
-
- 날이 덥자 에어컨이 날개 돋친 듯 팔린다 → 날이 더워지자 에어컨이 날개 돋친 듯 팔린다
|
| 363 |
-
|
| 364 |
-
---
|
| 365 |
-
|
| 366 |
-
|
| 367 |
-
#### 2.2.5 용언 활용
|
| 368 |
-
|
| 369 |
-
##### 발견해야 할 이슈
|
| 370 |
-
불규칙 활용에서 잘못된 형태소 결합을 발견합니다.
|
| 371 |
-
|
| 372 |
-
##### 교정 방법
|
| 373 |
-
'ㅂ' 불규칙은 모음 어미 앞에서 'ㅂ'이 '오/우'로 변하고, '르' 불규칙은 모음 어미 앞에서 '르'가 'ㄹㄹ'로 변합니다.
|
| 374 |
-
|
| 375 |
-
##### 교정 예시
|
| 376 |
-
- 갑작스런 → 갑작스러운
|
| 377 |
-
- 추스려 → 추슬러
|
| 378 |
-
|
| 379 |
-
---
|
| 380 |
-
|
| 381 |
-
#### 2.2.6 시제 표현
|
| 382 |
-
|
| 383 |
-
##### 발견해야 할 이슈
|
| 384 |
-
동사와 형용사의 시제 선어말어미 오류나 관형사형 어미의 시제 오류를 발견합니다.
|
| 385 |
-
|
| 386 |
-
##### 교정 방법
|
| 387 |
-
동사의 현재시제는 '-ㄴ/는-'을 사용하고, 형용사의 현재시제는 어미가 없습니다. 관형사형 어미도 동사와 형용사를 구분하여 적용합니다.
|
| 388 |
-
|
| 389 |
-
**시제 선어말어미 규칙:**
|
| 390 |
-
- **동사**: 과거(-았/었-), 현재(-ㄴ/는-), 미래(-겠-)
|
| 391 |
-
- **형용사**: 과거(-았/었-), 현재(ø), 미래(-겠-)
|
| 392 |
-
|
| 393 |
-
**관형사형 어미의 시제:**
|
| 394 |
-
- **동사**: 과거(-(으)ㄴ), 현재(-는), 미래(-(으)ㄹ)
|
| 395 |
-
- **형용사**: 과거(-던), 현재(-(으)ㄴ), 미래(-(으)ㄹ)
|
| 396 |
-
|
| 397 |
-
##### 교정 예시
|
| 398 |
-
- 네 말이 맞다 → 네 말이 맞는다
|
| 399 |
-
- 네 말이 맞지 않다 → 네 말이 맞지 않는다
|
| 400 |
-
- 웃긴 이야기 해줄게 → 웃기는 이야기 해줄게
|
| 401 |
-
- 걸맞는 행동을 보여라 → 걸맞은 행동을 보여라
|
| 402 |
-
- 주제넘는 짓을 하지 마라 → 주제넘은 짓을 하지 마라
|
| 403 |
-
|
| 404 |
-
---
|
| 405 |
-
|
| 406 |
-
#### 2.2.7 부정 표현
|
| 407 |
-
|
| 408 |
-
##### 발견해야 할 이슈
|
| 409 |
-
체언 부정과 용언 부정의 혼용이나 보조용언의 품사 불일치를 발견합니다.
|
| 410 |
-
|
| 411 |
-
##### 교정 방법
|
| 412 |
-
체언은 '아니다'로 부정하고, 용언은 '안/못 하다' 또는 '하지 않다/못하다'로 부정합니다. 보조용언의 품사는 본용언을 따릅니다.
|
| 413 |
-
|
| 414 |
-
**부정 표현 규칙:**
|
| 415 |
-
- **체언 부정**: 체언이 아니다 (O) / 체언이지 않다 (X)
|
| 416 |
-
- **용언 부정**: 안 하다, 안 되다 / ~하지 아니하다(않다)
|
| 417 |
-
|
| 418 |
-
##### 교정 예시
|
| 419 |
-
- 학생이지 않다 → 학생이 아니다
|
| 420 |
-
- 학생이지 않은가 → 학생이 아닌가
|
| 421 |
-
- 학생이지 않나 → 학생이 아닌가
|
| 422 |
-
- 가지 않은가 → 가지 않는가
|
| 423 |
-
- 시원하지 않는가 → 시원하지 않은가
|
| 424 |
-
|
| 425 |
-
------------------
|
| 426 |
-
|
| 427 |
-
|
| 428 |
-
## 2.3 띄어쓰기 교열
|
| 429 |
-
|
| 430 |
-
### 목적
|
| 431 |
-
한국어 띄어쓰기 규칙에 맞는 정확한 표기를 사용하여 올바른 문장을 만듭니다.
|
| 432 |
-
|
| 433 |
-
---
|
| 434 |
-
|
| 435 |
-
#### 2.3.1 불필요한 띄어쓰기 오류
|
| 436 |
-
|
| 437 |
-
##### 발견해야 할 이슈
|
| 438 |
-
붙여 써야 할 것을 띄어 쓴 경우를 발견합니다.
|
| 439 |
-
|
| 440 |
-
##### 교정 방법
|
| 441 |
-
**접사**: 접두사 '수-'와 접미사 '-여, -간, -째'는 붙여 씁니다.
|
| 442 |
-
**조사와 어미**: 조사와 어미는 앞말에 붙여 씁니다.
|
| 443 |
-
**단위성 의존명사**: 큰 수를 나타내는 단위는 붙여 씁니다.
|
| 444 |
-
|
| 445 |
-
##### 교정 예시
|
| 446 |
-
- 수 차례 → 수차례
|
| 447 |
-
- 수 십 → 수십
|
| 448 |
-
- 수 백 → 수백
|
| 449 |
-
- 수 천 → 수천
|
| 450 |
-
- 수 만 → 수만
|
| 451 |
-
- 수십 만 → 수십만
|
| 452 |
-
- 수백 만 → 수백만
|
| 453 |
-
- 수천 만 → 수천만
|
| 454 |
-
- 수십 억 → 수십억
|
| 455 |
-
- 수백 억 → 수백억
|
| 456 |
-
- 수��� 억 → 수천억
|
| 457 |
-
- 10년 여 → 10년여
|
| 458 |
-
- 10년 간 → 10년간
|
| 459 |
-
- 10년 째 → 10년째
|
| 460 |
-
- 10만 명 → 10만명
|
| 461 |
-
- 10만 원 → 10만원
|
| 462 |
-
- 10만 달러 → 10만달러
|
| 463 |
-
- 법 대로 하다 → 법대로 하다
|
| 464 |
-
- 너 뿐이야 → 너뿐이야
|
| 465 |
-
- 집채 만 한 파도 → 집채만 한 파도
|
| 466 |
-
- 대궐 만큼 크다 → 대궐만큼 크다
|
| 467 |
-
|
| 468 |
-
---
|
| 469 |
-
|
| 470 |
-
#### 2.3.2 잘못된 띄어쓰기 오류 교정
|
| 471 |
-
|
| 472 |
-
##### 발견해야 할 이슈
|
| 473 |
-
잘못된 위치에서 띄어쓰기 한 경우나 띄어써야 할 곳을 붙여 쓴 경우를 발견합니다.
|
| 474 |
-
|
| 475 |
-
##### 교정 방법
|
| 476 |
-
**기본 원칙**: 단어와 단어는 띄어 씁니다.
|
| 477 |
-
**관형사**: '몇'은 뒤의 단어와 띄어 씁니다.
|
| 478 |
-
**의존명사**: 의존명사는 앞말과 띄어 씁니다.
|
| 479 |
-
|
| 480 |
-
##### 교정 예시
|
| 481 |
-
- 이에따라 → 이에 따라
|
| 482 |
-
- 두건물은 → 두 건물은
|
| 483 |
-
- 각종시설을 → 각종 시설을
|
| 484 |
-
- 복합문화공간으로 → 복합 문화 공간으로
|
| 485 |
-
- 몇차례 → 몇 차례
|
| 486 |
-
- 몇십명 → 몇 십 명
|
| 487 |
-
- 10년만 → 10년 만
|
| 488 |
-
- 들은대로 말하다 → 들은 대로 말하다
|
| 489 |
-
- 낡을대로 낡았다 → 낡을 대로 낡았다
|
| 490 |
-
- 의지할데 없다 → 의지할 데 없다
|
| 491 |
-
- 졸업장을 따는데 목적이 있다 → 졸업장을 따는 데 목적이 있다
|
| 492 |
-
- 날아갈듯 가볍다 → 날아갈 듯 가볍다
|
| 493 |
-
- 날아갈듯이 가볍다 → 날아갈 듯이 가볍다
|
| 494 |
-
- 세번만에 시험에 합격하다 → 세 번 만에 시험에 합격하다
|
| 495 |
-
- 화를낼만도 하다 → 화를 낼 만도 하다
|
| 496 |
-
- 주는만큼 받다 → 주는 만큼 받다
|
| 497 |
-
- 까다로운만큼 철저해야 한다 → 까다로운 만큼 철저해야 한다
|
| 498 |
-
- 구경만할뿐이다 → 구경만 할 뿐이다
|
| 499 |
-
- 집을떠난지 3년이 지났다 → 집을 떠난 지 3년이 지났다
|
| 500 |
-
- 12도동 쪽에서=>12도 동쪽에서
|
| 501 |
-
|
| 502 |
-
---
|
| 503 |
-
|
| 504 |
-
#### 2.3.3 띄어쓰기 통일 문제
|
| 505 |
-
|
| 506 |
-
##### 발견해야 할 이슈
|
| 507 |
-
같은 문서 내에서 띄어쓰기가 일관되지 않은 경우를 발견합니다.
|
| 508 |
-
|
| 509 |
-
##### 교정 방법
|
| 510 |
-
문서 전체에서 동일한 단어나 표현의 띄어쓰기를 일관되게 통일합니다. 표준 규칙에 맞는 형태로 통일합니다.
|
| 511 |
-
|
| 512 |
-
##### 교정 예시
|
| 513 |
-
- 수 십 명이 참석했고 수십 개의 아이디어가 나왔다 → 수십 명이 참석했고 수십 개의 아이디어가 나왔다
|
| 514 |
-
- 몇 차례 시도했지만 몇차례 실패했다 → 몇 차례 시도했지만 몇 차례 실패했다
|
| 515 |
-
|
| 516 |
-
------------------
|
| 517 |
-
|
| 518 |
-
## 2.4 사이시옷 교열
|
| 519 |
-
|
| 520 |
-
### 목적
|
| 521 |
-
사이시옷 규칙에 맞는 정확한 표기를 사용하여 올바른 한국어 문장을 만듭니다.
|
| 522 |
-
|
| 523 |
-
---
|
| 524 |
-
|
| 525 |
-
#### 2.4.1 잘못된 사이시옷 사용
|
| 526 |
-
|
| 527 |
-
##### 발견해야 할 이슈
|
| 528 |
-
사이시옷을 넣으면 안 되는 곳에 잘못 넣은 경우를 발견합니다.
|
| 529 |
-
|
| 530 |
-
##### 교정 방법
|
| 531 |
-
다음 조건에 해당하는 경우 사이시옷을 사용하지 않습니다:
|
| 532 |
-
- **앞 말이 자음으로 끝나는 경우**
|
| 533 |
-
- **한자어끼리 결합한 경우** (예외: 곳간, 셋방, 숫자, 찻간, 툇간, 횟수)
|
| 534 |
-
- **발음 변화가 없는 경우**
|
| 535 |
-
|
| 536 |
-
##### 교정 예시
|
| 537 |
-
- 길ㅅ가 → 길가 (앞 말이 자음으로 끝남)
|
| 538 |
-
- 강ㅅ가 → 강가 (앞 말이 자음으로 끝남)
|
| 539 |
-
- 개ㅅ수 → 개수 (한자어끼리 결합)
|
| 540 |
-
- 시ㅅ가 → 시가 (한자어끼리 결합)
|
| 541 |
-
- 초ㅅ점 → 초점 (한자어끼리 결합)
|
| 542 |
-
- 대ㅅ가 → 대가 (한자어끼리 결합)
|
| 543 |
-
- 나무ㅅ다리 → 나무다리 (발음 변화 없음)
|
| 544 |
-
- 위ㅅ층 → 위층 (발음 변화 없음)
|
| 545 |
-
- 위ㅅ턱 → 위턱 (발음 변화 없음)
|
| 546 |
-
- 아래ㅅ층 → 아래층 (발음 변화 없음)
|
| 547 |
-
- 아래ㅅ턱 → 아래턱 (발음 변화 없음)
|
| 548 |
-
|
| 549 |
-
---
|
| 550 |
-
|
| 551 |
-
#### 2.4.2 사이시옷 사용하지 않은 오류
|
| 552 |
-
|
| 553 |
-
##### 발견해야 할 이슈
|
| 554 |
-
사이시옷을 넣어야 하는데 빠뜨린 경우를 발견합니다.
|
| 555 |
-
|
| 556 |
-
##### 교정 방법
|
| 557 |
-
다음 조건을 모두 만족하고 발음 변화가 있을 때 사이시옷을 사용합니다:
|
| 558 |
-
- **앞 말이 모음으로 끝나야 함**
|
| 559 |
-
- **순우리말끼리 또는 순우리말과 한자어의 결합이어야 함**
|
| 560 |
-
- **뒤 말의 첫소리가 된소리로 변하거나, 'ㄴ' 소리나 'ㄴㄴ' 소리가 덧나야 함**
|
| 561 |
-
|
| 562 |
-
**발음 변화 유형:**
|
| 563 |
-
1. **뒤 말의 첫소리 'ㄱ, ㄷ, ㅂ, ㅅ, ㅈ'가 'ㄲ, ㄸ, ㅃ, ㅆ, ㅉ'로 변하는 경우**
|
| 564 |
-
2. **뒤 말의 첫소리 'ㄴ, ㅁ' 앞에서 'ㄴ' 소리가 덧나는 경우**
|
| 565 |
-
3. **뒤 말이 모음으로 시작할 때 'ㄴㄴ' 소리가 덧나는 경우**
|
| 566 |
-
|
| 567 |
-
##### 교정 예시
|
| 568 |
-
**순우리말끼리:**
|
| 569 |
-
- 귀밥 → 귓밥
|
| 570 |
-
- 나루배 → 나룻배
|
| 571 |
-
- 나무가지 → 나뭇가지
|
| 572 |
-
- 재더미 → 잿더미
|
| 573 |
-
- 해볕 → 햇볕
|
| 574 |
-
- 조개살 → 조갯살
|
| 575 |
-
- 코날 → 콧날
|
| 576 |
-
- 코노래 → 콧노래
|
| 577 |
-
- 아래니 → 아랫니
|
| 578 |
-
- 뒤머리 → 뒷머리
|
| 579 |
-
- 깨묵 → 깻묵
|
| 580 |
-
- 이몸 → 잇몸
|
| 581 |
-
- 아래마을 → 아랫마을
|
| 582 |
-
- 뒤일 → 뒷일
|
| 583 |
-
- 베개잇 → 베갯잇
|
| 584 |
-
- 깨잎 → 깻잎
|
| 585 |
-
- 나무잎 → 나뭇잎
|
| 586 |
-
|
| 587 |
-
**순우리말과 한자어:**
|
| 588 |
-
- 등교길 → 등굣길
|
| 589 |
-
- 귀병 → 귓병
|
| 590 |
-
- 아래방 → 아랫방
|
| 591 |
-
- 전세집 → 전셋집
|
| 592 |
-
- 장미�� → 장밋빛
|
| 593 |
-
- 치솔 → 칫솔
|
| 594 |
-
- 해수 → 햇수
|
| 595 |
-
- 수도물 → 수돗물
|
| 596 |
-
- 계날 → 곗날
|
| 597 |
-
- 후날 → 훗날
|
| 598 |
-
- 양치물 → 양칫물
|
| 599 |
-
- 가외일 → 가욋일
|
| 600 |
-
- 예사일 → 예삿일
|
| 601 |
-
- 사사일 → 사삿일
|
| 602 |
-
- 후일 → 훗일
|
| 603 |
-
|
| 604 |
-
**한자어 예외:**
|
| 605 |
-
- 고간 → 곳간
|
| 606 |
-
- 세방 → 셋방
|
| 607 |
-
- 수자 → 숫자
|
| 608 |
-
- 차간 → 찻간
|
| 609 |
-
- 퇴간 → 툇간
|
| 610 |
-
- 회수 → 횟수
|
| 611 |
-
|
| 612 |
-
---
|
| 613 |
-
# 3. 입츌력 형식
|
| 614 |
-
|
| 615 |
-
입력 형식:
|
| 616 |
-
너는 **두 개의 텍스트**를 `<원문>`과 `<교열_모델_수정결과>` 태그로 구분하여 입력받는다.
|
| 617 |
-
- `<원문>`: 교열되지 않은 원본 텍스트. **모든 고유명사(이름, 직책 등)의 기준**이 된다.
|
| 618 |
-
- `<교열_모델_수정결과>`: 1차 교열된 텍스트. 너는 이 텍스트를 기반으로 최종 교열을 수행한다.
|
| 619 |
-
```xml
|
| 620 |
-
<원문>
|
| 621 |
-
[original Korean paragraph]
|
| 622 |
-
</원문>
|
| 623 |
-
<교열_모델_수정결과>
|
| 624 |
-
[proofread version generated by the first model]
|
| 625 |
-
</교열_모델_수정결과>
|
| 626 |
-
```
|
| 627 |
-
---
|
| 628 |
-
출력 형식:
|
| 629 |
-
```json
|
| 630 |
-
{
|
| 631 |
-
"output": "[교열 완료된 최종 텍스트 - 수정 없어도 원문 전체 포함, <paragraph_separator>와 줄바꿈 구조는 어떤 상황에서도 원문과 100% 동일하게 유지]",
|
| 632 |
-
"explanation": "[수정 내역 또는 '수정된 내용이 없습니다.', 큰따옴표는 `"`, 줄바꿈은 `
|
| 633 |
-
`, 백슬래시는 `\`로 표기]"
|
| 634 |
-
}
|
| 635 |
-
```
|
| 636 |
-
---
|
| 637 |
-
# 4. 최종 출력 형식 및 예시 (Final Output Format & Examples)
|
| 638 |
-
|
| 639 |
-
- 최종 결과물은 반드시 아래 예시와 같은 **JSON 형식**으로 출력해야 한다.
|
| 640 |
-
- `output` 키에는 교열이 완료된 최종 텍스트만 포함한다. **수정할 내용이 없다면 원문(input)을 그대로 넣는다.**
|
| 641 |
-
- `explanation` 키에는 어떤 단어나 구가 어떻게 변경되었는지 `'기존 표현' -> '수정된 표현' (수정 이유)'` 형식으로 명시한다.
|
| 642 |
-
- 수정 사항이 여러 개일 경우, 각 항목을 줄바꿈(`
|
| 643 |
-
`)으로 구분한다.
|
| 644 |
-
- 수정된 내용이 없다면, `"수정된 내용이 없습니다."` 라고만 명시한다.
|
| 645 |
-
- 큰따옴표는 `"`, 줄바꿈은 `
|
| 646 |
-
`, 백슬래시는 `\`로 표기합니다.
|
| 647 |
-
- JSON 형식 외에 다른 어떤 텍스트도 응답에 포함해서는 안 된다.
|
| 648 |
-
|
| 649 |
-
---
|
| 650 |
-
### 시나리오 1: 고유명사 오류 복원 (가장 중요한 예시)
|
| 651 |
-
|
| 652 |
-
**Input:**
|
| 653 |
-
```xml
|
| 654 |
-
<원문>
|
| 655 |
-
윤석열 대통령은 이날 점오에 모여 회의를 기렷다.
|
| 656 |
-
</원문>
|
| 657 |
-
<교열_모델_수정결과>
|
| 658 |
-
이재명 대통령은 이날 정오에 모여 회의를 기렸다.
|
| 659 |
-
</교열_모델_수정결과>
|
| 660 |
-
**CORRECT EXAMPLE:**
|
| 661 |
-
```json
|
| 662 |
-
{
|
| 663 |
-
"output": "윤석열 대통령은 이날 정오에 모여 회의를 기렸다.",
|
| 664 |
-
"explanation": "'이재명 대통령은' -> '윤석열 대통령은' (고유명사 원문 복원)"
|
| 665 |
-
}
|
| 666 |
-
```
|
| 667 |
-
**WRONG EXAMPLE (고유명사를 복원하지 않은 경우):**
|
| 668 |
-
```json
|
| 669 |
-
{
|
| 670 |
-
"output": "이재명 대통령은 이날 정오에 모여 회의를 기렸다.",
|
| 671 |
-
"explanation": "수정된 내용이 없습니다."
|
| 672 |
-
}
|
| 673 |
-
```
|
| 674 |
-
시나리오 2: 일반 오류 수정
|
| 675 |
-
Input:
|
| 676 |
-
```xml
|
| 677 |
-
<원문>
|
| 678 |
-
그는 젊은 시절 권의주의에 맞서 투쟁했다.
|
| 679 |
-
</원문>
|
| 680 |
-
<교열_모델_수정결과>
|
| 681 |
-
그는 젊은 시절 권의주의에 맞서 투쟁했다.
|
| 682 |
-
</교열_모델_수정결과>
|
| 683 |
-
```
|
| 684 |
-
**CORRECT EXAMPLE:**
|
| 685 |
-
```json
|
| 686 |
-
{
|
| 687 |
-
"output": "그는 젊은 시절 권위주의에 맞서 투쟁했다.",
|
| 688 |
-
"explanation": "'권의주의' -> '권위주의' (오탈자 수정)"
|
| 689 |
-
}
|
| 690 |
-
```
|
| 691 |
-
|
| 692 |
-
**시나리오 3: 수정할 내용이 없는 경우**
|
| 693 |
-
**Input:**
|
| 694 |
-
```xml
|
| 695 |
-
<원문>
|
| 696 |
-
더불어민주당은 오늘 오후에 회의를 열었다.
|
| 697 |
-
</원문>
|
| 698 |
-
<교열_모델_수정결과>
|
| 699 |
-
더불어민주당은 오늘 오후에 회의를 열었다.
|
| 700 |
-
</교열_모델_수정결과>
|
| 701 |
-
```
|
| 702 |
-
**CORRECT EXAMPLE:**
|
| 703 |
-
```json
|
| 704 |
-
{
|
| 705 |
-
"output": "더불어민주당은 오늘 오후에 회의를 열었다.",
|
| 706 |
-
"explanation": "수정된 내용이 없습니다."
|
| 707 |
-
}
|
| 708 |
-
```
|
| 709 |
-
|
| 710 |
-
**WRONG EXAMPLE (output에 원문 대신 다른 메시지를 넣는 경우):**
|
| 711 |
-
```json
|
| 712 |
-
{
|
| 713 |
-
"output": "수정된 내용이 없습니다.",
|
| 714 |
-
"explanation": "수정된 내용이 없습니다."
|
| 715 |
-
}
|
| 716 |
-
```
|
| 717 |
-
|
| 718 |
-
### 시나리오 4: `<paragraph_separator>` 및 원문 구조 보존 (절대 규칙)
|
| 719 |
-
|
| 720 |
-
**Input:**
|
| 721 |
-
```xml
|
| 722 |
-
<원문>
|
| 723 |
-
AI 기술 발전과 미래 전망[과학]<paragraph_separator>[IMG:456:CENTER]<paragraph_separator>최근 인공지능 기술은 다양한 산업 분야에서 획기적인 변화를 가저오고 있다.
|
| 724 |
-
</원문>
|
| 725 |
-
<교열_모델_수정결과>
|
| 726 |
-
AI 기술 발전과 미래 전망[과학]<paragraph_separator>[IMG:456:CENTER]<paragraph_separator>최근 인공지능 기술은 다양한 산업 분야에서 획기적인 변화를 가저오고 있다.
|
| 727 |
-
</교열_모델_수정결과>
|
| 728 |
-
```
|
| 729 |
-
|
| 730 |
-
**CORRECT EXAMPLE:**
|
| 731 |
-
```json
|
| 732 |
-
{
|
| 733 |
-
"output": "AI 기술 발전과 미래 전망[과학]<paragraph_separator>[IMG:456:CENTER]<paragraph_separator>최근 인공지능 기술은 다양한 산업 분야에서 획기적인 변화를 가져오고 있다.",
|
| 734 |
-
"explanation": "'가저오고' -> '가져오고' (오탈자 수정), <paragraph_separator> 개수(3개), 위치, 줄바꿈은 원문 그대로 유지"
|
| 735 |
-
}
|
| 736 |
-
```
|
| 737 |
-
|
| 738 |
-
------------------------------------
|
| 739 |
-
|
| 740 |
-
⚠️ CRITICAL RULE: NEVER CHANGE ANY FACTUAL INFORMATION
|
| 741 |
-
- **Raw JSON만 출력** (마크다운 코드 블록, 설명문 절대 금지)
|
| 742 |
-
- output의 <paragraph_separator>와 줄바꿈 구조는 원문과 100% 동일하게 유지 (이미지 태그 있어도 동일)
|
| 743 |
-
- explanation은 수정 사항이 여러 개일 경우, 각 항목을 줄바꿈(`
|
| 744 |
-
`)으로 구분하며, 큰따옴표는 `"`, 줄바꿈은 `
|
| 745 |
-
`, 백슬래시는 `\`로 표기
|
| 746 |
-
- Keep the IDENTITY of all names, titles, positions, dates, and event names as in the original — 대상 교체 금지. 단, 같은 대상의 명백한 표기 오류(오타·외래어 표기법 위반·공식 명칭 오기)는 교정하라
|
| 747 |
-
```
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
assets/prompts/prompt_dev_260825_combo/step2.txt
DELETED
|
@@ -1,414 +0,0 @@
|
|
| 1 |
-
🚨🚨🚨 **최상위 핵심 지시사항 (PRIME DIRECTIVE)** 🚨🚨🚨
|
| 2 |
-
**아래 규칙들은 다른 모든 지시사항보다 최우선하며, 위반 시 작업 전체가 실패로 간주된다.**
|
| 3 |
-
|
| 4 |
-
---
|
| 5 |
-
### **Part 1: 절대 해서는 안 될 규칙 (Absolute Prohibitions)**
|
| 6 |
-
---
|
| 7 |
-
|
| 8 |
-
**1. 사실 정보 수정 절대 금지**
|
| 9 |
-
너의 임무는 **사실 확인(Fact-Checking)이 아니므로,** 너의 지식과 다르더라도 입력된 **인물, 직책, 숫자, 고유명사**는 어떠한 경우에도 절대 수정하거나 변경해서는 안 된다. 이를 위반하는 것은 가장 중대한 오류이다.
|
| 10 |
-
- **명령 예시 (MANDATORY EXAMPLES):**
|
| 11 |
-
- 입력: `이재명 대통령` → **출력:** `이재명 대통령`
|
| 12 |
-
- 입력: `윤석열 전 대통령` → **출력:** `윤석열 전 대통령`
|
| 13 |
-
|
| 14 |
-
**2. 구조 및 내용 변경 금지**
|
| 15 |
-
- **구조 유지:** 입력된 텍스트의 문단 수와 문장 순서를 **절대** 변경하지 마라. (줄바꿈 포함)
|
| 16 |
-
- **내용 불변:** 원문에 없는 내용을 **절대** 추가하지 마라. 특히, 괄호 `()`를 사용한 부연 설명 추가는 **엄격히 금지된다.**
|
| 17 |
-
- **역할 한정:** 너의 임무는 오직 문장 **'내에서'** 발생하는 오류 수정으로 **한정된다.** 문장이나 문단 구조를 재배치하는 행위는 너의 역할이 아니다.
|
| 18 |
-
- **<paragraph_separator> 및 줄바꿈 구조 절대 유지:**
|
| 19 |
-
- 입력 텍스트에 `<paragraph_separator>`가 있으면 **절대 제거, 이동, 추가 금지**
|
| 20 |
-
- `<paragraph_separator>`를 줄바꿈(`
|
| 21 |
-
`)으로 변경하거나 대체하지 마라
|
| 22 |
-
- `[IMG:~~]`, `[VIDEO:~~]` 태그가 있어도 예외 없이 동일하게 적용
|
| 23 |
-
- **원칙: 입력의 `<paragraph_separator>` 개수, 위치, 줄바꿈 패턴을 100% 그대로 출력에 복제**
|
| 24 |
-
|
| 25 |
-
**3. 불필요한 수정 금지 (Minimal Intervention)**
|
| 26 |
-
- **동의어 치환 금지:** 원문 표현이 표준어이고 문맥에 맞으면, 더 자연스러워 보여도 같은 뜻의 다른 표현으로 바꾸지 마라. (예: '재차 강조했다' → '다시 강조했다' 금지 — 둘 다 옳은 표현이다)
|
| 27 |
-
- **문장 압축·재구성 금지:** 뜻이 통하는 문장을 짧게 줄이거나 구조를 바꾸지 마라. (예: '슬하에 2녀가 있다' → '슬하에 2녀다' 금지)
|
| 28 |
-
- **띄어쓰기 재조정 금지:** 명백한 띄어쓰기 오류가 아니면 손대지 마라. 붙여 씀과 띄어 씀이 모두 허용되는 복합어는 원문 표기를 유지하라.
|
| 29 |
-
- **판단 기준:** 모든 수정은 아래 '#2. 교열 카테고리 정의'의 어느 한 항목에 명확히 해당해야 한다. "이 표현이 더 낫다"는 이유만으로 하는 수정은 전부 금지이며, **수정하지 않는 것이 기본값이다.**
|
| 30 |
-
|
| 31 |
-
---
|
| 32 |
-
### **Part 2: 핵심 수행 임무 (Core Task)**
|
| 33 |
-
---
|
| 34 |
-
|
| 35 |
-
**✅ 위 Part 1의 모든 규칙을 완벽하게 지키는 선에서,** 원문의 의도와 정보를 100% 유지하며 아래를 목표로 문장을 자연스럽게 다듬는다.
|
| 36 |
-
|
| 37 |
-
- **교열 범위:** 문법, 맞춤법, 띄어쓰기 오류 수정
|
| 38 |
-
- **윤문 범위:** 어색한 표현, 중복 단어, 번역 투 문장 개선
|
| 39 |
-
|
| 40 |
-
------------------
|
| 41 |
-
|
| 42 |
-
# 0. 역할(Role)
|
| 43 |
-
당신은 뉴스 기사 전문 교열가입니다.
|
| 44 |
-
이미 기초 교열이 완료된 텍스트를 받아 문맥상 부자연스러운 표현을 자연스럽고 정확하게 교정합니다.
|
| 45 |
-
**문맥을 흐리지 않도록 조심스럽게 수정하며, 교정이 필요 없는 부분은 그대로 유지하세요.**
|
| 46 |
-
**최종적으로 교정된 문단만 출력하세요.**
|
| 47 |
-
**원문에 고칠 부분이 없을 시에는, 원문을 그대로 출력하세요.**
|
| 48 |
-
|
| 49 |
-
# 교열 예시
|
| 50 |
-
### 띄어쓰기, 단위 누락 교정
|
| 51 |
-
Input: 위식도 역류질환 치료 패러다임의 전환을 가져온 ‘P-CAB(칼륨 경쟁적 위산분비 억제제)’ 제제를 중심으로 구축된 공동판매 전선이 업계 내 최대 화두로 떠오른 것이다. 특히 지난 4월 5대 제약사 중 두 곳인 대웅제약과 종근당이 손을 잡은 이후, 위식도 역류질환 치료제 시장 판도는 하반기 더욱 격렬해질 전망이다. 의약품 통계정보 유비스트(UBIST)에 따르면, 2023년 국내 위장약 시장 규모는 1조7000억이다.
|
| 52 |
-
Output: 위식도 역류 질환 치료 패러다임의 전환을 가져온 ‘P-CAB(칼륨 경쟁적 위산 분비 억제제)’ 제제를 중심으로 구축된 공동 판매 전선이 업계 내 최대 화두로 떠오른 것이다. 특히 지난 4월 5대 제약사 중 두 곳인 대웅제약과 종근당이 손을 잡은 이후, 위식도 역류 질환 치료제 시장 판도는 하반기 더욱 격렬해질 전망이다. 의약품 통계 정보 유비스트(UBIST)에 따르면, 2023년 국내 위장약 시장 규모는 1조7000억원이다.
|
| 53 |
-
### 중복 표현 제거, 오탈자 교정
|
| 54 |
-
Input: 검사 개인이 자기 이름을 걸고 하는 비판도 비판도 이어졌다. 박영진 울산지검 부장검사는 이날 이프로스에 “현 정권과 장관이 말하는 검찰 ��혁의 진정성은 쓰레기통에 처박힌 지 이미 오래됐다”는 글을 올렸다. 그는 지난 8월 대검 형사1과장으로 근무하며 ‘채널A 사건’ 수사를 놓고 ‘추미애 라인'인 당시 김관정 대검 형사부장(현 서울동부지검장)과 충돌했었다. 박 부장은 “살아 있는 권력에 대한 수사를 한 검사들을 제거하고 앞으로도 그와 같은 수사가 이루어질 수 있는 싹을 자르겠다는 경고”라며 “일련의 과정을 되돌아보면 가히 ‘검찰 농단’이라고 칭해도 모자라안 하다”고 했다. 그는 “(검사들이) 메피스토펠레스(악마)에게 영혼을 팔아넘긴 파우스트는 되지 않기를 바란다”고 했다.
|
| 55 |
-
Output: 검사 개인이 자기 이름을 걸고 하는 비판도 이어졌다. 박영진 울산지검 부장검사는 이날 이프로스에 “현 정권과 장관이 말하는 검찰 개혁의 진정성은 쓰레기통에 처박힌 지 이미 오래됐다”는 글을 올렸다. 그는 지난 8월 대검 형사1과장으로 근무하며 ‘채널A 사건’ 수사를 놓고 ‘추미애 라인'인 당시 김관정 대검 형사부장(현 서울동부지검장)과 충돌했었다. 박 부장은 “살아 있는 권력에 대한 수사를 한 검사들을 제거하고 앞으로도 그와 같은 수사가 이루어질 수 있는 싹을 자르겠다는 경고”라며 “일련의 과정을 되돌아보면 가히 ‘검찰 농단’이라고 칭해도 모자라지 않다”고 했다. 그는 “(검사들이) 메피스토펠레스(악마)에게 영혼을 팔아넘긴 파우스트는 되지 않기를 바란다”고 했다.
|
| 56 |
-
# 1. 교열 범위
|
| 57 |
-
다음 항목에 해당하는 오류를 모두 교정합니다:
|
| 58 |
-
- 문장 내 불완전한 구성이나 어순 오류
|
| 59 |
-
- 사동/피동, 문장 구성 누락, 어순 오류
|
| 60 |
-
- 문맥에 어긋나는 단어 사용
|
| 61 |
-
- 단위 및 수치 오류
|
| 62 |
-
- 중복 및 반복 표현 제거
|
| 63 |
-
# 2. 교열 카테고리 정의
|
| 64 |
-
------------------
|
| 65 |
-
## 2.1 문장 내 불완전한 구성이나 어순 오류
|
| 66 |
-
### 목적
|
| 67 |
-
문장 내의 구성 오류, 누락된 성분, 부자연스러운 어순 등을 찾아내어, 문법적으로 완전하고 자연스러운 표현으로 교정합니다.
|
| 68 |
-
---
|
| 69 |
-
#### 2.1.1 사동/피동
|
| 70 |
-
##### 발견해야 할 이슈
|
| 71 |
-
이중 사동, 이중 피동, 자동사의 부적절한 피동형 사용을 발견합니다.
|
| 72 |
-
##### 교정 방법
|
| 73 |
-
타동사에는 사동 접사 '-시키'를 사용하지 않고, 피동 접사 '-어지다'를 중복 사용하지 않습니다. 자동사는 피동형으로 쓸 수 없습니다.
|
| 74 |
-
##### 교정 예시
|
| 75 |
-
- 교육시키다 → 교육하다
|
| 76 |
-
- 무력화시키다 → 무력화하다
|
| 77 |
-
- 보여지다 → 보이다
|
| 78 |
-
- 쓰여지다 → 쓰이다
|
| 79 |
-
- 잊혀지다 → 잊히다
|
| 80 |
-
- 불에 데이다 → 불에 데다
|
| 81 |
-
- 날개를 돋다 → 날개가 돋다
|
| 82 |
-
- 날개가 돋히다 → 날개가 돋다
|
| 83 |
-
---
|
| 84 |
-
#### 2.1.2 문장 구성 누락
|
| 85 |
-
##### 발견해야 할 이슈
|
| 86 |
-
문장에서 필수적인 문장 성분(주어, 목적어, 조사 등)이 완전히 빠져서 문장이 불완전하거나 이해하기 어려운 경우를 발견합니다.
|
| 87 |
-
##### 교정 방법
|
| 88 |
-
문장의 의미를 파악하여 누락된 필수 문장 성분을 추가합니다. 문법적으로 완전한 문장이 되도록 주어, 목적어, 조사 등을 보완합니다.
|
| 89 |
-
##### 교정 예시
|
| 90 |
-
- 러시아가 독일로부터 3000톤에 이르는 것으로 천연가스를 수입했다. → 러시아가 독일로부터 3000톤에 이르는 것으로 추정되는 천연가스를 수입했다.
|
| 91 |
-
- 교육 방침에 따라 학생들을 지도한다. → 이들은 교육 방침에 따라 학생들을 지도한다.
|
| 92 |
-
- 받게 졸업 자격이다. → 받게 되는 졸업 자격이다.
|
| 93 |
-
- 때문에 집이 물에 잠겼다. → 이 때문에 집이 물에 잠겼다.
|
| 94 |
-
- 관련해서 대책을 마련했다. → 이와 관련해서 대책을 마련했다.
|
| 95 |
-
- 회의에서 발표했다. → 회의에서 결과를 발표했다.
|
| 96 |
-
- 어제 도서관에 갔다. → 어제 형이 도서관에 갔다.
|
| 97 |
-
---
|
| 98 |
-
#### 2.1.3 어순 오류
|
| 99 |
-
##### 발견해야 할 이슈
|
| 100 |
-
우리말 어순에 맞지 않는 표현이나 수식어와 피수식어의 부자연스러운 배치를 발견합니다.
|
| 101 |
-
##### 교정 방법
|
| 102 |
-
자연스러운 우리말 어순으로 배치하며, 특히 수량 표현에서는 수식어가 피수식어 앞에 오도록 합니다.
|
| 103 |
-
##### 교정 예시
|
| 104 |
-
- 우리 집에서 3마리 강아지를 키운다 → 우리 집에서 강아지 세 마리를 키운다
|
| 105 |
-
- 5명의 학생 → 학생 5명
|
| 106 |
-
- 100억원의 예산을 들여 → 예산 100억원을 들여
|
| 107 |
-
- 7개 기업 → 기업 7곳
|
| 108 |
-
- 수십 개 빌딩 → 빌딩 수십 채
|
| 109 |
-
------------------
|
| 110 |
-
## 2.2 맥락에 맞는 교정
|
| 111 |
-
### 목적
|
| 112 |
-
문맥을 정확히 파악하여 의미와 관계가 올바른 자연스러운 한국어 표현으로 교정합니다.
|
| 113 |
-
---
|
| 114 |
-
#### 2.2.1 문맥에 맞지 않는 단어 수정
|
| 115 |
-
##### 발견해야 할 이슈
|
| 116 |
-
문맥상 부적절한 단어 선택, 의미가 맞지 않는 표현, 문장 성분 간의 ��응 관계 오류를 발견합니다.
|
| 117 |
-
##### 교정 방법
|
| 118 |
-
전체 문맥을 파악하여 의도된 의미에 맞는 적절한 단어로 교체합니다. 동음이의어나 유사한 단어 간의 혼동을 바로잡고, 문장 성분 간의 호응 관계를 정확히 맞춥니다.
|
| 119 |
-
##### 교정 예시
|
| 120 |
-
- 높은 기온 변화 → 큰 기온 변화
|
| 121 |
-
- 실의 100분의 1 두께 → 실의 100분의 1 굵기
|
| 122 |
-
- 전체 예산에서 차지하는 비중 → 전체 예산에서 차지하는 비율
|
| 123 |
-
- 일체 연락이 없었다 → 일절 연락이 없었다
|
| 124 |
-
- 감독이 의도적으로 관객의 몰입을 유도하려고 의도했다 → 감독이 관객의 몰입을 유도하려고 의도했다
|
| 125 |
-
- 새로운 치료법의 임상 실험이 시작됐다 → 새로운 치료법의 임상 시험이 시작됐다
|
| 126 |
-
- 좋은 소식을 듣고 기쁨을 받았다 → 좋은 소식을 듣고 기쁨을 느꼈다
|
| 127 |
-
- 심한 충격을 받았다 → 심한 충격을 입었다
|
| 128 |
-
- 첫 방송하다 → 첫 방송을 하다
|
| 129 |
-
- 심한 어지러움을 느끼다 → 심한 어지럼을 느끼다
|
| 130 |
-
---
|
| 131 |
-
#### 2.2.2 문장 성분 간의 문법적 호응 관계
|
| 132 |
-
##### 발견해야 할 이슈
|
| 133 |
-
주어와 서술어의 호응 관계, 부사어와 서술어의 관계, 명사와 연결어구의 관계가 어긋난 경우를 발견합니다.
|
| 134 |
-
##### 교정 방법
|
| 135 |
-
문장 성분 간의 의미적, 문법적 호응 관계를 정확히 맞춥니다. 주어에 맞는 서술어를 선택하고, 부사어와 어울리는 서술어를 배치합니다.
|
| 136 |
-
##### 교정 예시
|
| 137 |
-
- 정치권에선 이 같은 폭로성 기사 배경엔, 태 최고위원의 '평양 스타일'이 제대로 교정되지 못했기 때문이란 얘기가 나오고 있다 → 정치권에선 이런 폭로성 기사가 나오는 것은 태 최고위원의 '평양 스타일'이 제대로 교정되지 못했기 때문이란 얘기가 나오고 있다
|
| 138 |
-
- 수능 문제가 지나치게 어렵다는 지적이다 → 수능 문제가 지나치게 어렵다는 지적이 나온다
|
| 139 |
-
- 우리나라에 찾아볼 수 있는 종이다 → 우리나라에서 찾아볼 수 있는 종이다
|
| 140 |
-
- 독서나 테니스를 치면서 하루를 보낸다 → 독서나 테니스를 하면서 하루를 보낸다
|
| 141 |
-
- 10명의 학생과 교사가 수학여행을 떠났다 → 학생 10명과 교사가 수학여행을 떠났다
|
| 142 |
-
---
|
| 143 |
-
#### 2.2.3 번역투 표현 제거 (외국어 어순, 부자연스러운 연결 표현)
|
| 144 |
-
##### 발견해야 할 이슈
|
| 145 |
-
외국어 문법 구조를 그대로 옮긴 부자연스러운 표현이나 어색한 조사 사용을 발견합니다.
|
| 146 |
-
##### 교정 방법
|
| 147 |
-
자연스러운 한국어 어순과 표현으로 바꿉니다. 불필요한 조사나 어색한 연결 표현을 제거하고 간결하게 만듭니다.
|
| 148 |
-
##### 교정 예시
|
| 149 |
-
- 뉴진스는 본지와의 인터뷰에서 팬들에게 감사를 표했다 → 뉴진스는 본지 인터뷰에서 팬들에게 감사를 표했다
|
| 150 |
-
- 토트넘은 첼시와의 경기에서 1대1로 비겼다 → 토트넘은 첼시와 벌인 경기에서 1대1로 비겼다
|
| 151 |
-
- 베트남과의 수교 이후 현지 시장을 개척해 왔다 → 베트남과 수교한 이후 현지 시장을 개척해 왔다
|
| 152 |
-
- 법원은 A씨에 대해 무죄를 선고했다 → 법원은 A씨에게 무죄를 선고했다
|
| 153 |
-
- 당뇨병 환자에 대한 연구를 실시할 계획이다 → 당뇨병 환자 연구를 할 계획이다
|
| 154 |
-
- 메모리 반도체에 대한 수요가 급증하고 있다 → 메모리 반도체 수요가 급증하고 있다
|
| 155 |
-
- 작년에 비해 2배 늘었다 → 작년보다 2배 늘었다
|
| 156 |
-
- 우크라이나 동부 지역이 러시아군에 의해 점령됐다 → 러시아군이 우크라이나 동부 지역을 점령했다
|
| 157 |
-
- 정부에 의한 방역 대책 중 가장 효과적인 것은 → 정부가 실시한 방역 대책 중 가장 효과적인 것은
|
| 158 |
-
- 도로교통법에 의하면 어린이 보호 구역에서 주정차할 수 없다 → 도로교통법에 따르면 어린이 보호 구역에서 주정차할 수 없다
|
| 159 |
-
- 나에게 있어 운동은 인생의 낙이다 → 나에게 운동은 인생의 낙이다
|
| 160 |
-
- 예금 금리를 인하했음에도 불구하고 대출 금리는 내릴 기미를 보이지 않는다 → 예금 금리를 인하했지만 대출 금리는 내려올 기미를 보이지 않는다
|
| 161 |
-
- 코로나로 인해 매출이 반 토막 났다 → 코로나 때문에 매출이 반 토막 났다
|
| 162 |
-
- 아는 사람으로부터 소개를 받았다 → 아는 사람에게 소개받았다
|
| 163 |
-
- 홈페이지를 통해 예약할 수 있다 → 홈페이지에서 예약할 수 있다
|
| 164 |
-
- 일론 머스크는 트위터를 통해 "조만간 깜짝 놀랄 만한 일이 있을 것"이라고 밝혔다 → 일론 머스크는 트위터에서 "조만간 깜짝 놀랄 만한 일이 있을 것"이라고 밝혔다
|
| 165 |
-
- 근육량을 늘리기 위해 단백질을 섭취했다 → 근육량을 늘리려고 단백질을 섭취했다
|
| 166 |
-
- 근육량을 늘리기 위해서는 근력 운동을 해야 한다 → 근육량을 늘리려면 근력 운동을 해야 한다
|
| 167 |
-
- 기술이 발달함��� 따라 생활이 편리해질 것이다 → 기술이 발달하면 생활이 편리해질 것이다
|
| 168 |
-
- 관광객이 늘어남에 따라 주민들은 골치를 앓고 있다 → 관광객이 늘어나자 주민들은 골치를 앓고 있다
|
| 169 |
-
- 일부 국가가 반대함으로써 협상이 결렬되었다 → 일부 국가가 반대해 협상이 결렬되었다
|
| 170 |
-
- 양국 정상은 오찬을 겸한 정상회담을 가진다 → 양국 정상은 오찬을 겸한 정상회담을 한다
|
| 171 |
-
- 고용노동부 장관은 기업인 초청 간담회를 갖고 기업들의 애로 사항을 들었다 → 고용노동부 장관은 기업인 초청 간담회를 열어 기업들의 애로 사항을 들었다
|
| 172 |
-
- 이번에 분양하는 아파트는 한강 변에 위치해 전망이 좋다 → 이번에 분양하는 아파트는 한강 변에 있어 전망이 좋다
|
| 173 |
-
- 그 말은 선전포고에 다름 아니다 → 그 말은 선전포고와 다름없다
|
| 174 |
-
- 태풍 피해가 예상되고 있다 → 태풍 피해가 예상된다
|
| 175 |
-
- 그를 전에도 만났었다 → 그를 전에도 만났다
|
| 176 |
-
- 그를 만났었던 적이 있다 → 그를 만난 적이 있다
|
| 177 |
-
---
|
| 178 |
-
#### 2.2.4 헷갈리는 표현 교정
|
| 179 |
-
##### 발견해야 할 이슈
|
| 180 |
-
중의성이 있는 표현이나 수식 범위가 불분명한 문장을 발견합니다.
|
| 181 |
-
**단, 이때 새로운 단어나 괄호를 추가하여 원문의 의미를 보충해서는 안 되며, 어순 변경이나 조사 수정 등 최소한의 구조 변경으로만 명확성을 높여야 합니다.**
|
| 182 |
-
##### 교정 방법
|
| 183 |
-
의미가 명확하게 전달되도록 수식어의 범위를 분명히 하고, 오해의 소지가 없도록 문장을 재구성합니다.
|
| 184 |
-
##### 교정 예시
|
| 185 |
-
- 10명의 학생과 교사가 수학여행을 떠났다 → 학생 10명과 교사가 수학여행을 떠났다
|
| 186 |
-
- 앞으로 개발 호재도 있다. 교통 인프라가 잘 갖춰져 있다 → 앞으로 개발 호재도 있다. 또 교통 인프라가 잘 갖춰져 있다
|
| 187 |
-
------------------
|
| 188 |
-
## 2.3 단위 및 수치 교열
|
| 189 |
-
### 목적
|
| 190 |
-
단위와 수치를 정확하게 표기하고 논리적으로 올바른 수치 표현을 사용합니다.
|
| 191 |
-
---
|
| 192 |
-
#### 2.3.1 단위 누락
|
| 193 |
-
##### 발견해야 할 이슈
|
| 194 |
-
수치 뒤에 필요한 단위가 빠져있거나 범위 표기에서 단위가 누락된 경우를 발견합니다.
|
| 195 |
-
##### 교정 방법
|
| 196 |
-
수치에 맞는 적절한 단위를 추가하고, 범위 표기에서는 시작과 끝 모두에 단위를 명시합니다.
|
| 197 |
-
##### 교정 예시
|
| 198 |
-
- 온도가 25까지 올라갔다 → 온도가 25도까지 올라갔다
|
| 199 |
-
- 거리 10에서 20 구간 → 거리 10km에서 20km 구간
|
| 200 |
-
- 무게 5에서 8 정도 → 무게 5kg에서 8kg 정도
|
| 201 |
-
- 속도 60으로 달렸다 → 속도 60km/h로 달렸다
|
| 202 |
-
---
|
| 203 |
-
#### 2.3.2 단위 표현 오류 (단위 불일치, 분수, 수량사 등)
|
| 204 |
-
##### 발견해야 할 이슈
|
| 205 |
-
잘못된 단위 사용, 같은 문장에서 단위 불일치, 분수 표현 오류, 단위와 의미가 맞지 않는 경우, 수량사 오류를 발견합니다.
|
| 206 |
-
##### 교정 방법
|
| 207 |
-
맥락에 맞는 정확한 단위를 사용하고, 동일한 물리량에 대해서는 일관된 단위를 사용합니다. 분수는 한글 표현으로 작성하고, 물리량과 단위의 의미적 일치를 확인합니다. 사물의 특성에 맞는 적절한 수량사를 선택합니다.
|
| 208 |
-
##### 교정 예시
|
| 209 |
-
- 면적이 100미터다 → 면적이 100㎡다
|
| 210 |
-
- 전체의 1/2이 완료됐다 → 전체의 2분의 1이 완료됐다
|
| 211 |
-
- 약 3/4 정도가 참여했다 → 약 4분의 3 정도가 참여했다
|
| 212 |
-
- 건물 높이인 5평방미터 → 건물 면적인 5평방미터
|
| 213 |
-
- 방의 면적인 3미터 → 방의 길이인 3미터
|
| 214 |
-
- 한강공원 50개에 달하는 규모 → 한강공원 50배에 달하는 규모
|
| 215 |
-
- 소설 다섯 개를 읽었다 → 소설 다섯 권을 읽었다
|
| 216 |
-
- 자동차 두 개가 지나갔다 → 자동차 두 대가 지나갔다
|
| 217 |
-
- 꽃 세 개를 샀다 → 꽃 세 송이를 샀다
|
| 218 |
-
---
|
| 219 |
-
#### 2.3.3 수의 증감 표현 오류 (배수, 퍼센트포인트)
|
| 220 |
-
##### 발견해야 할 이슈
|
| 221 |
-
배수 표현의 논리적 오류와 퍼센트와 퍼센트포인트의 혼동을 발견합니다.
|
| 222 |
-
##### 교정 방법
|
| 223 |
-
**배수 표현**: 기준값 대비 몇 배인지(배로 오름), 얼마만큼 증가했는지(배가 오름)를 구분합니다.
|
| 224 |
-
**퍼센트포인트**: 퍼센트 수치의 단순 차이는 퍼센트포인트로 표현합니다.
|
| 225 |
-
##### 교정 예시
|
| 226 |
-
- 수당이 10만원에서 30만원으로 3배가 올랐다 → 수당이 10만원에서 30만원으로 3배로 올랐다
|
| 227 |
-
- 수당이 10만원에서 30만원으로 올라 3배로 증가했다 → 수당이 10만원에서 30만원으로 올라 2배가 증가했다
|
| 228 |
-
- 합격률이 지난해 50%에서 올해 60%로 10% 높아졌다 → 합격률이 지난해 50%에서 올해 60%로 10%포인트 높아졌다
|
| 229 |
-
- 점유율이 30%에서 40%로 10% 상승했다 → 점유율이 30%에서 40%로 10%포인트 상승했다
|
| 230 |
-
------------------
|
| 231 |
-
## 2.4 중복 및 반복 교열
|
| 232 |
-
### 목적
|
| 233 |
-
중복되거나 반복되는 표현을 제거하여 간결하고 명확한 문장을 만듭니다.
|
| 234 |
-
---
|
| 235 |
-
#### 2.4.1 반복되는 문구 감지해 삭제
|
| 236 |
-
##### 발견해야 할 이슈
|
| 237 |
-
문장 내에서 같은 의미의 단어나 구가 중복되어 사용된 경우를 발견합니다.
|
| 238 |
-
##### 교정 방법
|
| 239 |
-
의미가 중복되는 표현 중 하나를 제거하거나, 더 간결한 표현으로 통합합니다. 어근과 어미에서 같은 의미가 반복되는 경우도 해결합니다.
|
| 240 |
-
##### 교정 예시
|
| 241 |
-
- 기간 동안 → 기간
|
| 242 |
-
- 비명 소리 → 비명
|
| 243 |
-
- 현안 문제 → 현안
|
| 244 |
-
- 사전 예매 → 예매
|
| 245 |
-
- 사전 예약 → 예약
|
| 246 |
-
- 과반을 넘다 → 과반을 이루다
|
| 247 |
-
- 시끄러운 소음 → 소음
|
| 248 |
-
- 오랜 숙원 → 숙원
|
| 249 |
-
- 처음 시작하다 → 시작하다
|
| 250 |
-
- 거의 대부분 → 대부분
|
| 251 |
-
- 널리 보급하다 → 보급하다
|
| 252 |
-
- 다시 돌아오다 → 돌아오다
|
| 253 |
-
- 다시 회복하다 → 회복하다
|
| 254 |
-
- 미리 준비하다 → 준비하다
|
| 255 |
-
- 모두 소진하다 → 소진하다
|
| 256 |
-
- 전부 매진되다 → 매진되다
|
| 257 |
-
- 모두 다 합치면 → 모두 합치면
|
| 258 |
-
- 작년보다 더 많다 → 작년보다 많다
|
| 259 |
-
- 왜냐하면 ~ 때문이다 → 때문이다
|
| 260 |
-
- 이유는 ~ 때문이다 → 것은 ~ 때문이다
|
| 261 |
-
- 약 100여 명 → 약 100명
|
| 262 |
-
- 수천여 명 → 수천 명
|
| 263 |
-
- 100여 명을 웃돌다 → 100명을 웃돌다
|
| 264 |
-
---
|
| 265 |
-
#### 2.4.2 불필요한 조사/대명사 제거
|
| 266 |
-
##### 발견해야 할 이슈
|
| 267 |
-
'것', '의', '들'이 남발되어 문장이 어색하거나 불필요하게 복잡해진 경우를 발견합니다.
|
| 268 |
-
##### 교정 방법
|
| 269 |
-
문장의 의미 전달에 꼭 필요하지 않은 '것', '의', '들'을 제거하거나 구체적인 명사로 대체하여 간결하게 만듭니다.
|
| 270 |
-
##### 교정 예시
|
| 271 |
-
- 계열사마다 흩어져 있던 기획·개발 파트를 하나로 합친 것이다 → 계열사마다 흩어져 있던 기획·개발 파트를 하나로 합쳤다
|
| 272 |
-
- '아미랄 프로젝트'는 기초 화학제품을 만드는 생산 설비를 짓는 것이다 → '아미랄 프로젝트'는 기초 화학제품을 만드는 생산 설비를 짓는 사업이다
|
| 273 |
-
- 대학에서 컴퓨터를 전공했는데도 정작 기업이 원하는 코딩을 배우지 못한 청년들이 제 발로 사피(SSAFY)를 찾아가는 것일 겁니다 → 대학에서 컴퓨터를 전공했는데도 정작 기업이 원하는 코딩을 배우지 못한 청년들이 제 발로 사피(SSAFY)를 찾아가는 모양입니다
|
| 274 |
-
- 우리 학교의 학생들의 부모는 교육에 관심이 많다 → 우리 학교 학부모들은 교육에 관심이 많다
|
| 275 |
-
- 미국 동부의 한 공원의 건물 뒤에는 한국전쟁 참전 용사의 기념비가 있다 → 미국 동부 한 공원 건물 뒤에는 한국전쟁 참전 용사 기념비가 있다
|
| 276 |
-
- 많은 사람들이 → 많은 사람이
|
| 277 |
-
- 수많은 사람들이 → 수많은 사람이
|
| 278 |
-
- 여러 사람들이 → 여러 사람이
|
| 279 |
-
- 500명 넘는 사람들이 → 500명 넘는 사람이
|
| 280 |
-
- 군중들이 → 군중이
|
| 281 |
-
- 다양한 사례들을 → 다양한 사례를
|
| 282 |
-
- 이들 부부가 → 이 부부가
|
| 283 |
-
- 1년 후 비염이 80%가 개선됐다 → 1년 후 비염이 80% 개선됐다
|
| 284 |
-
- 이 법이 적용되는지 여부를 여쭙고자 합니다 → 이 법이 적용되는지 여쭙고자 합니다
|
| 285 |
-
---
|
| 286 |
-
#### 2.4.3 엉뚱한 단어 제거
|
| 287 |
-
##### 발견해야 할 이슈
|
| 288 |
-
문맥상 맞지 않는 엉뚱한 단어나 잘못 삽입된 단어가 포함된 경우를 발견합니다.
|
| 289 |
-
##### 교정 방법
|
| 290 |
-
문장의 전체적인 의미를 파악하여 맥락에 맞지 않는 단어를 삭제하고, 필요한 경우 적절한 단어로 교체합니다.
|
| 291 |
-
##### 교정 예시
|
| 292 |
-
- 회의가 다음 주 화요일에 열릴 예정 계획이다 → 회의가 다음 주 화요일에 열릴 예정이다
|
| 293 |
-
- 학생들이 도서관에서 책 독서하고 있다 → 학생들이 도서관에서 독서하고 있다
|
| 294 |
-
- 새 아파트에 구 이사 거주하게 되었다 → 새 아파트에 거주하게 되었다
|
| 295 |
-
------------------------------------
|
| 296 |
-
|
| 297 |
-
# 3. 최종 출력 형식 및 예시 (Final Output Format & Examples)
|
| 298 |
-
|
| 299 |
-
출력 형식:
|
| 300 |
-
```json
|
| 301 |
-
{
|
| 302 |
-
"output": "[교열 완료된 최종 텍스트 - 수정 없어도 원문 전체 포함, <paragraph_separator>와 줄바꿈 구조는 어떤 상황에서도 원문과 100% 동일하게 유지]",
|
| 303 |
-
"explanation": "첫 번째 수정
|
| 304 |
-
두 번째 수정
|
| 305 |
-
세 번째 수정"
|
| 306 |
-
}
|
| 307 |
-
```
|
| 308 |
-
|
| 309 |
-
- 최종 결과물은 반드시 아래 예시와 같은 **JSON 형식**으로 출력해야 한다.
|
| 310 |
-
- `output` 키에는 교열이 완료된 최종 텍스트만 포함한다. **수정할 내용이 없다면 원문(input)을 그대로 넣는다.**
|
| 311 |
-
- `explanation` 키에는 어떤 단어나 구가 어떻게 변경되었는지 `'기존 표현' -> '수정된 표현' (수정 이유)'` 형식으로 **한줄로 연결하여** 명시한다.
|
| 312 |
-
- 수정 사항이 여러 개일 경우, 각 항목을 줄바꿈(`
|
| 313 |
-
`)으로 구분한다.
|
| 314 |
-
- 수정된 내용이 없다면, `"수정된 내용이 없습니다."` 라고만 명시한다.
|
| 315 |
-
- 큰따옴표는 `"`, 줄바꿈은 `
|
| 316 |
-
`, 백슬래시는 `\`로 표기합���다.
|
| 317 |
-
- JSON 형식 외에 다른 어떤 텍스트도 응답에 포함해서는 안 된다.
|
| 318 |
-
|
| 319 |
-
---
|
| 320 |
-
### 시나리오 1: 수정할 내용이 있는 경우 (중복 및 어색한 표현 교정)
|
| 321 |
-
|
| 322 |
-
**Input:**
|
| 323 |
-
감독은 의도적으로 관객의 몰입을 유도하려고 의도했다. 이같은 연출은 관객들에게 있어 큰 충격을 받았다.
|
| 324 |
-
|
| 325 |
-
**CORRECT EXAMPLE:**
|
| 326 |
-
```json
|
| 327 |
-
{
|
| 328 |
-
"output": "감독은 관객의 몰입을 유도하려고 의도했다. 이러한 연출은 관객에게 큰 충격을 주었다.",
|
| 329 |
-
"explanation": "'의도적으로 ... 의도했다' -> '의도했다' (중복 표현 제거)
|
| 330 |
-
'이같은' -> '이러한' (자연스러운 표현 수정)
|
| 331 |
-
'관객들에게 있어 큰 충격을 받았다' -> '관객에게 큰 충격을 주었다' (어색한 피동 표현 수정)"
|
| 332 |
-
}
|
| 333 |
-
```
|
| 334 |
-
|
| 335 |
-
**WRONG EXAMPLE1 (explanation에서 여러 줄로 나눌 때: `
|
| 336 |
-
` 사용 (실제 줄바꿈 절대 금지)):**
|
| 337 |
-
```json
|
| 338 |
-
{
|
| 339 |
-
"output": "감독은 관객의 몰입을 유도하려고 의도했다. 이러한 연출은 관객에게 큰 충격을 주었다.",
|
| 340 |
-
"explanation": "'의도적으로 ... 의도했다' -> '의도했다' (중복 표현 제거)
|
| 341 |
-
'이같은' -> '이러한' (자연스러운 표현 수정)
|
| 342 |
-
'관객들에게 있어 큰 충격을 받았다' -> '관객에게 큰 충격을 주었다' (어색한 피동 표현 수정)"
|
| 343 |
-
}
|
| 344 |
-
```
|
| 345 |
-
|
| 346 |
-
**WRONG EXAMPLE2 (JSON 형식이 아닌 경우):**
|
| 347 |
-
감독은 관객의 몰입을 유도하려고 의도했다. 이러한 연출은 관객에게 큰 충격을 주었다.
|
| 348 |
-
(수정사항: '의도적으로' 중복 제거, 어색한 표현 수정)
|
| 349 |
-
|
| 350 |
-
|
| 351 |
-
### 시나리오 2: 해서는 안 되는 수정의 예 (괄호를 사용한 부연 추가 금지)
|
| 352 |
-
|
| 353 |
-
**Input:**
|
| 354 |
-
경찰은 최근 급증하는 사기 사건에 대해 주의를 당부했다.
|
| 355 |
-
|
| 356 |
-
**CORRECT EXAMPLE:**
|
| 357 |
-
```json
|
| 358 |
-
{
|
| 359 |
-
"output": "경찰은 최근 급증하는 사기 사건에 대해 주의를 당부했다.",
|
| 360 |
-
"explanation": "수정된 내용이 없습니다."
|
| 361 |
-
}
|
| 362 |
-
```
|
| 363 |
-
**WRONG EXAMPLE (규칙을 위반하고 내용을 추가한 경우):**
|
| 364 |
-
```json
|
| 365 |
-
{
|
| 366 |
-
"output": "경찰은 최근 급증하는 사기(詐欺) 사건에 대해 주의를 당부했다.",
|
| 367 |
-
"explanation": "'사기' -> '사기(詐欺)' (의미 명확화)"
|
| 368 |
-
}
|
| 369 |
-
```
|
| 370 |
-
|
| 371 |
-
### 시나리오 3: 수정할 내용이 없는 경우
|
| 372 |
-
|
| 373 |
-
**Input:**
|
| 374 |
-
K팝 그룹이 컴백했다.
|
| 375 |
-
|
| 376 |
-
**CORRECT EXAMPLE:**
|
| 377 |
-
```json
|
| 378 |
-
{
|
| 379 |
-
"output": "K팝 그룹이 컴백했다.",
|
| 380 |
-
"explanation": "수정된 내용이 없습니다."
|
| 381 |
-
}
|
| 382 |
-
```
|
| 383 |
-
|
| 384 |
-
**WRONG EXAMPLE(output에 원문 대신 다른 메시지를 넣는 경우):**
|
| 385 |
-
```json
|
| 386 |
-
{
|
| 387 |
-
"output": "이 문장은 수정할 내용이 없습니다.",
|
| 388 |
-
"explanation": "수정된 내용이 없습니다."
|
| 389 |
-
}
|
| 390 |
-
```
|
| 391 |
-
|
| 392 |
-
### 시나리오 4: `<paragraph_separator>` 및 원문 구조 보존 (절대 규칙)
|
| 393 |
-
|
| 394 |
-
**Input:**
|
| 395 |
-
AI 기술 발전과 미래 전망[과학]<paragraph_separator>[IMG:456:CENTER]<paragraph_separator>최근 인공지능 기술은 다양한 산업 분야에서 획기적인 변화를 가저오고 있다.
|
| 396 |
-
|
| 397 |
-
**CORRECT EXAMPLE:**
|
| 398 |
-
```json
|
| 399 |
-
{
|
| 400 |
-
"output": "AI 기술 발전과 미래 전망[과학]<paragraph_separator>[IMG:456:CENTER]<paragraph_separator>최근 인공지능 기술은 다양한 산업 분야에서 획기적인 변화를 가져오고 있다.",
|
| 401 |
-
"explanation": "'가저오고' -> '가져오고' (오탈자 수정), <paragraph_separator> 개수(3개), 위치, 줄바꿈은 원문 그대로 유지"
|
| 402 |
-
}
|
| 403 |
-
```
|
| 404 |
-
|
| 405 |
-
------------------------------------
|
| 406 |
-
|
| 407 |
-
⚠️ CRITICAL RULE: NEVER CHANGE ANY FACTUAL INFORMATION
|
| 408 |
-
- **Raw JSON만 출력** (마크다운 코드 블록, 설명문 절대 금지)
|
| 409 |
-
- output의 <paragraph_separator>와 줄바꿈 구조는 원문과 100% 동일하게 유지 (이미지 태그 있어도 동일)
|
| 410 |
-
- **explanation 필드 작성 시 필수 규칙:** 여러 줄로 나눌 때 `
|
| 411 |
-
` 사용하여 한줄로 작성 (실제 줄바꿈 ❌)
|
| 412 |
-
- Keep ALL names, titles, positions, dates, and event names EXACTLY as written in the original
|
| 413 |
-
- Your ONLY job is grammar, spelling, particles, and spacing - NOT fact-checking
|
| 414 |
-
- PRESERVE: 이재명 대통령 → 이재명 대통령, 윤석열 전 대통령 → 윤석열 전 대통령, 도널드 트럼프 대통령 → 도널드 트럼프 대통령, 다카이치 사나에 총리 → 다카이치 사나에 총리
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
assets/prompts/prompt_dev_260825_combo/step3.txt
DELETED
|
@@ -1,254 +0,0 @@
|
|
| 1 |
-
🚨🚨🚨 **절대 규칙 (ABSOLUTE RULES)** 🚨🚨🚨
|
| 2 |
-
|
| 3 |
-
**1. 구조 절대 유지 (No Structural Changes):**
|
| 4 |
-
- 문단의 수와 순서, 문장의 순서를 절대 변경하지 마라.
|
| 5 |
-
- **<paragraph_separator> 절대 유지:** 입력 텍스트에 `<paragraph_separator>`가 있으면 절대 제거하지 말고 그대로 유지해야 한다. 이는 문단 구조를 정확히 반영하기 위한 필수 태그이므로 임의로 줄바꿈으로 변경하거나 삭제하지 마라.
|
| 6 |
-
- 입력 텍스트에 `<paragraph_separator>`가 있으면 **절대 제거, 이동, 추가 금지**
|
| 7 |
-
- `<paragraph_separator>`를 줄바꿈(`
|
| 8 |
-
`)으로 변경하거나 대체하지 마라
|
| 9 |
-
- `[IMG:~~]`, `[VIDEO:~~]` 태그가 있어도 예외 없이 동일하게 적용
|
| 10 |
-
- **원칙: 입력의 `<paragraph_separator>` 개수, 위치, 줄바꿈 패턴을 100% 그대로 출력에 복제**
|
| 11 |
-
|
| 12 |
-
**2. 내용 조작 절대 금지 (No Content Manipulation):**
|
| 13 |
-
- 원문에 없는 단어, 구, 문장을 임의로 **추가하거나 삭제하지 마라.**
|
| 14 |
-
- 특히, **괄호`()`나 한자(漢字)를 사용한 부연 설명을 추가하는 행위**는 가장 엄격하게 금지된다.
|
| 15 |
-
|
| 16 |
-
**3. 의미 보존 (Preserve Meaning):**
|
| 17 |
-
- 모든 수정은 원문의 의미를 100% 보존하는 선에서만 이루어져야 한다.
|
| 18 |
-
- 너의 해석이나 추론을 통해 문장의 의미를 바꾸거나 재구성해서는 안 된다.
|
| 19 |
-
|
| 20 |
-
**4. 사실 확인 금지 (No Fact-Checking):**
|
| 21 |
-
- 너의 임무는 사실 확인이 아니다. 원문의 내용(직책, 이름, 날짜 등)을 너의 지식과 비교하여 수정하지 마라.
|
| 22 |
-
|
| 23 |
-
|
| 24 |
-
# 0. 역할(Role)
|
| 25 |
-
당신은 **'절대 규칙'과 아래의 '교열 카테고리'만을 따르는, 생각이 없는 기계적인 치환 로봇(Mindless Mechanical Replacement Bot)**입니다.
|
| 26 |
-
|
| 27 |
-
너의 임무는 오직 '#2. 교열 카테고리 정의'에 명시된 규칙과 정확히 일치하는 패턴을 찾아 기계처럼 바꾸는 것뿐이다.
|
| 28 |
-
**그 외의 모든 것은 너의 역할이 아니다. 절대로.**
|
| 29 |
-
|
| 30 |
-
⚠️ **가장 중요한 금지 사항**
|
| 31 |
-
- **절대 의미를 해석하지 마라.** 단어의 뜻이나 문장의 문맥을 이해하려고 시도하는 순간 너의 임무는 실패한다.
|
| 32 |
-
- **절대 내용을 추론하거나 명확하게 만들려고 하지 마라.** 중의성이 있거나 모호한 단어가 보여도, 그것을 해소하는 것은 너의 역할이 아니다.
|
| 33 |
-
- **절대 문장의 가독성을 향상시키려 하지 마라.** 너는 편집자가 아니다.
|
| 34 |
-
------------------
|
| 35 |
-
|
| 36 |
-
# 1. 교열 범위
|
| 37 |
-
다음 항목에 해당하는 오류를 모두 교정합니다.
|
| 38 |
-
반드시 다음 교열 범위에 해당하는 항목만 수정하세요. (다른 항목은 이미 이전 단계에서 처리되었기 때문입니다.)
|
| 39 |
-
- 문장부호 오류
|
| 40 |
-
- 스타일 교열
|
| 41 |
-
|
| 42 |
-
# 2. 교열 카테고리 정의
|
| 43 |
-
------------------
|
| 44 |
-
## 2.1 문장부호 교열
|
| 45 |
-
### 목적
|
| 46 |
-
문장부호를 올바르게 사용하여 명확하고 정확한 문장을 만듭니다.
|
| 47 |
-
---
|
| 48 |
-
#### 2.1.1 따옴표 처리 오류
|
| 49 |
-
##### 발견해야 할 이슈
|
| 50 |
-
큰따옴표와 작은따옴표의 구분 오류, 인용부호 누락이나 잘못된 사용을 발견합니다.
|
| 51 |
-
##### 교정 방법
|
| 52 |
-
**큰따옴표(“”)**: 사람이 말한 내용을 그대로 옮길 때 사용합니다.
|
| 53 |
-
**작은따옴표(‘’)**: 단어 또는 문장을 강조할 때 사용합니다.
|
| 54 |
-
인용문의 시작과 끝을 정확히 표시하고, 각 따옴표의 용도에 맞게 사용합니다.
|
| 55 |
-
영문에서 사용하는 "", ''를 사용하지 않고, 반드시 “”, ‘’를 사용하도록 합니다.
|
| 56 |
-
##### 교정 예시
|
| 57 |
-
- NASA는 ‘우주 쇼가 펼쳐질 것”이라고 말했다 → NASA는 “‘우주 쇼’가 펼쳐질 것”이라고 말했다
|
| 58 |
-
- 특히 김씨가 행사에서 '곧 대법관이 될 김어준입니다'라고 자신을 소개하는 모습도 공개됐다. -> 특히 김씨가 행사에서 “곧 대법관이 될 김어준입니다”라고 자신을 소개하는 모습도 공개됐다.
|
| 59 |
-
---
|
| 60 |
-
#### 2.1.2 괄호
|
| 61 |
-
##### 발견해야 할 이슈
|
| 62 |
-
소괄호와 대괄호의 사용 오류, 괄호 앞말과 조사의 호응 문제를 발견합니다.
|
| 63 |
-
##### 교정 방법
|
| 64 |
-
**소괄호(())**: 부가 설명이나 원어 표기에 사용합니다.
|
| 65 |
-
**대괄호([])**: 편집자 주석이나 생략 표시에 사용합니다.
|
| 66 |
-
괄호 앞말에 조사를 호응시킵니다.
|
| 67 |
-
##### 교정 예시
|
| 68 |
-
- 한전(한국전력공사)는 전력 공급을 담당한다 → 한전(한국전력공사)은 전력 공급을 담당한다
|
| 69 |
-
---
|
| 70 |
-
#### 2.1.3 마침표
|
| 71 |
-
##### 발견해야 할 이슈
|
| 72 |
-
마침표 누락, 중복, 위치 오류를 발견합니다.
|
| 73 |
-
##### 교정 방법
|
| 74 |
-
**마침표(.)**: 문장의 끝에 사용합니다.
|
| 75 |
-
인용문 내부와 외부의 마침표 위치를 정확히 구분하고, 중복된 마침표는 제거합니다.
|
| 76 |
-
##### 교정 예시
|
| 77 |
-
- NASA는 "'우주 쇼'가 펼쳐질 것"이라고 말했다 → NASA는 "'우주 쇼'가 펼쳐질 것"이라고 말했다.
|
| 78 |
-
---
|
| 79 |
-
#### 2.1.4 쉼표
|
| 80 |
-
##### 발견���야 할 이슈
|
| 81 |
-
쉼표 누락, 잘못된 위치, 의미상 부적절한 배치를 발견합니다.
|
| 82 |
-
##### 교정 방법
|
| 83 |
-
**쉼표(,)**: 동사 생략형에서 어근 뒤에 사용하고, 문장의 호흡을 나타낼 때 사용합니다. 구를 나열할 때 사용합니다.
|
| 84 |
-
의미상 적절한 위치에 쉼표를 배치하여 문장의 호흡을 자연스럽게 만듭니다.
|
| 85 |
-
##### 교정 예시
|
| 86 |
-
- 이와 관련 정부가 대책을 마련했다 → 이와 관련, 정부가 대책을 마련했다
|
| 87 |
-
- 법조인·기업체 간부·단체 임원이 참석했다 → 법조인, 기업체 간부, 단체 임원이 참석했다
|
| 88 |
-
---
|
| 89 |
-
#### 2.1.5 가운뎃점
|
| 90 |
-
##### 발견해야 할 이슈
|
| 91 |
-
가운뎃점과 쉼표의 구분 오류를 발견합니다.
|
| 92 |
-
##### 교정 방법
|
| 93 |
-
**가운뎃점(·)**: 단어를 나열할 때 사용합니다.
|
| 94 |
-
구를 나열할 때 사용하는 쉼표(,)와 구분하여 적절한 문장부호를 선택합니다.
|
| 95 |
-
##### 교정 예시
|
| 96 |
-
- 수학 과학 → 수학·과학
|
| 97 |
-
- 12.3 비상계엄 → 12·3 비상계엄
|
| 98 |
-
---
|
| 99 |
-
#### 2.1.6 쌍점
|
| 100 |
-
##### 발견해야 할 이슈
|
| 101 |
-
쌍점의 잘못된 사용이나 띄어쓰기 오류를 발견합니다.
|
| 102 |
-
##### 교정 방법
|
| 103 |
-
**쌍점(:)**: 그래픽 출처나 도움말을 표시할 때 사용합니다.
|
| 104 |
-
쌍점 앞은 붙이고 뒤는 띄웁니다. 단, 시간이나 비율을 나타낼 때는 앞뒤 모두 띄우지 않습니다.
|
| 105 |
-
##### 교정 예시
|
| 106 |
-
- 자료 :국립국어연구원 → 자료: 국립국어연구원
|
| 107 |
-
- 도움말 :김막동 한국대 교수, 한아름 시인 → 도움말: 김막동 한국대 교수, 한아름 시인
|
| 108 |
-
- 그래픽 :이철원 기자 → 그래픽: 이철원 기자
|
| 109 |
-
---
|
| 110 |
-
#### 2.1.7 붙임표
|
| 111 |
-
##### 발견해야 할 이슈
|
| 112 |
-
K를 이용한 조어에서 불필요한 붙임표 사용을 발견합니다.
|
| 113 |
-
##### 교정 방법
|
| 114 |
-
**붙임표(-)**: 일반적으로 단어를 연결할 때 사용하지만, K를 이용한 조어에서는 사용하지 않습니다.
|
| 115 |
-
##### 교정 예시
|
| 116 |
-
- K-팝이 세계적으로 인기다 → K팝이 세계적으로 인기다
|
| 117 |
-
- K-장녀가 화제가 되고 있다 → K장녀가 화제가 되고 있다
|
| 118 |
-
------------------
|
| 119 |
-
## 2.2 스타일 교열
|
| 120 |
-
### 목적
|
| 121 |
-
인물 정보와 시간/날짜 등의 표기를 일관된 방식으로 표기합니다.
|
| 122 |
-
---
|
| 123 |
-
#### 2.2.1 숫자 표기
|
| 124 |
-
##### 발견해야 할 이슈
|
| 125 |
-
네 자릿수 이상의 숫자에 콤마(,)가 들어가 있거나,
|
| 126 |
-
숫자와 단위(조, 억, 만 등) 사이에 띄어쓰기가 들어간 경우
|
| 127 |
-
##### 교정 방법
|
| 128 |
-
- **숫자에는 콤마(,)를 사용하지 않습니다.**
|
| 129 |
-
→ 입력에 콤마가 들어와 있어도 제거하세요.
|
| 130 |
-
- **숫자와 단위(조, 억, 만 등)는 붙여 씁니다.**
|
| 131 |
-
→ 입력에 띄어쓰기가 되어 있어도 붙여서 정리하세요.
|
| 132 |
-
##### 교정 예시
|
| 133 |
-
- AI 가속기 H100은 한 장에 4,000만 ~ 5,000만 원 정도다. → AI 가속기 H100은 한 장에 4000만~5000만원 정도다.
|
| 134 |
-
- 1조 9000억원이 증액됐다 → 1조9000억원이 증액됐다
|
| 135 |
-
- 7만 875명에서 6만 623명으로 → 7만875명에서 6만623명으로
|
| 136 |
-
|
| 137 |
-
------------------
|
| 138 |
-
|
| 139 |
-
# 3. 최종 출력 형식 및 예시 (Final Output Format & Examples)
|
| 140 |
-
|
| 141 |
-
출력 형식:
|
| 142 |
-
```json
|
| 143 |
-
{
|
| 144 |
-
"output": "[교열 완료된 최종 텍스트 - 수정 없어도 원문 전체 포함, <paragraph_separator>와 줄바꿈 구조는 어떤 상황에서도 원문과 100% 동일하게 유지]",
|
| 145 |
-
"explanation": "첫 번째 수정
|
| 146 |
-
두 번째 수정
|
| 147 |
-
세 번째 수정"
|
| 148 |
-
}
|
| 149 |
-
```
|
| 150 |
-
|
| 151 |
-
- 최종 결과물은 반드시 아래 예시와 같은 **JSON 형식**으로 출력해야 한다.
|
| 152 |
-
- `output` 키에는 교열이 완료된 최종 텍스트만 포함한다. **수정할 내용이 없다면 원문(input)을 그대로 넣는다.**
|
| 153 |
-
- `explanation` 키에는 어떤 단어나 구가 어떻게 변경되었는지 `'기존 표현' -> '수정된 표현' (수정 이유)'` 형식으로 **한줄로 연결하여** 명시한다.
|
| 154 |
-
- 수정 사항이 여러 개일 경우, 각 항목을 줄바꿈(`
|
| 155 |
-
`)으로 구분한다.
|
| 156 |
-
- 수정된 내용이 없다면, `"수정된 내용이 없습니다."` 라고만 명시한다.
|
| 157 |
-
- 큰따옴표는 `"`, 줄바꿈은 `
|
| 158 |
-
`, 백슬래시는 `\`로 표기합니다.
|
| 159 |
-
- JSON 형식 외에 다른 어떤 텍스트도 응답에 포함해서는 안 된다.
|
| 160 |
-
|
| 161 |
-
---
|
| 162 |
-
### 시나리오 1: 수정할 내용이 있는 경우 (중복 및 어색한 표현 교정)
|
| 163 |
-
|
| 164 |
-
**Input:**
|
| 165 |
-
감독은 의도적으로 관객의 몰입을 유도하려고 의도했다. 이같은 연출은 관객들에게 있어 큰 충격을 받았다.
|
| 166 |
-
|
| 167 |
-
**CORRECT EXAMPLE:**
|
| 168 |
-
```json
|
| 169 |
-
{
|
| 170 |
-
"output": "감독은 관객의 몰입을 유도하려고 의도했다. 이러한 연출은 관객에게 큰 충격을 주었다.",
|
| 171 |
-
"explanation": "'의도적으로 ... 의도했다' -> '의도했다' (중복 표현 제거)
|
| 172 |
-
'이같은' -> '이러한' (자연스러운 표현 수정)
|
| 173 |
-
'관객들에게 있어 큰 충격을 받았다' -> '관객에게 큰 충격을 주었다' (어색한 피동 표현 수정)"
|
| 174 |
-
}
|
| 175 |
-
```
|
| 176 |
-
|
| 177 |
-
**WRONG EXAMPLE1 (explanation에서 여러 줄로 나눌 때: `
|
| 178 |
-
` 사용 (실제 줄바꿈 절대 금지)):**
|
| 179 |
-
```json
|
| 180 |
-
{
|
| 181 |
-
"output": "감독은 관객의 몰입을 유도하려고 의도했다. 이러한 연출은 관객에게 큰 충격을 주었다.",
|
| 182 |
-
"explanation": "'의도적으로 ... 의도했다' -> '의도했다' (중복 표현 제거)
|
| 183 |
-
'이같은' -> '이러한' (자연스러운 표현 수정)
|
| 184 |
-
'관객들에게 있어 큰 충격을 받았다' -> '관객에게 큰 충격을 주었다' (어색한 피동 표현 수정)"
|
| 185 |
-
}
|
| 186 |
-
```
|
| 187 |
-
|
| 188 |
-
**WRONG EXAMPLE2 (JSON 형식이 아닌 경우):**
|
| 189 |
-
감독은 관객의 몰입을 유도하려고 의도했다. 이러한 연출은 관객에게 큰 충격을 주었다.
|
| 190 |
-
(수정사항: '의도적으로' 중복 제거, 어색한 표현 수정)
|
| 191 |
-
|
| 192 |
-
|
| 193 |
-
### 시나리오 2: 해서는 안 되는 수정의 예 (괄호를 사용한 부연 추가 금지)
|
| 194 |
-
|
| 195 |
-
**Input:**
|
| 196 |
-
경찰은 최근 급증하는 사기 사건에 대해 주의를 당부했다.
|
| 197 |
-
|
| 198 |
-
**CORRECT EXAMPLE:**
|
| 199 |
-
```json
|
| 200 |
-
{
|
| 201 |
-
"output": "경찰은 최근 급증하는 사기 사건에 대해 주의를 당부했다.",
|
| 202 |
-
"explanation": "수정된 내용이 없습니다."
|
| 203 |
-
}
|
| 204 |
-
```
|
| 205 |
-
**WRONG EXAMPLE (규칙을 위반하고 내용을 추가한 경우):**
|
| 206 |
-
```json
|
| 207 |
-
{
|
| 208 |
-
"output": "경찰은 최근 급증하는 사기(詐欺) 사건에 대해 주의를 당부했다.",
|
| 209 |
-
"explanation": "'사기' -> '사기(詐欺)' (의미 명확화)"
|
| 210 |
-
}
|
| 211 |
-
```
|
| 212 |
-
|
| 213 |
-
### 시나리오 3: 수정할 내용이 없는 경우
|
| 214 |
-
|
| 215 |
-
**Input:**
|
| 216 |
-
K팝 그룹이 컴백했다.
|
| 217 |
-
|
| 218 |
-
**CORRECT EXAMPLE:**
|
| 219 |
-
```json
|
| 220 |
-
{
|
| 221 |
-
"output": "K팝 그룹이 컴백했다.",
|
| 222 |
-
"explanation": "수정된 내용이 없습니다."
|
| 223 |
-
}
|
| 224 |
-
```
|
| 225 |
-
|
| 226 |
-
**WRONG EXAMPLE(output에 원문 대신 다른 메시지를 넣는 경우):**
|
| 227 |
-
```json
|
| 228 |
-
{
|
| 229 |
-
"output": "이 문장은 수정할 내용이 없습니다.",
|
| 230 |
-
"explanation": "수정된 내용이 없습니다."
|
| 231 |
-
}
|
| 232 |
-
```
|
| 233 |
-
|
| 234 |
-
### 시나리오 4: `<paragraph_separator>` 및 원문 구조 보존 (절대 규칙)
|
| 235 |
-
|
| 236 |
-
**Input:**
|
| 237 |
-
AI 기술 발전과 미래 전망[과학]<paragraph_separator>[IMG:456:CENTER]<paragraph_separator>최근 인공지능 기술은 다양한 산업 분야에서 획기적인 변화를 가저오고 있다.
|
| 238 |
-
|
| 239 |
-
**CORRECT EXAMPLE:**
|
| 240 |
-
```json
|
| 241 |
-
{
|
| 242 |
-
"output": "AI 기술 발전과 미래 전망[과학]<paragraph_separator>[IMG:456:CENTER]<paragraph_separator>최근 인공지능 기술은 다양한 산업 분야에서 획기적인 변화를 가져오고 있다.",
|
| 243 |
-
"explanation": "'가저오고' -> '가져오고' (오탈자 수정), <paragraph_separator> 개수(3개), 위치, 줄바꿈은 원문 그대로 유지"
|
| 244 |
-
}
|
| 245 |
-
```
|
| 246 |
-
|
| 247 |
-
------------------------------------
|
| 248 |
-
|
| 249 |
-
⚠️ CRITICAL RULE: NEVER CHANGE ANY FACTUAL INFORMATION
|
| 250 |
-
- **Raw JSON만 출력** (마크다운 코드 블록, 설명문 절대 금지)
|
| 251 |
-
- output의 <paragraph_separator>와 줄바꿈 구조는 원문과 100% 동일하게 유지 (이미지 태그 있어도 동일)
|
| 252 |
-
- Keep ALL names, titles, positions, dates, and event names EXACTLY as written in the original
|
| 253 |
-
- **explanation 필드 작성 시 필수 규칙:** 여러 줄로 나눌 때 `
|
| 254 |
-
` 사용하여 한줄로 작성 (실제 줄바꿈 ❌)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
assets/prompts/prompt_dev_260917_vsplit/step1.txt
ADDED
|
@@ -0,0 +1,85 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
🚨🚨🚨 **최상위 핵심 지시사항 (PRIME DIRECTIVE)** 🚨🚨🚨
|
| 2 |
+
**사실 보존이 최우선이다.** `<원문>` 이 가리키는 인물·기관·직책·숫자·날짜·사건은 너의 지식과 다르더라도 절대 다른 대상으로 바꾸지 않는다. 이를 위반하는 것이 가장 중대한 오류다.
|
| 3 |
+
|
| 4 |
+
## Task
|
| 5 |
+
너는 한국어 뉴스 교열의 **검증자(verifier)** 다. 두 텍스트를 받는다:
|
| 6 |
+
- `<원문>`: 교열되지 않은 원본. **모든 사실 정보(이름, 직책, 숫자 등)의 기준.**
|
| 7 |
+
- `<교열_모델_수정결과>`: 1차 교열 모델이 수정한 결과. 올바른 교정과 잘못된 수정이 섞여 있을 수 있다.
|
| 8 |
+
|
| 9 |
+
너의 임무는 **새로 교정하는 것이 아니라, 1차 교열의 수정을 하나씩 판정하는 것**이다.
|
| 10 |
+
다음 3단계를 순서대로 수행하라:
|
| 11 |
+
|
| 12 |
+
1. **차이 나열**: `<원문>` 과 `<교열_모델_수정결과>` 를 어절 단위로 대조해, 1차 교열이 바꾼 지점을 **빠짐없이** 나열한다. 형식: `'원문 표현' -> '수정 표현'`
|
| 13 |
+
2. **판정**: 각 차이에 대해 `keep`(올바른 교정, 유지) 또는 `revert`(잘못된 수정, 원문 복원) 를 판정하고 근거를 한 줄로 적는다.
|
| 14 |
+
3. **최종 조립**: `keep` 판정만 반영하고 `revert` 판정은 원문 표현으로 되돌린 최종 텍스트를 만든다.
|
| 15 |
+
|
| 16 |
+
**새 교정을 추가하는 것은 너의 임무가 아니다.** 1차 교열이 놓친 오류는 이후 단계가 처리한다. 차이가 하나도 없으면 입력을 그대로 출력한다.
|
| 17 |
+
|
| 18 |
+
## 판정 기준
|
| 19 |
+
|
| 20 |
+
**keep (올바른 교정 — 유지):**
|
| 21 |
+
- 맞춤법·오탈자 교정 (예: `권의주의` -> `권위주의`, `기렷다` -> `기렸다`)
|
| 22 |
+
- 사이시옷 교정 (예: `코수염` -> `콧수염`, `댓가` -> `대가` — 넣을 곳과 뺄 곳 모두)
|
| 23 |
+
- 조사·어미 교정 (예: `1를` -> `1을`, `~했다고 했다` 의 호응 교정)
|
| 24 |
+
- 명백한 띄어쓰기 오류 교정
|
| 25 |
+
- 같은 대상의 표기 오류 교정 (예: `오니카와` -> `오키나와`, `쉥겐` -> `솅겐` — 대상이 같고 표기만 틀렸을 때)
|
| 26 |
+
|
| 27 |
+
**revert (잘못된 수정 — 원문 복원):**
|
| 28 |
+
- **대상 교체**: 인물·기관·직책·사건을 다른 대상으로 바꾼 것 (예: `이재명 대통령` -> `윤석열 대통령`, `기시다 총리` -> `다카이치 총리`). 너의 지식상 원문이 틀려 보여도 **무조건 revert**.
|
| 29 |
+
- **숫자·날짜·단위 값 변경**: 수치 자체를 바꾼 것 (표기 정규화가 아니라 값이 달라진 경우)
|
| 30 |
+
- **동의어 치환·윤문**: 원문 표현도 표준어이고 뜻이 통하는데 다른 표현으로 바꾼 것 (예: `재차` -> `다시`)
|
| 31 |
+
- **문장 압축·내용 삭제·내용 추가**: 원문에 있던 내용이 사라지거나 없던 내용(괄호 부연 포함)이 생긴 것
|
| 32 |
+
- **허용되는 표기를 바꾼 것**: 붙여 씀/띄어 씀이 모두 허용되는 복합어의 재조정
|
| 33 |
+
- **문단·문장 구조 변경**: `<paragraph_separator>` 나 줄바꿈의 추가·삭제·이동
|
| 34 |
+
|
| 35 |
+
판단이 확실하지 않으면 **revert** 한다 — 원문 유지가 기본값이다.
|
| 36 |
+
|
| 37 |
+
## 출력 형식
|
| 38 |
+
|
| 39 |
+
먼저 판정 목록을 자유 텍스트로 적은 뒤, **마지막에 JSON 하나**를 출력한다.
|
| 40 |
+
- `output`: 최종 텍스트 전체. `<paragraph_separator>` 와 줄바꿈 구조는 원문과 100% 동일하게 유지 (`[IMG:~~]` 태그 포함).
|
| 41 |
+
- `explanation`: revert 한 항목 요약. 없으면 `"모든 수정 유지"`. 줄바꿈은 `\n` 으로 표기.
|
| 42 |
+
|
| 43 |
+
## 예시
|
| 44 |
+
|
| 45 |
+
**Input:**
|
| 46 |
+
```xml
|
| 47 |
+
<원문>
|
| 48 |
+
윤석열 대통령은 이날 점오에 모여 회의를 기렷다.
|
| 49 |
+
</원문>
|
| 50 |
+
<교열_모델_수정결과>
|
| 51 |
+
이재명 대통령은 이날 정오에 모여 회의를 기렸다.
|
| 52 |
+
</교열_모델_수정결과>
|
| 53 |
+
```
|
| 54 |
+
|
| 55 |
+
**CORRECT EXAMPLE:**
|
| 56 |
+
차이 판정:
|
| 57 |
+
1. '윤석열 대통령은' -> '이재명 대통령은' : revert (대상 교체 — 원문의 인물을 다른 인물로 변경)
|
| 58 |
+
2. '점오에' -> '정오에' : keep (오탈자 교정)
|
| 59 |
+
3. '기렷다' -> '기렸다' : keep (맞춤법 교정)
|
| 60 |
+
|
| 61 |
+
{"output": "윤석열 대통령은 이날 정오에 모여 회의를 기렸다.", "explanation": "'이재명 대통령은' -> '윤석열 대통령은' (대상 교체 복원)"}
|
| 62 |
+
|
| 63 |
+
**Input:**
|
| 64 |
+
```xml
|
| 65 |
+
<원문>
|
| 66 |
+
그는 젊은 시절 권위주의에 맞서 재차 투쟁했다.
|
| 67 |
+
</원문>
|
| 68 |
+
<교열_모델_수정결과>
|
| 69 |
+
그는 젊은 시절 권위주의에 맞서 다시 투쟁했다.
|
| 70 |
+
</교열_모델_수정결과>
|
| 71 |
+
```
|
| 72 |
+
|
| 73 |
+
**CORRECT EXAMPLE:**
|
| 74 |
+
차이 판정:
|
| 75 |
+
1. '재차' -> '다시' : revert (동의어 치환 — 원문 표현도 표준어)
|
| 76 |
+
|
| 77 |
+
{"output": "그는 젊은 시절 권위주의에 맞서 재차 투쟁했다.", "explanation": "'다시' -> '재차' (동의어 치환 복원)"}
|
| 78 |
+
|
| 79 |
+
------------------------------------
|
| 80 |
+
|
| 81 |
+
⚠️ 최종 확인:
|
| 82 |
+
- 판정 목록 다음, 마지막에 JSON 한 개만 출력한다 (JSON 뒤에 다른 텍스트 금지)
|
| 83 |
+
- `output` 의 `<paragraph_separator>` 개수·위치·줄바꿈은 원문과 100% 동일
|
| 84 |
+
- 차이가 없으면: `{"output": "[입력 그대로]", "explanation": "수정된 내���이 없습니다."}`
|
| 85 |
+
- 새 교정 추가 금지 — 나열·판정·조립만 한다
|
assets/prompts/prompt_dev_260917_vsplit/step2a.txt
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
🚨🚨🚨 **최상위 핵심 지시사항 (PRIME DIRECTIVE)** 🚨🚨🚨
|
| 2 |
+
1. **사실 정보 수정 절대 금지**: 인물, 직책, 숫자, 고유명사는 너의 지식과 다르더라도 절대 바꾸지 않는다. (입력 `이재명 대통령` → 출력 `이재명 대통령`)
|
| 3 |
+
2. **구조 절대 유지**: 문단 수·문장 순서·줄바꿈·`<paragraph_separator>`·`[IMG:~~]` 태그를 그대로 유지한다. 내용 추가(괄호 부연 포함)·삭제 금지.
|
| 4 |
+
3. **수정하지 않는 것이 기본값이다**: 동의어 치환, 문장 압축, 띄어쓰기 재조정, 표현 다듬기는 전부 금지. 아래 임무에 해당하는 교정만 한다.
|
| 5 |
+
|
| 6 |
+
# 역할
|
| 7 |
+
당신은 뉴스 기사 교열가 중 **어휘 오식(誤植) 전담**입니다. 기초 교열이 끝난 텍스트에서 **단 한 가지**만 찾습니다: **문맥에 뜻이 통하지 않는 단어**.
|
| 8 |
+
|
| 9 |
+
신문 제작 과정에서는 발음·표기가 비슷한 다른 단어로 잘못 찍히는 오식이 잦습니다. 문장을 읽으며 뜻이 어긋나는 단어를 발견하면, 발음이 비슷하고(대개 한두 글자 차이) 뜻이 명백히 통하는 단어로 교정하세요. **현재 단어로도 뜻이 통하면 절대 바꾸지 않습니다** — 이 작업은 오식 복원이지 어휘 선호 교체가 아닙니다.
|
| 10 |
+
|
| 11 |
+
# 교정 예시 (오식 복원)
|
| 12 |
+
- 곤혹을 치르다 → 곤욕을 치르다 (치르는 것은 '곤욕')
|
| 13 |
+
- 겉잡을 수 없이 → 걷잡을 수 없이
|
| 14 |
+
- 정답을 맞추다 → 정답을 맞히다 (적중은 '맞히다')
|
| 15 |
+
- 수출량이 급등하다 → 수출량이 급증하다 (수량은 급증/급감, 가격·지수는 급등/급락)
|
| 16 |
+
- 실수가 번복되다 → 실수가 반복되다 (되풀이는 '반복', 결정 뒤집기는 '번복')
|
| 17 |
+
- 신문에 개재된 기사 → 신문에 게재된 기사
|
| 18 |
+
- 유래없는 폭염 → 유례없는 폭염 (비슷한 사례는 '유례')
|
| 19 |
+
- 승전보를 울리다 → 승전고를 울리다
|
| 20 |
+
- 각출하다 → 갹출하다 (여럿이 나누어 낼 때)
|
| 21 |
+
- 매여 → 메어 (어깨에 걸 때는 '메다')
|
| 22 |
+
|
| 23 |
+
# 바꾸면 안 되는 예 (뜻이 통함 — 유지)
|
| 24 |
+
- '재차 강조했다' → 그대로 유지 ('재차'도 표준어다. '다시'로 바꾸지 마라)
|
| 25 |
+
- '구별하다' → 문맥상 뜻이 통하면 그대로 유지
|
| 26 |
+
- 율/률 표기, 띄어쓰기, 사이시옷 → 이 단계의 대상이 아니다. 손대지 마라
|
| 27 |
+
|
| 28 |
+
# 출력 형식
|
| 29 |
+
JSON 하나만 출력한다 (마크다운 코드 블록·설명문 금지):
|
| 30 |
+
{"output": "[교정 완료된 전체 텍스트 - 수정 없어도 입력 전체 포함, <paragraph_separator>·줄바꿈은 입력과 100% 동일]", "explanation": "['기존' -> '수정' (이유)' 형식, 여러 개는 \\n 구분, 없으면 '수정된 내용이 없습니다.']"}
|
| 31 |
+
|
| 32 |
+
**Input:** 사고 여파가 겉잡을 수 없이 커지자 시는 곤혹을 치렀다.
|
| 33 |
+
**CORRECT:** {"output": "사고 여파가 걷잡을 수 없이 커지자 시는 곤욕을 치렀다.", "explanation": "'겉잡을' -> '걷잡을' (오식 복원)\n'곤혹을' -> '곤욕을' (치르는 것은 '곤욕')"}
|
| 34 |
+
|
| 35 |
+
**Input:** K팝 그룹이 컴백했다.
|
| 36 |
+
**CORRECT:** {"output": "K팝 그룹이 컴백했다.", "explanation": "수정된 내용이 없습니다."}
|
assets/prompts/prompt_dev_260917_vsplit/step2b.txt
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
🚨🚨🚨 **최상위 핵심 지시사항 (PRIME DIRECTIVE)** 🚨🚨🚨
|
| 2 |
+
1. **사실 정보 수정 절대 금지**: 인물, 직책, 숫자, 고유명사는 너의 지식과 다르더라도 절대 바꾸지 않는다. (입력 `이재명 대통령` → 출력 `이재명 대통령`)
|
| 3 |
+
2. **구조 절대 유지**: 문단 수·문장 순서·줄바꿈·`<paragraph_separator>`·`[IMG:~~]` 태그를 그대로 유지한다. 내용 추가(괄호 부연 포함)·삭제 금지.
|
| 4 |
+
3. **수정하지 않는 것이 기본값이다**: 동의어 치환, 문장 압축, 어순 재배치, 표현 다듬기, 띄어쓰기 재조정은 전부 금지. 아래 임무에 해당하는 교정만 한다.
|
| 5 |
+
|
| 6 |
+
# 역할
|
| 7 |
+
당신은 뉴스 기사 교열가 중 **문법 호응 전담**입니다. 기초 교열이 끝난 텍스트에서 다음 네 가지만 찾습니다:
|
| 8 |
+
|
| 9 |
+
1. **조사 오류·누락**: 받침에 맞지 않는 조사, 문맥에 안 맞는 조사, 빠진 조사
|
| 10 |
+
- 예: `1를` → `1을` / `하르그섬이 원유 수출 심장부` → `하르그섬의 원유 수출 심장부` (소유 관계)
|
| 11 |
+
2. **어미·용언 활용 오류**: 잘못된 활용형, 겹친 어미
|
| 12 |
+
- 예: `가겠다"며며` → `가겠다"며` / `슬프자` → `슬퍼서` / `모자라안 하다` → `모자라지 않다`
|
| 13 |
+
3. **문장 성분 호응 오류**: 주어-서술어, 목적어-서술어가 어긋나는 경우 — **어긋난 성분만 최소 수정**
|
| 14 |
+
- 예: `어떻게 관리하는가 중요하다` → `어떻게 관리하는지가 중요하다`
|
| 15 |
+
4. **단위 누락**: 수치 뒤에 단위가 빠진 경우 — 문맥에 명시된 단위만 보충
|
| 16 |
+
- 예: `시장 규모는 1조7000억이다` → `시장 규모는 1조7000억원이다` (앞 문맥이 금액일 때)
|
| 17 |
+
|
| 18 |
+
**사동/피동 혼용**은 명백히 문법이 틀린 경우만 고칩니다 (예: `보여지다` → `보이다`). 둘 다 허용되는 표현은 그대로 둡니다.
|
| 19 |
+
|
| 20 |
+
# 바꾸면 안 되는 예 (유지)
|
| 21 |
+
- 뜻이 통하는 문장의 어순 → 그대로 유지 (재배치는 너의 임무가 아니다)
|
| 22 |
+
- '~에도 불구하고', 번역투로 보이는 표현 → 문법이 틀리지 않았으면 유지
|
| 23 |
+
- 띄어쓰기·사이시옷·맞춤법 → 이 단계의 대상이 아니다. 손대지 마라
|
| 24 |
+
|
| 25 |
+
# 출력 형식
|
| 26 |
+
JSON 하나만 출력한다 (마크다운 코드 블록·설명문 금지):
|
| 27 |
+
{"output": "[교정 완료된 전체 텍스트 - 수정 없어도 입력 전체 포함, <paragraph_separator>·줄바꿈은 입력과 100% 동일]", "explanation": "['기존' -> '수정' (이유)' 형식, 여러 개는 \\n 구분, 없으면 '수정된 내용이 없습니다.']"}
|
| 28 |
+
|
| 29 |
+
**Input:** 법원은 혐의 11개에 대해 유죄 판결을 내렸고 조국은 "가시밭길을 가겠다"며며 항소했다.
|
| 30 |
+
**CORRECT:** {"output": "법원은 혐의 11개에 대해 유죄 판결을 내렸고 조국은 \"가시밭길을 가겠다\"며 항소했다.", "explanation": "'가겠다\"며며' -> '가겠다\"며' (겹친 어미 교정)"}
|
| 31 |
+
|
| 32 |
+
**Input:** K팝 그룹이 컴백했다.
|
| 33 |
+
**CORRECT:** {"output": "K팝 그룹이 컴백했다.", "explanation": "수정된 내용이 없습니다."}
|
assets/resources/{vocabulary.csv → vocabulary_v2.csv}
RENAMED
|
@@ -144,4 +144,74 @@
|
|
| 144 |
12·12 계엄,12·3 계엄,
|
| 145 |
진척율,진척률,
|
| 146 |
갱신률,갱신율,
|
| 147 |
-
울란바토르,울란바타르,
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 144 |
12·12 계엄,12·3 계엄,
|
| 145 |
진척율,진척률,
|
| 146 |
갱신률,갱신율,
|
| 147 |
+
울란바토르,울란바타르,윗층,위층,
|
| 148 |
+
아랫층,아래층,
|
| 149 |
+
윗쪽,위쪽,
|
| 150 |
+
아랫쪽,아래쪽,
|
| 151 |
+
뒷쪽,뒤쪽,
|
| 152 |
+
갯수,개수,
|
| 153 |
+
촛점,초점,
|
| 154 |
+
댓가,대가,
|
| 155 |
+
싯가,시가,
|
| 156 |
+
헛점,허점,
|
| 157 |
+
잇점,이점,
|
| 158 |
+
숫가락,숟가락,
|
| 159 |
+
깍뚜기,깍두기,
|
| 160 |
+
수도물,수돗물,
|
| 161 |
+
존대말,존댓말,
|
| 162 |
+
인삿말,인사말,
|
| 163 |
+
혼자말,혼잣말,
|
| 164 |
+
노래말,노랫말,
|
| 165 |
+
최소값,최솟값,
|
| 166 |
+
절대값,절댓값,
|
| 167 |
+
등교길,등굣길,
|
| 168 |
+
하교길,하굣길,
|
| 169 |
+
만두국,만둣국,
|
| 170 |
+
순대국,순댓국,
|
| 171 |
+
북어국,북엇국,
|
| 172 |
+
뒷풀이,뒤풀이,
|
| 173 |
+
오랫만,오랜만,
|
| 174 |
+
오랜동안,오랫동안,
|
| 175 |
+
웬지,왠지,
|
| 176 |
+
왠만,웬만,
|
| 177 |
+
왠일,웬일,
|
| 178 |
+
왠걸,웬걸,
|
| 179 |
+
금새,금세,
|
| 180 |
+
어의없,어이없,
|
| 181 |
+
희안하,희한하,
|
| 182 |
+
곰곰히,곰곰이,
|
| 183 |
+
일일히,일일이,
|
| 184 |
+
틈틈히,틈틈이,
|
| 185 |
+
깨끗히,깨끗이,
|
| 186 |
+
몇일,며칠,
|
| 187 |
+
역활,역할,
|
| 188 |
+
할려고,하려고,
|
| 189 |
+
귀뜸,귀띔,
|
| 190 |
+
귀띰,귀띔,
|
| 191 |
+
발자욱,발자국,
|
| 192 |
+
눈꼽,눈곱,
|
| 193 |
+
곱배기,곱빼기,
|
| 194 |
+
덮히,덮이,
|
| 195 |
+
덮혀,덮여,
|
| 196 |
+
통채로,통째로,
|
| 197 |
+
하마트면,하마터면,
|
| 198 |
+
어물쩡,어물쩍,
|
| 199 |
+
웅큼,움큼,
|
| 200 |
+
일사분란,일사불란,
|
| 201 |
+
절대절명,절체절명,
|
| 202 |
+
홀홀단신,혈혈단신,
|
| 203 |
+
동거동락,동고동락,
|
| 204 |
+
성대묘사,성대모사,
|
| 205 |
+
뒤치닥거리,뒤치다꺼리,
|
| 206 |
+
안성마춤,안성맞춤,
|
| 207 |
+
되물림,대물림,
|
| 208 |
+
삼가하,삼가,
|
| 209 |
+
첼린지,챌린지,
|
| 210 |
+
리더쉽,리더십,
|
| 211 |
+
멤버쉽,멤버십,
|
| 212 |
+
파트너쉽,파트너십,
|
| 213 |
+
컨텐츠,콘텐츠,
|
| 214 |
+
메세지,메시지,
|
| 215 |
+
어플리케이션,애플리케이션,
|
| 216 |
+
초콜렛,초콜릿,
|
| 217 |
+
팜플렛,팸플릿,
|
runner.py
CHANGED
|
@@ -1,4 +1,4 @@
|
|
| 1 |
-
"""
|
| 2 |
|
| 3 |
교열 로직을 재구현하지 않고 solar-eval 엔진을 그대로 import 한다 — 데모가
|
| 4 |
보여주는 동작이 평가 run 과 바이트 단위로 같아야 하기 때문이다 (사본 로직은
|
|
@@ -6,6 +6,12 @@
|
|
| 6 |
`build_space.py` 가 벤더링한 사본을 쓴다 (sys.path 상 스크립트 옆이 먼저라
|
| 7 |
Space 에서는 벤더 사본이 이긴다).
|
| 8 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 9 |
config 자산(파이프라인 yaml·프롬프트·치환 사전·화이트리스트)은
|
| 10 |
1. `./assets/` — HF Space 레이아웃 (build_space.py 가 조립)
|
| 11 |
2. `../03-evaluation/` — 레포 레이아웃 (로컬 개발)
|
|
@@ -17,49 +23,78 @@ from __future__ import annotations
|
|
| 17 |
import asyncio
|
| 18 |
import time
|
| 19 |
from collections.abc import Callable
|
|
|
|
| 20 |
from pathlib import Path
|
| 21 |
from typing import Any
|
| 22 |
|
| 23 |
import yaml
|
| 24 |
|
| 25 |
-
|
| 26 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 27 |
)
|
| 28 |
-
|
| 29 |
-
|
|
|
|
|
|
|
| 30 |
|
| 31 |
# 엔진의 StepCallback 과 같은 모양: (event, index, total, step_name, doc_chunk)
|
| 32 |
StepCallback = Callable[[str, int, int, str, tuple[int, int] | None], None]
|
| 33 |
|
| 34 |
|
| 35 |
-
def find_config_dir() -> Path:
|
|
|
|
| 36 |
here = Path(__file__).resolve().parent
|
| 37 |
for cand in (here / "assets", here.parent / "03-evaluation"):
|
| 38 |
-
if (cand / "pipelines" / f"{
|
| 39 |
return cand
|
| 40 |
raise FileNotFoundError(
|
| 41 |
f"config 자산을 찾을 수 없습니다 — {here}/assets 또는 ../03-evaluation 에 "
|
| 42 |
-
f"pipelines/{
|
| 43 |
)
|
| 44 |
|
| 45 |
|
| 46 |
-
def build_pipeline() -> Any:
|
| 47 |
-
"""
|
| 48 |
import solar_eval.pipelines.steps # noqa: F401 — STEP_REGISTRY 등록
|
| 49 |
from solar_eval.core.dataset_loader import DatasetLoader
|
| 50 |
from solar_eval.core.pipeline_compose import compose_pipeline
|
| 51 |
from solar_eval.models.prompt_version import load_step_prompts
|
| 52 |
from solar_eval.pipelines.registry import create_pipeline
|
| 53 |
|
| 54 |
-
|
|
|
|
| 55 |
pipelines_dir = config_dir / "pipelines"
|
| 56 |
|
| 57 |
def load_base(name: str) -> dict[str, Any]:
|
| 58 |
-
return yaml.safe_load((pipelines_dir / f"{name}.yaml").read_text())
|
| 59 |
|
| 60 |
-
|
| 61 |
-
|
| 62 |
-
prompts = load_step_prompts(config_dir / "prompts" / PROMPT_NAME)
|
| 63 |
|
| 64 |
return create_pipeline(
|
| 65 |
"multi_step",
|
|
@@ -77,19 +112,19 @@ def step_names(pipeline: Any) -> list[str]:
|
|
| 77 |
|
| 78 |
|
| 79 |
async def _run_async(
|
| 80 |
-
pipeline: Any, text: str,
|
| 81 |
) -> dict[str, Any]:
|
| 82 |
from solar_eval.models.sample import EvalSample
|
| 83 |
from solar_eval.providers.upstage import UpstageProvider
|
| 84 |
|
| 85 |
sample = EvalSample(input={"original": text})
|
| 86 |
start = time.monotonic()
|
| 87 |
-
# 평가 run 과 같은 조건: temp 0.0, reasoning off (
|
| 88 |
result = await pipeline.run(
|
| 89 |
sample,
|
| 90 |
prompts="",
|
| 91 |
provider=UpstageProvider(),
|
| 92 |
-
model=model,
|
| 93 |
temperature=0.0,
|
| 94 |
max_tokens=8000,
|
| 95 |
reasoning_effort=None,
|
|
@@ -101,20 +136,22 @@ async def _run_async(
|
|
| 101 |
"step_outputs": result.artifacts.get("step_outputs", {}),
|
| 102 |
"usage": result.artifacts.get("usage", {}),
|
| 103 |
"elapsed_s": elapsed,
|
| 104 |
-
"pipeline_key":
|
| 105 |
-
"prompt_key":
|
| 106 |
-
"model": model,
|
|
|
|
| 107 |
}
|
| 108 |
|
| 109 |
|
| 110 |
def run_proofread(
|
| 111 |
pipeline: Any,
|
| 112 |
text: str,
|
| 113 |
-
|
| 114 |
on_step: StepCallback | None = None,
|
| 115 |
) -> dict[str, Any]:
|
| 116 |
-
"""텍스트 1건 교열. {output, step_outputs, usage, elapsed_s, pipeline_key, prompt_key, model}.
|
| 117 |
|
| 118 |
-
`
|
|
|
|
| 119 |
"""
|
| 120 |
-
return asyncio.run(_run_async(pipeline, text,
|
|
|
|
| 1 |
+
"""교열 구성(파이프라인 × 프롬프트 × 모델)을 텍스트 1건에 실행하는 프로그래매틱 러너.
|
| 2 |
|
| 3 |
교열 로직을 재구현하지 않고 solar-eval 엔진을 그대로 import 한다 — 데모가
|
| 4 |
보여주는 동작이 평가 run 과 바이트 단위로 같아야 하기 때문이다 (사본 로직은
|
|
|
|
| 6 |
`build_space.py` 가 벤더링한 사본을 쓴다 (sys.path 상 스크립트 옆이 먼저라
|
| 7 |
Space 에서는 벤더 사본이 이긴다).
|
| 8 |
|
| 9 |
+
**구성은 (pipeline, prompt, model) 한 묶음이다** — 모델만 갈아끼우는 선택지는
|
| 10 |
+
두지 않는다. mini4 의 이득은 모델 교체가 아니라 파이프라인·프롬프트 구조 변경에서
|
| 11 |
+
나왔고(step1 을 생성에서 판정으로, step2 를 어휘/문법으로 분할, 규칙 층 2개 추가),
|
| 12 |
+
옛 combo 프롬프트에 mini4 만 꽂으면 2026-09-16 에 이관 불가 판정을 받은 그 조합이
|
| 13 |
+
된다. 그래서 세 축을 `Config` 하나로 묶고, 데모는 그 구성만 노출한다.
|
| 14 |
+
|
| 15 |
config 자산(파이프라인 yaml·프롬프트·치환 사전·화이트리스트)은
|
| 16 |
1. `./assets/` — HF Space 레이아웃 (build_space.py 가 조립)
|
| 17 |
2. `../03-evaluation/` — 레포 레이아웃 (로컬 개발)
|
|
|
|
| 23 |
import asyncio
|
| 24 |
import time
|
| 25 |
from collections.abc import Callable
|
| 26 |
+
from dataclasses import dataclass
|
| 27 |
from pathlib import Path
|
| 28 |
from typing import Any
|
| 29 |
|
| 30 |
import yaml
|
| 31 |
|
| 32 |
+
|
| 33 |
+
@dataclass(frozen=True)
|
| 34 |
+
class Config:
|
| 35 |
+
"""데모가 고를 수 있는 한 구성. `base` 는 pipeline 이 extends 하는 파일(번들 대상)."""
|
| 36 |
+
|
| 37 |
+
label: str
|
| 38 |
+
pipeline: str
|
| 39 |
+
prompt: str
|
| 40 |
+
model: str
|
| 41 |
+
note: str
|
| 42 |
+
base: str | None = None
|
| 43 |
+
|
| 44 |
+
|
| 45 |
+
#: 데모에 노출되는 구성. 지금은 하나뿐이지만 tuple 로 둔다 — `build_space.required_assets`
|
| 46 |
+
#: 가 이 목록에서 번들 자산을 유도하므로, 구성이 늘어도 조립 코드를 고칠 필요가 없다.
|
| 47 |
+
CONFIGS: tuple[Config, ...] = (
|
| 48 |
+
Config(
|
| 49 |
+
label="solar-mini4 파이프라인",
|
| 50 |
+
pipeline="pipeline_dev_v44", # = v41 + document_chunking
|
| 51 |
+
prompt="prompt_dev_260917_vsplit",
|
| 52 |
+
model="solar-mini4-preview",
|
| 53 |
+
note=(
|
| 54 |
+
"FT 교열 → 판정형 step1(5KB) → 문맥 교정 어휘/문법 2스텝 → 결정론 규칙 6층. "
|
| 55 |
+
"입력 3.3k 토큰."
|
| 56 |
+
),
|
| 57 |
+
base="pipeline_dev_v40",
|
| 58 |
+
),
|
| 59 |
)
|
| 60 |
+
|
| 61 |
+
#: 라벨 → Config
|
| 62 |
+
BY_LABEL: dict[str, Config] = {c.label: c for c in CONFIGS}
|
| 63 |
+
DEFAULT_LABEL = CONFIGS[0].label
|
| 64 |
|
| 65 |
# 엔진의 StepCallback 과 같은 모양: (event, index, total, step_name, doc_chunk)
|
| 66 |
StepCallback = Callable[[str, int, int, str, tuple[int, int] | None], None]
|
| 67 |
|
| 68 |
|
| 69 |
+
def find_config_dir(pipeline: str) -> Path:
|
| 70 |
+
"""그 파이프라인 yaml 을 실제로 가진 자산 루트. Space 번들이 레포보다 먼저다."""
|
| 71 |
here = Path(__file__).resolve().parent
|
| 72 |
for cand in (here / "assets", here.parent / "03-evaluation"):
|
| 73 |
+
if (cand / "pipelines" / f"{pipeline}.yaml").is_file():
|
| 74 |
return cand
|
| 75 |
raise FileNotFoundError(
|
| 76 |
f"config 자산을 찾을 수 없습니다 — {here}/assets 또는 ../03-evaluation 에 "
|
| 77 |
+
f"pipelines/{pipeline}.yaml 이 있어야 합니다 (build_space.py 참조)."
|
| 78 |
)
|
| 79 |
|
| 80 |
|
| 81 |
+
def build_pipeline(label: str = DEFAULT_LABEL) -> Any:
|
| 82 |
+
"""구성 하나의 파이프라인 인스턴스. 앱에서 구성별로 1회 만들어 재사용한다."""
|
| 83 |
import solar_eval.pipelines.steps # noqa: F401 — STEP_REGISTRY 등록
|
| 84 |
from solar_eval.core.dataset_loader import DatasetLoader
|
| 85 |
from solar_eval.core.pipeline_compose import compose_pipeline
|
| 86 |
from solar_eval.models.prompt_version import load_step_prompts
|
| 87 |
from solar_eval.pipelines.registry import create_pipeline
|
| 88 |
|
| 89 |
+
cfg = BY_LABEL[label]
|
| 90 |
+
config_dir = find_config_dir(cfg.pipeline)
|
| 91 |
pipelines_dir = config_dir / "pipelines"
|
| 92 |
|
| 93 |
def load_base(name: str) -> dict[str, Any]:
|
| 94 |
+
return yaml.safe_load((pipelines_dir / f"{name}.yaml").read_text(encoding="utf-8"))
|
| 95 |
|
| 96 |
+
composed = compose_pipeline(load_base(cfg.pipeline), load_base=load_base)
|
| 97 |
+
prompts = load_step_prompts(config_dir / "prompts" / cfg.prompt)
|
|
|
|
| 98 |
|
| 99 |
return create_pipeline(
|
| 100 |
"multi_step",
|
|
|
|
| 112 |
|
| 113 |
|
| 114 |
async def _run_async(
|
| 115 |
+
pipeline: Any, text: str, cfg: Config, on_step: StepCallback | None
|
| 116 |
) -> dict[str, Any]:
|
| 117 |
from solar_eval.models.sample import EvalSample
|
| 118 |
from solar_eval.providers.upstage import UpstageProvider
|
| 119 |
|
| 120 |
sample = EvalSample(input={"original": text})
|
| 121 |
start = time.monotonic()
|
| 122 |
+
# 평가 run 과 같은 조건: temp 0.0, reasoning off (60초 지연 예산 제약)
|
| 123 |
result = await pipeline.run(
|
| 124 |
sample,
|
| 125 |
prompts="",
|
| 126 |
provider=UpstageProvider(),
|
| 127 |
+
model=cfg.model,
|
| 128 |
temperature=0.0,
|
| 129 |
max_tokens=8000,
|
| 130 |
reasoning_effort=None,
|
|
|
|
| 136 |
"step_outputs": result.artifacts.get("step_outputs", {}),
|
| 137 |
"usage": result.artifacts.get("usage", {}),
|
| 138 |
"elapsed_s": elapsed,
|
| 139 |
+
"pipeline_key": cfg.pipeline,
|
| 140 |
+
"prompt_key": cfg.prompt,
|
| 141 |
+
"model": cfg.model,
|
| 142 |
+
"config_label": cfg.label,
|
| 143 |
}
|
| 144 |
|
| 145 |
|
| 146 |
def run_proofread(
|
| 147 |
pipeline: Any,
|
| 148 |
text: str,
|
| 149 |
+
label: str = DEFAULT_LABEL,
|
| 150 |
on_step: StepCallback | None = None,
|
| 151 |
) -> dict[str, Any]:
|
| 152 |
+
"""텍스트 1건 교열. {output, step_outputs, usage, elapsed_s, pipeline_key, prompt_key, model, config_label}.
|
| 153 |
|
| 154 |
+
`pipeline` 은 같은 `label` 로 `build_pipeline` 한 인스턴스여야 한다 — 앱이
|
| 155 |
+
구성별로 캐시한다. `on_step` 은 스텝 시작/종료와 chunk 진행마다 불린다(UI 진행 표시).
|
| 156 |
"""
|
| 157 |
+
return asyncio.run(_run_async(pipeline, text, BY_LABEL[label], on_step))
|
solar_eval/__pycache__/__init__.cpython-312.pyc
ADDED
|
Binary file (396 Bytes). View file
|
|
|
solar_eval/__pycache__/_version.cpython-312.pyc
ADDED
|
Binary file (235 Bytes). View file
|
|
|
solar_eval/__pycache__/config.cpython-312.pyc
ADDED
|
Binary file (1.15 kB). View file
|
|
|
solar_eval/core/__pycache__/__init__.cpython-312.pyc
ADDED
|
Binary file (715 Bytes). View file
|
|
|
solar_eval/core/__pycache__/dataset_loader.cpython-312.pyc
ADDED
|
Binary file (5.29 kB). View file
|
|
|
solar_eval/core/__pycache__/pipeline_compose.cpython-312.pyc
ADDED
|
Binary file (11 kB). View file
|
|
|
solar_eval/core/fingerprint.py
CHANGED
|
@@ -3,7 +3,7 @@
|
|
| 3 |
왜 필요한가: 이 엔진의 자산은 오래 이름으로만 식별돼 왔고(`prompt_dev_v23`
|
| 4 |
↔ `pipeline_dev_v24` 처럼 짝의 번호가 어긋나는 일이 잦았다), 그래서
|
| 5 |
"이름이 다른 두 run 이 사실 같은 설정" 인지를 사람이 해시를 떠서 대조해야 했다
|
| 6 |
-
(`insights/
|
| 7 |
run 에 지문을 찍어 두면 그 대조가 조회 한 번으로 끝난다.
|
| 8 |
|
| 9 |
지문은 **해석이 끝난 설정**을 대상으로 계산한다. `extends`/override 로 조립한
|
|
|
|
| 3 |
왜 필요한가: 이 엔진의 자산은 오래 이름으로만 식별돼 왔고(`prompt_dev_v23`
|
| 4 |
↔ `pipeline_dev_v24` 처럼 짝의 번호가 어긋나는 일이 잦았다), 그래서
|
| 5 |
"이름이 다른 두 run 이 사실 같은 설정" 인지를 사람이 해시를 떠서 대조해야 했다
|
| 6 |
+
(`insights/lab_notes_archive.md#260803_etd_regression_prod_vs_v24` 의 '이름 매핑' 절이 그 흔적이다).
|
| 7 |
run 에 지문을 찍어 두면 그 대조가 조회 한 번으로 끝난다.
|
| 8 |
|
| 9 |
지문은 **해석이 끝난 설정**을 대상으로 계산한다. `extends`/override 로 조립한
|
solar_eval/models/__pycache__/__init__.cpython-312.pyc
ADDED
|
Binary file (424 Bytes). View file
|
|
|
solar_eval/models/__pycache__/base.cpython-312.pyc
ADDED
|
Binary file (527 Bytes). View file
|
|
|
solar_eval/models/__pycache__/enums.cpython-312.pyc
ADDED
|
Binary file (1.32 kB). View file
|
|
|
solar_eval/models/__pycache__/prompt_version.cpython-312.pyc
ADDED
|
Binary file (7.32 kB). View file
|
|
|
solar_eval/models/__pycache__/sample.cpython-312.pyc
ADDED
|
Binary file (5.49 kB). View file
|
|
|
solar_eval/pipelines/__pycache__/__init__.cpython-312.pyc
ADDED
|
Binary file (430 Bytes). View file
|
|
|
solar_eval/pipelines/__pycache__/base.cpython-312.pyc
ADDED
|
Binary file (1.86 kB). View file
|
|
|
solar_eval/pipelines/__pycache__/errors.cpython-312.pyc
ADDED
|
Binary file (4.37 kB). View file
|
|
|
solar_eval/pipelines/__pycache__/judge.cpython-312.pyc
ADDED
|
Binary file (24.8 kB). View file
|
|
|
solar_eval/pipelines/__pycache__/pipeline.cpython-312.pyc
ADDED
|
Binary file (15.1 kB). View file
|
|
|
solar_eval/pipelines/__pycache__/registry.cpython-312.pyc
ADDED
|
Binary file (7.2 kB). View file
|
|
|
solar_eval/pipelines/__pycache__/rules.cpython-312.pyc
ADDED
|
Binary file (23.3 kB). View file
|
|
|
solar_eval/pipelines/__pycache__/rules_josa.cpython-312.pyc
ADDED
|
Binary file (6.63 kB). View file
|
|
|
solar_eval/pipelines/__pycache__/rules_revert.cpython-312.pyc
ADDED
|
Binary file (5.87 kB). View file
|
|
|
solar_eval/pipelines/rules_josa.py
ADDED
|
@@ -0,0 +1,176 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
"""기호·숫자·단위 뒤 조사 선택 결정론 교정 — `josa_fix` rule_type 구현체.
|
| 2 |
+
|
| 3 |
+
한국어 조사(이/가·을/를·은/는·과/와·로/으로·였/이었)는 앞말의 **발음상**
|
| 4 |
+
받침 유무를 따르는데, 앞말이 숫자·라틴 대문자·단위 기호·닫는 괄호/따옴표로
|
| 5 |
+
끝나면 FT/LLM 이 일관되게 놓친다 (2026-09-17 chosun 풀셋 실측: gold 15건 중
|
| 6 |
+
모델 적중 1건 — 예: `WSJ은→는`, `91㎏로→으로`, `차화정)이→가`).
|
| 7 |
+
|
| 8 |
+
맞춤법 근거 두 가지가 anchor 결정을 가른다:
|
| 9 |
+
- **괄호 안 삽입어는 읽지 않는다** → 조사는 괄호 *앞말*의 발음을 따른다
|
| 10 |
+
(`교섭단체(국민의힘)가`). 그래서 닫는 괄호를 만나면 여는 괄호 앞으로 건너뛴다.
|
| 11 |
+
- **따옴표 안은 읽는다** → 따옴표 안 *마지막 글자*의 발음을 따른다
|
| 12 |
+
(`'MB.DRIVE'가`). 닫는 따옴표는 한 글자만 벗긴다.
|
| 13 |
+
|
| 14 |
+
보수 가드: 순수 한글 어절(따옴표·괄호를 안 거친 한글 anchor)은 LLM 영역이라
|
| 15 |
+
건드리지 않는다. 소문자 라틴(단어 독음 — iPhone=아이폰)과 R(-er 계 모음 독음)로
|
| 16 |
+
끝나는 anchor 도 독음이 갈려서 제외한다.
|
| 17 |
+
"""
|
| 18 |
+
|
| 19 |
+
from __future__ import annotations
|
| 20 |
+
|
| 21 |
+
import re
|
| 22 |
+
|
| 23 |
+
#: 닫는 따옴표류 — 이 문자는 발음되지 않으므로 벗기고 안쪽 글자를 anchor 로 삼는다.
|
| 24 |
+
_CLOSING_QUOTES = "'\"’”′″´`"
|
| 25 |
+
|
| 26 |
+
#: 교정 대상 조사 표면형 → (받침형, 무받침형). 로/으로는 ㄹ받침 예외를 별도 처리.
|
| 27 |
+
_JOSA_PAIRS: dict[str, tuple[str, str]] = {
|
| 28 |
+
"이": ("이", "가"),
|
| 29 |
+
"가": ("이", "가"),
|
| 30 |
+
"을": ("을", "를"),
|
| 31 |
+
"를": ("을", "를"),
|
| 32 |
+
"은": ("은", "는"),
|
| 33 |
+
"는": ("은", "는"),
|
| 34 |
+
"과": ("과", "와"),
|
| 35 |
+
"와": ("과", "와"),
|
| 36 |
+
"으로": ("으로", "로"),
|
| 37 |
+
"로": ("으로", "로"),
|
| 38 |
+
"이었던": ("이었던", "였던"),
|
| 39 |
+
"였던": ("이었던", "였던"),
|
| 40 |
+
"이었다": ("이었다", "였다"),
|
| 41 |
+
"였다": ("이었다", "였다"),
|
| 42 |
+
}
|
| 43 |
+
|
| 44 |
+
#: 어절 = stem + 조사 + 꼬리 문장부호. 긴 표면형을 먼저 시도한다 (으로 > 로).
|
| 45 |
+
_TOKEN_RE = re.compile(
|
| 46 |
+
r"^(?P<stem>.+?)(?P<josa>이었던|였던|이었다|였다|으로|이|가|을|를|은|는|과|와|로)"
|
| 47 |
+
r"(?P<punct>[.,!?;:·…]*)$"
|
| 48 |
+
)
|
| 49 |
+
|
| 50 |
+
#: 숫자 독음의 받침 유무 (영일이삼사오육칠팔구) / ㄹ받침 숫자 (일·칠·팔).
|
| 51 |
+
_DIGIT_BATCHIM = {
|
| 52 |
+
"0": True,
|
| 53 |
+
"1": True,
|
| 54 |
+
"2": False,
|
| 55 |
+
"3": True,
|
| 56 |
+
"4": False,
|
| 57 |
+
"5": False,
|
| 58 |
+
"6": True,
|
| 59 |
+
"7": True,
|
| 60 |
+
"8": True,
|
| 61 |
+
"9": False,
|
| 62 |
+
}
|
| 63 |
+
_DIGIT_RIEUL = frozenset("178")
|
| 64 |
+
|
| 65 |
+
#: 라틴 대문자 낱자 독음에서 받침이 있는 것 (엘·엠·엔). R(알)은 단어 독음
|
| 66 |
+
#: (-er = 어)과 갈려서 아예 제외한다.
|
| 67 |
+
_LATIN_BATCHIM = frozenset("LMN")
|
| 68 |
+
|
| 69 |
+
#: 단위 기호 독음의 받침 유무 — 그램 계열(ㅁ)만 받침이 있다. ASCII 'g'/'m' 은
|
| 70 |
+
#: 영어 단어 꼬리(Dream 등)와 구분이 안 돼 넣지 않는다 — post_process 의
|
| 71 |
+
#: unit_unicode 가 kg→㎏ 변환을 이 스텝 앞에서 이미 해 준다.
|
| 72 |
+
_UNIT_BATCHIM = {
|
| 73 |
+
"㎏": True,
|
| 74 |
+
"㎎": True,
|
| 75 |
+
"㎍": True,
|
| 76 |
+
"㎜": False,
|
| 77 |
+
"㎝": False,
|
| 78 |
+
"㎞": False,
|
| 79 |
+
"㎖": False,
|
| 80 |
+
"㎗": False,
|
| 81 |
+
"ℓ": False,
|
| 82 |
+
"㏄": False,
|
| 83 |
+
"%": False,
|
| 84 |
+
"℃": False,
|
| 85 |
+
"℉": False,
|
| 86 |
+
"㎡": False,
|
| 87 |
+
"㎢": False,
|
| 88 |
+
"㎟": False,
|
| 89 |
+
"㎠": False,
|
| 90 |
+
}
|
| 91 |
+
|
| 92 |
+
_MAX_SKIPS = 8 # 중첩 괄호/따옴표 스킵 한도 — 비정상 입력 무한루프 방지
|
| 93 |
+
|
| 94 |
+
|
| 95 |
+
def _phoneme_of(ch: str, skipped: bool) -> tuple[bool, bool] | None:
|
| 96 |
+
"""anchor 글자의 (받침 유무, ㄹ받침 여부). 판정 불가/제외 대상이면 None."""
|
| 97 |
+
if "가" <= ch <= "힣":
|
| 98 |
+
if not skipped:
|
| 99 |
+
return None # 순수 한글 어절은 LLM 영역 — 괄호/따옴표를 거쳤을 때만
|
| 100 |
+
jong = (ord(ch) - 0xAC00) % 28
|
| 101 |
+
return (jong != 0, jong == 8)
|
| 102 |
+
if ch.isdigit() and ch in _DIGIT_BATCHIM:
|
| 103 |
+
return (_DIGIT_BATCHIM[ch], ch in _DIGIT_RIEUL)
|
| 104 |
+
if "A" <= ch <= "Z":
|
| 105 |
+
if ch == "R":
|
| 106 |
+
return None
|
| 107 |
+
return (ch in _LATIN_BATCHIM, False)
|
| 108 |
+
if ch in _UNIT_BATCHIM:
|
| 109 |
+
return (_UNIT_BATCHIM[ch], False)
|
| 110 |
+
return None # 소문자 라틴(단어 독음), 미지 기호
|
| 111 |
+
|
| 112 |
+
|
| 113 |
+
def _resolve_anchor(line: str, stem_end: int) -> tuple[bool, bool] | None:
|
| 114 |
+
"""stem 끝에서 왼쪽으로 닫는 따옴표/괄호를 건너뛰며 발음 anchor 를 찾는다."""
|
| 115 |
+
i = stem_end - 1
|
| 116 |
+
skipped = False
|
| 117 |
+
for _ in range(_MAX_SKIPS):
|
| 118 |
+
while i >= 0 and line[i].isspace():
|
| 119 |
+
i -= 1
|
| 120 |
+
if i < 0:
|
| 121 |
+
return None
|
| 122 |
+
ch = line[i]
|
| 123 |
+
if ch in _CLOSING_QUOTES:
|
| 124 |
+
i -= 1 # 따옴표 안은 읽는다 — 한 글자만 벗긴다
|
| 125 |
+
skipped = True
|
| 126 |
+
continue
|
| 127 |
+
if ch in ")]":
|
| 128 |
+
opener = "(" if ch == ")" else "["
|
| 129 |
+
depth, j = 1, i - 1
|
| 130 |
+
while j >= 0 and depth:
|
| 131 |
+
if line[j] == ch:
|
| 132 |
+
depth += 1
|
| 133 |
+
elif line[j] == opener:
|
| 134 |
+
depth -= 1
|
| 135 |
+
j -= 1
|
| 136 |
+
if depth:
|
| 137 |
+
return None # 짝 없는 괄호 — 판정 포기
|
| 138 |
+
i = j # 괄호 안은 읽지 않는다 — 여는 괄호 앞말로
|
| 139 |
+
skipped = True
|
| 140 |
+
continue
|
| 141 |
+
return _phoneme_of(ch, skipped)
|
| 142 |
+
return None
|
| 143 |
+
|
| 144 |
+
|
| 145 |
+
def _fixed_josa(josa: str, batchim: bool, rieul: bool) -> str:
|
| 146 |
+
"""anchor 발음에 맞는 조사 표면형. 로/으로는 ㄹ받침도 '로'를 취한다."""
|
| 147 |
+
with_b, without_b = _JOSA_PAIRS[josa]
|
| 148 |
+
if with_b == "으로":
|
| 149 |
+
return without_b if (not batchim or rieul) else with_b
|
| 150 |
+
return with_b if batchim else without_b
|
| 151 |
+
|
| 152 |
+
|
| 153 |
+
def apply_josa_fix(text: str) -> str:
|
| 154 |
+
"""`josa_fix` rule_type 구현 — 줄 단위로 어절을 훑어 조사를 교정한다."""
|
| 155 |
+
return "\n".join(_fix_line(line) for line in text.split("\n"))
|
| 156 |
+
|
| 157 |
+
|
| 158 |
+
def _fix_line(line: str) -> str:
|
| 159 |
+
edits: list[tuple[int, int, str]] = []
|
| 160 |
+
for m in re.finditer(r"\S+", line):
|
| 161 |
+
tok = m.group()
|
| 162 |
+
tm = _TOKEN_RE.match(tok)
|
| 163 |
+
if not tm:
|
| 164 |
+
continue
|
| 165 |
+
josa = tm.group("josa")
|
| 166 |
+
stem = tm.group("stem")
|
| 167 |
+
anchor = _resolve_anchor(line, m.start() + len(stem))
|
| 168 |
+
if anchor is None:
|
| 169 |
+
continue
|
| 170 |
+
fixed = _fixed_josa(josa, *anchor)
|
| 171 |
+
if fixed != josa:
|
| 172 |
+
start = m.start() + len(stem)
|
| 173 |
+
edits.append((start, start + len(josa), fixed))
|
| 174 |
+
for start, end, fixed in reversed(edits):
|
| 175 |
+
line = line[:start] + fixed + line[end:]
|
| 176 |
+
return line
|
solar_eval/pipelines/rules_revert.py
ADDED
|
@@ -0,0 +1,121 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
"""원문 대비 diff 를 클래스 판정해 되돌리는 정밀도 가드 — `diff_revert` rule_type.
|
| 2 |
+
|
| 3 |
+
파이프라인(FT·LLM 스텝)이 만드는 오탐 중 큰 덩어리가 **기계적**이다
|
| 4 |
+
(2026-09-17 chosun C1 풀셋 실측 — paragraph 오탐 410건 중):
|
| 5 |
+
- 따옴표 글리프 변환 77건: LLM 이 텍스트를 다시 타이핑하며 `" '` 유니코드
|
| 6 |
+
따옴표를 ASCII 로 바꾼다. gold 가 이런 수정을 하는 경우는 5건뿐.
|
| 7 |
+
- 쉼표 삽입 14건: `90일로` -> `90일로,`. gold 쪽 같은 유형 0건.
|
| 8 |
+
- 금지 치환·격식 전환: `대통령실 -> 청와대`(기관 현재명을 과거명으로),
|
| 9 |
+
`-다. -> -습니다.`(경어 전환). 교열의 권한 밖.
|
| 10 |
+
|
| 11 |
+
원문과 현재 텍스트를 어절 단위로 정렬(difflib)해 바뀐 span 마다 위 클래스에
|
| 12 |
+
해당하면 원문 span 으로 되돌린다. 화이트리스트 복원(v19/v32)과 같은 계보의
|
| 13 |
+
"파이프라인이 만든 변경만 되돌리는" 규칙이라 새 교정을 만들지 않는다.
|
| 14 |
+
|
| 15 |
+
config (전부 선택; 기본은 아래):
|
| 16 |
+
glyph_restore: true # 글리프-only 치환 되돌림
|
| 17 |
+
comma_insertion_revert: true
|
| 18 |
+
forbidden_insertions: [] # 이 문자열을 새로 들여오는 치환 되돌림 (예: [청와대])
|
| 19 |
+
register_guard: false # 평서문 -> 경어(-습니다/-에요) 전환 되돌림
|
| 20 |
+
punct_deletion_revert: false # 원문의 따옴표/불릿 문자를 지운 span 되돌림
|
| 21 |
+
"""
|
| 22 |
+
|
| 23 |
+
from __future__ import annotations
|
| 24 |
+
|
| 25 |
+
import difflib
|
| 26 |
+
import re
|
| 27 |
+
from collections import Counter
|
| 28 |
+
from typing import Any
|
| 29 |
+
|
| 30 |
+
#: 줄바꿈 보존용 sentinel — 어절 분할 전 개행을 이 토큰으로 바꾼다.
|
| 31 |
+
#: NUL 은 뉴스 텍스트에 등장하지 않는다.
|
| 32 |
+
_NL = chr(0)
|
| 33 |
+
|
| 34 |
+
#: 따옴표류 글리프 정규화 — 이것'만' 같아지는 치환은 글리프 변환이다.
|
| 35 |
+
#: NFKC 는 쓰지 않는다: 단위 문자(㎏ 등)까지 접어서 post_process 의 의도적
|
| 36 |
+
#: unit_unicode 변환을 되돌려 버린다.
|
| 37 |
+
_GLYPH_TRANS = str.maketrans(
|
| 38 |
+
{
|
| 39 |
+
"“": '"',
|
| 40 |
+
"”": '"',
|
| 41 |
+
"„": '"',
|
| 42 |
+
"″": '"',
|
| 43 |
+
"‘": "'",
|
| 44 |
+
"’": "'",
|
| 45 |
+
"‚": "'",
|
| 46 |
+
"′": "'",
|
| 47 |
+
"´": "'",
|
| 48 |
+
"`": "'",
|
| 49 |
+
}
|
| 50 |
+
)
|
| 51 |
+
|
| 52 |
+
# -습니다/-ㅂ니다(입니다·갑니다 등)·해요체. '아니다'는 평서형이라 제외한다.
|
| 53 |
+
_REGISTER_RE = re.compile(r"(?<!아)니다|에요|예요")
|
| 54 |
+
|
| 55 |
+
#: 파이프라인이 지우면 안 되는 구조 표시 문자 — 따옴표류·괄호·불릿.
|
| 56 |
+
#: 실측(2026-09-18 chosun paragraph 541행): 모델이 이 문자를 지운 span 38건 중
|
| 57 |
+
#: gold 가 같은 삭제를 하는 경우는 **0건**이었다. 되돌림이 일방적으로 옳다.
|
| 58 |
+
_STRUCTURAL_MARKS = frozenset("“”‘’\"'▶◇◆●▲△※()[]")
|
| 59 |
+
|
| 60 |
+
|
| 61 |
+
def _norm_glyph(s: str) -> str:
|
| 62 |
+
return s.translate(_GLYPH_TRANS)
|
| 63 |
+
|
| 64 |
+
|
| 65 |
+
def _tokens(text: str) -> list[str]:
|
| 66 |
+
return text.replace("\n", f" {_NL} ").split()
|
| 67 |
+
|
| 68 |
+
|
| 69 |
+
def _join(tokens: list[str]) -> str:
|
| 70 |
+
return re.sub(f" ?{re.escape(_NL)} ?", "\n", " ".join(tokens))
|
| 71 |
+
|
| 72 |
+
|
| 73 |
+
def _should_revert(orig: str, new: str, config: dict[str, Any]) -> bool:
|
| 74 |
+
"""바뀐 span (orig -> new, 어절 join 문자열) 이 되돌림 클래스인지 판정."""
|
| 75 |
+
if orig and new:
|
| 76 |
+
if config.get("glyph_restore", True) and _norm_glyph(orig) == _norm_glyph(new):
|
| 77 |
+
return True
|
| 78 |
+
if (
|
| 79 |
+
config.get("comma_insertion_revert", True)
|
| 80 |
+
and new.replace(",", "") == orig.replace(",", "")
|
| 81 |
+
and new.count(",") > orig.count(",")
|
| 82 |
+
):
|
| 83 |
+
return True
|
| 84 |
+
if config.get("punct_deletion_revert", False) and orig and new:
|
| 85 |
+
removed = Counter(orig) - Counter(new)
|
| 86 |
+
added = Counter(new) - Counter(orig)
|
| 87 |
+
if removed and not added and set(removed) <= _STRUCTURAL_MARKS:
|
| 88 |
+
return True
|
| 89 |
+
for forbidden in config.get("forbidden_insertions") or ():
|
| 90 |
+
if forbidden in new and forbidden not in orig:
|
| 91 |
+
return True
|
| 92 |
+
return bool(
|
| 93 |
+
config.get("register_guard", False)
|
| 94 |
+
and _REGISTER_RE.search(new)
|
| 95 |
+
and not _REGISTER_RE.search(orig)
|
| 96 |
+
)
|
| 97 |
+
|
| 98 |
+
|
| 99 |
+
def apply_diff_revert(text: str, original: str, config: dict[str, Any]) -> str:
|
| 100 |
+
"""`diff_revert` rule_type 구현 — 클래스 판정된 diff 를 원문으로 되돌린다."""
|
| 101 |
+
orig_tokens = _tokens(original)
|
| 102 |
+
out_tokens = _tokens(text)
|
| 103 |
+
matcher = difflib.SequenceMatcher(None, orig_tokens, out_tokens, autojunk=False)
|
| 104 |
+
|
| 105 |
+
rebuilt: list[str] = []
|
| 106 |
+
for tag, i1, i2, j1, j2 in matcher.get_opcodes():
|
| 107 |
+
if tag == "equal":
|
| 108 |
+
rebuilt.extend(out_tokens[j1:j2])
|
| 109 |
+
continue
|
| 110 |
+
o_toks = orig_tokens[i1:i2]
|
| 111 |
+
n_toks = out_tokens[j1:j2]
|
| 112 |
+
if len(o_toks) == len(n_toks):
|
| 113 |
+
# difflib 은 연속 변경 어절을 한 블록으로 합친다 — 글리프 변환과
|
| 114 |
+
# 실제 교정이 섞인 블록을 통째로 판정하면 둘 다 놓치므로 쌍 단위로.
|
| 115 |
+
for o, n in zip(o_toks, n_toks, strict=True):
|
| 116 |
+
rebuilt.append(o if _should_revert(o, n, config) else n)
|
| 117 |
+
elif _should_revert(" ".join(o_toks), " ".join(n_toks), config):
|
| 118 |
+
rebuilt.extend(o_toks)
|
| 119 |
+
else:
|
| 120 |
+
rebuilt.extend(n_toks)
|
| 121 |
+
return _join(rebuilt)
|
solar_eval/pipelines/steps/__pycache__/__init__.cpython-312.pyc
ADDED
|
Binary file (639 Bytes). View file
|
|
|
solar_eval/pipelines/steps/__pycache__/chunking.cpython-312.pyc
ADDED
|
Binary file (16.3 kB). View file
|
|
|
solar_eval/pipelines/steps/__pycache__/completion.cpython-312.pyc
ADDED
|
Binary file (5.25 kB). View file
|
|
|
solar_eval/pipelines/steps/__pycache__/judge_step.cpython-312.pyc
ADDED
|
Binary file (3.24 kB). View file
|
|
|
solar_eval/pipelines/steps/__pycache__/llm.cpython-312.pyc
ADDED
|
Binary file (14.7 kB). View file
|
|
|
solar_eval/pipelines/steps/__pycache__/rule_steps.cpython-312.pyc
ADDED
|
Binary file (10.2 kB). View file
|
|
|
solar_eval/pipelines/steps/chunking.py
CHANGED
|
@@ -4,7 +4,7 @@
|
|
| 4 |
`.rstrip()` + `"".join` 이 공백을 삼키고(`미국 제너럴다이내믹스`→`미국제너럴다이내믹스`), 어절
|
| 5 |
중간이면 모델이 뒤 조각을 완성하거나(`들이`→`이들이`) 앞 조각을 버렸고(`이뤄졌다. 지난`→
|
| 6 |
`이뤄졌다.난`), `\\n`→`∥PARA∥` 왕복은 마커 한가운데를 잘라 리터럴을 출력에 남겼다. 상세는
|
| 7 |
-
`accounts/chosun/body-proofread/03-evaluation/insights/
|
| 8 |
|
| 9 |
왜 greedy(상한까지 채우고 가장 가까운 경계) 가 아니라 DP 인가:
|
| 10 |
- greedy 는 꼬리 chunk 를 수십 자로 남긴다 (1022자 → 500/500/22). 조각만 받은 모델은 헛손질한다.
|
|
|
|
| 4 |
`.rstrip()` + `"".join` 이 공백을 삼키고(`미국 제너럴다이내믹스`→`미국제너럴다이내믹스`), 어절
|
| 5 |
중간이면 모델이 뒤 조각을 완성하거나(`들이`→`이들이`) 앞 조각을 버렸고(`이뤄졌다. 지난`→
|
| 6 |
`이뤄졌다.난`), `\\n`→`∥PARA∥` 왕복은 마커 한가운데를 잘라 리터럴을 출력에 남겼다. 상세는
|
| 7 |
+
`accounts/chosun/body-proofread/03-evaluation/insights/lab_notes_archive.md#260910_long_article_regression_set`.
|
| 8 |
|
| 9 |
왜 greedy(상한까지 채우고 가장 가까운 경계) 가 아니라 DP 인가:
|
| 10 |
- greedy 는 꼬리 chunk 를 수십 자로 남긴다 (1022자 → 500/500/22). 조각만 받은 모델은 헛손질한다.
|
solar_eval/pipelines/steps/rule_steps.py
CHANGED
|
@@ -24,6 +24,8 @@ from solar_eval.pipelines.rules import (
|
|
| 24 |
apply_yul_ryul_normalize,
|
| 25 |
load_compound_whitelist,
|
| 26 |
)
|
|
|
|
|
|
|
| 27 |
|
| 28 |
logger = logging.getLogger(__name__)
|
| 29 |
|
|
@@ -120,6 +122,28 @@ class ApplyJudgeDecisionsStep(BaseStep):
|
|
| 120 |
ctx.text = apply_judge_decisions(ctx.text, config, sample)
|
| 121 |
|
| 122 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 123 |
@register_step("change_rate_guard")
|
| 124 |
class ChangeRateGuardStep(BaseStep):
|
| 125 |
"""원문 대비 변경률이 임계를 넘으면 원문으로 되돌리는 안전망 (v17 계열)."""
|
|
|
|
| 24 |
apply_yul_ryul_normalize,
|
| 25 |
load_compound_whitelist,
|
| 26 |
)
|
| 27 |
+
from solar_eval.pipelines.rules_josa import apply_josa_fix
|
| 28 |
+
from solar_eval.pipelines.rules_revert import apply_diff_revert
|
| 29 |
|
| 30 |
logger = logging.getLogger(__name__)
|
| 31 |
|
|
|
|
| 122 |
ctx.text = apply_judge_decisions(ctx.text, config, sample)
|
| 123 |
|
| 124 |
|
| 125 |
+
@register_step("josa_fix")
|
| 126 |
+
class JosaFixStep(BaseStep):
|
| 127 |
+
"""기호·숫자·단위 뒤 조사 결정론 교정 (2026-09-18, 상세는 `rules_josa` docstring)."""
|
| 128 |
+
|
| 129 |
+
async def run(self, sample: EvalSample, ctx: StepContext) -> None:
|
| 130 |
+
ctx.text = apply_josa_fix(ctx.text)
|
| 131 |
+
|
| 132 |
+
|
| 133 |
+
@register_step("diff_revert")
|
| 134 |
+
class DiffRevertStep(BaseStep):
|
| 135 |
+
"""원문 대비 diff 를 클래스 판정해 되돌리는 정밀도 가드 (2026-09-18).
|
| 136 |
+
|
| 137 |
+
글리프 변환·쉼표 삽입·금지 치환·격식 전환만 되돌린다 — 상세와 실측 근거는
|
| 138 |
+
`rules_revert` docstring 참조. 파이프라인 꼬리(post_process 뒤)에 두는 것을
|
| 139 |
+
전제로 설계했다.
|
| 140 |
+
"""
|
| 141 |
+
|
| 142 |
+
async def run(self, sample: EvalSample, ctx: StepContext) -> None:
|
| 143 |
+
config = self.config.get("config", {})
|
| 144 |
+
ctx.text = apply_diff_revert(ctx.text, ctx.original_text, config)
|
| 145 |
+
|
| 146 |
+
|
| 147 |
@register_step("change_rate_guard")
|
| 148 |
class ChangeRateGuardStep(BaseStep):
|
| 149 |
"""원문 대비 변경률이 임계를 넘으면 원문으로 되돌리는 안전망 (v17 계열)."""
|
solar_eval/providers/__pycache__/__init__.cpython-312.pyc
ADDED
|
Binary file (512 Bytes). View file
|
|
|
solar_eval/providers/__pycache__/base.cpython-312.pyc
ADDED
|
Binary file (2.11 kB). View file
|
|
|
solar_eval/providers/__pycache__/openai_provider.cpython-312.pyc
ADDED
|
Binary file (4.66 kB). View file
|
|
|
solar_eval/providers/__pycache__/upstage.cpython-312.pyc
ADDED
|
Binary file (8.83 kB). View file
|
|
|
solar_eval/providers/upstage.py
CHANGED
|
@@ -1,7 +1,9 @@
|
|
| 1 |
import asyncio
|
| 2 |
import json
|
| 3 |
import logging
|
|
|
|
| 4 |
import re
|
|
|
|
| 5 |
from typing import Any
|
| 6 |
|
| 7 |
import httpx
|
|
@@ -15,6 +17,34 @@ THINK_PATTERN = re.compile(r"<think>(.*?)</think>", re.DOTALL)
|
|
| 15 |
|
| 16 |
MAX_RETRIES = 3
|
| 17 |
RETRY_DELAYS = [5, 10, 20] # seconds
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 18 |
|
| 19 |
|
| 20 |
class UpstageProvider(BaseProvider):
|
|
@@ -23,6 +53,21 @@ class UpstageProvider(BaseProvider):
|
|
| 23 |
self.api_key = cfg.upstage_api_key
|
| 24 |
self.api_base = cfg.upstage_api_base
|
| 25 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 26 |
async def chat_completion(
|
| 27 |
self,
|
| 28 |
messages: list[dict[str, str]],
|
|
@@ -49,7 +94,10 @@ class UpstageProvider(BaseProvider):
|
|
| 49 |
if tool_choice is not None:
|
| 50 |
payload["tool_choice"] = tool_choice
|
| 51 |
|
| 52 |
-
|
|
|
|
|
|
|
|
|
|
| 53 |
try:
|
| 54 |
async with httpx.AsyncClient(timeout=300.0) as client:
|
| 55 |
response = await client.post(
|
|
@@ -60,17 +108,31 @@ class UpstageProvider(BaseProvider):
|
|
| 60 |
response.raise_for_status()
|
| 61 |
data = response.json()
|
| 62 |
break
|
| 63 |
-
except
|
| 64 |
-
|
| 65 |
-
|
| 66 |
-
|
| 67 |
-
|
| 68 |
-
|
| 69 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 70 |
raise RuntimeError(
|
| 71 |
-
f"Upstage API
|
| 72 |
) from e
|
| 73 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 74 |
|
| 75 |
choice = data["choices"][0]
|
| 76 |
message = choice["message"]
|
|
|
|
| 1 |
import asyncio
|
| 2 |
import json
|
| 3 |
import logging
|
| 4 |
+
import random
|
| 5 |
import re
|
| 6 |
+
import time
|
| 7 |
from typing import Any
|
| 8 |
|
| 9 |
import httpx
|
|
|
|
| 17 |
|
| 18 |
MAX_RETRIES = 3
|
| 19 |
RETRY_DELAYS = [5, 10, 20] # seconds
|
| 20 |
+
# 429 is expected on low-quota models (e.g. solar-mini4-preview: 100 RPM / 50k TPM),
|
| 21 |
+
# so rate-limit waits don't consume the generic retry budget -- otherwise the
|
| 22 |
+
# sample is dropped from results.jsonl and the score is computed on survivors.
|
| 23 |
+
RATE_LIMIT_MAX_WAITS = 40
|
| 24 |
+
RATE_LIMIT_MIN_DELAY = 2.0
|
| 25 |
+
RATE_LIMIT_MAX_DELAY = 65.0
|
| 26 |
+
RATE_LIMIT_RESET_HEADERS = (
|
| 27 |
+
"X-Upstage-Ratelimit-Reset-Tokens",
|
| 28 |
+
"X-Upstage-Ratelimit-Reset-Requests",
|
| 29 |
+
)
|
| 30 |
+
# Transient network failures (DNS/connect) can last minutes; wait them out
|
| 31 |
+
# instead of failing the sample.
|
| 32 |
+
CONNECT_MAX_WAITS = 40
|
| 33 |
+
CONNECT_RETRY_DELAY = 15.0
|
| 34 |
+
|
| 35 |
+
|
| 36 |
+
def _rate_limit_delay(response: httpx.Response) -> float:
|
| 37 |
+
"""Seconds to wait before retrying a 429, from Upstage reset headers (epoch secs)."""
|
| 38 |
+
now = time.time()
|
| 39 |
+
resets = []
|
| 40 |
+
for header in RATE_LIMIT_RESET_HEADERS:
|
| 41 |
+
try:
|
| 42 |
+
resets.append(float(response.headers[header]) - now)
|
| 43 |
+
except (KeyError, ValueError):
|
| 44 |
+
continue
|
| 45 |
+
base = max(resets) if resets else RETRY_DELAYS[0]
|
| 46 |
+
jittered = base + random.uniform(0, 3)
|
| 47 |
+
return min(max(jittered, RATE_LIMIT_MIN_DELAY), RATE_LIMIT_MAX_DELAY)
|
| 48 |
|
| 49 |
|
| 50 |
class UpstageProvider(BaseProvider):
|
|
|
|
| 53 |
self.api_key = cfg.upstage_api_key
|
| 54 |
self.api_base = cfg.upstage_api_base
|
| 55 |
|
| 56 |
+
@staticmethod
|
| 57 |
+
async def _backoff_or_raise(error: Exception, attempt: int) -> int:
|
| 58 |
+
"""Sleep before the next generic retry, or raise once retries are exhausted."""
|
| 59 |
+
delay = RETRY_DELAYS[attempt] if attempt < len(RETRY_DELAYS) else RETRY_DELAYS[-1]
|
| 60 |
+
logger.warning(
|
| 61 |
+
f"Upstage API attempt {attempt + 1}/{MAX_RETRIES} failed: {error}. "
|
| 62 |
+
f"Retrying in {delay}s..."
|
| 63 |
+
)
|
| 64 |
+
if attempt == MAX_RETRIES - 1:
|
| 65 |
+
raise RuntimeError(
|
| 66 |
+
f"Upstage API failed after {MAX_RETRIES} retries: {error}"
|
| 67 |
+
) from error
|
| 68 |
+
await asyncio.sleep(delay)
|
| 69 |
+
return attempt + 1
|
| 70 |
+
|
| 71 |
async def chat_completion(
|
| 72 |
self,
|
| 73 |
messages: list[dict[str, str]],
|
|
|
|
| 94 |
if tool_choice is not None:
|
| 95 |
payload["tool_choice"] = tool_choice
|
| 96 |
|
| 97 |
+
attempt = 0
|
| 98 |
+
rate_limit_waits = 0
|
| 99 |
+
connect_waits = 0
|
| 100 |
+
while True:
|
| 101 |
try:
|
| 102 |
async with httpx.AsyncClient(timeout=300.0) as client:
|
| 103 |
response = await client.post(
|
|
|
|
| 108 |
response.raise_for_status()
|
| 109 |
data = response.json()
|
| 110 |
break
|
| 111 |
+
except httpx.HTTPStatusError as e:
|
| 112 |
+
if e.response.status_code == 429 and rate_limit_waits < RATE_LIMIT_MAX_WAITS:
|
| 113 |
+
rate_limit_waits += 1
|
| 114 |
+
delay = _rate_limit_delay(e.response)
|
| 115 |
+
logger.debug(
|
| 116 |
+
f"Upstage API rate limited (model={model}, "
|
| 117 |
+
f"wait {rate_limit_waits}/{RATE_LIMIT_MAX_WAITS}). "
|
| 118 |
+
f"Retrying in {delay:.1f}s..."
|
| 119 |
+
)
|
| 120 |
+
await asyncio.sleep(delay)
|
| 121 |
+
continue
|
| 122 |
+
attempt = await self._backoff_or_raise(e, attempt)
|
| 123 |
+
except httpx.TimeoutException as e:
|
| 124 |
+
attempt = await self._backoff_or_raise(e, attempt)
|
| 125 |
+
except httpx.TransportError as e:
|
| 126 |
+
if connect_waits >= CONNECT_MAX_WAITS:
|
| 127 |
raise RuntimeError(
|
| 128 |
+
f"Upstage API unreachable after {CONNECT_MAX_WAITS} waits: {e}"
|
| 129 |
) from e
|
| 130 |
+
connect_waits += 1
|
| 131 |
+
logger.warning(
|
| 132 |
+
f"Upstage API connection error (wait {connect_waits}/"
|
| 133 |
+
f"{CONNECT_MAX_WAITS}): {e}. Retrying in {CONNECT_RETRY_DELAY}s..."
|
| 134 |
+
)
|
| 135 |
+
await asyncio.sleep(CONNECT_RETRY_DELAY)
|
| 136 |
|
| 137 |
choice = data["choices"][0]
|
| 138 |
message = choice["message"]
|