LLM 개발 입문 (2) - 1

루나·2026년 2월 1일

LLM STUDY

목록 보기
2/31

본 포스팅은 "Do it! LLM을 활용한 AI 에이전트 개발 입문"을 독학하며 쓴 글입니다.
내돈내산 포스팅임을 참고해주시면 감사하겠습니다.
2026년 2월 1일 기준으로 작성되었습니다.


Chapter 2

OpenAI의 API로 챗봇 만들기

본 포스팅에서는 프롬프트 엔지니어링에 대해서 다뤄보겠습니다

1. GPT에게 역할 부여하기

GPT는 messages 매개변수에 어떤 대화 기록을 넣는지에 따라 답변이 달라진다
이전 포스트에서는 system의 content에 "You are a helpful assistant"라고 입력해서 일반적인 시스템 프롬프트로 설정했다
하지만 이 content의 값이 달라진다면 답변이 달라지는 것을 확인할 수 있다
이렇게 사용자가 원하는 답변을 하도록 문장을 입력하고 설계하는 작업을 프롬프트 엔지니어링이라고 한다

아래와 같이 2가지 시스템 프롬프트를 준비하고 답변을 확인해보자

  • GPT에게 배트맨 속 조커 역할 부여하기

  • GPT에게 백설공주 속 마법 거울 역할 부여하기

이렇게 프롬프트를 다르게 하고 동일한 질문을 제공하고 답변이 어떻게 달라지는지 확인해보자

# mirror_in_snow_white.py
from openai import OpenAI
from dotenv import load_dotenv
import os

load_dotenv()

api_key = os.getenv('OPENAI_API_KEY')

client = OpenAI(api_key=api_key)

response = client.chat.completions.create(
  model = "gpt-4o",
  temperature = 0.9,
  messages = [
    {"role" : "system", "content" : "너는 백설공주 이야기 속의 마법 거울이야. 그 이야기의 캐릭터에 부합하게 답변해줘"},
    {"role" : "user", "content" : "세상에서 누가 제일 아름답니?"},
  ]
)

print(response)

print('------')
print(response.choices[0].message.content)

우선 언어 모델이 더 참신한 답변을 할 수 있도록 temperature = 0.9로 설정하고, messages의 content를 변경하였다

위와 같이 코드를 진행하면 결과는 다음과 같이 나오는 것을 확인할 수 있다

오, 나의 여왕이시여. 이 세상에서 가장 아름다우신 분은 바로 당신이십니다. 
그러나 숲 속 깊은 곳, 일곱 난쟁이들과 함께 지내는 백설공주도 그 아름다움을 간직하고 있나이다. 그녀의 미를 조심하시옵소서.

이제 프롬프트를 바꿔서 배트맨에 나오는 조커 역할을 GPT에게 부여하고 질문에 대한 답변을 확인해보자

# joker_in_batman.py
from openai import OpenAI
from dotenv import load_dotenv
import os

load_dotenv()

api_key = os.getenv('OPENAI_API_KEY')

client = OpenAI(api_key=api_key)

response = client.chat.completions.create(
  model = "gpt-4o",
  temperature = 0.9,
  messages = [
    {"role" : "system", "content" : "너는 배트맨에 나오는 조커야. 조커의 악당 캐릭터에 맞게 답변해줘"},
    {"role" : "user", "content" : "세상에서 누가 제일 아름답니?"},
  ]
)

print(response)

print('------')
print(response.choices[0].message.content)
하하하! 아름다움이라... 그건 웃음 뒤에 숨겨진 혼란과 광기겠지. 
세상에서 제일 아름다운 건 바로 혼돈이야! 모든 것이 무질서하게 얽히고설킨 그 순간 말이지. 그리고 그 혼돈 속에서 나, 조커가 가장 빛나는 법이지! 하하하!

이렇게 시스템 프롬프트에 따라 같은 질문을 해도 답변이 다르게 나올 수 있다는 것을 확인할 수 있다
따라서, 사용자가 특정 목적에 맞는 답변을 받기를 원한다면 언어모델에 특정 역할을 설정하는 것이 중요하다!!

2. 원샷 프롬프팅과 퓨샷 프롬프팅 적용하기

  • 원샷 프롬프팅 : GPT가 원하는 패턴에 맞춰 답변할 수 있도록 예시를 한 번 제시해서 유도하는 방식

  • 퓨샷 프롬프팅 : 예시를 여러 번 알려주는 방식

두 프롬프팅 방식의 차이를 알아보기 위해 세 가지 버전의 코드를 작성해보자

(1) 프롬프팅을 하지 않은 버전
(2) 예시 답변을 한 번만 제공한 원샷 프롬프팅
(3) 예시 답변을 여러 번 제공한 퓨샷 프롬프팅

(1) 프롬프팅을 하지 않은 버전

# no_prompt.py
from openai import OpenAI
from dotenv import load_dotenv
import os

load_dotenv()

api_key = os.getenv('OPENAI_API_KEY')

client = OpenAI(api_key=api_key)

response = client.chat.completions.create(
  model = "gpt-4o",
  temperature = 0.9,
  messages = [
    {"role" : "system", "content" : "너는 유치원생이야. 유치원생처럼 답변해줘"},
    {"role" : "user", "content" : "오리"},
  ]
)

print(response.choices[0].message.content)

결과

꽥꽥! 오리 재미있어! 물에서 수영해! 꽥꽥! 🦆💦

(2) 예시 답변을 한 번만 제공한 원샷 프롬프팅

# one_shot.py
from openai import OpenAI
from dotenv import load_dotenv
import os

load_dotenv()

api_key = os.getenv('OPENAI_API_KEY')

client = OpenAI(api_key=api_key)

response = client.chat.completions.create(
  model = "gpt-4o",
  temperature = 0.9,
  messages = [
    {"role" : "system", "content" : "너는 유치원생이야. 유치원생처럼 답변해줘"},
    {"role" : "user", "content" : "참새"},
    {"role" : "assistant", "content" : "짹짹"},
    {"role" : "user", "content" : "오리"},
  ]
)

print(response.choices[0].message.content)

결과

꽥꽥!

하지만 이 경우에 일반적이지 않은 동물에 대해 묻게 된다면 제대로 답을 못할 때도 있다

동물답변성공여부
호랑이어흥! 무서워! 하지만 동물원에서 보면 멋져!X
스르르르! 무서워! 하지만 안 물면 괜찮아!X

이런 단점을 극복하기 위해서 예시를 여러 번 제공하는 퓨샷 프롬프팅이 사용된다

(3) 예시 답변을 여러 번 제공한 퓨샷 프롬프팅

# few_shot.py
from openai import OpenAI
from dotenv import load_dotenv
import os

load_dotenv()

api_key = os.getenv('OPENAI_API_KEY')

client = OpenAI(api_key=api_key)

response = client.chat.completions.create(
  model = "gpt-4o",
  temperature = 0.9,
  messages = [
    {"role" : "system", "content" : "너는 유치원생이야. 유치원생처럼 답변해줘"},
    {"role" : "user", "content" : "참새"},
    {"role" : "assistant", "content" : "짹짹"},
    {"role" : "user", "content" : "말"},
    {"role" : "assistant", "content" : "히이이잉"},
    {"role" : "user", "content" : "개구리"},
    {"role" : "assistant", "content" : "개굴개굴"},
    {"role" : "user", "content" : "뱀"},
  ]
)

print(response.choices[0].message.content)

결과

동물답변성공여부
호랑이어흥!O
스르르르!O

기존 방식과 다르게 호랑이와 뱀에 대해서도 성공적으로 답변이 생성되는 것을 확인할 수 있다

3. 마무리

책은 다음 장에서 실제로 챗봇을 만드는 실습을 하지만 포스팅이 너무 길어질 것 같아서 다음 포스팅으로 넘기도록 하겠습니다

profile
Per ardua ad astra

0개의 댓글