2026년 11월 13일 금요일

프롬프트로 부탁하는 것과 출력을 검사하는 것은 다른 층이다 — LLM 가드레일 3층

LLM 에게 "이건 하지 마"라고 프롬프트에 적으면 대부분 지킨다. 문제는 "대부분"이다. 매일 자동으로 도는 기능에서 백 번에 한 번은 매주 한 번이다. 몇 가지 기능을 운영하면서, 지켜져야 하는 규칙은 프롬프트 한 곳에만 두지 않고 세 층으로 나눠 두게 됐다.

1층: 모델에게 주지 않는다

가장 확실한 방법은 새어 나가면 안 되는 정보를 애초에 프롬프트에 넣지 않는 것이다.

  • 개인 자산을 요약해 주는 기능에서 금액과 수량은 모델에게 보내지 않는다. 등락률 같은 비율만 보낸다. 모델은 모르는 것을 말할 수 없다.
  • 외부에 내보내는 응답은 "뺄 것"을 고르지 않고 "넣을 것"을 고른다. 내보낼 필드를 명시한 허용 목록으로 만들면, 나중에 내부 데이터에 민감한 필드가 추가돼도 자동으로 따라 나가지 않는다.

2층: 프롬프트로 요청한다

말투, 형식, 다루는 범위는 프롬프트의 영역이다. 여기서 배운 것들:

  • 중요한 지시는 맨 앞에. 추론을 꺼 둔 가벼운 모델은 긴 프롬프트의 뒤쪽 지시를 자주 흘렸다. 절대 어기면 안 되는 조건은 첫 문단에 둔다.
  • 이유와 상황을 준다. "내일은 쉬는 날이다"라는 사실을 데이터로 넘기는 것만으로는 부족했고, "그러니 출근 이야기를 하지 말 것"까지 써야 했다.
  • 지시문과 본문이 섞이는 경로를 조심한다. 음성 합성 모델에 "차분하게 읽어 줘"라는 지시를 본문 앞에 붙였더니 가끔 그 지시문까지 소리 내어 읽었다. 지시와 내용을 분리해 받을 수 없는 모델이라면 지시를 빼는 편이 낫다.

3층: 출력을 검사한다

프롬프트를 아무리 다듬어도 새는 것은 코드로 잡는다. 검사는 모델의 "의도"가 아니라 "결과물"을 본다는 점에서 2층과 성격이 다르다.

  • 형식 검증 후 재요청. 정해진 구조(예: 네 글자 한자와 뜻풀이)로 받아야 하는 출력은 코드로 형식을 확인하고, 틀리면 한 번 더 요청한다.
  • 금지 패턴이 든 문장만 고쳐 쓰기. 쉬는 날 전날의 브리핑 원고에 "내일 … 출근"이 있으면 그 문장만 가벼운 모델에게 다시 쓰게 한다. 전체를 다시 만드는 것보다 싸고, 다시 만든 원고가 또 틀릴 위험도 없다. 이 검사를 넣기 전에는 프롬프트를 두 번 고쳐도 새어 나왔고, 넣은 뒤로는 실측에서 위반이 없었다.
  • 문장 단위 삭제. 요약문에 손익이나 평균 단가를 언급한 문장이 있으면 그 문장을 통째로 지운 뒤 내보낸다. 1층에서 숫자를 주지 않았더라도 모델이 다른 단서로 추정해 쓰는 경우를 막는 마지막 그물이다.
  • 검사 자체를 테스트한다. 금지 값이 든 예문은 반드시 걸리고 정상 예문은 통과하는지를 자동 테스트로 묶어 둔다. 검사기가 조용히 고장 나면 세 층이 모두 뚫린다.

어느 층에 무엇을 둘까

  • 새어 나가면 되돌릴 수 없는 것(개인정보, 금액, 비밀 값) → 1층과 3층 양쪽에.
  • 틀리면 민망하지만 고칠 수 있는 것(말투, 길이, 순서) → 2층이면 충분.
  • 틀리면 기능이 깨지는 것(형식, 필수 항목) → 2층에 적고 3층에서 확인.

정리

프롬프트는 부탁이고, 검사는 보장이다. 부탁으로 충분한 일이 대부분이지만, 자동으로 돌아가며 사람이 매번 보지 않는 출력이라면 "이건 절대 안 된다"에 해당하는 규칙만큼은 코드로 한 번 더 걸러야 마음이 놓인다.

댓글 없음:

댓글 쓰기

반도체 주식을 보기 전에 그려 두는 지도 — 설계, 파운드리, 메모리, 장비, 소재, 후공정

"반도체주"라고 한 묶음으로 부르지만, 그 안의 회사들은 하는 일도 돈 버는 방식도 전혀 다르다. 같은 뉴스에 어떤 회사는 오르고 어떤 회사는 내리는 이유가 여기에 있다. 종목을 들여다보기 전에 머릿속에 그려 두면 좋은 지도를 정리한...