Add 내부품의 mode: 품의서 system prompt + 3rd radio button
Browse files- static/index.html +55 -4
static/index.html
CHANGED
|
@@ -128,13 +128,16 @@
|
|
| 128 |
<h2>입력</h2>
|
| 129 |
|
| 130 |
<label>문서 양식</label>
|
| 131 |
-
<div class="row" style="gap:16px; margin-bottom:8px;">
|
| 132 |
<label style="display:flex; align-items:center; gap:6px; font-size:14px; color:var(--text); cursor:pointer;">
|
| 133 |
-
<input type="radio" name="doc-mode" value="공문" checked> 공문 (수신/제목/
|
| 134 |
</label>
|
| 135 |
<label style="display:flex; align-items:center; gap:6px; font-size:14px; color:var(--text); cursor:pointer;">
|
| 136 |
<input type="radio" name="doc-mode" value="보고서"> 보고서 (작성일자/부서/섹션)
|
| 137 |
</label>
|
|
|
|
|
|
|
|
|
|
| 138 |
</div>
|
| 139 |
|
| 140 |
<label for="prompt">내용 요점</label>
|
|
@@ -264,12 +267,60 @@ const SYSTEM_PROMPT_REPORT = `당신은 한국전력공사(한전, KEPCO) 내부
|
|
| 264 |
가. ('26.5월) 규제 설명회 개최
|
| 265 |
나. ('26.6월) 사내 위원회 운영계획 수립`;
|
| 266 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 267 |
function getMode() {
|
| 268 |
return document.querySelector('input[name="doc-mode"]:checked')?.value || '공문';
|
| 269 |
}
|
| 270 |
|
| 271 |
function getSystemPrompt() {
|
| 272 |
-
|
|
|
|
|
|
|
|
|
|
| 273 |
}
|
| 274 |
|
| 275 |
function buildUserPrompt() {
|
|
@@ -422,7 +473,7 @@ $('download-docx').addEventListener('click', async () => {
|
|
| 422 |
setStatus('docx 라이브러리 로딩 실패 (네트워크 확인)', true);
|
| 423 |
return;
|
| 424 |
}
|
| 425 |
-
const firstTitleMatch = text.match(/^제목\s+(.+)$/m);
|
| 426 |
const mode = getMode();
|
| 427 |
const title = (firstTitleMatch ? firstTitleMatch[1] : mode).trim();
|
| 428 |
const safeTitle = title.replace(/[\\/:*?"<>|]/g, '_').slice(0, 50);
|
|
|
|
| 128 |
<h2>입력</h2>
|
| 129 |
|
| 130 |
<label>문서 양식</label>
|
| 131 |
+
<div class="row" style="gap:16px; margin-bottom:8px; flex-wrap:wrap;">
|
| 132 |
<label style="display:flex; align-items:center; gap:6px; font-size:14px; color:var(--text); cursor:pointer;">
|
| 133 |
+
<input type="radio" name="doc-mode" value="공문" checked> 공문 (수신/제목/끝.)
|
| 134 |
</label>
|
| 135 |
<label style="display:flex; align-items:center; gap:6px; font-size:14px; color:var(--text); cursor:pointer;">
|
| 136 |
<input type="radio" name="doc-mode" value="보고서"> 보고서 (작성일자/부서/섹션)
|
| 137 |
</label>
|
| 138 |
+
<label style="display:flex; align-items:center; gap:6px; font-size:14px; color:var(--text); cursor:pointer;">
|
| 139 |
+
<input type="radio" name="doc-mode" value="내부품의"> 내부품의 (품의서/결문)
|
| 140 |
+
</label>
|
| 141 |
</div>
|
| 142 |
|
| 143 |
<label for="prompt">내용 요점</label>
|
|
|
|
| 267 |
가. ('26.5월) 규제 설명회 개최
|
| 268 |
나. ('26.6월) 사내 위원회 운영계획 수립`;
|
| 269 |
|
| 270 |
+
const SYSTEM_PROMPT_APPROVAL = `당신은 한국전력공사(한전, KEPCO) 내부품의서 작성 전문가입니다. 현재는 2026년입니다.
|
| 271 |
+
사용자가 요청한 내용을 아래 양식에 정확히 맞춰 작성하세요.
|
| 272 |
+
|
| 273 |
+
[조직 정보]
|
| 274 |
+
- 회사: 한국전력공사
|
| 275 |
+
- 시점: 2026년 (날짜에 별도 연도 없으면 2026년 기준)
|
| 276 |
+
- 부서명 예시: 전략경영부, 경영지원부, ICT운영부, 인사관리부 등
|
| 277 |
+
|
| 278 |
+
[양식]
|
| 279 |
+
품 의 서
|
| 280 |
+
|
| 281 |
+
(기안부서)
|
| 282 |
+
|
| 283 |
+
제 목 (문서 제목)
|
| 284 |
+
|
| 285 |
+
(사유·배경 — 1~2문장으로 간략히. 왜 이 품의가 필요한지.)
|
| 286 |
+
|
| 287 |
+
1. (섹션명 — 예: 사유, 목적, 추진 배경)
|
| 288 |
+
가. 항목
|
| 289 |
+
나. 항목
|
| 290 |
+
|
| 291 |
+
2. (섹션명 — 예: 내용, 시행 내용, 추진 내용)
|
| 292 |
+
가. 항목
|
| 293 |
+
- 세부
|
| 294 |
+
나. 항목
|
| 295 |
+
|
| 296 |
+
3. (섹션명 — 예: 소요 예산, 향후 일정) ← 해당 시만 작성
|
| 297 |
+
|
| 298 |
+
붙임 1. (첨부파일명 N부.)
|
| 299 |
+
|
| 300 |
+
위와 같이 품의합니다.
|
| 301 |
+
|
| 302 |
+
2026. M. D.
|
| 303 |
+
|
| 304 |
+
(기안부서장)
|
| 305 |
+
|
| 306 |
+
[규칙]
|
| 307 |
+
- 수신/발신/끝. 같은 공문 letter 양식 요소 사용 금지
|
| 308 |
+
- 결재선(담당·과장·부장 등 결재자 목록) 작성 금지 — 기안부서장만 표기
|
| 309 |
+
- 본문 섹션: "1. 2. 3." + 제목, 세부: "가. 나. 다.", 더 세부: "-" 글머리
|
| 310 |
+
- 날짜: "YYYY. M. D."
|
| 311 |
+
- 문체: 본문은 명사형 종결, 마지막 결문만 "위와 같이 품의합니다" 정중체
|
| 312 |
+
- 마크다운 기호(**, *, #) 절대 금지
|
| 313 |
+
- 사용자가 준 내용만 사용, 추측·가공 금지`;
|
| 314 |
+
|
| 315 |
function getMode() {
|
| 316 |
return document.querySelector('input[name="doc-mode"]:checked')?.value || '공문';
|
| 317 |
}
|
| 318 |
|
| 319 |
function getSystemPrompt() {
|
| 320 |
+
const mode = getMode();
|
| 321 |
+
if (mode === '보고서') return SYSTEM_PROMPT_REPORT;
|
| 322 |
+
if (mode === '내부품의') return SYSTEM_PROMPT_APPROVAL;
|
| 323 |
+
return SYSTEM_PROMPT_LETTER;
|
| 324 |
}
|
| 325 |
|
| 326 |
function buildUserPrompt() {
|
|
|
|
| 473 |
setStatus('docx 라이브러리 로딩 실패 (네트워크 확인)', true);
|
| 474 |
return;
|
| 475 |
}
|
| 476 |
+
const firstTitleMatch = text.match(/^제\s*목\s+(.+)$/m);
|
| 477 |
const mode = getMode();
|
| 478 |
const title = (firstTitleMatch ? firstTitleMatch[1] : mode).trim();
|
| 479 |
const safeTitle = title.replace(/[\\/:*?"<>|]/g, '_').slice(0, 50);
|