개발/AI&Chatbot

Day09. Chatbot 만들기

honeypeach 2025. 10. 27. 10:35

💬 LLM은 “다음 단어를 확률로 예측하는 똑똑한 계산기”이고,

💬 Transformer는 “문장 전체를 한눈에 보고 관계를 계산하는 뇌 구조”,

💬 Token은 “LLM이 세상을 이해하는 최소 단위”입니다.

💬 그리고 GPT-4o는 이 모든 걸 통합해,

글·그림·소리를 동시에 이해하는 “만능 언어 모델”로 발전했습니다.


1. 먼저 OpenAI 라이브러리를 설치합니다.

pip install openai -q
from google.colab import userdata

try:
    api_key = userdata.get('OPENAI_API_KEY')
    print("✅ API Key 불러오기 성공")
    print(f"키 앞 4자리: {api_key[:4]}...")  # 확인용
except Exception as e:
    print(f"❌ API Key를 불러올 수 없습니다: {e}")
    print("Colab의 🔑 Secrets 메뉴에서 'OPENAI_API_KEY'를 등록했는지 확인하세요.")

2. 라이브러리 import하기

# 맨처음에 라이브러리 import
import os # openai API 키를 받아오기 위한 라이브러리
from openai import OpenAI # openai의 api를 사용하기 위한 라이브러리

3. api키 적용하기

# 이 api를 해당 코드에 적용을 하겠다.
os.environ['OPENAI_API_KEY'] = ''

4. GPT 모델과 통신할 수 있는 클라이언트(client) 객체를 생성합니다.

# 머신러닝 모델 사용한것과 비슷하게
# model = logisticregression()
client = OpenAI()

5. 이제 ChatGPT 모델을 불러와 대화 내용을 생성합니다.
(여기서는 gpt-4o-mini 모델을 사용했습니다.)

이 부분을 변경하여 다양한 프롬프트를 생성할 수 있습니다.

# chatgpt가 응답을 하는 변수
response = client.chat.completions.create(
    model = 'gpt-4o-mini', # model은 gpt 4o mini
    messages = [{
        'role' : 'user',
        'content' : '안녕 ChatGPT'
    }] # 챗봇 설정 우리가 chatgpt에게 안녕 ChatGPT라고 입력!
)
# response '안녕 ChatGPT'에 대한 결과값이 들어있음

6. ChatGPT가 생성한 결과를 출력합니다.

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

 


실전 예제

- role과 system 부여

conversation = [
    {"role": "system", "content": "너는 에세이 전문가야. 대형 출판업계 전문가 역할을 해줘"}, # 전반적인 대화의 맥락
    {"role": "user", "content": "에세이를 처음 쓰는데, 어떻게 작성해야할지 모르겠어요."}, # 첫번째 질문
    {"role": "assistant", "content": "주제를 정하고 나면 어떻게 도입부를 시작하는 게 좋을까요?"}, # ai가 답변할만한 답변을 예상해서 적음
    {"role": "user", "content": "잘 읽히는 글을 쓰고 싶어요."}, # 두번째 질문
    {"role": "assistant", "content": "주제를 정하고 나면 어떻게 도입부를 시작하는 게 좋을까요?"}, # ai가 답변할만한 답변을 예상해서 적음
    {"role": "user", "content": "잘 읽히는 글을 쓰고 싶어요."}, # 세번째 질문
    {"role": "assistant", "content": "가장 많이 판매된 작품에 대한 예시와 이유를 분석해서 설명해줄래요?"}, # ai가 답변할만한 답변을 예상해서 적음

]


response = client.chat.completions.create(
    model="gpt-4o-mini",
    messages=conversation,
    temperature=0.6
)

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

- 프롬프트 가이드

from openai import OpenAI

# 1. 사용자 역할 설정
my_role = "여행 가이드"

# 2. 사용자 질문 입력
user_input = input("✈️ 여행 관련 질문을 입력하세요: ")

# 3. System 프롬프트 구성
system_prompt = f"""
너는 {my_role}야.
한국인 여행자를 위한 맞춤 여행 설계 전문가로 행동해줘.

[가이드라인]
- 여행 지역, 기간, 예산, 동반자 정보를 파악해 일정 구성
- 교통수단·음식·숙소·계절 정보 포함
- 현실적인 이동 동선 고려
- 응답은 아래 형식으로 정리

[응답 형식]
1️⃣ 여행 개요
2️⃣ 추천 일정 (일자별)
3️⃣ 추천 음식·명소
4️⃣ 여행 꿀팁과 주의사항
"""

# 4. ChatGPT 호출
res = client.chat.completions.create(
    model="gpt-4o-mini",
    messages=[
        {"role": "system", "content": system_prompt},
        {"role": "user", "content": user_input}
    ]
)

# 5. 출력
print("\n🌍 여행 가이드의 추천:")
print(res.choices[0].message.content)

- 나에게 잘 맞는 temperature와 top_p 범위 파악하기

prompt = "인공지능이 사회에 미칠 영향에 대해 설명해줘."

settings = [
    {"temperature": 0.2, "top_p": 0.5, "desc": "분석형"},
    {"temperature": 0.9, "top_p": 1.0, "desc": "창의형"}
]

for s in settings:
    res = client.chat.completions.create(
        model="gpt-4o-mini",
        temperature=s["temperature"],
        top_p=s["top_p"],
        max_tokens=150,
        messages=[
            {"role": "system", "content": "너는 사회학자야."},
            {"role": "user", "content": prompt}
        ]
    )
    print(f"\n🧭 모드: {s['desc']}\n{res.choices[0].message.content}\n")

 

temperature와 top_p에 따른 차이점 분석

더보기
prompt = "기록이 인간의 생태계에 미칠 영향에 대해 설명해줘."

settings = [
    {"temperature": 0.1, "top_p": 0.2, "desc": "매우 안정형 (예측 중심)"},
    {"temperature": 0.2, "top_p": 0.3, "desc": "안정형"},
    {"temperature": 0.3, "top_p": 0.4, "desc": "분석형"},
    {"temperature": 0.4, "top_p": 0.5, "desc": "균형형 (안정성 위주)"},
    {"temperature": 0.5, "top_p": 0.6, "desc": "균형형 (안정성+다양성)"},
    {"temperature": 0.6, "top_p": 0.7, "desc": "조금 창의적"},
    {"temperature": 0.7, "top_p": 0.8, "desc": "창의형"},
    {"temperature": 0.8, "top_p": 0.85, "desc": "매우 창의적"},
    {"temperature": 0.9, "top_p": 0.9, "desc": "자유로운 창의형"},
    {"temperature": 1.0, "top_p": 1.0, "desc": "완전 창의형 (다양성 극대)"}
]

for s in settings:
    res = client.chat.completions.create(
        model="gpt-4o-mini",
        temperature=s["temperature"],
        top_p=s["top_p"],
        max_tokens=150,
        messages=[
            {"role": "system", "content": "너는 기록학자야."},
            {"role": "user", "content": prompt}
        ]
    )
    print(f"\n🧭 모드: {s['desc']}\n{res.choices[0].message.content}\n")

1️⃣ Temperature (0.0 ~ 1.0)

  • 의미: 모델이 다음 단어를 선택할 때 불확실성을 얼마나 허용할지 결정
  • 낮을수록(0~0.3):
    • 선택지가 제한적 → 예측 가능, 안정적, 반복적인 표현
    • 분석적, 사실 기반, 정답 위주 답변이 많음
    • ex: "기록은 정보를 남기고, 사회 구조를 유지하는 역할을 한다."
  • 중간(0.4~0.6):
    • 어느 정도 창의성과 안정성을 균형 → 안정성+약간의 다양성
    • ex: "기록은 인간의 기억과 경험을 이어주는 매개체로, 사회적 관계에 영향을 미친다."
  • 높을수록(0.7~1.0):
    • 선택 폭이 넓음 → 창의적, 예상치 못한 표현, 다양성
    • 문장 구조나 단어 선택이 자유로움
    • ex: "기록은 인간 생태계의 흐름 속에 은밀한 파동을 만들어, 생각과 관계의 지도를 바꾼다."

2️⃣ Top_p (0.0 ~ 1.0, nucleus sampling)

  • 의미: 모델이 단어를 선택할 때 상위 확률 토큰을 누적하여 p 이상이 될 때까지만 후보로 고려
  • 낮을수록(0~0.5):
    • 선택 가능한 단어가 제한 → 예측 가능, 안정적
    • 낮은 top_p + 낮은 temperature → 거의 정형화된 답
  • 중간(0.5~0.8):
    • 상위 토큰 50~80% 범위 내에서 다양성 허용 → 균형형 답변
  • 높을수록(0.9~1.0):
    • 거의 모든 토큰 후보 고려 → 창의적, 예상치 못한 단어 선택 가능
    • temperature가 높으면 더욱 자유롭게 변주

🔹 요약

조합특징예시

낮은 temp + 낮은 top_p 안정적, 예측 가능 “기록은 정보를 남기고 사회적 구조를 유지한다.”
중간 temp + 중간 top_p 안정성과 다양성 균형 “기록은 인간의 기억과 경험을 이어주는 매개체다.”
높은 temp + 높은 top_p 창의적, 예상치 못한 표현 “기록은 인간 생태계의 흐름 속에 은밀한 파동을 만들어 관계의 지도를 바꾼다.”

💡 직관적인 이해:

  • temperature  창의성 강도
  • top_p  선택 범위 폭
  • 둘 다 높으면 완전 자유로운 답변, 둘 다 낮으면 예측 가능한 안전 답변
728x90