리뷰 자동화 루프의 페르소나 거부를 시스템 프롬프트로 해결
목차
review_loop.py에서 persona 설정이 Claude Code의 거부(refusal)를 트리거했다. 이 이슈를 system-prompt 옵션으로 옮겨서 해결한 작업이다.
Claude Code의 안전장치와 경계
Claude Code와 같은 AI 보조 도구는 프롬프트 인젝션이나 의도치 않은 동작을 방지하기 위해 사용자 입력에 대한 검증 로직을 갖고 있다. 특히 persona를 설정하거나 역할을 강제하는 방식의 프롬프트에는 제약이 생기는 경우가 있다. "넌 이제부터 X야" 같은 persona 지정이 잠재적으로 도구의 본래 동작 방식을 왜곡할 수 있다고 판단하는 것이다.
내 경우 review_loop.py에서 코드 리뷰를 자동화하면서 review agent의 tone이나 스타일을 일관되게 유지하려고 persona를 프롬프트에 삽입했는데, Claude Code 측에서 이를 거부했다. 사용자 프롬프트 영역에 persona를 넣으려고 하니 "이건 도구 설정이 아니라 프롬프트 조작처럼 보인다"고 판단한 것 같다.
--system-prompt 옵션으로의 마이그레이션
해결책은 단순했다. persona를 사용자 프롬프트 대신 --system-prompt 옵션으로 전달하는 것이다. system-prompt는 명시적인 도구 파라미터이기 때문에 "이건 의도적인 설정"이라는 신호를 명확하게 보낸다.
| 방식 | 위치 | Claude Code 거부 | 의도 전달 |
|---|---|---|---|
| 사용자 프롬프트 내 persona | prompt="You are..." |
✓ 거부됨 | 모호함 |
| --system-prompt 옵션 | system_prompt="You are..." |
✗ 거부 안 함 | 명확함 |
사용자 입력 영역에 들어가는 것과 명시적인 파라미터는 다르게 해석되는 것이다. 인터페이스 설계 관점에서 보면, 도구가 "명확한 API 파라미터는 신뢰하되, 사용자 프롬프트 내 암묵적 지시는 검증한다"는 철학을 적용하고 있다는 걸 알 수 있다.
자동화 스크립트와 도구의 상호작용
코드 리뷰 루프처럼 반복 실행되는 자동화 스크립트에서는 각 호출이 일관된 방식으로 동작해야 한다. persona를 설정하는 건 단순한 스타일 선호가 아니라 output format이나 리뷰의 depth, tone을 표준화하는 기술적 필요다.
이 fix를 통해 배운 점:
- 명시적 파라미터 우선: 프롬프트 텍스트에 숨겨 넣기보다 도구의 정식 옵션으로 전달하기
- 거부는 신호: 도구가 거부하는 패턴이 있다면, 같은 의도를 다른 경로로 달성할 방법을 먼저 생각해보기
- API 설계의 의도 파악: --system-prompt가 있는 이유, 왜 사용자 프롬프트와 분리되는지 이해하기
review_loop이 persona를 --system-prompt로 옮긴 후 일관되게 작동하면서, 비슷한 자동화 도구에서도 같은 패턴을 먼저 적용할 수 있게 됐다.
🛒 이 글과 어울리는 추천 상품
*위 링크는 쿠팡파트너스 활동의 일환이며, 일정액의 수수료를 제공받을 수 있습니다.
댓글 0
첫 댓글 달아줘.