List
지난 글에서는 LLM(Large Language Model)이 기존 언어 모델의 어떤 한계를 해결하기 위해 등장했는지 살펴보았습니다. 이번 글에서는 OpenAI의 ChatGPT API를 사용하여 LLM을 실제로 활용하는 방법에 대해 알아보겠습니다.
특히, 과거의 Completion API 방식에서 최근의 Chat Completion API 방식으로의 발전 과정과 둘의 차이를 살펴보고, API의 사용법과 다양한 파라미터, 그리고 사용자와의 멀티턴 대화를 처리하는 방법까지 함께 다뤄볼 예정입니다.
Completion에서 Chat Completion으로의 발전 과정
OpenAI는 처음 GPT 모델을 공개할 때 Completion API를 주로 사용했습니다. Completion API는 사용자가 입력한 텍스트 프롬프트(prompt)에 대한 "뒷부분" 텍스트를 이어주는 방식이었습니다.
예를 들어 아래와 같이 프롬프트를 제공하면:
response = openai.Completion.create(
model="text-davinci-003",
prompt="오늘의 날씨는",
max_tokens=50,
)
Python
복사
모델이 "오늘의 날씨는" 뒤에 이어질 내용을 생성해 줬습니다. 그러나 Completion API에는 다음과 같은 단점이 있었습니다.
•
단순한 텍스트 완성: 맥락이나 대화 구조를 명시적으로 표현하기 어렵습니다.
•
역할 지정 불가: 시스템(system)이나 사용자(user), 어시스턴트(assistant) 같은 역할 구분이 없어 복잡한 대화를 표현하기가 까다로웠습니다.
•
멀티턴 대화 처리 불편: 이전 대화 기록을 따로 관리하며 매번 전체 문맥을 프롬프트로 전달해야 했습니다.
이런 한계들을 극복하기 위해 등장한 것이 바로 Chat Completion API입니다.
Chat Completion API는 프롬프트 방식에서 벗어나, 역할(role)을 가진 메시지(message)들의 리스트를 주고받는 구조로 발전했습니다.
이제 시스템, 사용자, 어시스턴트의 역할을 명확하게 구분하고, 이전 메시지를 쉽게 관리하여 멀티턴 대화를 자연스럽게 유지할 수 있게 되었습니다.
Chat Completion API의 기본 사용법
Chat Completion API는 기본적으로 메시지(messages)의 리스트로 구성되어 있으며, 각 메시지는 다음과 같은 구조를 가집니다.
•
system: 모델이 가져야 할 역할이나 지침을 전달
•
user: 사용자가 전달하는 질문 또는 요청
•
assistant: 모델이 생성한 이전의 응답
기본 사용 예시를 Python으로 나타내면 다음과 같습니다.
import openai
response = openai.ChatCompletion.create(
model="gpt-3.5-turbo",
messages=[
{"role": "system", "content": "당신은 친절한 AI 비서입니다."},
{"role": "user", "content": "한국의 수도는 어디인가요?"}
],
temperature=0.5,
max_tokens=100
)
print(response.choices[0].message.content)
Python
복사
위 코드에서는 모델에게 "친절한 AI 비서"라는 역할을 지정한 후, 사용자가 "한국의 수도는 어디인가요?"라고 질문하면 모델이 응답을 생성합니다.
User의 Role과 멀티턴 처리 방식
Chat Completion API의 가장 큰 장점은 역할(role) 기반의 메시지 구조 덕분에 멀티턴(multi-turn) 대화를 쉽게 구현할 수 있다는 점입니다.
이전 대화 내용을 기억하고, 맥락에 맞는 응답을 제공하기 위해서는 대화의 흐름을 다음과 같이 관리하면 됩니다.
import openai
conversation = [
{"role": "system", "content": "당신은 여행 전문가입니다."},
{"role": "user", "content": "유럽에서 가볼 만한 곳을 추천해 주세요."},
{"role": "assistant", "content": "프랑스 파리, 이탈리아 로마, 스페인 바르셀로나가 유명한 여행지입니다."},
{"role": "user", "content": "그중에서 로마의 대표적인 관광지는 어디인가요?"}
]
response = openai.ChatCompletion.create(
model="gpt-3.5-turbo",
messages=conversation
)
print(response.choices[0].message.content)
Python
복사
이렇게 이전의 모든 대화를 messages 리스트에 포함하여 보내면, 모델은 이전 맥락을 기억하여 사용자에게 더욱 적절한 답변을 생성할 수 있습니다.
Chat Completion API의 주요 파라미터
모델의 응답 품질을 조절하기 위한 몇 가지 주요 파라미터를 알아봅시다.
파라미터 | 설명 | 일반적인 값 |
temperature | 모델이 생성할 답변의 창의성을 조정합니다. 0에 가까우면 결정적이고 반복적, 1에 가까우면 창의적이고 다양한 답변을 생성합니다. | 0.7 전후 |
max_tokens | 응답의 최대 길이(토큰 수)를 지정합니다. | 100~500 |
top_p | 단어 선택 시 확률 분포의 범위를 조정하여 답변의 다양성을 높이거나 낮춥니다. | 0.9 전후 |
frequency_penalty | 반복적인 표현을 줄이기 위해 자주 나오는 단어에 페널티를 부여합니다. | 0~1 |
presence_penalty | 새로운 표현을 유도하기 위해 기존 등장 단어에 페널티를 부여합니다. | 0~1 |
예시:
response = openai.ChatCompletion.create(
model="gpt-3.5-turbo",
messages=[
{"role": "system", "content": "당신은 요약 전문가입니다."},
{"role": "user", "content": "다음 글을 3줄로 요약해 주세요. (여기 긴 텍스트 삽입)"}
],
temperature=0.5,
max_tokens=150,
top_p=0.9,
frequency_penalty=0.2,
presence_penalty=0.0
)
Python
복사
파라미터를 목적에 맞게 잘 조정하면, 더욱 원하는 결과를 얻기 쉽습니다.
마무리
이번 글에서는 기존의 Completion API가 가진 한계와, 이를 극복하고 멀티턴 대화를 자연스럽게 처리할 수 있게 진화한 Chat Completion API의 특징과 기본 사용법에 대해 살펴보았습니다. Chat Completion API를 사용하면 간편한 메시지 관리와 역할 설정, 멀티턴 대화 구현이 쉬워지며, API 파라미터를 적절히 조절함으로써 원하는 결과를 더 쉽게 얻을 수 있습니다.
다음 시리즈에서는 LLM 모델이 사용자의 의도를 정확히 이해하고 원하는 형태의 답변을 생성할 수 있도록 프롬프트를 설계하는 기술인 프롬프트 엔지니어링에 대해서 알아보겠습니다.