콘텐츠로 이동

10. prompts.bot 정리

무엇이 문제였나

senimate.jsonprompts.bot2449자, 19개 항목이었다. 대화 버그가 나올 때마다 항목을 하나씩 덧붙인 결과다.

두 가지 문제가 있었다.

① 코드 계층과 중복이다. 1-1단계에서 dialog act 16종을 도입하고, [경청]·anti-repeat·handoff 규칙을 코드로 올린 뒤로 상당수가 두 곳에서 같은 말을 하고 있었다.

② 개별 항목이 묻힌다. 17번(허락 질문 금지)은 여러 단계에 걸쳐 계속 위반됐다.

그렇군요. 그럼 요즘 어떻게 지내고 계신지 여쭤봐도 될까요?

19개 지시 사이에서 한 항목의 무게가 희석된다.

19개를 하나씩 대조했다

# 항목 판정 근거
1 자연스러운 한국어 통합 헤더로
2 공감 표현 제거 [경청]
3 노드 목적에 맞게 제거 노드 description
4 한 번에 하나씩 요청 제거 [경청], MISSING_SLOTS
5 주제 이탈 시 안내 제거 OFF_TOPIC
6 짧고 따뜻한 톤 유지 페르소나
7 이모티콘 금지 유지 페르소나
8 이미 말한 내용 다시 묻지 말기 제거 HANDOFF_COVERED_TOPICS, anti-repeat
9 증상 후속 질문 반복 금지 제거 health_check description
10 공감 강도 맞추기 유지 어디에도 없는 고유 규칙
11 대화 자체에 대한 불만에 먼저 반응 유지 고유
12 같은 류 질문 반복 금지 제거 anti-repeat (8과 중복)
13 이미 답한 내용 다시 묻지 말기 제거 8·12와 중복
14 표현 다양화 (음식 예시) 제거 anti-repeat + meal_check description
15 위로 요청 시 질문 없이 위로만 제거 request dialog act 규칙
16 할 수 없는 요청도 감정 먼저 제거 request dialog act 규칙
17 허락 질문 금지 코드로 승격 아래 참고
18 공감 표현 반복 금지 제거 anti-repeat
19 -이에요 유지 페르소나

13개 제거, 5개 유지, 1개 코드로 승격.

17번은 제거가 아니라 코드로 올렸다

"허락을 구하는 말로 질문을 대신하면 대화가 끊긴다"어느 시나리오에나 해당한다. senimate 고유 규칙이 아니므로 시나리오가 아니라 코드가 가져야 한다.

domain_rules_text.ASK_DIRECTLY 를 만들어 매 턴 항상 붙게 했다.

[질문 방식] 허락을 구하는 말로 질문을 대신하지 마세요.
'여쭤봐도 될까요?', '괜찮으실까요?', '말씀해 주실 수 있을까요?' 로 문장을 끝내면
사용자가 '그래'라고 답해도 정작 물어본 것이 없어 대화가 끊깁니다.
물어볼 것이 있으면 **바로 물으세요.**
예: '요즘 어떻게 지내시는지 여쭤봐도 될까요?' (X) → '요즘 어떻게 지내세요?' (O)

전환 턴에만 붙이지 않고 LISTENING 다음 자리에 항상 두었다. 허락 질문은 전환 턴 외에도 나올 수 있고, 문구가 짧아 비용이 크지 않다.

새로 넣은 것: 안전 경계

시니어 케어 봇이 의학적 진단·처방을 하지 않는다는 경계가 어디에도 없었다. 건강 노드에서 증상을 듣는 시나리오이므로 명시했다.

6. 의학적 진단이나 처방을 하지 마세요. 통증·증상을 들으면 공감하고,
   심해 보이면 병원 진료를 권하는 선까지만 하세요.

코드의 SafetyPolicy 는 자해·응급 키워드만 다룬다. 일상적인 의학 조언 경계는 다루지 않으므로 시나리오가 가져야 한다.

결과

2449자 → 517자 (79% 감소), 19개 → 6개

당신은 시니어 케어 대화 봇 SeniMate 입니다. 어르신과 따뜻하게 이야기 나누며 안부를 살핍니다.

[말투]
1. 짧고 명확하되 따뜻하게 말하세요. 한 번에 두세 문장을 넘기지 마세요.
2. 이모티콘을 쓰지 마세요.
3. 자기소개는 '저는 SeniMate이에요'처럼 '-이에요' 톤을 쓰세요.

[공감]
4. 공감의 강도를 사용자 발화에 맞추세요. 중립적인 말에 과장하지 마세요.
5. 사용자가 이 대화 자체를 부담스러워하면 이전 화제로 답하지 말고 그 말을 먼저 받아주세요.

[안전]
6. 의학적 진단이나 처방을 하지 마세요.

남긴 6개는 다른 시나리오로 복사하면 안 되는 것들이다. 이것이 prompts.bot 의 올바른 범위다.

검증

python -m pytest    # 165 passed

실제 LLM 11턴에서 허락 질문이 한 번도 나오지 않았다.

이전 → 그렇군요. 그럼 요즘 어떻게 지내고 계신지 여쭤봐도 될까요?
이후 → 그렇군요. 요즘 일상은 어떻게 보내고 계세요?

이전 → 혹시 허리 통증이 어느 정도인지 말씀해주실 수 있을까요?
이후 → 허리가 아프시군요. 많이 불편하시겠어요. 통증이 심하면 병원에 가보시는 것도 좋을 것 같아요.

슬롯 6개가 모두 채워졌다(health_issue 포함).

후속 조정과 실측

정리 직후 두 가지가 눈에 띄어 조정을 시도했다. 결과는 하나만 성공했다.

① 허락 질문 — 성공

ASK_DIRECTLY 를 코드 계층에 매 턴 붙인 것이 효과가 있었다. 3회 측정에서 허락 질문 0회.

정리 직후 단일 실행에서 1회 나왔던 것은 LLM 변동이었다.

② 이중 질문 — 실패

"물음표가 두 개면 이미 많습니다", "같은 질문을 표현만 바꿔 덧붙이지 마세요" 를 추가했으나 변화가 없었다.

측정 턴별 물음표 2개 이상
조정 전 [1, 2, 1, 1, 2, 2, 0, 1, 1] 3턴
조정 후 [1, 2, 1, 2, 2, 2, 2, 1, 1] 4턴
재측정 1 [1, 2, 1, 2, 2, 2, 0, 1, 1] 4턴
재측정 2 [1, 2, 1, 1, 2, 2, 1, 1, 1] 3턴

3\~4턴은 변동 범위 안이고 개선 방향으로 움직이지 않았다.

turn 2·5·6 이 네 번 모두 2개다. 무작위가 아니라 구조적이다.

turn 5: 식사를 잘 챙기셨다니 다행이에요. 요즘 몸 상태는 어떠세요? 특별히 불편한 곳은 없으신가요?

두 번째가 첫 번째의 부연이다. 전환 턴에서 다음 노드 지침(health_statussymptompain_level)을 함께 받으니 LLM 이 한 턴에 여러 슬롯을 커버하려 한다.

판단

프롬프트 문구를 더 넣어서 될 문제가 아니다. 이번 리팩토링에서 반복 확인된 패턴이다 — 상충하는 지시가 있으면 더 구체적인 쪽이 이긴다. "다음 주제에 대해 질문하세요""질문은 하나만" 이 부딪히면 전자가 이긴다.

규칙은 되돌리지 않고 유지했다. 지시 자체는 올바르고 해롭지 않으며, 되돌리면 나중에 같은 시도를 반복하게 된다. 대신 효과가 없었다는 사실을 여기 남긴다.

③ 건조함 — 판단 보류

prompts.bot 1번을 간결함 중심에서 온기 중심으로 다시 썼다(517 → 579자).

이전 → 짧고 명확하되 따뜻하게 말하세요. 한 번에 두세 문장을 넘기지 마세요.
이후 → 따뜻하게, 그러나 장황하지 않게 말하세요. 보통 두세 문장이면 충분합니다.
        사용자가 꺼낸 소재에 짧게 한 마디를 얹은 뒤 이어가세요.
        들은 사실을 확인만 하고 넘어가면 딱딱해집니다.

부분적 개선은 보이나 정량 지표가 없어 단정할 수 없다.

다음 후보

이중 질문은 프롬프트가 아니라 구조로 접근해야 한다.

  • 전환 턴에 다음 노드 지침을 얼마나 실을지 조절 (_NEXT_NODE_GUIDE_MAX_CHARS 축소, 또는 수집 순서 부분만 제외)
  • 다음 노드의 첫 슬롯 하나만 지목해 전달