Generative AI/Prompt Engineering

OpenAI API Chat Format으로 챗봇 만들기 - 프롬프트 엔지니어링 가이드 #5

eco7T 2025. 5. 13. 11:06
반응형

이번에는 프롬프트 엔지니어링 마지막 이야기로, OpenAI API의 "Chat Format"을 활용한 대화형 챗봇(ChatBot)을 구현해 보도록 할게요. 생성형 AI을 이해하는 데에 있어서 대화형 챗봇은 아주 좋은 예가 될 거예요.

반응형

 

OpenAI API Chat Format으로 챗봇 만들기

  역할 기반 메시지 구성

Chat API의 핵심은 role 기반 메시지 시스템이에요. 모든 대화는 다음과 같은 역할로 구분됩니다.

  • system: 초기 설정과 규칙을 정합니다. 
  • user: 사용자가 입력한 메시지입니다.
  • assistant: 모델이 생성한 답변입니다.

이 구조를 활용하면 원하는 성격과 기능을 가진 챗봇을 쉽게 설계할 수 있죠, 다음 예시 코드를 보면 잘 이해할 수 있을 거예요.

messages = [
    {"role": "system", "content": "You are friendly chatbot."},
    {"role": "user", "content": "Hi, my name is Isa"}
]

 

 

 

 

 

 

  get_completion로 챗봇 구성

가장 기본적인 대화 챗봇은 단일 메시지를 모델에 전달해 응답을 받는 방식입니다.

def get_completion_from_messages(messages, model="gpt-4o-mini", temperature=0):
    response = openai.chat.completions.create(
        model=model,
        messages=messages,
        temperature=temperature,
    )
    return response.choices[0].message.content
  • GPT 모델과의 대화를 위한 메시지 구성은 이미 이전부터 다뤄봤기 때문에 위와 같은 코드 구성에 대해서는 너무 익숙합니다. 다만, message안에 역할이 추가되었다는 것이 특징인 거죠.
  • 위 코드에서 pormpt에 이전에 다뤄왔던 프롬프트를 입력하게 됩니다.

 

 

 

 

 

 

  챗봇의 성격(역할) 설정하기

이제 system 역할을 활용하여 챗봇에게 개성을 부여해 볼게요. 

messages =  [  
{'role':'system', 'content':'당신은 부산 사투리로 말합니다.'},    
{'role':'user', 'content':'유머를 말해 주세요.'} ]

response = get_completion_from_messages(messages, temperature=1)
print(response)

위 코드처럼 system에 성격을 부여했어요.

자 그럼 이 코드를 실행하면 GPT 실제로 부산 사투리로 유머를 말해 줄지 볼게요.

챗봇 만들기 (Chat Completion)-01
챗봇 만들기 (Chat Completion)-01

 

GPT 유머가 실제로 그다지 재미있지는 않겠지만, 부산(?) 사투리로 말하고 있는 것은 분명합니다. 역할을 수행하는 거죠.

 

여기에서 또 하나 눈여겨볼 것은 바로 temporature의 역할이에요.

  • temperature 값이 낮을수록(예: 0~0.3) GPT 모델은 가장 확률이 높은, 즉 가장 일반적이고 예측 가능한 답변을 생성하게 됩니다. 시살에 기반한 정확한 정보나 긴 문장의 답변을 할 경우 일관된 답변을 유지하려 합니다. 
  • 반면 값이 높을 경우(예: 0.7~1), GPT 모델은 좀 더 다양하고 창의적이며, 때로는 예상치 못한 답변을 생성하게 됩니다. 브레이스토밍이나 기타 뭔가 아이디어가 필요한 답변을 원할 때 적용해 볼 수 있습니다. 물론, 이때는 주제를 벗어나거나 비논리적인 대답을 얻을 수도 있음을 이해하고 있어야 합니다.

 

 

 

 

  대화 맥락 유지하기

지금까지 기본적인 대화 챗봇을 만들어 봤어요. 그런데, 대화라는 것은 맥락을 이해해야 지속할 수 있을 거예요. 한번 대화를 나누고 이어서 대화하려는데, GPT 모델이 이전 내용을 까맣게 잊어버리고 엉뚱한 소리를 하면 곤란하니까 말이죠.

 

다음과 같이 대화를 구성해 볼게요.

앞에서 사용했던 get_completion_from_messages 함수를 그대로 사용하고요, 다음과 같이 대화를 시도합니다.

messages = [
    {'role':'system', 'content':'당신은 상냥한 나만의 챗봇입니다.'},
    {'role':'user', 'content':'만나서 반가워, 내 이름은 eco7이야.'}
]
response = get_completion_from_messages(messages, temperature=1)
print(f"챗봇: {response}")

위 코드를 실행하니, GPT는 다음과 같이 응답합니다.

챗봇 만들기 (Chat Completion)-02
챗봇 만들기 (Chat Completion)-02

 

 

맥락을 유지한다는 것은 정보를 기억하는 것이 기본이 되므로, 내 이름을 기억해야 합니다. 

다음과 같이 앞에서 사용했던 형식대로 메시지를 구성해서 GPT에게 질문해 볼게요.

messages = [
    {'role':'user', 'content':'그래, 너 혹시 내 이름을 기억하니?'}
]
response = get_completion_from_messages(messages, temperature=1)
print(f"챗봇: {response}")

코드를 실행해서 GPT가 어떻게 대답하는지 보죠.

챗봇 만들기 (Chat Completion)-03
챗봇 만들기 (Chat Completion)-03

 

 

기억을 못 한다고 합니다. 이와 같이 GPT 모델과 대화의 맥락을 유지하려면 뭔가 다른 조치가 필요해요. 다음과 같이 간단하게 구성해 볼 수 있어요.

messages.append({'role': 'assistant', 'content': response})
messages.append({'role': 'user', 'content': '그래, 너 혹시 내 이름을 기억하니?'})

이와 같이 메시지를 새로 구성하는 것이 아니라 append를 사용해서 추가하는 거예요.

이러면 어떻게 대답하는지 확인해 보죠.

챗봇 만들기 (Chat Completion)-04
챗봇 만들기 (Chat Completion)-04

 

앞에서 알려줬던 내 이름은 정확하게 기억하고 있습니다.

 

그런데, 생각해 보면 기본적인 대화 유지를 위해 프롬프트를 위와 같이 작성하려면 대화가 길어지거나 기억할 정보가 많다면 프롬프트가 매우 길어질 거예요. 프롬프트가 길어진다는 것은 결국 입력 Token 수의 증가로 이어져서 리소스와 비용 모두에 부담이 되겠죠. 때문에 이러한 방법 이외에 다른 방법들이 필요할 것입니다.

이러한 부분은 다음 LLM (대규모 언어 모델)에 대해 다뤄보면서 함께 짚어 보기로 하고 오늘은 여기에서 프롬프트에 대한 이야기를 마칩니다.

 

 

 

 

 


2025.04.22 - [Generative AI/Prompt Engineering] - 프롬프트 엔지니어링으로 챗GPT와 OpenAI API 활용 - GPT에게 원하는 답을 얻는 법 #1

 

프롬프트 엔지니어링으로 챗GPT와 OpenAI API 활용 - GPT에게 원하는 답을 얻는 법 #1

이번 글부터는 최근 이슈가 되고 있는 생성형 AI와 관련한 기술에 대해 시작해 보겠습니다. 그중 오늘부터 몇 회에 걸쳐 프롬프트 엔지니어링에 살펴보겠습니다. 물론, 가장 많이 사용되는 OpenAI

eco7t.tistory.com

2025.04.25 - [Generative AI/Prompt Engineering] - OpenAI GPT 출력 형식 설정으로 JSON 파싱과 프롬프트 엔지니어링 #2

 

OpenAI GPT 출력 형식 설정으로 JSON 파싱과 프롬프트 엔지니어링 #2

이번 글에서는 지난번에 시작했던, 프롬프트 엔지니어링을 이용해서 GPT에게 원하는 답을 얻는 방법 중 GPT에게 명확하게 구체적으로 잘 묻는 방법에 이어서 GPT의 응답을 명확하게 하도록 요구하

eco7t.tistory.com

2025.04.30 - [Generative AI/Prompt Engineering] - IPython.display로 HTML 출력하고 ipywidgets로 실시간 슬라이더까지! #3

 

IPython.display로 HTML 출력하고 ipywidgets로 실시간 슬라이더까지! #3

오늘은 지금까지 다뤄왔던 프롬프트 엔지니어링 기술 이외 파이썬 자체 라이브러리 중 Jupyter Notebook이나 콘솔 환경에서 아주 유용한 IPython 라이브러리에 대해 살펴보겠습니다. IPython.display와 ipyw

eco7t.tistory.com

 

반응형