1. 텍스트 생성 모델의 기초

OpenAI의 텍스트 생성 모델인 일반적으로 Generative Pre-trained Transformer (GPT)로 알려진 모델은 딥 러닝에서의 자기 주의 메커니즘을 활용하여 자연어를 이해하고 처리합니다. GPT 모델의 훈련은 두 단계로 구성됩니다: 사전 훈련 및 미세 조정.

사전 훈련

사전 훈련 단계에서 모델은 대규모 텍스트 데이터셋을 사용하여 비지도 학습을 진행합니다. 이 과정에서 모델은 다음 단어를 예측하면서 훈련됩니다. 예를 들어, "I have a pen"이라는 문장이 주어졌을 때, 처음 몇 단어를 보고 "pen"이라는 단어를 예측하려고 합니다. 사전 훈련의 주요 목표는 모델이 언어의 구조와 의미를 이해하도록 하는 것입니다.

미세 조정

미세 조정 단계는 특정 작업에 대한 지도 학습을 포함합니다. 이 단계에서 모델은 문제 해결 시 사용되는 특정 응용 프로그램에 적응하도록 조정됩니다. 미세 조정은 사전 훈련된 모델을 기반으로 주석이 달린 데이터셋을 사용하여 모델을 추가로 훈련시켜 특정 작업에 더 잘 적응하도록 합니다.

2. 응용 시나리오

OpenAI의 텍스트 생성 모델은 다양한 시나리오에 적용될 수 있습니다. 여기에는 몇 가지 구체적인 응용이 포함됩니다:

  • 문서 초안 작성: 사용자가 빠르게 문서를 작성하고 편집하는 데 도움.
  • 컴퓨터 코드 작성: 프로그래밍을 지원하기 위한 코드 조각 생성.
  • 지식 베이스에 대한 질문 응답: 저장된 지식을 기반으로 답변 제공.
  • 텍스트 분석: 텍스트 정보 추출, 감정 분석 등.
  • 소프트웨어에 대한 자연어 인터페이스 제공: 사용자가 자연어를 사용하여 소프트웨어와 상호 작용할 수 있도록 함.
  • 다양한 과목에서의 가르침: 여러 과목에 걸쳐 교육 지도 제공.
  • 언어 번역: 다른 언어간의 텍스트 번역.
  • 게임 캐릭터 시뮬레이션: 게임이나 롤플레잉 시나리오를 위한 대화와 배경 이야기 생성.

3. 대화 모델 소개

대화 모델은 사전 훈련을 통해 자연스러운 대화를 이해하고 생성하는 특수한 유형의 텍스트 생성 모델입니다. 이 모델은 사용자와 가상 비서 간의 대화를 시뮬레이션할 수 있으며 실시간 대화형 응용에 적합합니다.

대화 모델의 사용은 주로 멀티턴 대화를 포함합니다. 예를 들어 사용자가 질문을 하면 모델은 이전의 훈련 데이터를 기반으로 적절한 응답을 생성할 수 있습니다. 또한 대화 모델은 문맥 정보를 유지하여 더 일관되고 자연스러운 응답을 생성할 수 있습니다.

대화 모델의 응용 시나리오:

  • 고객 서비스 보조: 사용자의 자주 묻는 질문에 자동으로 답변을 제공하고 지원 및 조언을 제공합니다.
  • 챗봇: 사용자들과 자연스러운 대화식 상호작용을 수행합니다.
  • 가상 비서: 사용자 명령을 실행하며 회의 일정 잡기, 알림 설정 등을 수행합니다.
  • 롤플레잉 게임: 게임 캐릭터에게 독특한 대화와 성격을 부여하여 게임 경험을 풍부하게 합니다.

4. 대화 모델 API

대화 모델 API를 사용하면 개발자가 HTTP 요청을 사용하여 GPT 모델과 상호 작용할 수 있습니다. 이 섹션에서는 curl을 사용하여 요청을 구성하고 모델에서 반환된 응답을 구문 분석하는 방법에 대해 소개합니다.

요청 구성

시작하기 전에 OpenAI에서 API 키를 등록하고 획득해야하며, 요청을 보낼 때 HTTP 헤더를 통해 인증해야 합니다.

다음은 curl을 사용하여 대화 모델 API에 요청을 보내는 예입니다:

curl https://api.openai.com/v1/chat/completions \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $OPENAI_API_KEY" \
  -d '{
    "model": "gpt-3.5-turbo",
    "messages": [
      {
        "role": "system",
        "content": "You are a helpful assistant."
      },
      {
        "role": "user",
        "content": "Which team won the 2020 World Series?"
      }
    ]
  }'

대화 모델 매개변수의 의미

OpenAI의 대화 모델 API를 사용할 때, "model" 및 "messages"와 같은 주요 매개변수가 각각 특정 의미를 가지며 결과에 영향을 줍니다.

모델 매개변수

모델 매개변수는 사용할 모델의 버전을 지정하는데 사용됩니다. 예를 들어, "model": "gpt-3.5-터보"는 GPT-3.5-터보 모델을 요청하고 있다는 것을 나타냅니다. 여기서 선택한 모델 버전은 해당 모델의 능력, 훈련 데이터 및 인터페이스 기능에 기초하여 사용자 입력에 응답할 것입니다.

현재 지원되는 모델은 다음과 같습니다:

지원되는 모델 최대 컨텍스트 모델 설명
gpt-4-0125-preview 128,000 토큰 '태만한' 경우를 줄이기 위해 설계된 GPT-4 터보 미리보기 모델.
gpt-4-turbo-preview 128,000 토큰 현재 gpt-4-0125-preview 모델을 가리킵니다.
gpt-4-1106-preview 128,000 토큰 지침 실행 능력 개선, JSON 모드, 재현 가능한 출력, 병렬 함수 호출을 갖춘 GPT-4 터보 모델.
gpt-4-vision-preview 128,000 토큰 이미지를 이해할 수 있는 기능을 갖춘 GPT-4 모델로, 다른 모든 GPT-4 터보 기능도 지원합니다.
gpt-4 8,192 토큰 현재 gpt-4-0613을 가리킵니다.
gpt-4-0613 8,192 토큰 2023년 6월 13일에 스냅샷 된 GPT-4 모델로, 함수 호출 지원이 개선되었습니다.
gpt-4-32k 32,768 토큰 현재 gpt-4-32k-0613을 가리킵니다. 이 모델은 널리 홍보되지 않으며 GPT-4 터보를 선호합니다.
gpt-4-32k-0613 32,768 토큰 2023년 6월 13일에 스냅샷된 GPT-4 32k 버전 모델로, 널리 홍보되지 않으며 GPT-4 터보를 선호합니다.
gpt-3.5-turbo-1106 16,385 토큰 지침 실행 능력, JSON 모드, 재현 가능한 출력, 병렬 함수 호출이 개선된 최신 GPT-3.5 터보 모델.
gpt-3.5-turbo 4,096 토큰 현재 gpt-3.5-turbo-0613을 가리킵니다.
gpt-3.5-turbo-16k 16,385 토큰 현재 gpt-3.5-turbo-16k-0613을 가리킵니다.
gpt-3.5-turbo-instruct 4,096 토큰 GPT-3 시대 모델과 유사한 기능을 갖춘 모델로, 전통적인 완성 엔드포인트와 호환되지만 채팅 완성에는 적합하지 않습니다.
gpt-3.5-turbo-0613 4,096 토큰 2023년 6월 13일에 스냅샷된 gpt-3.5-turbo 모델로, 2024년 6월 13일에 사용이 중단될 예정입니다.
gpt-3.5-turbo-16k-0613 16,385 토큰 2023년 6월 13일에 스냅샷된 gpt-3.5-16k-turbo 모델로, 2024년 6월 13일에 사용이 중단될 예정입니다.
gpt-3.5-turbo-0301 4,096 토큰 2023년 3월 1일에 스냅샷된 gpt-3.5-turbo 모델로, 2024년 6월 13일에 사용이 중단될 예정입니다.

메시지 매개변수

메시지 매개변수는 대화에서 각 메시지를 나타내는 요소인 배열입니다. 각 메시지는 두 가지 속성, 즉 역할(발신자의 역할)과 내용(메시지의 구체적인 내용)을 포함하는 객체입니다.

  • role: 메시지의 발신자 역할을 지정합니다. "system", "user", "assistant"와 같은 선택적 값이 있습니다.
  • content: 메시지의 구체적인 내용입니다.

역할의 유형 및 기능

역할 매개변수의 값은 메시지의 유형과 기능을 정의합니다. 대화 API는 다른 역할에 따라 모델의 응답을 변경합니다.

'시스템' 역할

시스템 메시지는 모델의 동작을 전역적으로 나타내는 데 사용됩니다. 예를 들어 모델이 수행하는 역할 (예: 고객 서비스 조수, 번역기 등)을 명시적으로 지정하거나 대화에서 따라야 하는 특정 지침을 제공할 수 있습니다. 시스템 메시지는 대화 전체에 걸쳐 모델의 동작에 장기적인 영향을 미치지만 일반적으로 선택 사항입니다.

예를 들어, 모델이 고객 서비스 조수로 대화에 참여하도록 원한다면 시스템 메시지에서 다음과 같이 지정할 수 있습니다:

{
  "role": "system",
  "content": "당신은 고객 서비스 조수입니다."
}

'사용자' 역할

사용자 메시지는 사용자가 입력한 질문을 나타냅니다. 모델은 이러한 메시지에 응답하여 정보, 답변 또는 기타 형태의 출력을 제공합니다. 이러한 메시지는 대화 API 워크플로우의 중요한 부분이며 일반적으로 응용 프로그램에서 실제 사용자 질의에 해당합니다.

예를 들어, curl 예제의 사용자 요청에서:

{
  "role": "user",
  "content": "2020 월드 시리즈에서 우승한 팀은 누구인가요?"
}

'조수' 역할

조수 메시지는 일반적으로 모델이 생성하는 응답을 나타내며 개발자가 제공하는 대화 기록 메시지의 일부일 수도 있습니다. API 요청에서는 조수 역할 메시지를 일반적으로 제공하지 않습니다. 단, 모델이 대화 기록에서 질문에 대한 답변을 어떤 형식으로 제공할지 미리 설정하여 모델의 출력 예시를 제공해야 하는 경우에 사용됩니다.

응답 구문 분석

모델의 응답은 JSON 형식으로 반환됩니다. 아래는 응답을 구문 분석하는 예시입니다:

{
  "choices": [
    {
      "finish_reason": "stop",
      "index": 0,
      "message": {
        "content": "2020 월드 시리즈 챔피언은 로스앤젤레스 다저스팀입니다.",
        "role": "assistant"
      },
      "logprobs": null
    }
  ],
  "created": 1677664795,
  "id": "chatcmpl-7QyqpwdfhqwajicIEznoc6Q47XAyW",
  "model": "gpt-3.5-turbo-0613",
  "object": "chat.completion",
  "usage": {
    "completion_tokens": 17,
    "prompt_tokens": 57,
    "total_tokens": 74
  }
}

위의 응답에서 모델의 답변은 choices[0].message.content에서 얻을 수 있습니다.

다이얼로그 모델에서 메모리 기능 구현하기

아래는 OpenAI의 챗 완성 API를 사용하여 GPT 모델의 메모리 기능을 구현하는 예시입니다. 이 예시는 새로운 API 요청에서 과거 대화 컨텍스트(즉, 메모리 내용)를 저장하여 지속적인 대화를 이루는 방법을 보여줍니다.

import requests

api_url = "https://api.openai.com/v1/chat/completions"
api_key = "당신의 OpenAI API 키"

headers = {
    "Content-Type": "application/json",
    "Authorization": f"Bearer {api_key}"
}

data = {
    "model": "gpt-3.5-turbo",  # gpt-4나 기타 사용 가능한 모델로 변경 가능
    "messages": [
      {
        "role": "system",  # 시스템 메시지, 대화 모델의 동작을 설정하는 데 사용됨
        "content": "당신은 도움 어시스턴트입니다."
      },
      {
        "role": "user",  # 사용자 메시지, 모델은 이에 응답함
        "content": "기후 변화의 주요 이유를 알려줄 수 있나요?"
      },
      {
        "role": "assistant",  # 모델의 응답
        "content": "기후 변화의 주요 이유는 온실 가스 배출, 화석 연료 연소, 그리고 삼림 파괴 등이 포함됩니다."
      },
      {
        "role": "user",  # 모델의 답변을 기반으로 한 새로운 질문
        "content": "온실 가스 배출을 어떻게 줄일 수 있을까요?"
      }
    ]
}

response = requests.post(api_url, headers=headers, json=data)

if response.status_code == 200:
    reply_content = response.json()['choices'][0]['message']['content']
    print(f"모델의 응답 => {reply_content}")
else:
    print(f"요청 에러: {response.status_code}")

이 예시에서는 사용자가 먼저 기후 변화의 주요 이유에 대해 물었고, 그 후 모델의 설명을 기반으로 다른 질문을 하도록 시뮬레이션합니다. 후속 요청에서 이전 대화의 내용을 유지하여 모델이 이를 기억하고 그에 기반한 응답을 생성할 수 있도록 합니다. 이 방법은 이전 대화의 입력과 출력을 새 요청의 히스토리 메시지로 사용하여 대화 상태의 전달과 기억을 달성합니다.

팁: 대화의 메모리 기능을 구현하기 위해서 모델은 최대 토큰 제한이 있기 때문에 각 요청마다 모든 과거 대화 메시지를 입력하는 것은 불가능합니다. 일반적으로 현재 질문과 관련된 관련 메시지들을 모델에 입력으로 사용하고, 후속 섹션에서는 임베딩 기능이 텍스트 유사성 검색을 달성하는 방법을 소개할 것입니다.

5. JSON 스키마

JSON 스키마는 대화 모델 API의 기능으로, 사용자가 항상 JSON 형식의 응답을 받기를 요구할 수 있도록 하는 기능입니다.

JSON 스키마 사용

JSON 스키마를 사용하려면 HTTP 요청 본문에서 response_format 필드를 { "type": "json_object" }로 설정하고, 시스템 메시지가 모델 출력이 JSON 형식임을 나타내도록 해야 합니다. 아래는 JSON 스키마를 활성화하는 curl 요청의 예시입니다:

curl https://api.openai.com/v1/chat/completions \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $OPENAI_API_KEY" \
  -d '{
    "model": "gpt-3.5-turbo-1106",
    "response_format": { "type": "json_object" },
    "messages": [
      {
        "role": "system",
        "content": "JSON 형식으로 출력하는 도움 어시스턴트입니다."
      },
      {
        "role": "user",
        "content": "2020년 월드 시리즈에서 어떤 팀이 우승했나요?"
      }
    ]
  }'

JSON 스키마 응답 구문 분석

JSON 스키마 모드에서 응답은 완전하고 완벽하게 구문 분석된 JSON 객체를 포함하게 됩니다. 이 모드는 모델의 출력이 직접 구문 분석되어 사용될 수 있는 유효한 JSON 객체임을 보장합니다. 아래는 JSON 스키마를 사용하여 반환될 수 있는 응답의 예시입니다:

{
  "choices": [
    {
      "finish_reason": "stop",
      "message": {
        "content": "{\"winner\": \"Los Angeles Dodgers\"}"
      }
    }
  ]
}

Python에서는 다음 코드를 사용하여 응답에서 내용을 추출할 수 있습니다:

import json

response = {
  "choices": [
    {
      "finish_reason": "stop",
      "message": {
        "content": "{\"winner\": \"Los Angeles Dodgers\"}"
      }
    }
  ]
}

response_content = json.loads(response['choices'][0]['message']['content'])

print(response_content)

출력은 다음과 같을 것입니다:

{'winner': 'Los Angeles Dodgers'}

JSON 스키마는 특정 사용 사례에 대한 응답 형식을 정확히 보장하는 믿을 수 있는 방법을 제공합니다. 따라서 API 응답 형식에 대한 구체적인 요구사항이 있는 시나리오에서는 JSON 스키마를 활성화하는 것이 좋습니다.