반응형
요즘 AI 서비스, 특히 대규모 언어 모델(LLM) 이 핫하죠. “AI가 업무 효율을 10배로 높여준다” 같은 이야기를 주변에서 많이 들어 보셨을 텐데요. 막상 LLM을 다뤄보면, 프롬프트를 어떻게 주느냐에 따라 결과물이 천차만별이라는 걸 느끼실 거예요.
오늘은 LLM을 더 똑똑하게 쓸 수 있게 도와주는 FewShotPromptTemplate과, 모델이 생성하는 출력을 실시간으로 확인할 수 있는 StreamingStdOutCallbackHandler를 소개해 보려고 합니다. 최대한 어렵지 않게 설명해 드릴 테니, 함께 차근차근 알아봅시다.
1. FewShotPromptTemplate: LLM에게 힌트를 주는 정석 방법
“FewShot”이 뭐길래?
- FewShot은 말 그대로 “적은 예시”를 뜻해요. 모델에게 문제 유형에 맞는 예시를 몇 개 주고, 그 예시를 바탕으로 새로운 입력에 대한 답변을 더 정교하게 뽑아내도록 유도하는 기법이죠.
- 예시(샘플 데이터) 덕분에 모델은 “아, 이런 식으로 답변을 만들어야 하는구나!” 라고 감을 잡게 됩니다.
FewShotPromptTemplate이 하는 일
- 프롬프트(Prompt) 안에 샘플 예시들을 적절히 배치하는 템플릿을 만드는 과정이에요.
- 예를 들어, 영화 리뷰를 감정(긍정/부정)으로 분류해 주길 원한다고 가정해볼까요?
"이 영화는 스토리가 짜임새 있고 배우 연기도 좋아서 즐겁게 봤어요."
=> 감정: 긍정
"정말 지루했고, 시간 낭비였어요."
=> 감정: 부정
- 위처럼 모델이 이해하기 쉬운 구조로 예시를 미리 넣어둔 다음, 실제로 분류하고 싶은 리뷰를 넣는 식으로 템플릿을 짜면 됩니다.
왜 써야 할까?
- 정확도 향상
모델이 어떤 답변을 기대하는지 예시로 알려주면, 원하는 방향으로 답변을 맞춰줄 확률이 높아집니다. - 유연한 적용
영화 리뷰뿐만 아니라, 요약, 번역, 스타일 변환 등 다양한 작업에 간단하게 확장해서 쓸 수 있어요. - 쉽고 빠르게
별도의 복잡한 모델 튜닝 없이도, 프롬프트 설계만 잘 하면 꽤 훌륭한 결과를 뽑아낼 수 있답니다.
2. StreamingStdOutCallbackHandler: 결과가 나오는 과정을 실시간으로 확인하기
실시간 스트리밍이 왜 필요할까?
- 보통 AI 모델이 텍스트를 생성할 때 한 줄 한 줄 계산해서 만들어냅니다. 그런데 우리가 흔히 보는 “결과”는 최종적으로 합쳐진 텍스트죠.
- StreamingStdOutCallbackHandler는 이 중간 과정을 실시간으로 보여주는 도구입니다.
어떤 점이 좋을까?
- 진행 상황 모니터링
모델이 천천히 대답을 만들어내는 과정을 그대로 볼 수 있어서, 진행 상황을 파악하기 편해집니다. - 디버깅에 용이
중간에 모델이 이상한 답변 방향으로 튀는 걸 눈치채고, 재빠르게 멈출 수도 있어요. - 사용자 경험 개선
서비스를 만들 때, 사용자에게 “실시간으로 답변을 생성 중”이라는 느낌을 줄 수 있습니다.
예) 챗GPT가 한 자 한 자 타이핑 치는 것처럼 보여주는 인터페이스
3. 실제 활용 시나리오
그럼 이 두 가지를 결합하면 어떤 그림이 나올까요? 간단히 예시 코드를 한 번 살펴보겠습니다.
from langchain.prompts import FewShotPromptTemplate
from langchain.callbacks import StreamingStdOutCallbackHandler
from langchain.llms import OpenAI
# 1. FewShotPromptTemplate 설정
examples = [
{"review": "이 영화는 정말 재미있었어요!", "sentiment": "긍정"},
{"review": "스토리가 엉망이고 배우들의 연기도 형편없었어요.", "sentiment": "부정"},
]
prompt_template = FewShotPromptTemplate(
examples=examples,
example_prompt="리뷰: {review}\n감정: {sentiment}\n",
prefix="영화 리뷰를 보고 감정을 분석해주세요.\n\n",
suffix="리뷰: {input}\n감정:",
input_variables=["input"],
)
# 2. StreamingStdOutCallbackHandler 설정
callbacks = [StreamingStdOutCallbackHandler()]
# 3. 모델 불러오기 (OpenAI 예시)
llm = OpenAI(callbacks=callbacks, streaming=True)
# 4. 프롬프트로 질의하기
my_review = "음향 효과와 액션이 놀라웠지만, 결말이 조금 아쉬웠어요."
prompt = prompt_template.format(input=my_review)
response = llm(prompt)
print("\n최종 결과:", response)
- FewShotPromptTemplate에다가 리뷰와 감정을 짝지은 예시 2개를 넣었습니다.
- prefix와 suffix를 이용해 실제 유저가 입력할 부분({input})을 제외한 텍스트를 정의해줍니다.
- 모델에서 답변을 생성할 때, StreamingStdOutCallbackHandler를 적용하면, 터미널(콘솔)에서 실시간으로 결과가 나오는 걸 확인할 수 있습니다.
4. 알아두면 좋은 팁
- FewShot 예시의 다양성
예시 리뷰를 너무 비슷하게 주면, 모델이 특정 표현에만 맞춰버릴 수 있어요. 가능하면 다양한 형식을 넣어 주세요. - 길이는 짧게, 내용은 명확하게
템플릿이 너무 길면 모델이 문맥 파악에 애를 먹을 수 있습니다. 간결하지만 핵심 정보를 담도록 신경 써보세요. - 실시간 출력 vs. 성능
Streaming 기능을 켜면 중간 출력이 가능해지지만, 경우에 따라서는 응답 속도가 조금 느려질 수도 있어요.
프로젝트 성격에 맞춰서 켜고 끄는 걸 조절하시면 됩니다.
오늘은 FewShotPromptTemplate과 StreamingStdOutCallbackHandler가 정확히 뭔지, 그리고 실제로 어떻게 쓰면 좋은지 간단히 살펴봤습니다.
- FewShotPromptTemplate: LLM이 원하는 대답을 더 잘 내도록 힌트를 주는 역할
- StreamingStdOutCallbackHandler: 모델의 답변 생성 과정을 실시간으로 보여주는 툴
이 두 가지를 잘 활용하시면, 프롬프트 엔지니어링에 대한 이해도 높아지고, 모델이 이상하게 답변하는 상황도 미리 캐치하기 쉬워집니다.
반응형
'Data Analysis > AI' 카테고리의 다른 글
LangChain의 메모리 개념과 ConversationBufferMemory 완벽 이해하기 (0) | 2025.01.29 |
---|---|
OpenAI 사용량 추적의 비밀병기: get_openai_callback (0) | 2025.01.28 |
LLM 활용도를 높이는 꿀팁: set_llm_cache, set_debug, 그리고 InMemoryCache (0) | 2025.01.28 |
LLM langchain - OutputParser and LCEL (0) | 2025.01.19 |
LLM - LangChain에서 Prompt Template을 어떻게 활용하고 구성할 수 있는지 (1) | 2025.01.15 |
댓글