ChatGPT API를 사용하여 다양한 작업을 수행할 때, 요청 파라미터의 설정은 매우 중요하다. 요청 파라미터는 API가 입력을 어떻게 처리하고, 어떤 방식으로 응답을 생성할지를 제어한다. 이 섹션에서는 주요 요청 파라미터에 대해 상세히 설명하고, 각각의 파라미터가 어떤 역할을 하는지, 그리고 이를 어떻게 최적화할 수 있는지에 대해 다룬다.

API 기본 요청 구조

ChatGPT API 요청은 보통 HTTP POST 요청으로 이루어지며, JSON 형식의 페이로드를 포함한다. 기본적인 구조는 다음과 같다.

import openai

response = openai.ChatCompletion.create(
    model="gpt-4",
    messages=[
        {"role": "system", "content": "You are a helpful assistant."},
        {"role": "user", "content": "Can you help me with some information?"}
    ],
    temperature=0.7,
    max_tokens=100
)

이 기본적인 예제에서, 우리는 model, messages, temperature, max_tokens와 같은 몇 가지 중요한 파라미터를 사용하였다. 이제 이들 파라미터의 역할과 설정 방법을 상세히 살펴보겠다.

model

model="gpt-4"

messages

messages=[
    {"role": "system", "content": "You are a helpful assistant."},
    {"role": "user", "content": "What is the capital of France?"}
]

temperature

P(w_i) = \frac{\exp\left(\frac{\log P(w_i)}{\text{temperature}}\right)}{\sum_{j} \exp\left(\frac{\log P(w_j)}{\text{temperature}}\right)}

여기서 P(w_i)는 단어 w_i가 선택될 확률을 나타내며, temperature 값이 확률 분포의 집중도에 영향을 준다.

temperature=0.7

max_tokens

T = \sum_{i=1}^{n} t_i \quad \text{where} \quad n \leq \text{max\_tokens}

여기서 t_i는 개별 토큰을 의미하며, 총합 T의 길이는 max_tokens를 초과할 수 없다.

max_tokens=100

top_p

\sum_{i=1}^{k} P(w_i) \geq \text{top\_p}

여기서 k는 선택된 단어의 수를 나타내며, 총합이 top_p 이상이 되면 후보 선택이 종료된다.

top_p=0.9

presence_penalty

\log P(w_i) = \log P(w_i) + (\text{presence\_penalty})
presence_penalty=0.6

frequency_penalty

\log P(w_i) = \log P(w_i) - (\text{frequency\_penalty} \times \text{count}(w_i))
frequency_penalty=0.5

stop

stop=["\n", "User:"]

위의 예시는 줄바꿈 문자나 "User:" 문자열을 만나면 텍스트 생성을 멈추도록 설정한다.

logit_bias

\log P(t_i) = \log P(t_i) + \text{logit\_bias}(t_i)

여기서 logit_bias(t_i)는 토큰 t_i에 적용되는 바이어스를 나타낸다.

logit_bias={50256: -100}  # 특정 토큰의 확률을 사실상 0으로 만듦

n

\text{Number of responses} = n
n=3

stream

stream=True

user

user="user-1234"

stream과 비동기 처리

stream=True 옵션을 사용하면, 응답을 실시간으로 수신할 수 있다. 이때 비동기 처리 방식으로 API 호출을 관리하는 것이 중요하다. Python에서는 asyncio 모듈을 사용하여 비동기 API 호출을 쉽게 처리할 수 있다.

import openai
import asyncio

async def generate_response():
    response = await openai.ChatCompletion.acreate(
        model="gpt-4",
        messages=[
            {"role": "user", "content": "Tell me a story."}
        ],
        stream=True
    )

    async for chunk in response:
        print(chunk['choices'][0]['delta'].get('content', ''), end='')

asyncio.run(generate_response())

위 코드에서는 stream=True로 설정된 API 호출이 비동기적으로 처리되며, 응답이 부분적으로 전달될 때마다 출력된다.

다양한 파라미터의 조합

이제까지 다룬 여러 파라미터들을 적절히 조합하여, 모델의 출력을 최적화할 수 있다. 예를 들어, temperaturetop_p를 함께 조정하거나, frequency_penaltypresence_penalty를 결합하여 텍스트의 반복성과 다양성을 동시에 관리할 수 있다.

response = openai.ChatCompletion.create(
    model="gpt-4",
    messages=[{"role": "user", "content": "Write a creative story."}],
    temperature=0.85,
    max_tokens=150,
    top_p=0.95,
    frequency_penalty=0.5,
    presence_penalty=0.6
)

이 조합은 창의적이고 다양한 이야기를 생성하지만, 동일한 표현의 반복을 줄이고 새로운 주제를 도입할 가능성을 높인다.