# 프롬프트 디자인 팁

프롬프트를 설계할 때는 다음 사항에 주의해주세요:

### 시작은 간단하게

프롬프트 설계를 시작할 때는 프롬프트 설계가 최적의 결과를 얻기 위해 많은 실험을 필요로 하는 반복적인 프로세스임을 염두에 두세요. OpenAI나 Cohere에서 제공하는 플레이그라운드로 시작해보는 것이 좋습니다.

간단한 프롬프트에서 시작하여 더 나은 결과를 위해 요소나 문맥을 추가해 나갈 수 있습니다. 이러한 이유에서 프롬프트 버전관리는 중요하겠지요. 이 가이드를 읽으면 구체성, 간결함, 명확함이 더 나은 결과를 가져온다는 것을 알 수 있을 것입니다.

여러 하위 작업을 포함한 큰 단위 작업을 실행해야한다면, 작업들을 보다 작은 단위로 분해한 뒤 결과가 개선됨에 따라 점진적으로 구축해 나가세요.
이러한 방식은 프롬프트 설계 초기 프로세스에 복잡도를 주는 것을 방지할 수 있습니다.

### 지시

"작성하기", "분류하기", "요약하기", "번역하기", "정렬하기" 등의 명령어를 사용하여 모델에게 달성하고 싶은 결과를 지시함으로써 다양한 간단한 작업에 대한 효과적인 프롬프트를 설계할 수 있습니다.

어느 것이 가장 효과적인지 찾아내기 위해서는 여러 차례의 실험이 필요하다는 것을 명심하세요.
다양한 키워드, 컨텍스트와 데이터를 활용하여 다양한 지시를 내려보고 특정 사용 사례나 작업에 가장 적합한 방법을 찾아나가세요.
일반적으로 수행하려는 작업과 관련된 문맥이 구체적이고 적절할수록 더 좋습니다. 다음 가이드에서 샘플링과 컨텍스트 추가의 중요성에 대해 다뤄보도록 하겠습니다.

보통은 프롬프트 시작 부분에 지시사항을 명시할 것을 권장합니다. 또한 "##"과 같은 명확한 구분 기호를 사용하여 명령어와 컨텍스트를 구분하는 것도 좋은 방법입니다.

예를 들어:

_프롬프트:_

```
### 지시 ###
아래 문장을 스페인어로 번역해줘:

문장: "안녕하세요!"
```

_출력:_

```
¡Hola!
```

### 특이성

모델이 실행하기를 바라는 작업에 대해 구체적인 지시를 내려주세요. 프롬프트가 상세하고 구체적일수록 결과는 좋아집니다. 특정 출력이나 스타일을 원하는 경우에는 특히 중요합니다. 더 나은 결과를 가져올 특정 토큰이나 키워드는 존재하지 않습니다. 좋은 포맷을 갖춘 상세한 프롬프트를 준비하는 것이 중요합니다. 프롬프트에 예시를 제공하는 것은 특정 포맷으로 출력을 얻는 데 실제로도 매우 효과적입니다.

프롬프트의 길이에는 제한이 있기 때문에 프롬프트 설계 시 그 길이를 염두에 두어야 합니다. 어느정도로 구체적이고 상세하게 대할 것인가를 고려해봐야겠지요. 불필요한 세부 사항을 포함하는 것은 언나 좋은 접근법은 아닙니다. 자세한 내용은 관련성이 있으며 당면한 과제에 기여해야 합니다. 프롬프팅은 많은 실험과 반복을 필요로 합니다. 애플리케이션에 최적인 프롬프트를 찾기 위해 많은 실험과 반복을 권장합니다.

예시로, 텍스트에서 특정 정보를 추출하는 간단한 프롬프트를 시도해 봅시다.

_프롬프트:_

```
다음 문장에서 장소의 이름을 추출해줘.

원하는 형식:
Place: <comma_separated_list_of_company_names>

입력: "비록 이러한 발전이 연구원들에게 격려가 되지만, 많은 것들이 여전히 미스터리입니다. 리스본의 Champalimaud 센터 for the Unknown의 신경 면역학자인 Henrique Veiga-Fernandes는 "우리는 종종 뇌와 주변부에서 보는 효과 사이에 블랙박스를 가지고 있습니다,"라고 말합니다. "만약 우리가 그것을 치료적 맥락에서 사용하고 싶다면, 우리는 실제로 그 작용기전을 이해할 필요가 있습니다.""

```

_출력:_

```
장소: Champalimaud 센터 for the Unknown, 리스본
```

입력 텍스트의 출처는 [this Nature article](https://www.nature.com/articles/d41586-023-00509-z) 입니다.

### 부정확성을 피하라

위와 같은 팁을 고려해서 지나치게 상세하게 기술하거나 포맷을 개선하는 프롬프트를 급작스럽게 발전시킨다면, 부정확한 설명을 만들어 버리는 등 함정에 빠지기 쉽습니다. 프롬프트는 구체적이고 직접적이어야 좋은 결과를 얻을 수 있습니다. 직접적일수록 효과적인 메시지가 전달됩니다 -- 효과적인 커뮤니케이션 방식과 꽤나 흡사하지요.

예를 들어 프롬프트 엔지니어링의 개념을 배우고 싶을 수도 있습니다. 그럼 이렇게 시도해 보는 것입니다:

```
프롬프트 엔지니어링의 개념을 설명해 줘. 설명은 간결한 몇 문장으로, 너무 자세히는 하지말아줘.
```

위의 프롬프트는 어떤 어조로 어느정도의 분량의 문장들로 설명해주기를 명확하게 지시하지 않았습니다. 물론 위의 프롬프트로도 여전히 좋은 답변을 얻을 수 있겠지만 매우 구체적이고 간결하며 정곡을 찌르는 프롬프트가 좋습니다. 마치 다음과 같은 것입니다.

```
고등학생에게 프롬프트 엔지니어링 개념을 2~3줄의 문장으로 설명해 주세요.
```

### 할까 말까?

프롬프트를 설계할 시 적용할 수 있는 또 다른 일반적인 팁은 '하지 말아야 할 것'보다는 '해야하는 것'을 말하는 것입니다. 이를 통해 보다 구체적이고 모델로부터 좋은 답변을 얻기 위한 세부 사항에 초점이 맞춰집니다.

아래는 제가 '하지 말아야 할 것'에 초점을 맞춘 지시 때문에 영화 추천 챗봇이 실패한 예시입니다.

_프롬프트:_

```
다음은 고객에게 영화를 추천하는 보조원입니다. 관심사를 묻지 말고 개인정보도 묻지 마세요.

고객: 제 흥미를 바탕으로 영화를 추천해 주세요.

보조원:
```

_출력:_

```
네, 당신의 관심을 바탕으로 영화를 추천해 드리겠습니다.액션, 코미디, 로맨스, 아니면 어떤 종류의 영화를 좋아하세요?
```

다음은 개선된 프롬프트입니다:

_프롬프트:_

```
다음은 고객에게 영화를 추천하는 보조원입니다. 보조원은는 전세계적으로 유행하는 영화를 추천해줍니다. 사용자의 관심사를 묻는 것을 자제하고 개인 정보를 묻는 것 또한 피해야 합니다. 추천할만한 마땅한 영화가 없는 경우 "죄송합니다. 추천할 영화를 찾을 수 없습니다."라고 응답해야 합니다.

고객: 제 흥미를 바탕으로 영화를 추천해 주세요.
보조원:
```

_출력:_

```
죄송합니다만, 당신의 관심사에 관한 정보는 찾을 수 없었습니다. 하지만 여기 지금 가장 트렌디한 영화 목록이 있습니다: [영화 목록]. 좋아하는 것을 찾으시길 바라요!
```

위의 예시 중 몇가지는 ["Best practices for prompt engineering with OpenAI API" article.](https://help.openai.com/en/articles/6654000-best-practices-for-prompt-engineering-with-openai-api)에서 발췌되었습니다.
