@@ -137,6 +137,10 @@ public SendMessageResponse sendMessage(Long chatId, SendMessageRequest request)
137137 maybeMilestoneHint (session , chat );
138138 }
139139
140+ // 응답 형식 제어를 위한 추가 지침 전송
141+ String formatInstruction = buildFormatInstruction (chat );
142+ session .sendMessage (formatInstruction );
143+
140144 // 모델 호출
141145 GenerateContentResponse modelResp = session .sendMessage (request .content ());
142146
@@ -484,6 +488,46 @@ private String normalizeQuotes(String response) {
484488 .trim ();
485489 }
486490
491+ /**
492+ * 응답 형식 제어를 위한 추가 지침 생성
493+ */
494+ private String buildFormatInstruction (shinhan .click .domain .chat .entity .Chat chat ) {
495+ String characterName = safe (chat .getCharacter () != null ? chat .getCharacter ().getName () : null );
496+ String personaName = safe (chat .getPersonaName ());
497+
498+ StringBuilder instruction = new StringBuilder ();
499+
500+ instruction .append ("(응답 형식 지침) 다음 규칙을 엄격히 준수하여 응답하세요:\n \n " );
501+
502+ // 1. 제3자 대사 금지
503+ instruction .append ("1. 제3자 대사 금지:\n " );
504+ instruction .append ("- " ).append (characterName ).append ("와 " ).append (personaName ).append (" 외의 다른 인물의 직접 발언은 절대 따옴표로 표시하지 않습니다\n " );
505+ instruction .append ("- 제3자의 말은 나레이션으로만 간접 인용: '그가 인사를 건넸다', '누군가 소리쳤다' 등\n " );
506+ instruction .append ("- 예시 (올바름): 멀리서 누군가 부르는 소리가 들렸다\n " );
507+ instruction .append ("- 예시 (금지): \" 여기 있었구나!\" 친구가 말했다\n \n " );
508+
509+ // 2. 응답 구성 제한
510+ instruction .append ("2. 응답 구성 제한:\n " );
511+ instruction .append ("- " ).append (characterName ).append ("의 나레이션: 최대 2회까지만\n " );
512+ instruction .append ("- " ).append (characterName ).append ("의 대사: 최대 2회까지만\n " );
513+ instruction .append ("- 나레이션은 간결하게, 대사는 자연스럽게 배치\n " );
514+ instruction .append ("- 과도한 서술이나 반복적인 대사 금지\n \n " );
515+
516+ // 3. 대사 표기 규칙 재확인
517+ instruction .append ("3. 대사 표기 규칙:\n " );
518+ instruction .append ("- " ).append (characterName ).append ("의 직접 발언만 표준 따옴표(\" )로 감싸기\n " );
519+ instruction .append ("- 다른 종류의 따옴표 절대 사용 금지\n " );
520+ instruction .append ("- 나레이션과 대사를 명확히 구분\n \n " );
521+
522+ // 4. 응답 예시
523+ instruction .append ("4. 올바른 응답 구성 예시:\n " );
524+ instruction .append ("\" 어? 여기서 뭐하고 있었어?\" 그가 고개를 갸우뚱하며 다가왔다. \" 혹시 나를 기다리고 있었던 거야?\" \n \n " );
525+
526+ instruction .append ("이 지침들을 모든 응답에서 반드시 준수하되, 기존 캐릭터 설정과 세계관은 그대로 유지하세요." );
527+
528+ return instruction .toString ();
529+ }
530+
487531 /**
488532 * 최적화된 히스토리 시딩 (기존 8개에서 4개로 단축)
489533 */
0 commit comments