프롬프트를 코드에서 분리한 이유 — Prompt Template 실전

프롬프트를 코드 안에 문자열로 박아두면 처음엔 편합니다. 그런데 서비스가 커지면서 저는 프롬프트를 코드에서 아예 분리하는 쪽으로 방식을 바꿨습니다. 그 계기와, LangChain의 Prompt Template을 실제로 어떻게 쓰는지 정리해 봅니다.

템플릿이 필요해진 순간

같은 형식의 질문을 반복할 때가 문제였습니다. "상품명만 바뀌고 나머지 지시는 똑같은" 프롬프트가 수십 개 생기니, 문구 하나 고치려면 전부 찾아 고쳐야 했어요. Prompt Template은 이 틀을 한 번만 정의하고 값만 바꿔 끼우는 방식입니다.

from langchain_core.prompts import PromptTemplate

tpl = PromptTemplate.from_template(
    "너는 쇼핑 카피라이터야.\n상품: {product}\n특징: {feature}\n위 정보로 30자 내 카피를 써줘."
)
print(tpl.format(product="가습기", feature="저소음"))

예시를 넣으면 품질이 확 오른다 (Few-shot)

제가 체감한 가장 큰 차이는 예시를 몇 개 넣어주는 것이었습니다. "이런 식으로 써줘" 하고 샘플을 보여주면 결과 톤이 눈에 띄게 안정됩니다. LangChain에는 이걸 위한 FewShotPromptTemplate이 있어요.

from langchain_core.prompts import FewShotPromptTemplate, PromptTemplate

example_tpl = PromptTemplate.from_template("상품: {p}\n카피: {c}")
examples = [
    {"p": "텀블러", "c": "하루 종일 따뜻하게, 손안의 온기"},
    {"p": "우산",   "c": "갑작스런 비에도 당황하지 않게"},
]
prompt = FewShotPromptTemplate(
    examples=examples,
    example_prompt=example_tpl,
    suffix="상품: {p}\n카피:",
    input_variables=["p"],
)
print(prompt.format(p="무선 마우스"))

예시 두 줄 덕분에 결과가 제 브랜드 톤에 훨씬 가깝게 나왔습니다. 프롬프트를 길게 설명하는 것보다 예시 한두 개가 더 셀 때가 많아요.

제가 밟은 함정: 중괄호

템플릿 안에 JSON 예시를 넣으려고 { }를 그대로 썼다가 오류가 났습니다. 템플릿은 중괄호를 변수로 읽기 때문이에요. 리터럴로 넣으려면 {{ }}처럼 두 번 써야 합니다. 처음 겪으면 원인을 못 찾으니 미리 기억해 두세요.

실무 팁: 프롬프트는 파일로 빼두기

저는 요즘 프롬프트 본문을 별도 텍스트 파일로 관리하고 코드에서 불러옵니다. 기획자가 코드 몰라도 문구를 고칠 수 있고, 버전 관리도 깔끔해지거든요. 프롬프트도 하나의 "콘텐츠 자산"이라고 보면 관리 방식이 달라집니다.

마무리

Prompt Template은 화려한 기능이라기보다 "프롬프트를 흩어놓지 말고 한곳에서 관리하자"는 원칙에 가깝습니다. 반복되는 프롬프트가 서너 개를 넘는 순간 바로 도입하시길 권합니다. 다음 글에서는 이렇게 만든 응답을 프로그램이 바로 쓸 수 있는 구조화 데이터로 바꾸는 방법을 다뤄보겠습니다.

댓글

이 블로그의 인기 게시물

지하철 노선도로 이해하는 LangGraph (분기·반복 설계)

LangGraph State란 무엇인가? 상태 관리 개념 쉽게 이해하기

LangGraph Node와 Edge 개념 쉽게 이해하기 (초보자 완전 정리)