# 프롬프트 설계에 관한 일반적인 팁

프롬프트를 설계할 때 주의해야 할 몇 가지 사항에 대해 소개합니다.

### 시작은 간단하게

프롬프트 설계를 시작할 때는 프롬프트 설계가 최적의 결과를 얻기 위해 많은 실험이 필요한 반복적인 과정임을 명심해야 합니다. OpenAI 또는 Cohere에서 제공하는 간단한 플레이그라운드로 시작해 보는 것이 좋습니다.

간단한 프롬프트로 시작하여 더 나은 결과를 위해 요소나 문맥을 계속해서 추가할 수 있습니다. 따라서 프롬프트의 버전 관리가 중요합니다. 이 가이드에서는 구체성, 단순성, 간결함을 통해 더 나은 결과를 얻을 수 있는 많은 예시를 제시하고 있습니다.

여러 하위 작업을 포함한 큰 단위 작업을 실행해야 하는 경우, 작업을 보다 작은 단위로 세분화하고 결과가 개선됨에 따라 점진적으로 구축해 나갈 수 있습니다. 이러한 방식을 통해 프롬프트 설계 초기 과정에 너무 많은 복잡성이 추가되는 것을 방지할 수 있습니다.

### 지시

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

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

프롬프트의 시작 부분에 지시 사항을 명시하는 것이 좋다는 의견도 있습니다. 또 다른 권장 사항으로는 '###'과 같이 명확한 구분 기호를 사용하여 명령어와 지시 사항을 구분하는 것을 들 수 있습니다.

예시:

*Prompt:*

```
### 지시 ###
다음 텍스트를 스페인어로 번역해 줘.

텍스트: "안녕하세요!"
```

*Output:*

```
¡Hola!
```

### 특이성

모델에 실행시킬 지시와 작업을 구체적으로 설명하세요. 프롬프트가 상세하고 구체적일수록 결과는 더 좋아집니다. 특정한 출력이나 스타일을 얻고자 하는 경우 특히 중요합니다. 더 나은 결과를 내는 특정한 토큰이나 키워드는 존재하지 않습니다. 좋은 형식과 상세한 프롬프트를 준비하는 것이 중요합니다. 프롬프트에 예시를 제공하는 것은 특정한 형식으로 출력을 얻는 데 실제로도 매우 효과적입니다.

프롬프트의 길이에는 제한이 있기 때문에 프롬프트를 설계할 때는 그 사항을 염두에 두어야 합니다. 얼마나 구체적이고 상세하게 작성해야 하는지 생각할 필요가 있습니다. 불필요한 세부 사항을 많이 포함하는 것이 반드시 좋은 접근 방법은 아닙니다. 세부 사항은 관련성이 있어야 하고, 당면한 과제에 기여해야 합니다. 프롬프트의 설계는 많은 실험과 반복이 필요합니다. 애플리케이션에 맞는 프롬프트의 최적화를 위해 많은 실험과 반복을 거듭할 것을 권장합니다. 

텍스트에서 특정 정보를 추출하는 간단한 프롬프트의 예시를 살펴봅시다.

*Prompt:*

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

원하는 형식:
Place: <comma_separated_list_of_places>
입력: "이러한 발전은 연구자들에게 격려가 되지만, 많은 것들이 여전히 수수께끼입니다. 리스본에 있는 샴팔리마우드 센터(CCU: Champalimaud Centre for the Unknown)의 신경면역학자인 Henrique Veiga-Fernandes는 "뇌와 주변부에서 보이는 효과 사이에 블랙박스가 있는 경우가 종종 있습니다."라고 말합니다. 그리고 다음과 같이 덧붙입니다. "치료적 맥락에서 이를 사용하고자 할 경우, 그 메커니즘을 실제로 이해할 필요가 있습니다."

```

*Output:*

```
장소: 샴팔리마우드 센터(CCU: Champalimaud Centre for the Unknown), 리스본
```

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

### 부정확성 피하기

상세하게 기술하고 형식을 개선하는 방법에 대한 위 내용을 고려할 경우, 프롬프트를 교묘하게 다루려 하거나 부정확한 설명을 작성하는 등의 함정에 빠지기 쉽습니다. 프롬프트는 구체적이고 직접적이어야 더욱 좋은 결과를 얻을 수 있습니다. 직접적일수록 메시지가 더 효과적으로 전달됩니다. 효과적인 커뮤니케이션 방식과 매우 유사하다고 할 수 있습니다.

프롬프트 엔지니어링의 개념을 배우고자 하는 경우를 예시로 들어 보겠습니다. 이 경우, 다음과 같이 시도해 볼 수 있습니다.

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

위의 프롬프트에서는 몇 문장을 사용해야 하는지, 어떤 스타일을 사용해야 하는지 명확하게 지시되어 있지 않습니다. 물론 이 프롬프트로도 여전히 좋은 답변을 얻을 수는 있겠지만, 매우 구체적이고 간결하며 정곡을 찌르는 프롬프트일수록 좋습니다. 적절한 예시로 다음을 살펴봅시다.

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

### 해야 하는 것과 하지 말아야 할 것

프롬프트를 설계할 때 적용할 수 있는 또 다른 일반적인 팁은 '하지 말아야 할 것'보다는 '해야 하는 것'에 초점을 두는 것입니다. 이렇게 하면, 보다 구체적이고 모델로부터 좋은 답변을 이끌어 내는 세부 사항에 집중할 수 있습니다.

다음은 '하지 말아야 할 것'에 초점을 둔 지시로 인해 영화 추천 챗봇이 실패한 예시입니다.

*Prompt:*

```
다음은 고객에게 영화를 추천하는 상담원입니다. 관심사를 묻지 마세요. 개인정보를 묻지 마세요.
고객: 제 관심사를 바탕으로 영화를 추천해 주세요.
상담원:
```

*Output:*

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

개선된 프롬프트는 다음과 같습니다.

*Prompt:*

```
다음은 고객에게 영화를 추천하는 상담원입니다. 상담원은 글로벌 인기 영화 중에서 영화를 추천해야 합니다. 사용자의 관심사를 묻지 않고, 개인 정보를 요구하지 않아야 합니다. 상담원이 추천할 영화가 없는 경우 "죄송합니다. 오늘 추천할 영화를 찾을 수 없습니다." 라고 응답해야 합니다.

고객: 제 관심사를 바탕으로 영화를 추천해 주세요.
상담원:
```

*Output:*

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

위의 예시 중 몇 가지는 ["OpenAI API를 사용한 프롬프트 엔지니어링의 모범 사례(Best practices for prompt engineering with OpenAI API)"](https://help.openai.com/en/articles/6654000-best-practices-for-prompt-engineering-with-openai-api)에서 발췌하였습니다.
