# 다양한 파라미터 조합을 통한 결과 최적화

ChatGPT API의 강력함은 다양한 파라미터를 통해 출력 결과를 조정하고 최적화할 수 있다는 점에 있다. 이 섹션에서는 이러한 파라미터들이 어떻게 작동하는지, 그리고 특정 요구사항에 맞는 최적의 결과를 얻기 위해 어떻게 조합할 수 있는지에 대해 자세히 설명한다.

#### 1. Temperature

**Temperature** 파라미터는 출력의 무작위성을 조정하는 데 사용된다. 값이 낮을수록 모델의 응답이 더 결정론적이 되며, 높은 값은 응답을 더 다양하고 창의적으로 만든다.

* **Formula**:

$$
P(x) = \frac{\exp\left(\frac{z(x)}{T}\right)}{\sum\_{x'} \exp\left(\frac{z(x')}{T}\right)}
$$

여기서 $P(x)$는 다음 단어로 선택될 확률을 의미하며, $z(x)$는 단어 $x$의 로짓(logit) 값이다. $T$는 temperature 파라미터이다.

* **Example**:

  ```python
  response = openai.ChatCompletion.create(
      model="gpt-4",
      messages=[{"role": "user", "content": "Tell me a joke."}],
      temperature=0.7
  )
  ```

  * **Low Temperature** (e.g., 0.2): 모델은 더 예측 가능한 답변을 생성한다.
  * **High Temperature** (e.g., 1.0): 모델은 더 창의적이고 예상치 못한 답변을 생성할 수 있다.

#### 2. Top-p (Nucleus Sampling)

**Top-p**는 Nucleus Sampling이라고도 하며, 이 파라미터는 누적 확률이 $p$ 이하가 될 때까지 높은 확률의 단어들을 샘플링한다. 이 방법은 temperature 파라미터와 함께 사용되어 모델의 출력 분포를 조정할 수 있다.

* **Concept**:\
  전체 확률 분포에서 상위 $p$ 퍼센트의 단어들만 고려한다. $p = 0.9$라면, 상위 90%에 속하는 단어들만 다음 단어로 선택될 가능성이 있다.
* **Example**:

  ```python
  response = openai.ChatCompletion.create(
      model="gpt-4",
      messages=[{"role": "user", "content": "Give me a random fact."}],
      top_p=0.8
  )
  ```

  * **Low Top-p** (e.g., 0.5): 응답이 매우 제한적이지만, 특정한 결과를 원할 때 유용하다.
  * **High Top-p** (e.g., 0.9): 더 다양한 응답을 생성한다.

#### 3. Max Tokens

**Max Tokens** 파라미터는 생성할 텍스트의 최대 길이를 정의한다. 이 파라미터를 통해 응답의 길이를 제어할 수 있다.

* **Considerations**:\
  생성되는 응답이 너무 길어지지 않도록 하거나, 특정 길이 내에서 응답을 제한하고자 할 때 유용하다.
* **Example**:

  ```python
  response = openai.ChatCompletion.create(
      model="gpt-4",
      messages=[{"role": "user", "content": "Summarize the article."}],
      max_tokens=50
  )
  ```

  * **Low Max Tokens** (e.g., 50): 짧고 간결한 응답을 유도한다.
  * **High Max Tokens** (e.g., 300): 더 긴 응답이 필요할 때 사용한다.

#### 4. Frequency Penalty

**Frequency Penalty**는 동일한 단어의 반복을 줄이기 위해 사용된다. 이 파라미터를 높게 설정하면, 모델은 동일한 단어를 반복해서 사용하는 것을 피하려고 한다.

* **Formula**:\
  반복된 단어의 확률을 감소시키는 데 사용된다.

$$
P(x) \propto \frac{1}{1 + \text{count}(x) \cdot \lambda}
$$

여기서 $\text{count}(x)$는 단어 $x$의 등장 횟수이며, $\lambda$는 frequency penalty 파라미터이다.

* **Example**:

  ```python
  response = openai.ChatCompletion.create(
      model="gpt-4",
      messages=[{"role": "user", "content": "Describe the sunset."}],
      frequency_penalty=0.5
  )
  ```

  * **Low Frequency Penalty** (e.g., 0.0): 단어의 반복이 자유로울 수 있다.
  * **High Frequency Penalty** (e.g., 2.0): 모델이 더 다양한 단어를 사용하도록 유도한다.

#### 5. Presence Penalty

**Presence Penalty**는 특정 단어가 얼마나 자주 등장했는지에 관계없이 단어가 생성될 확률을 조정한다. 이 파라미터는 새로운 주제를 도입하거나, 모델이 이전에 사용하지 않은 단어를 사용하도록 유도하는 데 유용하다.

* **Formula**:\
  단어의 등장 여부에 따라 그 확률을 증가시키거나 감소시킨다.

$$
P(x) \propto \left(1 + \lambda \cdot \mathbf{1}(x \text{ is present})\right)
$$

여기서 $\mathbf{1}(x \text{ is present})$는 단어 $x$가 이미 텍스트에 존재하는지 여부를 나타내는 지시 함수이며, $\lambda$는 presence penalty 파라미터이다.

* **Example**:

  ```python
  response = openai.ChatCompletion.create(
      model="gpt-4",
      messages=[{"role": "user", "content": "Start a new story."}],
      presence_penalty=0.6
  )
  ```

  * **Low Presence Penalty** (e.g., 0.0): 모델이 반복적인 주제를 계속해서 사용할 수 있다.
  * **High Presence Penalty** (e.g., 1.0): 모델이 새로운 주제나 단어를 사용하도록 유도한다.

#### 6. Stop Sequences

**Stop Sequences**는 생성된 텍스트를 중지시키기 위한 특정 텍스트 패턴이다. 이 파라미터를 설정하면, 모델은 지정된 패턴이 나타날 때까지 텍스트를 생성하며, 패턴이 발견되면 그 즉시 응답을 종료한다.

* **Concept**:\
  Stop Sequences는 특정 구문이나 문장이 출력되는 즉시 응답 생성을 중지할 수 있도록 한다. 이는 문맥상 필요 없는 정보를 제거하거나, 특정 형식의 응답을 유지할 때 유용하다.
* **Example**:

  ```python
  response = openai.ChatCompletion.create(
      model="gpt-4",
      messages=[{"role": "user", "content": "List three animals."}],
      stop=["\n"]
  )
  ```

  * **Single Stop Sequence**: 예를 들어, 줄바꿈이 발생할 때 응답을 중지하도록 설정할 수 있다.
  * **Multiple Stop Sequences**: 여러 패턴을 설정하여 응답을 보다 세밀하게 제어할 수 있다.

#### 7. Best Of

**Best Of** 파라미터는 모델이 여러 개의 응답을 생성한 다음, 그 중에서 가장 적합한 응답을 선택하여 반환하도록 한다. 이 파라미터를 사용하면 더 높은 품질의 응답을 얻을 수 있다.

* **Concept**:\
  모델이 $n$개의 응답을 생성한 후, 그 중 가장 높은 점수를 받은 응답을 선택하여 반환한다. 이는 무작위성을 줄이고, 더 예측 가능한 결과를 얻는 데 유용하다.
* **Example**:

  ```python
  response = openai.ChatCompletion.create(
      model="gpt-4",
      messages=[{"role": "user", "content": "Explain quantum mechanics."}],
      best_of=3
  )
  ```

  * **Best Of = 1**: 단일 응답을 생성하여 반환한다. 이는 기본값이다.
  * **Best Of > 1**: 여러 응답 중 가장 좋은 결과를 선택한다.

#### 8. Logit Bias

**Logit Bias**는 특정 토큰의 선택 확률을 조정하는 데 사용된다. 이 파라미터를 통해 특정 단어가 더 자주 선택되거나 덜 자주 선택되도록 할 수 있다.

* **Concept**:\
  각 단어의 logit 값을 직접 조정하여, 해당 단어가 선택될 확률을 증가시키거나 감소시킬 수 있다. 예를 들어, 특정 단어가 반드시 포함되도록 하거나, 특정 단어의 사용을 피하도록 할 수 있다.
* **Formula**:

$$
P(x) = \frac{\exp(z(x) + \text{logit\_bias}(x))}{\sum\_{x'} \exp(z(x') + \text{logit\_bias}(x'))}
$$

여기서 $\text{logit\_bias}(x)$는 특정 토큰 $x$에 적용된 로그 확률 편향이다.

* **Example**:

  ```python
  response = openai.ChatCompletion.create(
      model="gpt-4",
      messages=[{"role": "user", "content": "What is the capital of France?"}],
      logit_bias={"Paris": 10}
  )
  ```

  * **Positive Bias**: 특정 단어가 더 자주 선택되도록 설정할 수 있다.
  * **Negative Bias**: 특정 단어가 선택될 가능성을 낮추거나 거의 선택되지 않도록 할 수 있다.

#### 9. Prompt Length and Context

**Prompt Length**는 모델에 제공되는 입력 텍스트의 길이를 의미하며, 응답의 품질과 관련이 있다. 특히 긴 프롬프트는 모델이 문맥을 더 잘 이해하고, 더욱 일관된 응답을 생성하는 데 도움이 된다.

* **Considerations**:\
  너무 긴 프롬프트는 비용을 증가시키고, 너무 짧은 프롬프트는 문맥을 제대로 제공하지 못해 응답 품질을 떨어뜨릴 수 있다. 적절한 길이의 프롬프트를 유지하는 것이 중요하다.
* **Example**:

  ```python
  long_prompt = "In a galaxy far, far away, there was a small planet inhabited by beings with extraordinary abilities..."
  response = openai.ChatCompletion.create(
      model="gpt-4",
      messages=[{"role": "user", "content": long_prompt}],
      max_tokens=100
  )
  ```

  * **Short Prompt**: 응답이 예상치 못한 방향으로 갈 수 있다.
  * **Long Prompt**: 응답의 일관성과 품질이 높아질 수 있다.
