24. 죽은 free_conversation 파라미터 제거¶
시나리오 JSON에 params.free_conversation: true를 넣어도 Graph Builder와 런타임이 읽지 않았다. 읽히지 않는 키는 자유 대화 모드처럼 보이지만 아무 일도 하지 않는다.
무엇이 문제였나¶
자유 대화 노드(general_conversation의 conversation)에 아래가 붙어 있었다.
둘을 한 세트로 보는 문서가 많았다. 실제로 런타임이 소비하는 것은 turn_limit_enabled뿐이다.
| 키 | Graph Builder | 런타임 |
|---|---|---|
turn_limit_enabled: false |
노드 dict에 실어 통과 | executor가 턴 수 전환을 끄고, NLG 턴 예산 문구를 안 붙임 |
free_conversation: true |
노드 dict에 실어 통과 | 읽지 않음 |
GraphBuilder가 params에서 거절하는 것은 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 표 | 현재 계약에서 제거 |
남겨 둔 값:
이 값이 없으면 자유 대화 노드도 기본 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— MinTurnPolicymax_fallback_retries— FallbackPolicycompletion_slots— NLU 힌트capability와 skill 키 — SkillExecutornlg_opening— bot-first 첫 발화
여기에 없는 키를 시나리오에 쓰면 위생 테스트가 막는다. 새 키를 쓰려면 읽는 코드를 먼저 넣고 목록에 추가한다.
자유 대화는 어디에 남나¶
플래그가 아니라 구조다.
- 노드에
collect_slots가 없다 →GeneralResponseExecutor turn_limit_enabled: false→ 턴 수로 노드를 떠나지 않음next_nodes에서 종료 intent만 closure로, 그 외 stay- 질문·평서문 섞임은
prompts.bot과 노드 description
남은 문서¶
현재 시나리오 JSON과 시나리오 가이드 Params에는
free_conversation이 없습니다. 구현 판단이 갈리면 코드와 CONSUMED_PARAMS, 이
기록 순으로 봅니다.