프롬프트 템플릿은 빈칸이 있는 프롬프트입니다. 고정된 텍스트에는 한 종류의 작업에서 좋은 답을 얻기 위해 배운 모든 것, 즉 역할, 형식, 제약이 담깁니다. 빈칸에는 매번 바뀌는 것, 즉 주제, 언어, 작업할 텍스트가 들어갑니다. 빈칸 세 개를 채우는 것이 프롬프트를 새로 쓰는 것보다 빠르고, 품질과 모양이 일정한 답을 얻을 수 있습니다.
아래 템플릿은 어떤 프로그래밍 개념이든 여러분의 수준에 맞춰 설명합니다. 입력칸에 원하는 값을 넣고, 요소를 하나씩 꺼서 각각이 무엇을 더하는지 확인한 다음, 복사하거나 채팅 앱에서 열어 보세요.
핵심 개념: 클로저는 바깥 함수의 실행이 끝난 뒤에도, 자신이 만들어진 곳의 변수를 기억하는 함수입니다.
예시:
function makeCounter() {
let count = 0;
return function () {
count += 1; // still sees count from makeCounter
return count;
};
}
const next = makeCounter();
console.log(next()); // 1
console.log(next()); // 2
흔한 실수: 카운터 두 개가 합계 하나를 공유하리라 기대하는 것. makeCounter()를 호출할 때마다 새로운 count가 만들어지므로, 각 카운터는 자기만의 값을 가집니다.
좋은 템플릿의 조건
템플릿은 출발점이 된 프롬프트만큼만 좋으므로, 고정된 텍스트는 이미 실행해 보고 마음에 들었던 프롬프트여야 합니다. 쓸모 있는 템플릿과 그저 그런 답을 더 빨리 만들어 내는 양식을 가르는 선택이 세 가지 있습니다.
바뀌는 것만 빈칸으로 두세요. 답이 항상 400자 이내이기를 원한다면 400을 고정 텍스트에 쓰세요. 빈칸 하나하나는 쓸 때마다 다시 내려야 하는 결정이고, 빈칸이 열 개인 템플릿은 프롬프트를 새로 쓰는 것보다 채우기가 더 느립니다.
모든 빈칸에 명확한 이름과 적절한 기본값을 주세요. {{아는것}}은 무엇을 입력할지 알려 주지만 {{x}}는 그렇지 않습니다. 기본값은 기대하는 값의 종류를 보여 주고, 아무것도 입력하지 않고도 템플릿을 한 번 실행해 볼 수 있게 해 줍니다.
작업 하나에 템플릿 하나를 두세요. 빈칸에 따라 개념 설명도 하고, 코드 리뷰도 하고, 퀴즈 문제도 쓰는 템플릿은 세 가지 모두를 따로 만든 템플릿 세 개보다 못합니다. 고정 텍스트가 구체적일수록 형식과 기준에 대해 더 많은 것을 말할 수 있습니다.
프롬프트 작성법의 여섯 가지 요소는 고정 텍스트를 점검하기 좋은 체크리스트입니다. 역할, 할 일, 맥락, 입력, 형식, 제약 조건. 빈칸은 보통 할 일, 맥락, 입력에 들어갑니다.
프롬프트 템플릿 예시
아래 세 가지는 흔한 일상 작업을 다룹니다. 각각 채워 넣을 이름 붙은 입력칸이 있습니다. 바로 쓸 수 있는 프롬프트를 더 보려면 프롬프트 예시를 참고하세요.
def median(numbers: list[float]) -> float:
if not numbers:
raise ValueError("median() needs at least one number")
ordered = sorted(numbers)
middle = len(ordered) // 2
if len(ordered) % 2 == 1:
return ordered[middle]
return (ordered[middle - 1] + ordered[middle]) / 2
# median([3, 1, 2]) returns 2
# median([4, 1, 3, 2]) returns 2.5
# median([]) raises ValueError
안녕하세요, 초대해 주셔서 감사합니다. 저를 떠올려 주셔서 기쁩니다! 아쉽게도 14일에는 참석이 어렵습니다. 대신 다음 달 중에 날짜를 잡을 수 있을까요? 그때라면 프로젝트에 대해 기꺼이 이야기하겠습니다.
감사합니다. [이름]
붙여 넣은 텍스트를 태그로 감싸는 데는 이유가 있습니다. 채워 넣은 텍스트에 지시처럼 보이는 문장이 들어 있을 수 있고, 구분자는 모델이 템플릿의 지시와 작업할 자료를 헷갈리지 않게 해 줍니다.
나만의 템플릿 만드는 방법
- 잘 통했던 프롬프트에서 시작하세요. 답이 제대로 나왔던 대화를 골라, 이어진 메시지에서 추가해야 했던 수정 사항까지 포함해 프롬프트의 최종 버전을 모으세요. 이 수정 사항이 가장 값진 부분입니다. 첫 버전이 틀린 부분을 고쳐 주기 때문입니다.
- 다음에 바뀔 것을 표시하세요. 프롬프트를 읽으면서 다음에 쓸 때 고칠 단어에 모두 밑줄을 긋습니다. 보통 두세 가지, 많아야 네 가지입니다. 주제, 독자, 길이, 붙여 넣는 입력.
- 각각을 이름 붙인 빈칸으로 바꾸세요. 도구가 기대하는 방식으로 빈칸을 쓰세요. 손으로 붙여 넣는 프롬프트라면
[audience], 코드라면{audience}같은 식입니다. - 세 가지 다른 내용으로 테스트하세요. 전형적인 경우 하나, 아주 짧거나 아주 긴 입력 하나, 특이한 경우 하나를 쓰세요. 하나라도 실패하면 고정 텍스트가 여전히 첫 번째 용도에 대해 무언가를 가정하고 있는 것입니다. 프롬프트 반복 개선에서 설명하는 것처럼 한 번에 한 문장씩 바꾸세요.
- 찾을 수 있는 곳에 저장하세요. 메모 파일, 텍스트 확장 도구, 스니펫 관리자 모두 괜찮습니다. 찾아 헤매야 하는 템플릿은 결국 안 쓰게 됩니다.
코드에서 쓰는 템플릿
프로그램에서 템플릿은 이름 붙은 필드가 있는 문자열입니다. Python의 str.format()이 필드를 채웁니다.
SUMMARY_TEMPLATE = """Summarize the text inside the <text> tags for {audience}.
Use at most {bullets} bullet points and lead with any action the reader must take.
<text>
{text}
</text>"""
with open("notes.txt", encoding="utf-8") as f:
meeting_notes = f.read()
prompt = SUMMARY_TEMPLATE.format(
audience="a manager who has two minutes",
bullets=3,
text=meeting_notes,
)
str.format()을 쓸 때는 템플릿 안의 모든 중괄호 문자를 두 번씩({{와 }}) 써야 하는데, 템플릿에 JSON 예시가 들어 있을 때 이 점이 중요합니다. 넘겨주는 값 안의 중괄호, 예를 들어 meeting_notes 안의 코드는 이스케이프할 필요가 없습니다. AI 앱을 만드는 일부 라이브러리에는 자체 템플릿 클래스가 있지만, 부가 기능이 붙었을 뿐 포맷 문자열과 같은 일을 합니다.
값이 사용자에게서 온다면, 템플릿이 그 텍스트를 모델에게 보낸다는 점을 기억하세요. 텍스트를 구분자 안에 두고, 악의적인 입력이 악용할 수 있는 도구나 데이터를 모델에게 주지 마세요.
템플릿과 시스템 프롬프트
템플릿과 시스템 프롬프트는 서로 다른 문제를 풉니다. 시스템 프롬프트에는 대화나 앱의 모든 메시지에 적용되는 규칙이 들어갑니다. 페르소나, 말투, 어시스턴트가 절대 하면 안 되는 것 같은 것들입니다. 템플릿에는 빈칸이 있는 작업 하나가 들어갑니다. 앱에서는 둘을 함께 쓰는 경우가 많습니다. 기본 규칙을 정하는 고정된 시스템 프롬프트와, 사용자 메시지를 하나씩 만들어 내는 템플릿입니다.
자주 묻는 질문
프롬프트 템플릿이란 무엇인가요?
프롬프트 템플릿은 쓸 때마다 바뀌는 부분을 [topic]이나 {language} 같은 자리 표시자로 남겨 둔 재사용 가능한 프롬프트입니다. 고정된 텍스트에는 이미 테스트한 지시가 들어 있고, 매번 프롬프트를 처음부터 쓰는 대신 빈칸만 채우면 됩니다.
나만의 프롬프트 템플릿은 어떻게 만드나요?
이미 좋은 답을 얻은 프롬프트에서 시작하세요. 다음에 쓸 때 바꿀 단어를 표시하고, 각각을 이름 붙인 빈칸으로 바꾼 다음, 특이한 경우 하나를 포함해 세 가지 다른 내용으로 템플릿을 테스트하세요. 첫 답변을 좋게 만든 지시는 그대로 두세요.
프롬프트 템플릿은 어디에 저장해야 하나요?
빠르게 복사할 수 있는 곳이면 어디든 됩니다. 메모 파일, 텍스트 확장 도구, 스니펫 관리자 같은 곳입니다. 채팅 앱에도 맞춤형 지침이나 프로젝트 지침처럼 반복해서 쓰는 텍스트를 두는 곳이 있지만, 이곳은 빈칸이 있는 일회성 작업보다 모든 메시지에 적용되는 규칙에 더 잘 맞습니다.
Python에서 프롬프트 템플릿은 어떻게 쓰나요?
이름 붙인 필드가 있는 문자열로 템플릿을 저장하고 str.format()이나 f-string으로 채우세요. str.format()을 쓸 때는 템플릿 안의 중괄호 문자를 두 번씩({{와 }}) 써야 합니다. 템플릿에 JSON 예시가 들어 있을 때가 그렇습니다. 사용자가 입력한 텍스트는 구분자 안에 넣어서 지시와 분리하세요.