언어 모델은 방대한 데이터로 훈련되지만, 특정 작업에 대해 최적의 응답을 생성하려면 맥락(context)과 의도(intent)를 명확히 제공해야 합니다. FewShotPromptTemplate은 작업의 예시를 몇 개 제공함으로써 모델이 사용자가 원하는 출력 형식을 이해하고, 이를 기반으로 일관성 있는 결과를 생성하도록 돕습니다.
예를 들어, 질문에 대한 답변을 생성하거나, 텍스트를 특정 스타일로 변환하는 작업을 수행할 때, 단일 지시(instruction)만 제공하는 것보다 몇 가지 입력-출력 쌍을 보여주는 것이 더 효과적일 수 있습니다. 이를 “few-shot learning”이라고 부르며, FewShotPromptTemplate은 이를 체계적으로 구현한 클래스입니다.
왜 FewShotPromptTemplate을 사용하는가?
- 맥락 제공: 모델이 작업의 의도를 더 잘 파악하도록 도와줍니다.
- 일관성 향상: 출력 형식을 예시로 명확히 정의하여 결과의 품질을 높입니다.
- 효율성: 긴 설명 대신 간단한 예시로 원하는 결과를 유도할 수 있습니다.
- 적응성: 다양한 작업에 맞게 예시를 조정하여 유연하게 사용할 수 있습니다.
FewShotPromptTemplate의 기본 구조
LangChain의 FewShotPromptTemplate은 다음과 같은 구성 요소로 이루어집니다:
- examples: 모델에 제공할 입력-출력 예시 리스트.
- example_prompt: 각 예시를 형식화하기 위한 프롬프트 템플릿.
- prefix: 프롬프트의 시작 부분으로, 작업에 대한 설명이나 지시사항을 포함.
- suffix: 프롬프트의 끝 부분으로, 사용자의 실제 입력값을 삽입하는 위치를 지정.
- input_variables: 사용자 입력으로 채워질 변수 이름.
- example_separator: 각 예시 사이를 구분하는 문자열(기본값은 \n).
이제 이 요소들을 하나씩 살펴보고, 실제 코드를 통해 사용법을 익혀보겠습니다.
예제: 감정 분류기 구현하기
FewShotPromptTemplate을 사용해 텍스트의 감정을 분류하는 간단한 예제를 만들어 보겠습니다. 여기서는 긍정(positive), 부정(negative), 중립(neutral)으로 감정을 분류하는 작업을 수행합니다.
1. 필요한 모듈 임포트
먼저 LangChain에서 필요한 모듈을 가져옵니다.
from langchain.prompts import FewShotPromptTemplate, PromptTemplate
2. 예시 데이터 준비
모델에 제공할 입력-출력 쌍을 정의합니다.
examples = [
{"text": "이 영화 정말 재미있어요!", "sentiment": "positive"},
{"text": "음식이 너무 맛없어서 실망했어요.", "sentiment": "negative"},
{"text": "오늘 날씨가 평범하네요.", "sentiment": "neutral"}
]
3. 예시 프롬프트 템플릿 정의
각 예시를 어떻게 표시할지 형식화합니다.
example_prompt = PromptTemplate(
input_variables=["text", "sentiment"],
template="입력: {text}\n출력: {sentiment}"
)
4. FewShotPromptTemplate 생성
이제 모든 요소를 조합하여 FewShotPromptTemplate을 만듭니다.
few_shot_prompt = FewShotPromptTemplate(
examples=examples,
example_prompt=example_prompt,
prefix="다음 텍스트의 감정을 분류하세요. 감정은 positive, negative, neutral 중 하나로 선택합니다.\n\n",
suffix="\n입력: {input}\n출력:",
input_variables=["input"],
example_separator="\n\n"
)
5. 프롬프트 출력 확인
사용자 입력을 넣어 최종 프롬프트가 어떻게 보이는지 확인합니다.
input_text = "새로운 프로젝트가 기대돼요!"
print(few_shot_prompt.format(input=input_text))
다음 텍스트의 감정을 분류하세요. 감정은 positive, negative, neutral 중 하나로 선택합니다.
입력: 이 영화 정말 재미있어요!
출력: positive
입력: 음식이 너무 맛없어서 실망했어요.
출력: negative
입력: 오늘 날씨가 평범하네요.
출력: neutral
입력: 새로운 프로젝트가 기대돼요!
출력:
이 프롬프트를 언어 모델에 전달하면, 모델은 주어진 예시를 바탕으로 “positive”라는 출력을 생성할 가능성이 높습니다.
고급 활용: 동적 예시 선택
고정된 예시 대신, 입력에 따라 관련성 높은 예시를 동적으로 선택하고 싶다면 LangChain의 SemanticSimilarityExampleSelector를 사용할 수 있습니다. 이는 입력과 유사한 예시를 벡터 유사도 기반으로 선택합니다.
예제: 동적 감정 분류기
from langchain.prompts.example_selector import SemanticSimilarityExampleSelector
from langchain_community.vectorstores import FAISS
from langchain_ollama import OllamaEmbeddings
# 임베딩 모델 설정 (OpenAIEmbeddings는 API 키 필요)
embeddings = OllamaEmbeddings(model='exaone3.5')
# 예시 벡터화 및 저장
selector = SemanticSimilarityExampleSelector.from_examples(
examples,
embeddings,
FAISS,
k=2 # 가장 유사한 2개의 예시 선택
)
# 동적 FewShotPromptTemplate 생성
dynamic_prompt = FewShotPromptTemplate(
example_selector=selector,
example_prompt=example_prompt,
prefix="다음 텍스트의 감정을 분류하세요. 감정은 positive, negative, neutral 중 하나로 선택합니다.\n\n",
suffix="\n입력: {input}\n출력:",
input_variables=["input"],
example_separator="\n\n"
)
# 테스트
print(dynamic_prompt.format(input="이 책 정말 감동적이에요!"))
다음 텍스트의 감정을 분류하세요. 감정은 positive, negative, neutral 중 하나로 선택합니다.
입력: 이 영화 정말 재미있어요!
출력: positive
입력: 음식이 너무 맛없어서 실망했어요.
출력: negative
입력: 이 책 정말 감동적이에요!
출력:
이 경우, 입력과 의미적으로 가까운 예시(예: “이 영화 정말 재미있어요!”)가 선택되어 모델의 성능을 더욱 향상시킬 수 있습니다.
주의사항 및 팁
- 예시의 품질: 예시는 명확하고 작업의 의도를 잘 반영해야 합니다. 모호한 예시는 모델을 혼란스럽게 할 수 있습니다.
- 예시 개수: 너무 많은 예시는 토큰 한도를 초과하거나 모델을 과부하로 만들 수 있으니, 보통 3~5개가 적당합니다.
- 형식 일관성: example_prompt와 suffix의 형식이 일치해야 모델이 출력을 예측하기 쉽습니다.
FewShotPromptTemplate은 LangChain에서 언어 모델의 잠재력을 극대화하는 강력한 도구입니다. 적은 예시로도 모델이 작업을 학습하고, 일관성 있는 출력을 생성하도록 유도할 수 있습니다. 이 챕터에서 다룬 기본 예제와 고급 활용법을 바탕으로, 여러분만의 창의적인 프롬프트를 설계해보세요.