PromptTemplate는 LangChain에서 제공하는 도구로, 대규모 언어 모델(LLM)에 전달할 프롬프트(prompt)를 체계적으로 구성하고 관리하기 위한 템플릿입니다. LLM은 사용자가 제공하는 프롬프트에 따라 응답을 생성하기 때문에, 일관성 있고 재사용 가능한 프롬프트를 만드는 것이 중요합니다. PromptTemplate는 이러한 요구를 충족하기 위해 설계되었습니다.
LangChain은 LLM을 활용한 애플리케이션 개발을 지원하는 프레임워크로, PromptTemplate는 그 핵심 구성 요소 중 하나입니다. 이를 통해 사용자는 동적인 값을 삽입하거나 특정 형식으로 프롬프트를 구조화할 수 있습니다.
주요 특징
- 템플릿 기반 구조
PromptTemplate는 문자열 기반의 템플릿을 정의합니다. 이 템플릿에는 변수(placeholder)가 포함될 수 있으며, 나중에 실제 값으로 대체됩니다. 예를 들어, “안녕하세요, {name}님!”이라는 템플릿을 만들고, {name}에 “홍길동”이라는 값을 넣어 “안녕하세요, 홍길동님!”이라는 완성된 프롬프트를 생성할 수 있습니다. - 동적 변수 삽입
사용자가 입력한 데이터나 외부 데이터를 기반으로 프롬프트를 동적으로 생성할 수 있습니다. 이를 통해 동일한 템플릿을 다양한 상황에 맞춰 재사용할 수 있습니다. - LLM과의 통합
PromptTemplate는 LangChain에서 LLM 호출 시 사용되며, 템플릿에 따라 모델이 일관된 형식의 입력을 받도록 보장합니다. 이는 특히 복잡한 작업(예: 질문 답변, 요약, 번역 등)에서 유용합니다. - 재사용성과 유지보수성
프롬프트가 애플리케이션 곳곳에서 사용될 때, PromptTemplate를 사용하면 코드를 깔끔하게 유지하고 필요 시 템플릿만 수정하면 됩니다.
기본 사용법
LangChain에서 PromptTemplate는 Python 클래스로 구현되어 있습니다. 아래는 간단한 예제입니다:
from langchain.prompts import PromptTemplate
# 템플릿 정의
template = "당신의 이름은 {name}이고, 나이는 {age}세입니다. 자기소개를 해 주세요."
prompt = PromptTemplate(
input_variables=["name", "age"],
template=template
)
# 변수 값을 채워 프롬프트 생성
filled_prompt = prompt.format(name="오스틴", age=25)
print(filled_prompt)
당신의 이름은 오스틴이고, 나이는 25세입니다. 자기소개를 해 주세요.
- input_variables: 템플릿에서 사용할 변수 목록을 지정합니다.
- template: 실제 템플릿 문자열입니다.
- format(): 변수에 값을 채워 완성된 프롬프트를 반환합니다.
고급 기능
- 조건문과 반복문
LangChain의 PromptTemplate는 단순한 문자열 치환 외에도 복잡한 로직을 포함할 수 있습니다. 예를 들어, 특정 조건에 따라 템플릿의 일부를 포함하거나 제외할 수 있습니다. - 다중 템플릿 결합
여러 PromptTemplate을 결합해 더 복잡한 프롬프트를 만들 수 있습니다. 이를 통해 작업 흐름(workflow)을 세분화할 수 있습니다. - 외부 데이터 통합
PromptTemplate는 외부 컨텍스트(예: 문서, 데이터베이스 쿼리 결과 등)를 변수로 삽입해 LLM이 이를 기반으로 응답하도록 설정할 수 있습니다. - ChatPromptTemplate와의 차이
LangChain에는 ChatPromptTemplate라는 변형도 존재합니다. 이는 대화형 모델(예: ChatGPT 같은 모델)에 특화된 템플릿으로, 시스템 메시지, 사용자 메시지, AI 메시지 등을 구분해 정의할 수 있습니다.
실제 활용 예시
1) 질문 생성기
from langchain.prompts import PromptTemplate
template = "주제: {topic}\n질문: {topic}에 대해 설명해 주세요."
prompt = PromptTemplate(
input_variables=["topic"],
template=template
)
print(prompt.format(topic="인공지능"))
주제: 인공지능
질문: 인공지능에 대해 설명해 주세요.
2) LLM 호출과 연계
from langchain_ollama import OllamaLLM
from langchain.prompts import PromptTemplate
llm = OllamaLLM(model="exaone3.5")
template = "{item}의 가격은 얼마인가요?"
prompt = PromptTemplate(input_variables=["item"], template=template)
# LLM에 프롬프트 전달
response = llm.invoke(prompt.format(item="아이폰"))
print(response)
아이폰의 정확한 가격은 모델과 사양에 따라 다르며, 국가, 통신사, 그리고 판매점에 따라 변동될 수 있습니다. 최신 모델의 경우, 예를 들어 아이폰 14 시리즈의 가격은 대략적으로 다음과 같습니다 (가격은 국가 및 판매처에 따라 다를 수 있음):
– **아이폰 14**: 약 $799 (약 1,000,000원)
– **아이폰 14 Plus**: 약 $899 (약 1,200,000원)
– **아이폰 14 Pro**: 약 $999 (약 1,300,000원)
– **아이폰 14 Pro Max**: 약 $1,099 (약 1,400,000원)
최신 모델의 정확한 가격을 확인하려면 해당 국가의 애플 공식 웹사이트나 현지 판매점을 참조하시는 것이 가장 정확합니다.
장점
- 유연성: 변수와 템플릿을 조합해 다양한 상황에 대응 가능.
- 일관성: 동일한 작업에 대해 항상 같은 형식의 프롬프트 제공.
- 확장성: 복잡한 애플리케이션에서도 쉽게 통합 가능.
한계
- 복잡성 증가: 너무 많은 변수나 조건이 들어가면 관리하기 어려울 수 있음.
- 모델 의존성: 프롬프트의 효과는 사용하는 LLM의 성능에 따라 달라질 수 있음.
PromptTemplate는 LangChain에서 프롬프트 엔지니어링을 효율적으로 수행하기 위한 강력한 도구입니다. 특히 ollama 같은 모델과 결합해 사용할 때, 작업의 목적에 맞는 프롬프트를 체계적으로 구성할 수 있어 생산성을 크게 높일 수 있습니다. 사용자는 템플릿을 설계할 때 명확성과 간결성을 유지하며, LLM의 응답 품질을 최적화하는 방향으로 활용하면 좋습니다.