콘텐츠로 이동

24. 죽은 free_conversation 파라미터 제거

시나리오 JSON에 params.free_conversation: true를 넣어도 Graph Builder와 런타임이 읽지 않았다. 읽히지 않는 키는 자유 대화 모드처럼 보이지만 아무 일도 하지 않는다.

무엇이 문제였나

자유 대화 노드(general_conversationconversation)에 아래가 붙어 있었다.

"params": {
  "free_conversation": true,
  "turn_limit_enabled": false
}

둘을 한 세트로 보는 문서가 많았다. 실제로 런타임이 소비하는 것은 turn_limit_enabled뿐이다.

Graph Builder 런타임
turn_limit_enabled: false 노드 dict에 실어 통과 executor가 턴 수 전환을 끄고, NLG 턴 예산 문구를 안 붙임
free_conversation: true 노드 dict에 실어 통과 읽지 않음

GraphBuilderparams에서 거절하는 것은 params.slots뿐이다. 나머지 키는 검증하지도 해석하지도 않는다. 실행 의미는 executor · domain_rules · skill resolver가 각자 자기 키를 읽을 때만 생긴다.

언제 죽었나

18. 런타임 내부 프롬프트 정리에서 NLG 화법 규칙 FREE_CONVERSATION과, free_conversation 여부로 그 규칙을 갈아끼우던 분기를 제거했다.

그 이전에는 이 플래그가 "공감·요약·후속 질문을 매 턴 강제하지 않음"을 켰다. 화법을 시나리오 prompts.bot과 노드 description으로 옮긴 뒤, 플래그는 JSON과 생성 프롬프트 허용 목록에만 남았다.

스키마 위생 테스트(CONSUMED_PARAMS)는 그 목록에 키가 있으면 시나리오 선언을 허용한다. 주석이 "domain_rules가 읽는다"고 되어 있어도, 코드가 읽지 않으면 죽은 키를 정상으로 잠근다.

무엇을 바꿨나

선언을 지우고, 다시 생성되지 않게 허용 목록에서도 지웠다.

위치 변경
dm/scenario/general_conversation.json conversation.params에서 키 제거
dm/tests/test_scenario_schema_hygiene.py CONSUMED_PARAMS에서 제거. 시나리오가 다시 넣으면 실패
dm/generator/prompts.py ALLOWED_NODE_PARAMS와 생성 안내 표에서 제거
시나리오 작성 가이드 params 표 현재 계약에서 제거

남겨 둔 값:

"params": {
  "turn_limit_enabled": false
}

이 값이 없으면 자유 대화 노드도 기본 max_turns에 걸려 턴 수로 다음 단계·종료로 갈 수 있다. 종료는 nlu.intent == user_wants_to_end 라우팅이 담당한다.

Graph Builder가 처리하는 params

생성기가 가르치는 허용 키와, 런타임 CONSUMED_PARAMS는 같아야 한다. 테스트 test_allowed_params_match_the_runtime이 둘을 비교한다.

현재 소비 예:

  • max_turns / turn_limit_enabled — executor, domain_rules 턴 예산
  • min_turns — MinTurnPolicy
  • max_fallback_retries — FallbackPolicy
  • completion_slots — NLU 힌트
  • capability와 skill 키 — SkillExecutor
  • nlg_opening — bot-first 첫 발화

여기에 없는 키를 시나리오에 쓰면 위생 테스트가 막는다. 새 키를 쓰려면 읽는 코드를 먼저 넣고 목록에 추가한다.

자유 대화는 어디에 남나

플래그가 아니라 구조다.

  • 노드에 collect_slots가 없다 → GeneralResponseExecutor
  • turn_limit_enabled: false → 턴 수로 노드를 떠나지 않음
  • next_nodes에서 종료 intent만 closure로, 그 외 stay
  • 질문·평서문 섞임은 prompts.bot과 노드 description

남은 문서

현재 시나리오 JSON과 시나리오 가이드 Params에는 free_conversation이 없습니다. 구현 판단이 갈리면 코드와 CONSUMED_PARAMS, 이 기록 순으로 봅니다.