LLM으로 무언가를 자동 생성하는 시스템을 운영해 보면, 코드보다 프롬프트를 훨씬 자주 고치게 됩니다. 톤이 살짝 아쉬워서, SEO 규칙이 바뀌어서, 특정 표현이 자꾸 튀어나와서. 이 잦은 수정을 코드 배포로 처리하면 개발자가 병목이 됩니다. 콘텐츠 자동화 파이프라인을 만들며 프롬프트를 아예 데이터로 빼 데이터베이스에서 관리하도록 설계한 이유와 방법을 정리합니다.
코드에 박힌 프롬프트의 문제
처음에는 다섯 단계의 프롬프트를 각 단계 코드 안에 문자열로 두었습니다. 편했지만 오래가지 못했습니다. 초안 톤을 조금 부드럽게 바꾸고 싶어도 코드를 고치고 테스트하고 배포해야 했습니다. 마케터가 "이 표현만 빼 주세요"라고 요청하면 그 한 줄을 위해 배포 파이프라인이 돌았습니다.
더 큰 문제는 실험이 무서워진다는 점이었습니다. 프롬프트를 바꿔 보고 결과가 나쁘면 되돌려야 하는데, 코드 안에 있으면 되돌리는 것도 배포입니다. 안전하게 되돌릴 방법이 없으니 시도 자체를 꺼리게 됐습니다. 프롬프트는 자주 바뀌는 데이터인데 자주 안 바뀌는 코드처럼 다루고 있었습니다.
프롬프트를 데이터로 옮기다
그래서 프롬프트를 데이터베이스 테이블로 뺐습니다. 각 프롬프트 레코드는 시스템 프롬프트와 사용자 템플릿, 온도, 최대 토큰 같은 실행 설정을 함께 담고 있습니다. 파이프라인의 각 단계는 실행할 때 자기에게 맞는 프롬프트를 DB에서 찾아 불러옵니다.
찾는 기준은 하나가 아닙니다. 같은 초안 작성이라도 한국어냐 영어냐, 어느 발행 채널이냐, 뉴스형이냐 정보형이냐에 따라 프롬프트가 달라야 합니다. 그래서 스테이지, 언어, 플랫폼, 콘텐츠 유형의 조합으로 활성화된 프롬프트를 찾도록 했습니다. 플랫폼이나 유형이 지정되지 않은 공통 프롬프트도 둘 수 있어 채널을 안 가리는 토픽 선정 같은 단계는 공통 프롬프트 하나로 처리됩니다.
템플릿 변수로 데이터를 끼워 넣는다
프롬프트를 데이터로 두니 실행할 때마다 달라지는 값을 어떻게 넣을지가 문제였습니다. 수집한 기사 목록, 선정된 토픽, 앞 단계가 만든 초안 같은 것들 말입니다. 프롬프트 본문에 중괄호로 감싼 자리표시자를 두고 실행 시점에 실제 값으로 치환하는 간단한 템플릿 방식을 썼습니다.
치환기는 자리표시자를 찾아 대응하는 값으로 바꾸되, 값이 없는 자리표시자는 건드리지 않고 그대로 둡니다. 이렇게 관대하게 처리하면 프롬프트에 오타가 하나 있어도 전체가 터지지 않고 어떤 자리가 안 채워졌는지 결과에서 바로 보입니다. 프롬프트 작성자는 코드를 몰라도 "여기에 소스가 들어간다"는 자리표시자 규칙만 알면 됩니다.
버전과 롤백을 남긴다
데이터로 옮긴 진짜 이득은 버전 관리에 있습니다. 각 프롬프트에는 버전 번호가 붙고 새로 고칠 때 이전 버전을 지우지 않고 남깁니다. 어느 버전을 활성화할지는 플래그로 정하므로, 새 프롬프트가 마음에 안 들면 활성 버전을 이전으로 되돌리기만 하면 됩니다. 롤백이 배포가 아니라 플래그 전환이 됐습니다.
이 안전망이 생기니 실험이 편해졌습니다. 프롬프트를 과감하게 바꿔 며칠 돌려 보고 결과가 좋으면 두고 나쁘면 이전 버전으로 즉시 복귀합니다. 프롬프트를 코드에서 데이터로 옮긴 한 번의 결정이 운영의 성격을 바꿨습니다.
파이프라인 전체와의 연결
이 프롬프트 관리는 다섯 단계 파이프라인 위에서 동작합니다. 단계를 왜 다섯으로 나눴는지는 AI 콘텐츠 생성 5단계 파이프라인 설계에, 그 프롬프트가 조직 고유의 문체를 어떻게 흉내 내면서도 개인정보는 지우는지는 레퍼런스 문체 학습과 개인정보 누출 방지에 이어집니다. 시스템 전체 그림은 AI SEO 콘텐츠 생성·발행 자동화 사례에 있습니다.
자주 묻는 질문
프롬프트를 DB에 두면 무엇이 좋아지나요?
문구 수정이 코드 배포가 아니라 데이터 편집이 됩니다. 마케터의 요청 한 줄을 배포 없이 반영하고 버전을 남겨 두어 마음에 안 드는 변경은 이전 버전으로 즉시 되돌릴 수 있습니다. 프롬프트라는 자주 바뀌는 대상을 그 성격에 맞게 다루는 방법입니다.
같은 단계인데 프롬프트가 여러 개일 수 있나요?
네. 같은 초안 작성이라도 언어와 발행 채널, 콘텐츠 유형에 따라 다른 프롬프트가 필요합니다. 스테이지와 언어, 플랫폼, 유형의 조합으로 활성 프롬프트를 찾으므로 상황별로 다른 프롬프트를 두고 채널을 안 가리는 단계는 공통 프롬프트 하나로 처리할 수 있습니다.
실행할 때마다 달라지는 값은 어떻게 넣나요?
프롬프트 본문에 중괄호 자리표시자를 두고 실행 시점에 실제 값으로 치환합니다. 값이 없는 자리표시자는 그대로 남겨 두는 관대한 방식이라, 자리 하나가 비어도 전체가 실패하지 않고 어디가 안 채워졌는지 결과에서 드러납니다.