
질문: “Codex/GPT가 답변 끝마다 ‘원하시면 ~해드릴까요?’ ‘필요하시면 ~’ 이런 거 자꾸 붙이는데, SOUL.md에 ‘쓰지 마’라고 써놔도 안 고쳐져요. 어떻게 막나요?”
덕후방에서 5명 이상이 같은 고민을 나눴고, 결국 두 단계로 나눠서 잡아야 한다는 결론이 나왔어요.
1. 왜 한 줄 지시는 안 통하나요?
GPT 계열 모델은 시스템 프롬프트가 굉장히 강하게 “친절한 어시스턴트”로 잡혀 있어요. SOUL.md에 "원하시면" 쓰지 마 한 줄 넣어도, 모델 입장에서는 그게 마지막 한 표일 뿐이라 다음 턴에서 또 슬쩍 붙여요. 특히 답변 마지막 문단은 모델이 가장 “마무리 잘 하고 싶다”는 압력을 받는 자리라 패턴이 자동으로 튀어나와요.
해결은 레이어 두 개로 가는 게 안정적이에요.
2. 첫 번째 레이어 — 하드니스 (strict-agentic)
오픈클로의 openclaw.json(또는 사용 중인 하네스의 동등 설정)에서 실행 계약을 강하게 잡아요.
{
"agents": {
"defaults": {
"embeddedPi": {
"executionContract": "strict-agentic"
}
}
}
}
strict-agentic은 모델이 “친절한 대화 모드”가 아니라 “지시받은 일을 끝내고 보고하는 에이전트 모드”로 작동하도록 시스템 레벨에서 압력을 줘요. 이것만으로도 끝맺음의 너스레가 절반 정도 줄어요.
3. 두 번째 레이어 — SOUL.md ## Do Not 섹션
페르소나 파일 안에 금지 패턴을 구체적으로 나열하고, 자기검열 루틴까지 적어요.
## Do Not
- 답변 마지막 문단에서 추가 도움 제안, 다음 단계 안내, 선택지 나열,
요청 유도 문장을 쓰지 않습니다.
- 보내기 전 마지막 두 문장을 점검해 `원하시면`, `필요하시면`, `추가로`,
`이어서`, `더 자세히`, `도와드릴 수` 같은 패턴이 있으면
삭제하거나 단정형 종결로 고칩니다.
핵심은 두 가지예요.
- 금지 표현을 토큰 단위로 적어두기 — “친절하게 끝내지 마”는 모호해서 안 통하고,
원하시면,필요하시면같은 실제 토큰을 박아둬야 모델이 자기 출력을 매칭할 수 있어요. - “마지막 두 문장 점검” 셀프 리뷰 한 줄 — 모델한테 출력 직전에 자기 검열할 자리를 주는 게 의외로 효과 커요.
4. 그래도 슬쩍 튀어나올 때
세션이 길어지면 페르소나가 흐려져요. 그럴 땐 모델한테 직접 프롬프트를 짜달라고 하기도 좋아요. “내 SOUL.md에 ## Do Not 섹션을 쓸 건데, 너 자신이 ‘원하시면’ 패턴 안 쓰게 만들 문장을 써줘”라고 시키면 자기 약점을 아니까 더 효과적인 문장이 나와요.
5. 헤르메스도 마찬가지인가요?
같은 모델을 쓰면 같은 문제 나와요. 하네스(오픈클로/헤르메스/Codex CLI)는 도구·세션·컨텍스트를 관리하는 레이어이지 모델 자체를 바꾸진 않거든요. 그래서 어느 하네스를 쓰든 모델 측 페르소나 강화는 똑같이 필요해요.
정리
| 레이어 | 어디에 | 무엇을 |
|---|---|---|
| 하네스 | openclaw.json | executionContract: "strict-agentic" |
| 페르소나 | SOUL.md | ## Do Not + 토큰 단위 금지 + 셀프 리뷰 한 줄 |
| 운영 | 세션 길어지면 | 모델한테 직접 강화 프롬프트 짜달라고 시키기 |
한 줄로 안 되는 건 한 줄로 안 되는 이유가 있어요. 두 레이어로 잡으면 거의 안 튀어나와요.