FewShotChatMessagePromptTemplate는 소수의 예제를 제공하여 모델이 특정 작업에 적합한 응답을 생성하도록 유도하는 데 유용합니다.
LangChain의 프롬프트 템플릿 중 하나로, 대화 형식의 입력과 출력 예제를 제공하여 모델이 맥락을 이해하고 유사한 패턴의 응답을 생성하도록 돕습니다. 이는 소수 샷 학습(Few-Shot Learning)을 구현하는 데 이상적이며, 모델이 새로운 작업을 빠르게 학습하도록 유도합니다.
주요 특징:
- 대화 형식 지원: 사용자와 모델 간의 대화 흐름을 반영한 프롬프트 설계 가능.
- 예제 기반 학습: 소수의 입력-출력 쌍을 제공하여 모델의 응답 품질 향상.
- 유연한 템플릿: 다양한 작업에 맞게 커스터마이징 가능.
일반적으로 다음과 같은 구성 요소로 이루어집니다:
- 예제(Examples): 모델이 참고할 입력-출력 쌍.
- 프롬프트 템플릿(Prompt Template): 대화 형식의 메시지 구조를 정의.
- 포맷팅 로직(Formatting Logic): 입력 데이터를 템플릿에 맞게 변환.
다음 코드는 FewShotChatMessagePromptTemplate를 사용한 감정 분류 예제 코드입니다.
from langchain.prompts import FewShotChatMessagePromptTemplate, ChatPromptTemplate
from langchain_ollama import ChatOllama
# EXAONE 3.5 모델 초기화
llm = ChatOllama(model="exaone3.5")
# 예제 데이터: 고객 문의와 감정 레이블
examples = [
{
"input": "제품이 너무 빨리 배송되어서 놀랐어요! 정말 만족합니다.",
"output": "긍정"
},
{
"input": "배송이 늦어서 아쉬웠습니다. 다음엔 개선 부탁드려요.",
"output": "부정"
},
{
"input": "고객 서비스가 정말 친절해서 기분이 좋았어요!",
"output": "긍정"
}
]
# 예제 프롬프트 템플릿 정의
example_prompt = ChatPromptTemplate.from_messages([
("human", "{input}"),
("ai", "{output}")
])
# FewShotChatMessagePromptTemplate 설정
few_shot_prompt = FewShotChatMessagePromptTemplate(
examples=examples,
example_prompt=example_prompt
)
# 최종 프롬프트 템플릿
final_prompt = ChatPromptTemplate.from_messages([
("system", "당신은 고객 문의의 감정을 긍정 또는 부정으로 분류하는 전문가입니다. 다음 예제를 참고하여 응답하세요."),
few_shot_prompt,
("human", "{input}")
])
# 체인 구성
chain = final_prompt | llm
# 테스트 입력
test_input = "제품 품질이 기대 이상이었어요! 다음에도 구매할게요."
response = chain.invoke({"input": test_input})
print(f"입력: {test_input}")
print(f"출력: {response.content}")
입력: 제품 품질이 기대 이상이었어요! 다음에도 구매할게요.
출력: 긍정
코드 설명:
- 모델 초기화: ChatOllama를 사용하여 EXAONE3.5 모델을 로드합니다.
- 예제 정의: 고객 문의와 해당 감정(긍정/부정)을 쌍으로 제공합니다.
- 예제 프롬프트: ChatPromptTemplate을 사용하여 입력과 출력을 대화 형식으로 정의합니다.
- FewShot 프롬프트: FewShotChatMessagePromptTemplate로 예제를 묶어 모델에 전달합니다.
- 최종 프롬프트: 시스템 메시지와 FewShot 프롬프트를 결합하여 최종 프롬프트를 생성합니다.
- 체인 실행: 입력 데이터를 프롬프트에 적용하고 모델을 호출하여 결과를 얻습니다.
다음은 고급 활용으로 FewShotChatMessagePromptTemplate는 단순한 텍스트 분류뿐만 아니라 다양한 작업에 활용될 수 있습니다. 예를 들어:
- 질문 답변: 특정 도메인의 질문에 대한 답변 형식을 학습.
- 텍스트 생성: 특정 스타일의 글쓰기(예: 공식 문서, 캐주얼 대화)를 유도.
- 작업 자동화: 고객 문의에 대한 자동 응답 템플릿 생성.
고급 예제는 고객 문의에 대한 자동 응답이며, 고객 문의에 대한 자동 응답 템플릿을 생성하는 예제를 살펴보겠습니다.
from langchain.prompts import FewShotChatMessagePromptTemplate, ChatPromptTemplate
from langchain_ollama import ChatOllama
# 모델 초기화
llm = ChatOllama(model="exaone3.5")
# 예제 데이터
examples = [
{
"input": "배송 상태를 알려주세요.",
"output": "안녕하세요! 배송 상태를 확인하려면 주문 번호를 말씀해 주세요."
},
{
"input": "제품이 언제 도착하나요?",
"output": "안녕하세요! 주문하신 제품의 예상 도착 날짜를 확인하려면 주문 번호를 알려주시면 빠르게 확인해드리겠습니다."
}
]
# 예제 프롬프트
example_prompt = ChatPromptTemplate.from_messages([
("human", "{input}"),
("ai", "{output}")
])
# FewShot 프롬프트
few_shot_prompt = FewShotChatMessagePromptTemplate(
examples=examples,
example_prompt=example_prompt
)
# 최종 프롬프트
final_prompt = ChatPromptTemplate.from_messages([
("system", "당신은 고객 문의에 친절하게 응답하는 챗봇입니다. 예제를 참고하여 자연스럽게 답변하세요."),
few_shot_prompt,
("human", "{input}")
])
# 체인 구성
chain = final_prompt | llm
# 테스트
test_input = "주문한 물건이 언제 올까요?"
response = chain.invoke({"input": test_input})
print(f"입력: {test_input}")
print(f"출력: {response.content}")
입력: 주문한 물건이 언제 올까요?
출력: 주문 번호를 알려주시면 정확한 배송 예정일을 확인해 드릴 수 있습니다. 혹시 아직 주문 번호를 확인하지 못하셨다면, 주문 확인 이메일이나 주문 내역을 확인하시면 쉽게 찾으실 수 있을 거예요. 주문 번호를 알려주시겠어요?
FewShotChatMessagePromptTemplate는 LangChain에서 소수 샷 학습을 구현하는 데 매우 효과적인 도구입니다. 이를 다양한 실제 시나리오에 쉽게 적용할 수 있습니다.