본문 바로가기
Data Analysis/AI

LLM을 제대로 활용하는 꿀팁: FewShotPromptTemplate & StreamingStdOutCallbackHandler

by Hagrid 2025. 1. 28.
반응형

요즘 AI 서비스, 특히 대규모 언어 모델(LLM) 이 핫하죠. “AI가 업무 효율을 10배로 높여준다” 같은 이야기를 주변에서 많이 들어 보셨을 텐데요. 막상 LLM을 다뤄보면, 프롬프트를 어떻게 주느냐에 따라 결과물이 천차만별이라는 걸 느끼실 거예요.

오늘은 LLM을 더 똑똑하게 쓸 수 있게 도와주는 FewShotPromptTemplate과, 모델이 생성하는 출력을 실시간으로 확인할 수 있는 StreamingStdOutCallbackHandler를 소개해 보려고 합니다. 최대한 어렵지 않게 설명해 드릴 테니, 함께 차근차근 알아봅시다.


1. FewShotPromptTemplate: LLM에게 힌트를 주는 정석 방법

“FewShot”이 뭐길래?

  • FewShot은 말 그대로 “적은 예시”를 뜻해요. 모델에게 문제 유형에 맞는 예시를 몇 개 주고, 그 예시를 바탕으로 새로운 입력에 대한 답변을 더 정교하게 뽑아내도록 유도하는 기법이죠.
  • 예시(샘플 데이터) 덕분에 모델은 “아, 이런 식으로 답변을 만들어야 하는구나!” 라고 감을 잡게 됩니다.

FewShotPromptTemplate이 하는 일

  • 프롬프트(Prompt) 안에 샘플 예시들을 적절히 배치하는 템플릿을 만드는 과정이에요.
  • 예를 들어, 영화 리뷰를 감정(긍정/부정)으로 분류해 주길 원한다고 가정해볼까요?

 

"이 영화는 스토리가 짜임새 있고 배우 연기도 좋아서 즐겁게 봤어요."
=> 감정: 긍정

"정말 지루했고, 시간 낭비였어요."
=> 감정: 부정

 

  • 위처럼 모델이 이해하기 쉬운 구조로 예시를 미리 넣어둔 다음, 실제로 분류하고 싶은 리뷰를 넣는 식으로 템플릿을 짜면 됩니다.

왜 써야 할까?

  1. 정확도 향상
    모델이 어떤 답변을 기대하는지 예시로 알려주면, 원하는 방향으로 답변을 맞춰줄 확률이 높아집니다.
  2. 유연한 적용
    영화 리뷰뿐만 아니라, 요약, 번역, 스타일 변환 등 다양한 작업에 간단하게 확장해서 쓸 수 있어요.
  3. 쉽고 빠르게
    별도의 복잡한 모델 튜닝 없이도, 프롬프트 설계만 잘 하면 꽤 훌륭한 결과를 뽑아낼 수 있답니다.

2. StreamingStdOutCallbackHandler: 결과가 나오는 과정을 실시간으로 확인하기

실시간 스트리밍이 왜 필요할까?

  • 보통 AI 모델이 텍스트를 생성할 때 한 줄 한 줄 계산해서 만들어냅니다. 그런데 우리가 흔히 보는 “결과”는 최종적으로 합쳐진 텍스트죠.
  • StreamingStdOutCallbackHandler는 이 중간 과정을 실시간으로 보여주는 도구입니다.

어떤 점이 좋을까?

  1. 진행 상황 모니터링
    모델이 천천히 대답을 만들어내는 과정을 그대로 볼 수 있어서, 진행 상황을 파악하기 편해집니다.
  2. 디버깅에 용이
    중간에 모델이 이상한 답변 방향으로 튀는 걸 눈치채고, 재빠르게 멈출 수도 있어요.
  3. 사용자 경험 개선
    서비스를 만들 때, 사용자에게 “실시간으로 답변을 생성 중”이라는 느낌을 줄 수 있습니다.
    예) 챗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. 알아두면 좋은 팁

  1. FewShot 예시의 다양성
    예시 리뷰를 너무 비슷하게 주면, 모델이 특정 표현에만 맞춰버릴 수 있어요. 가능하면 다양한 형식을 넣어 주세요.
  2. 길이는 짧게, 내용은 명확하게
    템플릿이 너무 길면 모델이 문맥 파악에 애를 먹을 수 있습니다. 간결하지만 핵심 정보를 담도록 신경 써보세요.
  3. 실시간 출력 vs. 성능
    Streaming 기능을 켜면 중간 출력이 가능해지지만, 경우에 따라서는 응답 속도가 조금 느려질 수도 있어요.
    프로젝트 성격에 맞춰서 켜고 끄는 걸 조절하시면 됩니다.

오늘은 FewShotPromptTemplateStreamingStdOutCallbackHandler가 정확히 뭔지, 그리고 실제로 어떻게 쓰면 좋은지 간단히 살펴봤습니다.

  • FewShotPromptTemplate: LLM이 원하는 대답을 더 잘 내도록 힌트를 주는 역할
  • StreamingStdOutCallbackHandler: 모델의 답변 생성 과정을 실시간으로 보여주는 툴

이 두 가지를 잘 활용하시면, 프롬프트 엔지니어링에 대한 이해도 높아지고, 모델이 이상하게 답변하는 상황도 미리 캐치하기 쉬워집니다.

반응형

댓글