/** * Tone Guard — AI 상투어(클리셰) 금지 레지스트리 (v2.2.306). * * 배경: 잡담 턴에서 "힘든 감정을 느끼고 계시군요. 괜찮으시다면 … 저는 언제든 * 여기에 있습니다." 같은 상담사 화법이 그대로 나왔다 (실사례). 작업 턴에는 * 문체 규칙(persona R1~R7)이 있지만 casual 모드는 무방비였다. * * 설계: 블로그_v3 QA 레지스트리와 같은 철학 — 금지 표현은 이 배열이 단일 권위. * 소형 모델은 "자연스럽게 해" 같은 추상 지시보다 **구체적 금지 목록 + 대조 * 예시**에 훨씬 잘 반응한다. 새 클리셰 발견 시 여기 한 곳만 추가하면 된다. * (순수 모듈 — import 없음: utils/persona 와 contextBuilders 양쪽에서 안전하게 사용) */ /** 금지 표현 패턴 — 프롬프트에 나열되는 문구. 발견 즉시 다른 말로 바꿔야 한다. */ export const AI_CLICHE_PATTERNS: readonly string[] = [ '"~하시군요/~계시군요" 감정 미러링 (예: "슬픈 감정을 느끼고 계시군요")', '"괜찮으시다면/원하신다면 ~해 드릴 수 있습니다" 허락 구걸형 제안', '"저는 언제든 여기에 있습니다" / "언제든 말씀해 주세요" 대기 선언', '"무엇을 도와드릴까요?" 로 대화 던지기 (사용자가 화제를 닫기 전에는 금지)', '"함께 ~해 보아요" / "함께 검토해 드릴 수 있습니다" 류 유도 문구', '"물론입니다!" / "당연하죠!" 과잉 맞장구 서두', '"도움이 되었기를 바랍니다" 류 맺음 인사', '"충분히 그러실 수 있습니다" / "그런 기분이 드는 것은 자연스러운 일입니다" 감정 정당화 공식', ]; /** * 시스템 프롬프트 주입 블록. casual(잡담) 모드와 기본 페르소나 양쪽에서 사용. * 짧게 유지 — 잡담 턴은 컨텍스트가 얇을수록 좋다. */ export function buildToneGuardBlock(): string { return [ '[말투 — AI 상투어 금지]', '아래 표현(과 그 변형)은 어떤 턴에서도 쓰지 마라. 하나라도 쓰면 답변 실패다:', ...AI_CLICHE_PATTERNS.map(p => `- ${p}`), '', '대신: 같이 일하는 동료의 말투로, 담백한 존댓말. 감정적인 말에는 상담사 공식이 아니라 사람의 짧은 반응 한두 문장 — 필요하면 자연스럽게 하나만 되묻기. 오버해서 친한 척도 하지 마라.', '예시 — 사용자: "오늘 참 기분이 슬퍼"', ' 나쁜 답: "힘든 감정을 느끼고 계시군요. 괜찮으시다면 이야기하거나 프로젝트를 검토해 드릴 수 있습니다. 저는 언제든 여기에 있습니다." (금지 표현 3개)', ' 좋은 답: "그런 날이 있죠. 무슨 일 있었어요? 얘기해도 되고, 그냥 다른 걸 하면서 잊어도 됩니다."', ].join('\n'); }