AI가 쓴 가게 소개 문구에 "매일 7시에 문을 열어요"가 들어가도, 제가 만든 검사기는 그냥 통과시킬 뻔했습니다. 그 가게 자료에 있던 7은 영업시간이 아니라 사진 개수였는데 말입니다.
이 글 3줄 요약
- AI가 쓴 문장의 숫자를 '입력 자료에 있는 숫자인가'로만 검사하면, 사진 개수가 영업시간으로 둔갑해도 통과합니다.
- 시각·날짜·가격 모양의 문장은 가게가 직접 쓴 글 안에 같은 모양의 같은 글이 있을 때만 통과하도록 바꿨습니다.
- 근거가 없으면 AI가 숫자를 짐작하지 않고
[영업시간을 넣어 주세요]같은 빈칸을 남기게 했습니다. 사장님 홍보 글에도 그대로 옮겨 쓸 수 있습니다.
무엇을 만들고 있었는지
저는 사장님이 가게 링크를 넣으면 공개된 정보를 읽어 점수를 매겨 주는 무료 가게 진단 웹앱을 만들고 있습니다. 그다음 단계로 붙이던 기능이 웹 리포트였습니다. 진단 결과를 바탕으로 AI가 4주 실행 계획과 항목별 처방을 쓰고, 사장님이 그대로 복사해 쓸 수 있는 복붙 완성본(소개글이나 소식 글 초안)까지 만들어 주는 기능입니다.
복붙 완성본은 손님 눈에 그대로 나갈 글입니다. 그래서 처음부터 사후 검사(AI가 글을 다 쓴 뒤 정해진 규칙으로 한 번 더 걸러 내는 단계)를 넣어 두었습니다. 숫자 규칙은 단순했습니다.
"출력에 나온 숫자가 입력 자료의 숫자 모음 안에 있으면 통과."
AI가 없는 숫자를 지어내면 막히고, 자료에 있는 숫자를 쓰면 통과하는 구조입니다. 저는 이 정도면 충분하다고 생각했습니다. 솔직히 꽤 꼼꼼하게 짰다고 믿고 있었습니다.
검수 AI가 찍어 준 한 장면
계획을 확정하기 전에 다른 AI에게 계획서를 넘겨 반박을 시켰습니다. 만드는 AI와 따로 두고 흠만 찾게 하는 검수 AI(만든 결과물을 독립적으로 점검하는 역할의 AI)입니다. 이 방식은 만드는 AI와 까는 AI를 분리하세요 글에 자세히 적어 두었습니다.
돌아온 지적 가운데 하나가 이 글의 주인공입니다.
입력에 '사진 수 7'이 있으면, 완성본의 "매일 7시에 문을 열어요"도 숫자 검사를 통과합니다.
읽자마자 얼굴이 화끈했습니다. 맞는 말이었거든요. 제 검사기는 7이라는 숫자가 자료 어딘가에 있는지만 봤습니다. 그 7이 무엇을 세던 숫자인지, 어디서 왔는지는 전혀 묻지 않았습니다.
더 아팠던 건 따로 있습니다. 그 가게 입력 자료에는 영업시간 내용 자체가 아예 없었습니다. 없는 영업시간을 AI가 지어냈는데, 하필 사진 개수와 숫자가 겹치면 검사기가 '근거 있음' 도장을 찍어 주는 셈입니다. 손님 화면에 나가기 전 계획 단계에서 잡혔으니 다행이지만, 설계가 틀렸던 건 틀린 겁니다.
왜 이런 구멍이 생겼는지
원인은 숫자를 숫자로만 다룬 데 있었습니다. 사람에게 7은 사진 7장일 수도, 아침 7시일 수도, 메뉴 일곱 가지일 수도 있습니다. 같은 숫자라도 뜻이 다르면 전혀 다른 사실입니다. 그런데 제 규칙은 뜻을 떼어 내고 숫자만 모아 대조했습니다.
AI 쪽에서 보면 더 분명해집니다. AI는 그럴듯한 문장을 완성하려는 성향이 강합니다. 가게 소개글에는 보통 영업시간이 들어가니, 자료에 없어도 빈자리를 메우려고 합니다. 그때 손에 잡히는 숫자가 자료 안에 있으면 그걸 끌어다 쓰기 쉽습니다. 완전히 지어낸 숫자보다 이런 '빌려 온 숫자'가 검사에 더 안 걸립니다.
사장님 일에도 똑같이 생길 수 있는 일입니다. 메뉴 개수를 적어 줬더니 가격처럼 들어가거나, 리뷰 개수가 할인율처럼 들어가는 식입니다. 눈으로 대충 훑으면 숫자가 자료와 맞으니 넘어가기 쉽습니다.
어떻게 고쳤는지
방향은 하나였습니다. '숫자'가 아니라 '사실의 모양'으로 검사하기로 했습니다.
사실 모양을 먼저 정했습니다
완성본에 아래 모양이 나오면 사실 문장으로 봅니다.
- 시각 모양: N시, 오전·오후, 시와 분을 쌍점으로 적은 형태, 요일
- 날짜 모양: N월 N일, N일까지
- 가격·할인 모양: 가격 표기, 할인율
근거는 가게가 직접 쓴 글로만 좁혔습니다
사실 모양의 문장은 같은 모양의 같은 글이 가게가 직접 쓴 글 조각 안에 있어야 통과합니다. 소개글, 메뉴 설명, 소식 제목 같은 것들입니다. 사진 수나 키워드 수처럼 칸에 담긴 숫자는 근거로 치지 않습니다. "7시"라고 쓰려면 가게 글 어딘가에 "7시"가 같은 모양으로 적혀 있어야 한다는 뜻입니다.
근거가 없으면 빈칸으로 남기게 했습니다
AI에게는 근거 없는 사실을 쓰지 말고 정해진 자리표시(나중에 사람이 채울 빈칸 표시)만 쓰라고 지시했습니다. [영업시간을 넣어 주세요], [행사 날짜], [가격] 같은 것들입니다. 자리표시가 남은 완성본 아래에는 "[ ] 칸을 채워 쓰세요"라는 안내를 한 줄 붙였습니다. 틀린 영업시간이 나가느니 빈칸이 나가는 편이 훨씬 낫다고 판단했습니다.
칸마다 검사하고, 걸린 칸만 바꿨습니다
글 전체를 버리지 않습니다. 칸 단위로 검사해서 걸린 칸만 미리 만들어 둔 규칙 문장으로 바꿉니다. 이참에 다른 검사도 같은 자리에 묶었습니다. 바깥 주소·연락처·사람 이름이 끼어드는지, '최고' 같은 최상급 표현이나 경쟁 가게 비교가 있는지, 입력 글을 길게 그대로 베꼈는지, 업종이 확인되지 않은 가게 글에 진료·시술 같은 규제 낱말이 섞였는지를 봅니다.
시험(코드가 의도대로 도는지 자동으로 확인하는 절차)에도 그 장면을 그대로 넣었습니다. 사진 수 7, 영업시간 없음인 자료에서 "매일 7시에 문을 열어요"가 나오면 거절되는지 확인합니다.
못 잡는 것도 적어 두었습니다
이 검사는 시각·날짜·가격 모양만 봅니다. 숫자가 없는 과장이나 틀린 설명은 이 검사의 몫이 아닙니다. 그래서 무엇을 잡고 무엇을 못 잡는지를 문서에 따로 적었습니다. 검사기가 있다는 사실만으로 안심하는 게 제일 위험하다고 느꼈기 때문입니다.
사장님 홍보 글에 바로 옮기는 법
개발까지 하지 않으셔도 같은 원리를 쓸 수 있습니다. ChatGPT나 Claude 같은 채팅 AI로 소개글이나 이벤트 공지를 쓰실 때, 프롬프트(AI에게 주는 지시문) 앞에 아래 문단을 붙여 보세요.
아래 [가게 자료]에 적힌 내용만 사실로 써 주세요.
영업시간·요일·날짜·가격·할인이 자료에 같은 모양으로 적혀 있지 않으면
짐작해서 채우지 말고 아래 빈칸을 그대로 남겨 주세요.
- 영업시간 → [영업시간을 넣어 주세요]
- 날짜 → [행사 날짜]
- 가격 → [가격]
자료에 있는 다른 숫자(사진 개수, 리뷰 개수, 메뉴 개수)를
시간·날짜·가격으로 바꿔 쓰지 마세요.
빈칸이 남았다면 글 맨 끝에 "[ ] 칸을 채워 쓰세요"라고 한 줄 붙여 주세요.
[가게 자료]
여기에 소개글, 메뉴 설명, 공지 글을 그대로 붙여 넣습니다.
글이 나오면 같은 대화창에서 한 번 더 시킵니다.
방금 쓴 글에서 시각·요일·날짜·가격·할인이 들어간 문장을 모두 뽑아 주세요.
문장마다 [가게 자료]의 어느 문장에서 왔는지 그 문장을 그대로 옮겨 적어 주세요.
같은 모양의 글을 자료에서 찾지 못하면 "근거 없음"이라고 표시해 주세요.
사진 개수나 리뷰 개수처럼 다른 것을 세던 숫자는 근거로 치지 마세요.
'근거 없음'이 붙은 줄은 지우거나 빈칸으로 바꾸시면 됩니다. AI에게 팩트인지 추정인지 물어보세요 글의 방법과 함께 쓰시면 한층 든든합니다.
오늘 바로 해 볼 것
- AI로 써 둔 홍보 글 하나를 꺼내 숫자마다 동그라미를 칩니다.
- 동그라미 옆에 '무엇의 숫자인지'와 '어디서 왔는지'를 적어 봅니다. 둘 중 하나라도 비면 의심 대상입니다.
- 근거 자료를 소개글·메뉴판·공지 글처럼 사장님이 직접 쓴 글로 좁힙니다.
- 위 빈칸 프롬프트를 메모장이나 AI의 저장 기능에 넣어 두고 매번 붙여 씁니다.
- 이미 자동화를 돌리고 계시다면 검사 규칙이 '숫자가 자료에 있나'인지 '같은 모양의 같은 글이 있나'인지 확인해 봅니다.
현장 인사이트
숫자가 자료에 있다는 것과 그 문장이 사실이라는 것은 다른 이야기입니다. 대조할 땐 그 숫자가 무엇을 세던 숫자인지까지 함께 맞춰야 합니다.
AI에게 글을 맡기는 일 자체는 이제 어렵지 않습니다. 정작 손이 가는 건 손님 앞에 나가기 전에 한 번 거르는 장치입니다. 우리 가게 자료에 맞는 검사 규칙이나 빈칸 프롬프트를 같이 짜 보고 싶으시면 편하게 말씀 주세요.