스크립트 품질 — 문체 규칙과 Gemini 재시도
오늘은 script-generator.ts의 품질 규칙을 여러 단계로 강화한 작업을 정리한다.
간접 인용 종결어 금지
description 필드에서 "~이라고 합니다", "~다고 합니다" 같은 간접 인용체가 반복되는 문제가 있었다.
SYSTEM_PROMPT의 description 생성 지침을 뉴스 앵커 직접 서술체(~했습니다, ~됩니다, ~전망입니다)로 교체했고, 동일한 내용을 CLAUDE.md와 .claude/rules/worker-pipeline.md에도 반영해 문서와 코드를 동기화했다.
추가로 스크립트 구조상 [승] 구간 뒤에 오는 [기] 구간에서 같은 계열 종결어가 연속으로 나오는 패턴을 발견했다. "~거라고 + ~이라고" 같은 2연속 케이스를 프롬프트의 금지 예시에 명시해서 규칙을 보강했다.
comment_bait 구체화
comment_bait 필드에 "이 상황 이해되십니까?" 같은 주제 비특정 예시가 포함되어 있었다. 이런 일반적인 질문은 어떤 영상에도 붙일 수 있어서 의미가 없다. 예시를 제거하고 반드시 영상의 구체적 이슈·주체·사건을 언급한 질문만 생성하도록 프롬프트를 강제화했다.
코드 레벨 격식체 검증
가장 실질적인 변경은 여기다.
Gemini가 SYSTEM_PROMPT 지시를 무시하고 script 필드에 격식체 종결어(~습니다/~입니다)를 삽입하는 경우가 실제로 발생했다. 프롬프트 수정만으로는 재발을 막기 어렵다고 판단해 parseOutput 함수에 검증 로직을 추가했다.
if (/습니다|입니다/.test(script)) {
throw new ScriptError("SCRIPT_FORMAL_ENDING");
}
감지 시 SCRIPT_FORMAL_ENDING 오류를 throw하고 최대 3회 재시도하도록 구현했다.
프롬프트 엔지니어링만으로 LLM 출력을 완전히 제어하려는 건 한계가 있다. 중요한 규칙은 파싱 단계에서 검증하고 재시도하는 구조가 훨씬 안정적이다.