PromptTemplate를 쓰는 이유 ?
프롬프트를 직접 LLM에 넘겨도 되는데, 굳이 PromptTemplate 를 쓰는 이유는 템플릿화된 프롬프트를 깔끔하고 재사용 가능하게 관리할 수 있기 때문이다.
간단한 프롬프트를 주는 경우에는 굳이 안 쓰는게 더 빠를 수도 있다. 하지만 변수가 많아지고 프롬프트가 길어지면 사용하는게 훨씬 빠르고 코드도 깔끔해진다.
PromptTemplate는 단일 문자열에 대한 템플릿이고, 일반적으로 문장 하나에 대한 템플릿이다.
여러 메시지 역할을 구조화 한 ChatPromptTemplate 도 있는데, 이번 포스트에서는 PromptTemplate에 대해서만 다뤄보겠다.
from langchain.chat_models import ChatOpenAI
from langchain.schema import HumanMessage
llm = ChatOpenAI(model=default_model, api_key = apikey)
question = "서울에서 맛있는 길거리 음식 알려줘"
prompt = f"다음 질문에 답해줘: \n {question}"
response = llm.invoke([HumanMessage(content=prompt)])
print(response.content)
다음과 같이 그냥 문자열로 프롬프트를 만들고, llm에 invoke 해주면 된다.
하지만 다음의 경우를 생각해 보자.
변수가 하나가 아니라, 여러개 예를 들어서 어떤 장소에 어떤 음식종류를 몇개 추천 받고 싶은지 가격대는 어떤지 필터링을 걸어서 추천 받고 싶다면 변수에 따른 코드도 많아지고, 나중에 변경이 될 때 건드려야 할 코드도 많아진다.
이럴 때 PromptTemplate 를 사용한다.
from langchain.chat_models import ChatOpenAI
from langchain.schema import HumanMessage
from langchain.prompts import PromptTemplate
template = PromptTemplate(
input_variables=["place", "food_type", "count", "price_range"],
template="""
다음 조건에 맞는 길거리 음식 추천해줘
- 장소: {place}
- 음식 종류: {food_type}
- 추천 개수: {count}개
- 가격대: {price_range}
조건에 맞는 음식 이름과 간단한 설명 부탁해.
"""
)
이렇게 템플릿을 만들고, template.format으로 만들면 된다.
prompt = template.format(
place="광장시장",
food_type="분식",
count="3",
price_range="5000원 이하"
)
print(filled_prompt)

아까 template에 만든 그대로 잘 만들어진다.
이렇게 만든 template를 그대로 llm에 넘겨주기만 하면 된다.
response = llm.invoke(prompt)
print(response.content)

잘 나온다. GOOD
그리고 템플릿 문자열만 넣으면 자동으로 변수까지 추출해주는 기능도 있다.
from_template
template_str = """
다음 조건에 맞는 길거리 음식 추천해줘
- 장소: {place}
- 음식 종류: {food_type}
- 추천 개수: {count}개
- 가격대: {price_range}
조건에 맞는 음식 이름과 간단한 설명 부탁해.
"""
template = PromptTemplate.from_template(template_str)
prompt = template.format(
place="광장시장",
food_type="분식",
count="3",
price_range="5000원 이하"
)
print(prompt)

똑같이 나온다. input_variables 를 따로 지정할 필요 없고, {} 안에 변수명을 LangChain이 자동으로 추출해줘서 코드가 간결해 진다.
음... from_template를 사용하는게 더 편한 것 같은데... 본인이 편한거 사용하면 될 것 같다. 혹시 둘의 큰 차이가 있다면 알려주세요..
템플릿을 Json 파일로 관리할 수 도 있다.
template.save("prompt2.json")

잘 저장 되어 있다.
이제 불러다가 쓰면 된다.
from langchain.prompts import load_prompt
template = load_prompt("prompt2.json")
prompt = template.format(
place="남대문시장",
food_type="튀김",
count="2",
price_range="7000원 이하"
)
print(prompt)

디자이너나 기획자랑 협업 할 때는 이렇게 json 파일로 관리해서 쓰기도 한다고 한다. 상황에 따라서 맞게 사용하면 될 듯 하다.