직접 해 본 결과만 적습니다 · 확인하지 못한 것은 그렇게 표시합니다
써 AI 마케팅 적용기 시중에 나온 AI 방법을 실무에 넣어 보고, 쓸만한지 남깁니다
콘텐츠 만들기

프롬프트로 부탁하는 것은 강제가 아닙니다 — AI자동화에서 규칙을 지키게 하는 법

계속 쓴다2026-08-10·읽기 5분·글 써봄

프롬프트에 "반드시" 를 몇 번이나 넣었는데도 지시를 어긴 결과가 나왔습니다. 대부분은 지키는데, 어쩌다 한 번 안 지킵니다.

AI자동화에서는 그 "어쩌다 한 번" 이 문제입니다. 사람이 매번 보는 구조가 아니라면 그대로 나갑니다.

1. 지켜야 하는 규칙과 있으면 좋은 것을 나눕니다 2. 지켜야 하는 것은 생성 뒤에 검사합니다 3. 검사에 실패하면 막습니다 4. 검사를 못 하면 통과시키지 않습니다

프롬프트 증상 — 지시를 어긴 결과가 나옵니다

증상 — 프롬프트에 분명히 적었는데 결과가 다릅니다.

프롬프트 지시와 실제 결과가 어긋난 예를 정리한 터미널 화면

지시 결과
"500자 이내로" 812자
"표를 넣지 말 것" 표 2개
"자료에 없는 수치는 쓰지 말 것" 없는 수치 3개

원인 — 프롬프트는 부탁입니다. 모델이 그 방향으로 가도록 유도하는 것이지, 못 하게 막는 장치가 아닙니다.

강하게 쓰면 확률이 올라갑니다. 대문자로 쓰고, 반복하고, "절대" 를 붙이면 더 잘 지킵니다. 다만 0이 되지는 않습니다.

저는 이걸 인정하는 데 시간이 걸렸습니다. 안 지켜지면 프롬프트를 더 강하게 고쳤습니다. 그러다 어느 순간 프롬프트가 규칙 목록처럼 길어져 있었습니다. 길어질수록 앞부분이 흐려지는 느낌도 있었습니다.

해결 — AI자동화는 생성 뒤에 검사한다

해결 — 반드시 지켜야 하는 것은 나온 결과를 검사해서 판정합니다.

생성 뒤 검사해서 통과 여부를 가르는 구조를 정리한 터미널 화면

text = generate(prompt)

# 프롬프트에 적었더라도, 나온 것을 다시 확인한다
if len(text) > MAX_CHARS:
    raise BlockedError(f"분량 초과: {len(text)}자")
if banned := find_banned(text):
    raise BlockedError(f"금지 표현: {banned}")
if missing := unverified_numbers(text, sources):
    raise BlockedError(f"근거 없는 수치: {missing}")

프롬프트에 적는 것을 그만두라는 뜻이 아닙니다. 적으면 통과율이 올라갑니다. 다만 그걸 믿고 끝내면 안 됩니다.

역할
프롬프트 통과율을 올립니다
검사 통과 여부를 정합니다

어떤 규칙을 검사로 옮길 것인가

전부 검사로 만들 수는 없습니다. 기준이 필요합니다.

규칙을 사고·품질·취향 세 갈래로 나눈 기준을 정리한 터미널 화면

구분 예 다루는 법
어기면 사고 법 위반 표현, 없는 수치, 개인정보 검사로 막습니다
어기면 품질 저하 분량, 소제목 수, 형식 검사로 점수를 매깁니다
취향 어투, 표현 선택 프롬프트로 충분합니다

첫 줄만 확실히 하면 됩니다. 나머지는 프롬프트로 유도하고 점수로 관리해도 괜찮습니다.

저는 처음에 전부 막으려다가 통과하는 글이 거의 없어졌습니다. 분량이 열 글자 넘었다고 막고, 소제목이 하나 모자란다고 막았습니다. 그때 이 구분을 만들었습니다.

품질 쪽은 막는 대신 점수를 매겨서 기준선을 넘으면 통과시킵니다. 항목 하나가 부족해도 다른 데서 채우면 넘어갑니다. 저는 이렇게 바꾸고 나서야 자동 발행이 실제로 돌기 시작했습니다.

검사를 못 하면 어떻게 하나

여기가 중요합니다. 검사기 자체가 실패할 때 어떻게 할지 정해 둬야 합니다.

try:
    result = check(text)
except Exception as e:
    # 검사를 못 했다 = 안전한지 모른다
    raise BlockedError(f"검사 실패로 차단: {e}")     # 통과시키지 않는다

"검사 못 했으니 일단 통과" 는 검사가 없는 것과 같습니다. 검사기가 죽은 날 전부 그냥 나갑니다.

저는 이 부분을 반대로 만들어 뒀던 적이 있습니다. 검사가 실패하면 넘어가게 해뒀는데, 그러면 검사기가 조용히 죽은 동안 아무것도 안 걸러집니다. 막는 쪽이 기본값이어야 합니다.

주의할 점은 이렇게 두면 검사기가 고장났을 때 아무것도 안 나간다는 것입니다. 그래서 며칠 연속 0건이면 알림이 오게 같이 붙여 뒀습니다.

강제해도 우회로가 생깁니다

대안으로 검사를 붙였다고 끝이 아니었습니다. 저는 검사를 붙인 뒤에도 그 검사를 지나지 않는 경로가 여럿 있는 걸 나중에 발견했습니다.

  • 다른 함수에서 직접 발행하는 경로
  • 재시도 로직이 검사를 건너뛰는 경우
  • 강제 옵션이 검사까지 같이 열어 버리는 경우

규칙을 만들었으면 그 규칙을 지나지 않는 길이 있는지 를 따로 확인해야 합니다. 문서에 "차단됨" 이라고 적혀 있어도 코드가 다를 수 있습니다.

확인 못 한 것

프롬프트를 얼마나 강하게 쓰면 위반율이 어디까지 떨어지는지는 재보지 않았습니다. 체감으로는 줄었는데 숫자로 확인하진 않았습니다.

같은 지시를 여러 번 돌려서 위반 비율을 세면 될 것 같은데, 어차피 검사로 막을 것이라 굳이 안 했습니다. 프롬프트를 얼마나 다듬어야 충분한지는 아직 모르겠습니다.

판정 — 계속 쓴다

검사로 옮기는 것은 값어치가 큽니다. 프롬프트를 아무리 다듬어도 확률이지만, 검사는 판정입니다.

프롬프트도 계속 씁니다. 통과율이 오르면 재생성이 줄고 그만큼 비용과 시간이 줍니다. 둘은 대체 관계가 아닙니다.

검사 실패를 통과로 처리하지 않는 것이 이 글에서 제일 중요합니다. 이게 반대로 돼 있으면 검사기가 있어도 없는 것과 같습니다.

직접 하실 분께

하나. "반드시" 를 프롬프트에 적었으면, 그것이 지켜졌는지 검사하는 코드도 같이 만드세요.

둘. 규칙을 어기면 사고 / 품질 저하 / 취향 으로 나눕니다. 전부 막으면 아무것도 안 나갑니다.

셋. 검사가 실패하면 막습니다. 통과시키면 검사가 없는 것과 같습니다.

넷. 검사를 붙인 뒤 그 검사를 지나지 않는 경로가 있는지 확인합니다. 대개 있습니다.

다음에는 검사를 우회하는 경로를 코드에서 자동으로 찾아내는 방법을 만들어보려고 합니다. 되면 이어서 적겠습니다.