C.W.K.
Stream
Lesson 07 of 10 · published

프롬프트는 string이 아니라 versioned code야

~18 min · foundations, version-control, engineering

Level 0수련생
0 XP0/100 lessons0/14 achievements
0/120 XP to next level120 XP to go0% complete

프롬프트가 TextField에 있으면 너의 게 아니야

프롬프트는 소프트웨어야. input, output, regression, dependency (모델 버전, schema 버전), lifecycle 다 있어. database row나 Notion 페이지에 있는 configuration string으로 다루거나 — 더 나쁘게 — 코드 안 inline literal로 두면 가장 기본적인 엔지니어링 hygiene을 못 해. diff, review, rollback 다 없어져.

최소 versioning 모양

  • 프롬프트는 source control (git)에, 자기 파일에, diff 가능한 확장자 (.md, .prompt)로.
  • 각 프롬프트는 파일명이나 frontmatter에 version 박혀 있어 (v3.md, summarize@5.prompt).
  • 각 프롬프트는 어느 모델에 맞춰 튜닝됐는지 명시 — 코드랑 언어 버전처럼 coupled야.
  • 각 프롬프트는 sibling eval suite가 있어서 merge gate.
  • production은 versioned key로 프롬프트 read하지, UI string으로 안 read해.

이게 보이는 것보다 훨씬 중요한 이유

versioning 없는 프롬프트 변경은 invisible해. 지원 티켓이 "AI가 점점 나빠진다"고 비난하는데 진짜 원인은 이틀 전 누군가의 tweak이고 — 아무도 못 찾아. versioning이 prompt engineering을 engineering으로 만드는 거야.

Code

frontmatter 박힌 prompt 파일·markdown
---
id: support.draft_reply
version: 7
model: claude-opus-4-7
input_schema: schemas/support_input.json
output_schema: schemas/support_output.json
last_eval_pass: 2026-04-30
owner: customer-experience
---

You are a support agent...

{{user_message}}
런타임에 versioned prompt 로드·python
from pathlib import Path
import frontmatter

def load_prompt(name: str, version: int):
    path = Path(f"prompts/{name}/v{version}.md")
    fm = frontmatter.load(path)
    return fm.content, fm.metadata

body, meta = load_prompt("support.draft_reply", 7)
assert meta["model"] == os.environ["PROMPT_MODEL"]

External links

Exercise

코드베이스에서 string literal로 박힌 프롬프트 하나 찾아. frontmatter (id, version, model) 있는 versioned 파일로 이동. version key로 런타임에 로드.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고
💛 by 피파warm

댓글 4

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.
  1. J
    JJ파파

    감사합니다. 요즘 모델은 동적으로 자원을 조절하는 부분이 있어서 더욱 어려운 부분이 있을 것 같네요. ^^

    💛 by 피파warm💛 by 똘이warm
    1. 피파
      피파· warmJJJ파파

      JJ파파님, 정확한 catch이세요. 같은 모델 이름이라도 inference-time에 자원/추론량이 흔들려서 version key 만으로는 stability 못 잡아요. 그래서 evaluation track이 짝꿍처럼 따라오는 거예요 — golden set + regression test가 흔들리는 자리를 잡아주거든요.

      ~ 피파

      💛 by 똘이warm
  2. Happycurio3
    Happycurio3

    프롬프트를 단순 문자열(String)이 아니라 버전이 지정된 코드(Versioned Code)로 다룬다는 것은, 코드를 수정하고 골든셋으로 검증(Eval)하며 배포하는 일반 소프트웨어 개발의 엄격한 규칙(Software Engineering Discipline)을 프롬프트에도 그대로 적용하여 인간의 실수를 원천 차단한다. 추적 가능성 프롬프트 문구가 v6에서 v7로 변경될 때 Git을 통해 어떤 단어가 수정되었는지 정확히 비교(Diff)할 수 있습니다. 실수 원천 차단 환경 변수에 정의된 AI 모델(PROMPT_MODEL)과 프롬프트 파일에 명시된 타겟 모델이 다를 경우, 코드 실행 단계에서 assert 에러를 발생시켜 잘못된 모델 호출로 인한 서비스 장애를 사전에 방어한다. 모델과 프롬프트의 매칭을 검증하는 것은 프롬프트는 텍스트가 아니라, 특정 하드웨어(AI 모델)에 종속된 바이너리 코드와 같다는 것이다. 검증을 통해 시스템은 아키텍처 관점에서의 완전한 예측 가능성(Predictability)을 확보하게 된다.

    💛 by 피파warm
    1. 피파
      피파· warmHappycurio3Happycurio3

      Happycurio3님, 핵심을 아주 잘 잡으셨어요. 특히 “프롬프트와 모델은 결합된 dependency”라는 점을 짚은 게 좋아요 — 그래서 versioning이 단순 기록이 아니라 배포 안정성 장치가 되는 거거든요. 한 가지만 더 보태면, 완전한 예측 가능성보다는 “변경 원인을 추적하고 회귀를 빨리 잡는 구조”라고 표현하면 LLM 특유의 확률성까지 더 정확하게 품을 수 있어요.

      ~ 피파