시스템 프롬프트에 사실을 넣었는데 챗봇이 무시한 이유
판매 완료 정보를 프롬프트에 넣어도 챗봇은 계속 구매를 안내했다. 범인은 다른 줄의 지시문이었다.
전시장에서 QR을 찍으면 그 작품 이야기를 들려주는 챗봇을 만들고 있다.
대표님이 짚었다. "판매 완료된 작품인데 챗봇이 구매를 안내하더라."
확인해보니 챗봇은 판매 여부를 아예 모르고 있었다. 팔린 작품도 벽에 라벨이 그대로 붙어 있어서 관람객이 찍고 들어온다. 그런데 챗봇은 그걸 모른 채 "가격은 문의 버튼으로 문의하세요" 라고 답했다. 갤러리가 같은 답을 또 하게 된다.
그래서 판매 상태를 프롬프트에 넣었다. 작품 정보 블록에 한 줄 추가했다.
판매 상태: 판매 완료 (더 이상 구매할 수 없음)
배포하고 눌러봤다. 똑같았다. 여전히 "가격은 별도 문의 사항입니다" 라고 답했다.
경로는 다 맞았다
처음엔 배포가 안 됐거나 값이 안 실려 간 줄 알았다. 경로를 하나씩 따라갔다. DB 조회 ✅, 화면 ✅, API ✅, 프롬프트 조립 ✅. 다 맞았다.
그러다 시스템 프롬프트의 다른 줄을 봤다.
가격·구매 문의는 화면 아래 문의 버튼으로 갤러리에게 직접 문의할 수 있다고 안내하세요.
이 줄이 판매 여부와 무관하게 무조건 그 행동을 시키고 있었다.
사실은 컨텍스트에 있었다. 그런데 「무엇을 하라」는 지시가 그 사실을 덮었다. 모델 입장에서는 "판매 완료라는 정보가 있네. 그런데 가격 질문에는 문의 버튼을 안내하라고 했으니 그렇게 하자" 가 된 것이다.
사실을 주는 것과, 그 사실로 무엇을 하라고 시키는 것은 다른 일이다. 자료가 부족한 게 아니라 지시가 충돌하고 있었다.
고치면서 더 나쁜 사고를 냈다
지시문 자체를 조건부로 갈랐다. 팔린 작품이면 아예 다른 지시가 나가게 했다.
그런데 새 지시를 이렇게 썼다.
🔴 이 작품은 이미 판매되었습니다. 가격·구매 질문에는 반드시 먼저 …라고 알리세요.
챗봇이 그 줄을 통째로 관람객에게 출력했다. 🔴 이모지까지 그대로.
원인은 내가 지시를 완성된 평서문으로 시작한 것이다. 모델이 그걸 「전할 말」로 읽었다. 그 프롬프트의 다른 줄들은 전부 "…라고 안내하세요" 한 가지 형태였는데, 내가 거기서 벗어난 게 시작이었다. 사람 눈에 잘 보이라고 넣은 🔴 과 ** 도 모델에게는 그냥 글자였다.
남긴 기준
그 사실이 바뀌면 「무엇을 하라」도 바뀌어야 하나. 바뀌어야 하면 사실만 넣지 말고 지시문을 갈라라.
지시는 「무엇을 하라」로만 써라. 완성된 문장으로 시작하면 그대로 복사돼서 나간다.
두 사고 다 사람이 눌러보고 잡았다. 코드로는 계속 맞아 보였다.