목차
지금까지 이 블로그에서도 LangChain(랭체인)에 대해서는 여러 방식으로 다뤄봤어요. 하지만, 프롬프트 템플릿이나 LangChain(랭체인) 자체를 구조적으로 자세하게 살펴보지는 못했어요. 오늘부터 몇 차례에 걸쳐 OpenAI의 LangChain(랭체인)에 대해 정리해 보도록 하겠습니다. 오늘은 그 첫번째로 LangChain Templete(프롬프트 템플릿) 구성과 Output Parsing (응답 처리)에 대해 다뤄볼게요.
LangChain 프롬프트 템플릿
우선, OpenAI의 LangChain을 살펴보기 위해서, OpenAI의 API를 사용해야 해요, 그러기 위해서는 API 사용 등록을 하고 Key를 받아야 해요. 이 부분은 이전 글을 참고하시면 됩니다. (OpenAI GPT API 사용법 #1)
자, 그러면 아래와 같이 GPT와 대화 메시지를 구성해 볼게요.
openai.api_key = "OPENAI_API_KEY" #OpenAI API등록 후 할당 받은 Key를 입력
def conversation_withGPT(prompt):
messages = [{"role": "user", "content": prompt}]
response = openai.chat.completions.create(
model="gpt-4o-mini",
messages=messages,
temperature=0
)
return response.choices[0].message.content
GPT와 Text 대화를 위한 가장 기본적인 함수를 구현했어요. OpenAI 홈페이지의 예시 함수와 거의 동일해서 별다른 설명은 불필요할 듯 해요.
자, 이제 Prompt(프롬프트)를 구성해 볼게요.
customer_email = """
야, 진짜 뭐여 이게! 이 OLED TV 산 지 한 달도 안 됐는데,
화면이 깜빡거리더니 쌕 나가부렀어!
400만 원짜리 TV가 이게 뭐야, 장난해?
서비스센터 전화했더니 보증은 안 되고 수리비 내라고하는데,
어? 이게 말이 돼? 당장 새 걸로 바꿔주던가 뭐라도 해줘야 하는거 아냐?
와 진짜 열받네!
"""
customer_style = """
차분하고 정중한 어투의 한국어
"""
prompt1 = f"""다음 '--'으로 구분된 본문을 {customer_style}의 문체로 재작성해 주세요.
본문:
--
{customer_email}
--
"""
response = conversation_withGPT(prompt1)
위와 같이 정의하면 “prompt1″은 다음과 같은 텍스트로 구성될 거예요.

물론, 이런 프롬프트를 GPT에게 지시하면 분명 원하는 대답을 받을 거예요.
어째튼, 위와 같은 함수는 Prompt(프롬프트)를 입력 받아서 처리하는 방식이에요. 다시 말하면 프롬프트와 response가 1:1 구조라는 거예요. 물론 함수이기 때문에 이 함수는 각각의 프롬프트에 따라 활용되지만, 그 프롬프트는 반드시 개별적으로 입력해 줘야 하고 그에 따라 response를 얻는 구조라고 할 수 있죠.
물론, 이 예시는 간단한 구조라서 조금 가공하면 여러 방법으로 코드 재사용성을 높일 수 있고, 코드 가독성도 높일 수 있어요. 하지만, 복잡한 상황에서는 중복 코드가 많아 질거에요. 프롬프트를 계속 복붙해야 하는 상황이 나오게 될 거예요.
자 그럼, 이런 부분을 해결할 수 있는 LangChain의 ChatPromptTemplate (프롬프트 템플릿) 클래스를 사용해 볼게요.
from langchain.prompts import ChatPromptTemplate
template_str = """ 아래 '-문장-'을 {style}의 문체로 변경해 주세요.
-문장-: {text}
"""
ppt_template = ChatPromptTemplate.from_template(template_str)
위와 같이 코드를 구성하고 “ppt_template”에 뭐가 있는지 보면 다음과 같아요. 앞에서 봤던 프롬프트와 다른건 입력 변수가 있다는 거예요.
ppt_template(
input_variables=['style', 'text'],
input_types={}, partial_variables={},
template=" 아래 '-문장-'을 {style}의 문체로 변경해 주세요. \n-문장-: {text}\n"
)
이것은 “template_string”에서 정의한 style과 text가 입력 변수로 되었다는 걸 알 수 있죠.
그럼 이제 ppt_template(프롬프트 템플릿)를 어떻게 활용하는지 볼게요. 다음과 같이 코드를 구성해 볼게요.
customer_text = ppt_template.format_messages(
style = customer_style,
text = customer_email
)
우리가 맨 앞에서 선언했던 customer_email과 customer_style을 입력 값으로 하고 ppt_template(프롬프트 템플릿에 따라customer_text를 생성했어요. 이렇게 하면 customer_text는 우리가 앞에서 정의한 prompt1과 같아집니다. 즉, prompt1을 반복해서 코딩할 필요가 없어지죠.
일단 결과를 보기 위해 코드를 추가하고 실행 결과까지 볼게요.
resp_customer_text = chat(customer_text)
print(resp_customer_text.content)
===========
안녕하세요.
최근에 구매한 OLED TV에 대해 말씀드리고자 합니다. 이 제품을 구입한 지 한 달도 채 되지 않았는데, 화면이 깜빡거리더니 갑자기 작동이 멈추었습니다. 400만 원이라는 고가의 제품이 이렇다니 매우 실망스럽습니다.
서비스센터에 문의해 보니 보증이 적용되지 않아 수리비를 부담해야 한다고 하더군요. 이 상황이 이해가 되지 않습니다. 제품에 문제가 발생했을 때, 교환이나 적절한 조치를 취해 주시는 것이 필요하지 않을까요?
이런 상황에 대해 매우 유감스럽게 생각하며, 빠른 해결을 부탁드립니다. 감사합니다.
자, 그럼 위 내용이 고객의 불만 사항을 접수하는 상황이니 이어서 고객센터 직원의 응대하는 상황도 만들어 볼게요. 앞에서 고객도 매우 예의 없는 말투였으니 고객센터 상담원의 말투도 똑같이 예의 없는 투로 설정해 볼게요. 조건을 같게 해보려고요.
service_reply = """
고객니마,
보증은 그 OLED TV 고장난 거 커버 안해요.
왜냐? 아마 고객님이 뭘 잘못 만져서 화면이 나간 거지,
멀쩡한 TV가 그냥 깜빡하고 꺼지겠어? 서비스센터 말이 맞아요,
수리비는 고객님이 내셔야 해. 운이 없다고 해도 뭐!
참! 그럼, 다음에 봐!
"""
service_style_pirate = """
차분하고 정중한 한국어
"""
자, 이런 고객센터 직원은 없겠지만, 위와 같이 설정해 보고, 앞에서 정의한 ppt_template을 활용해 볼게요. 다음과 같이 코드를 구성해 보죠.
service_text = ppt_template.format_messages(
style=service_style_pirate,
text=service_reply
)
print(service_text[0].content)
여기서 논에 띄는 것은 앞에서 선언한 ppt_template를 그대로 사용했다는 거예요. 즉 prompt1과 같은 코드는 더 이상 사용하지 않고 새롭게 프롬프트를 정의할 수 있죠. 이 코드를 실행한 결과를 보죠.

이제, chat 클래스를 이용해서 GPT에게 지시를 하고 얻은 대답은 다음과 같아요. 4o-mini 모델이라 지시사항에 따라 정확하게 대답을 해 줍니다.
resp_service = chat(service_text)
print(resp_service.content)
============================
고객님께,
안녕하세요. 고객님께서 문의하신 OLED TV의 고장에 대해 안내 말씀 드립니다. 유감스럽게도, 해당 고장은 보증 범위에 포함되지 않습니다. 이는 고객님께서 사용 중에 발생한 문제로, TV가 자연스럽게 꺼지는 경우는 드물기 때문입니다. 서비스 센터의 판단이 옳다고 생각됩니다. 따라서 수리비는 고객님께서 부담하셔야 할 것 같습니다. 불편을 드려 죄송합니다.
다음에 또 뵙기를 바랍니다. 감사합니다.
자, 랭체인의 Templete (프롬프트 템플릿) 구성만 이야기 했는데도 상당히 내용이 길어졌네요. 오늘은 여기까지 하고 다음 글에서 Output Parsing을 이어서 정리하도록 할게요.
- LangChain 프롬프트 템플릿으로 GPT 프롬프트 자동화하기 #1
- 파이썬 Transformer(트랜스포머) #1 – 감정 분석부터 Self-Attention
- AI 글쓰기의 한계 #1 – 왜 GPT는 사람처럼 글을 못 쓸까?
- OpenAI API 요금은 어떻게 계산될까? 토큰 개념과 tiktoken 활용 #1
- 챗지피티 프롬프트로 지브리 스타일, 픽사 스타일 이미지 생성 방법