프롬프트로 부탁하면 결국 우회된다, 물리적으로 막아야 한다

26년 07월 26일

프롬프트는 부탁이다

이날은 “프롬프트로 부탁하면 결국 우회된다”는 교훈을 정리한 날이다.

에이전트에게 프롬프트로 행동을 지시했다.

근데 프롬프트는 부탁이지 강제가 아니다.

물리적으로 막아야 한다.

그리고 무해해 보이는 리팩터가 안전장치를 무력화한 것도 발견했다.

에이전트가 작업을 시작하기 전에 보고를 하도록 프롬프트에 적었다.

“모든 작업 전에 작업 시작 보고를 호출해라.” 근데 에이전트가 보고 없이 도구를 호출했다.

프롬프트에 적었는데도 무시했다.

왜 우회되는가

프롬프트는 “경향”을 만든다.

“보통은 보고한다.” 근데 “항상 보고한다”가 아니다.

상황에 따라 에이전트가 “이번에는 안 해도 되겠다”라고 판단한다.

프롬프트는 부탁이다.

강제가 아니다.

부탁은 거절될 수 있다.

하드 게이트로 전환했다

해결은 물리적으로 막는 거였다.

도구 호출 훅에서 보고 전에 모든 도구를 차단한다.

보고를 해야만 도구가 풀린다.

우회가 불가능하다.

프롬프트로 “부탁”하는 게 아니라, 시스템으로 “강제”한다.

에이전트가 판단할 여지를 없앤다.

“이번에는 안 해도 되겠다”라는 판단 자체가 불가능하다.

소프트 강제가 실패하는 순간

소프트 강제(프롬프트)가 실패하는 건 “에이전트가 말을 안 듣는” 게 아니다.

프롬프트의 본질이 확률적이기 때문이다.

100번 중 95번은 듣지만 5번은 안 듣는다.

그 5번이 문제다.

하드 게이트는 100번 중 100번 강제한다.

우회가 불가능하다.

강제가 필요한 규칙은 프롬프트가 아니라 시스템으로 구현해야 한다.

번역이 에이전트 출력을 죽였다

한국어가 아닌 출력(일본어/중국어)을 감지해서 한국어로 번역하는 가드가 있었다.

근데 번역이 비동기라서 문제가 생겼다.

번역 중에 다른 메시지가 들어오면, 번역 완료를 기다리는 동안 에이전트 출력이 중단됐다.

최대 10초 동안 에이전트가 멈췄다.

번역을 폐지했다

해결은 번역 자체를 폐지하는 거였다.

번역 대신 “잘라내기”를 한다.

한자가 감지되면, 그 부분을 잘라내고 꼬리를 다시 생성한다.

번역이 없으니까 기다림도 없다.

동기 처리로 즉시 잘라낸다.

비동기 번역이 에이전트 출력을 죽였다.

동기 잘라내기가 해결이었다.

“고쳐서 쓴다”가 아니라 “잘라내고 다시 쓴다”로 전환한 거다.

중복 제거가 3개의 안전장치를 무력화했다

단일 커밋이 “프롬프트 중복 제거”를 수행했다.

무해해 보이는 리팩터였다.

근데 이 커밋이 3개의 안전장치를 동시에 약화했다.

구체가 추상을 잡아먹었다

기존에는 “codebase_search를 먼저 써라”, “단일 파일 수정은 위임하지 마라”, “지시를 정확히 따라라”라는 구체적인 금지문이 있었다.

이건 명확했다.

중복 제거 리팩터가 이 구체적인 금지문을 추상 원칙으로 바꿨다.

“적절한 도구를 사용하라”같은 추상. 추상은 해석의 여지가 있다.

“적절한”이 뭔지 에이전트가 판단한다.

구체적 금지가 사라지니까, 에이전트가 금지를 우회한다.

단순화의 역설

“중복을 제거하면 좋아진다”고 생각한다.

근데 중복이 사실은 구체적 강제였다면, 제거하면 강제가 사라진다.

“중복”과 “강제”를 구분해야 한다.

같은 말이 반복되는 건 중복이지만, 구체적 금지가 여러 곳에 적히는 건 강제다.

강제를 제거하면 안전장치가 무력화된다.

독립 검증이 없으면 자기 보고서의 오류를 못 잡는다

29개 확장의 공통 유틸리티를 전수 조사했다.

조사 에이전트가 보고서를 제출했다.

“텍스트 결과 함수가 5곳에 중복이다.” 근데 독립 검증 에이전트가 3가지 오류를 잡았다.

텍스트 결과 함수 5곳은 통합이 불가능했다.

타입이 달랐다.

“5곳 중복”이 아니라 “5가지 다른 타입”이었다.

그리고 일부 집계가 과대평가되었고 누락된 항목도 있었다.

자기 검증의 한계

조사 에이전트가 자기 보고서를 검증하면, 자기 오류를 잡기 어렵다.

자기가 쓴 걸 다시 읽으면, “내가 쓴 거니까 맞겠지”라고 생각한다.

독립 검증이 필요하다.

다른 에이전트가, 다른 관점에서, 같은 데이터를 검증해야 한다.

독립 검증이 3가지 오류를 잡았다.

자기 검증은 0개를 잡았다.

마무리

이날의 핵심은 “강제와 부탁을 구분하라”였다.

강제가 필요한 규칙은 프롬프트가 아니라 시스템으로 구현해야 한다.

프롬프트는 부탁이다.

우회된다.

하드 게이트는 강제다.

우회가 불가능하다.

그리고 단순화도 같다.

“중복을 제거하면 좋아진다”는 단순화가, 사실은 구체적 강제를 제거하는 거면, 안전장치가 무력화된다.

중복과 강제를 구분해야 한다.

독립 검증도 같다.

자기 검증은 자기 오류를 못 잡는다.

독립 검증이 필요하다.

“내가 확인했다”가 아니라 “다른 사람이 확인했다”여야 한다.

부탁과 강제를 구분하고 중복과 강제를 구분하고 자기 검증과 독립 검증을 구분해라.