LangChain 독학 가이드 3 - 프롬프트 템플릿

learning by Seven Fingers Studio 14분
LangChainPromptTemplateChatPromptTemplatePythonAI

“GPT한테 매번 비슷한 질문 하는데, 계속 같은 말 반복해서 쓰기 귀찮아요.” 이런 생각 해보신 적 있으세요? 저도 그랬어요. 예를 들어 “다음 텍스트를 한국어로 번역해줘: [텍스트]” 이런 식으로 매번 앞부분을 복붙하고 있었거든요.

LangChain의 프롬프트 템플릿을 쓰면 이 문제가 깔끔하게 해결돼요. 변하는 부분만 바꿔 끼우면 되니까요!

프롬프트 템플릿이 뭔가요?

프롬프트 템플릿은 쉽게 말해 “빈칸 채우기” 형태의 프롬프트예요. 고정된 부분과 변하는 부분을 분리해서, 재사용 가능한 프롬프트를 만드는 거죠.

예를 들어볼게요:

  • 고정: “다음 텍스트를 한국어로 번역해줘:”
  • 변하는 부분: 번역할 텍스트

이걸 템플릿으로 만들면 "다음 텍스트를 한국어로 번역해줘: {text}" 이렇게 되는 거예요. {text} 부분에 원하는 텍스트를 넣으면 됩니다.

PromptTemplate 기본 사용법

가장 기본적인 PromptTemplate 사용법부터 볼게요:

from langchain_core.prompts import PromptTemplate

# 템플릿 생성
template = PromptTemplate.from_template(
    "{country}의 수도는 어디인가요?"
)

# 변수 채워서 프롬프트 완성
prompt = template.format(country="한국")
print(prompt)

실행 결과:

한국의 수도는 어디인가요?

{country} 부분이 “한국”으로 바뀌었죠? 이제 나라 이름만 바꾸면 다른 질문을 만들 수 있어요.

여러 변수 사용하기

변수가 여러 개 필요할 때도 있죠. 그것도 간단해요:

from langchain_core.prompts import PromptTemplate

template = PromptTemplate.from_template(
    "{language}로 '{text}'를 번역해줘."
)

prompt = template.format(language="영어", text="안녕하세요")
print(prompt)

실행 결과:

영어로 '안녕하세요'를 번역해줘.

{language}{text} 두 개의 변수를 사용했어요. 필요한 만큼 변수를 추가할 수 있습니다.

ChatPromptTemplate - 대화형 프롬프트

실제 챗봇을 만들 때는 ChatPromptTemplate을 더 많이 써요. 시스템 메시지, 사용자 메시지 등을 구분해서 설정할 수 있거든요.

from langchain_core.prompts import ChatPromptTemplate

template = ChatPromptTemplate.from_messages([
    ("system", "당신은 친절한 여행 가이드입니다. 한국어로 답변해주세요."),
    ("human", "{city}의 유명한 관광지를 3개 알려주세요.")
])

prompt = template.format_messages(city="도쿄")
for msg in prompt:
    print(f"[{msg.type}] {msg.content}")

실행 결과:

[system] 당신은 친절한 여행 가이드입니다. 한국어로 답변해주세요.
[human] 도쿄의 유명한 관광지를 3개 알려주세요.

system 메시지로 AI의 역할을 정해주고, human 메시지로 실제 질문을 보내는 거예요. 이렇게 하면 AI가 더 일관된 답변을 해줍니다.

실제로 LLM에 연결해보기

템플릿을 만들었으니 실제 GPT에 연결해서 답변을 받아볼게요:

from dotenv import load_dotenv
from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate

load_dotenv()

# 템플릿 생성
template = ChatPromptTemplate.from_messages([
    ("system", "당신은 요리 전문가입니다. 간단하고 실용적인 레시피를 알려주세요."),
    ("human", "{ingredient}로 만들 수 있는 간단한 요리를 알려주세요.")
])

# 모델 생성
llm = ChatOpenAI(model="gpt-3.5-turbo")

# 체인 연결 (다음 글에서 자세히!)
chain = template | llm

# 실행
response = chain.invoke({"ingredient": "계란"})
print(response.content)

실행 결과:

계란으로 만들 수 있는 간단한 요리를 소개해드릴게요!
**계란찜**
1. 계란 2개를 풀고 물 1/2컵을 섞어요
2. 소금 약간, 참기름 몇 방울 추가
3. 전자레인지에 2-3분 돌리면 끝!

template | llm 이 부분은 다음 글에서 배울 LCEL(체인)이에요. 지금은 “템플릿과 모델을 연결했구나” 정도로 이해하시면 돼요.

MessagesPlaceholder - 대화 기록 넣기

챗봇을 만들 때 이전 대화 내용을 기억해야 하잖아요? 그때 MessagesPlaceholder를 사용해요:

from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain_core.messages import HumanMessage, AIMessage

template = ChatPromptTemplate.from_messages([
    ("system", "당신은 친절한 AI 비서입니다."),
    MessagesPlaceholder(variable_name="chat_history"),
    ("human", "{question}")
])

# 이전 대화 기록
history = [
    HumanMessage(content="내 이름은 철수야"),
    AIMessage(content="안녕하세요 철수님! 만나서 반갑습니다.")
]

prompt = template.format_messages(
    chat_history=history,
    question="내 이름이 뭐라고 했지?"
)

for msg in prompt:
    print(f"[{msg.type}] {msg.content}")

실행 결과:

[system] 당신은 친절한 AI 비서입니다.
[human] 내 이름은 철수야
[ai] 안녕하세요 철수님! 만나서 반갑습니다.
[human] 내 이름이 뭐라고 했지?

이전 대화 기록이 중간에 들어갔죠? 이렇게 하면 AI가 맥락을 파악해서 “철수님이라고 하셨어요”라고 대답할 수 있어요.

실전 팁

1. 역할 설정은 system에

AI의 성격이나 역할은 항상 system 메시지에 넣으세요. 더 일관된 답변을 얻을 수 있어요.

("system", "당신은 10년 경력의 프론트엔드 개발자입니다. 초보자도 이해할 수 있게 설명해주세요.")

2. 출력 형식 지정하기

원하는 출력 형식이 있다면 명시적으로 적어주세요:

("system", "답변은 다음 형식으로 해주세요:\n- 장점: ...\n- 단점: ...\n- 결론: ...")

3. 예시 포함하기

Few-shot 프롬프팅이라고 하는데, 예시를 포함하면 더 정확한 답변을 얻을 수 있어요:

template = """다음 형식으로 감정을 분석해주세요.

예시:
입력: 오늘 날씨가 너무 좋아서 기분이 좋아요
출력: 긍정

입력: {text}
출력:"""

정리

오늘 배운 내용:

  • PromptTemplate: 기본 템플릿, 변수로 빈칸 채우기
  • ChatPromptTemplate: 대화형 템플릿, system/human 구분
  • MessagesPlaceholder: 대화 기록 삽입용
  • 여러 변수 사용 가능
  • LLM에 연결해서 실제 답변 받기

프롬프트 템플릿은 LangChain의 가장 기본이 되는 개념이에요. 다음 글에서는 이 템플릿을 활용해서 체인을 만드는 LCEL을 배워볼 거예요!


다음 글 보기

← 이전 글
LangChain 독학 가이드 2 - 개발 환경 설정
다음 글 →
LangChain 독학 가이드 4 - LCEL 체인 만들기
← 블로그 목록으로