프롬프트 엔지니어링 가이드에 대한 한국어 버전 작성을 위해 시작합니다.

번역은 AIPilotSmarteasy를 사용해서 구글 제미나이로 합니다.

 

불필요하다고 판단되는  부분은 과감히 삭제하니, 해당 내용에 대해 더 알고 싶다면 원문을 확인해 보면 됩니다.

삭제한 부분이나 의견을 붙이거나 추가적인 내용은 언급할 것입니다.

프롬프트 엔지니어링 가이드

프롬프트 엔지니어링은 다양한 응용 프로그램과 연구 주제에 대해 언어 모델(LM)을 효율적으로 사용하기 위해 프롬프트를 개발하고 최적화하는 비교적 새로운 분야입니다. 프롬프트 엔지니어링 기술은 대규모 언어 모델(LLM)의 기능과 한계를 더 잘 이해하는 데 도움이 됩니다.

연구자들은 프롬프트 엔지니어링을 사용하여 질문 답변 및 산술 추론과 같은 다양한 일반적이고 복잡한 작업에서 LLM의 능력을 향상시킵니다. 개발자는 프롬프트 엔지니어링을 사용하여 LLM 및 기타 도구와 인터페이스하는 강력하고 효과적인 프롬프팅 기법을 설계합니다.

프롬프트 엔지니어링은 프롬프트를 설계하고 개발하는 것만이 아닙니다. LLM과 상호 작용하고 개발하는 데 유용한 광범위한 기술과 기법을 포함합니다. LLM과 인터페이스하고, LLM을 사용하여 구축하고, LLM의 기능을 이해하는 데 중요한 기술입니다. 프롬프트 엔지니어링을 사용하여 LLM의 안전성을 개선하고, LLM을 도메인 지식 및 외부 도구로 확장하는 것과 같은 새로운 기능을 구축할 수 있습니다.

LLM 개발에 대한 높은 관심에 힘입어, 최신 논문, 고급 프롬프팅 기법, 학습 가이드, 모델별 프롬프팅 가이드, 강의, 참고 문헌, 새로운 LLM 기능 및 프롬프트 엔지니어링 관련 도구를 모두 포함하는 새로운 프롬프트 엔지니어링 가이드를 만들었습니다.

 

더 알아보고 싶으신가요?

Maven과 협력하여 프롬프트 엔지니어링에 대한 다음과 같은 라이브 코호트 기반 과정을 제공합니다.

* **모두를 위한 LLM(초급)** – 최신 프롬프트 엔지니어링 기법과 실제 사용 사례에 효과적으로 적용하는 방법을 배우세요.

* **LLM을 위한 프롬프트 엔지니어링(고급)** – LLM을 사용하여 복잡한 사용 사례와 애플리케이션을 구축하기 위한 고급 프롬프트 엔지니어링 기법을 배우세요.

이제 학습자에게 특별 할인을 제공하고 있습니다. 프로모션 코드 MAVENAI20을 사용하여 20% 할인 혜택을 받으세요.

프롬프트 엔지니어링? 간단히 말하면 프롬프트 작성 방법이라고 할 수 있습니다. 프롬프트는 생성형 인공지능 모델에 생성을 지시하는 유일한 방법입니다. 그러니 중요하고 대충 만들면 안 되니 분석 설계를 거쳐 만들어 져야 한다는 거죠. 너무 쉬워도 문제고 너무 어려워도 문제입니다. 프롬프트 엔지니어링 둘 사이에서 줄을 잘 타야 합니다.

Introduction

프롬프트 엔지니어링은 다양한 응용 프로그램과 사용 사례에 대해 대규모 언어 모델(LLM)을 효율적으로 적용하고 구축하기 위해 프롬프트를 개발하고 최적화하는 비교적 새로운 분야입니다.

프롬프트 엔지니어링 기술은 LLM의 기능과 한계를 더 잘 이해하는 데 도움이 됩니다. 연구자들은 프롬프트 엔지니어링을 사용하여 질문 답변 및 산술 추론과 같은 다양한 일반적이고 복잡한 작업에서 LLM의 안전성과 능력을 향상시킵니다. 개발자는 프롬프트 엔지니어링을 사용하여 LLM 및 기타 도구와 인터페이스하는 강력하고 효과적인 프롬프팅 기법을 설계합니다.

이 포괄적인 가이드는 프롬프트 엔지니어링의 이론적 측면과 실용적인 측면, 그리고 LLM과 상호 작용하고 LLM을 사용하여 구축하기 위해 최상의 프롬프팅 기법을 활용하는 방법을 다룹니다.

모든 예시는 별도로 명시되지 않는 한 OpenAI의 Playground를 사용하여 gpt-3.5-turbo로 테스트되었습니다. 모델은 기본 구성(즉, temperature=1 및 top_p=1)을 사용합니다. 프롬프트는 gpt-3.5-turbo와 유사한 기능을 갖춘 다른 모델에서도 작동해야 하지만 모델 응답은 다를 수 있습니다.

LLM Settings

프롬프트를 설계하고 테스트할 때 일반적으로 API를 통해 LLM과 상호 작용합니다. 프롬프트에 대한 다양한 결과를 얻으려면 몇 가지 파라미터를 구성할 수 있습니다. 이러한 설정을 조정하면 응답의 신뢰성과 바람직성을 향상시키는 데 중요하며, 사용 사례에 적합한 설정을 찾으려면 약간의 실험이 필요합니다. 다음은 다양한 LLM 제공업체를 사용할 때 자주 접하게 되는 일반적인 설정입니다.

**온도(Temperature)** – 간단히 말해, 온도가 낮을수록 가장 가능성이 높은 다음 토큰이 항상 선택되므로 결과가 더 결정적입니다. 온도를 높이면 더 많은 무작위성이 발생하여 더 다양하거나 창의적인 출력을 장려할 수 있습니다. 기본적으로 다른 가능한 토큰의 가중치를 높이는 것입니다. 응용 프로그램 측면에서, 사실 기반 QA와 같이 더 사실적이고 간결한 응답을 장려하려면 낮은 온도 값을 사용하는 것이 좋습니다. 시 생성이나 다른 창의적인 작업의 경우 온도 값을 높이는 것이 유리할 수 있습니다.

**최상위 P(Top P)** – 온도를 사용하는 샘플링 기법인 핵 샘플링(nucleus sampling)으로, 모델이 얼마나 결정적인지 제어할 수 있습니다. 정확하고 사실적인 답변을 찾고 있다면 이 값을 낮게 유지하세요. 더 다양한 응답을 원한다면 값을 높이세요. Top P를 사용하면 top_p 확률 질량을 포함하는 토큰만 응답에 고려되므로 낮은 top_p 값은 가장 확실한 응답을 선택합니다. 즉, 높은 top_p 값은 모델이 가능성이 낮은 단어를 포함하여 더 많은 가능한 단어를 살펴볼 수 있도록 하여 더 다양한 출력을 생성합니다.

일반적인 권장 사항은 온도 또는 Top P 중 하나만 변경하는 것입니다.

**최대 길이(Max Length)** – 최대 길이를 조정하여 모델이 생성하는 토큰 수를 관리할 수 있습니다. 최대 길이를 지정하면 길거나 관련 없는 응답을 방지하고 비용을 제어하는 데 도움이 됩니다.

**중지 시퀀스(Stop Sequences)** – 중지 시퀀스는 모델이 토큰 생성을 중지하도록 하는 문자열입니다. 중지 시퀀스를 지정하는 것은 모델 응답의 길이와 구조를 제어하는 또 다른 방법입니다. 예를 들어, 모델이 10개 이상의 항목이 없는 목록을 생성하도록 하려면 “11”을 중지 시퀀스로 추가할 수 있습니다.

**빈도 페널티(Frequency Penalty)** – 빈도 페널티는 응답 및 프롬프트에 이미 나타난 횟수에 비례하여 다음 토큰에 페널티를 적용합니다. 빈도 페널티가 높을수록 단어가 다시 나타날 가능성이 줄어듭니다. 이 설정은 더 자주 나타나는 토큰에 더 높은 페널티를 부여하여 모델 응답에서 단어 반복을 줄입니다.

**존재 페널티(Presence Penalty)** – 존재 페널티는 반복되는 토큰에 페널티를 적용하지만, 빈도 페널티와 달리 모든 반복되는 토큰에 대해 페널티가 동일합니다. 두 번 나타나는 토큰과 10번 나타나는 토큰은 동일하게 페널티를 받습니다. 이 설정은 모델이 응답에서 구문을 너무 자주 반복하는 것을 방지합니다. 모델이 다양하거나 창의적인 텍스트를 생성하도록 하려면 더 높은 존재 페널티를 사용하는 것이 좋습니다. 또는, 모델이 집중력을 유지해야 하는 경우 더 낮은 존재 페널티를 사용해 보세요.

온도와 top_p와 마찬가지로 일반적인 권장 사항은 빈도 또는 존재 페널티 중 하나만 변경하는 것입니다.

몇 가지 기본 예시를 시작하기 전에, 사용하는 LLM 버전에 따라 결과가 다를 수 있다는 점을 기억하세요.

 

Basics of Prompting

Prompting an LLM

간단한 프롬프트로도 많은 것을 달성할 수 있지만, 결과의 품질은 모델에 제공하는 정보의 양과 프롬프트의 구성 방식에 따라 달라집니다. 프롬프트에는 모델에 전달하는 지시 사항이나 질문과 같은 정보가 포함될 수 있으며, 맥락, 입력 또는 예시와 같은 다른 세부 정보를 포함할 수 있습니다. 이러한 요소를 사용하여 모델을 더 효과적으로 지시하여 결과의 품질을 향상시킬 수 있습니다.

간단한 프롬프트의 기본적인 예시를 살펴보면서 시작해 봅시다.

**프롬프트**

하늘은

**출력**

파랗다.

OpenAI Playground 또는 다른 LLM Playground를 사용하는 경우 다음 스크린샷에 표시된 것처럼 모델에 프롬프트를 입력할 수 있습니다.

## OpenAI Playground 시작하기: 튜토리얼

OpenAI Playground를 사용하는 방법에 대한 튜토리얼입니다.

gpt-3.5-turbo나 gpt-4와 같은 OpenAI 채팅 모델을 사용할 때는 프롬프트를 시스템, 사용자, 어시스턴트라는 세 가지 역할로 구조화할 수 있습니다. 시스템 메시지는 필수는 아니지만 어시스턴트의 전반적인 동작을 설정하는 데 도움이 됩니다. 위의 예시에는 사용자 메시지만 포함되어 있으며, 이를 사용하여 모델에 직접 프롬프트를 입력할 수 있습니다. 간단하게 하기 위해 명시적으로 언급되지 않는 한 모든 예시는 사용자 메시지만 사용하여 gpt-3.5-turbo 모델에 프롬프트를 입력합니다. 위 예시의 어시스턴트 메시지는 모델 응답에 해당합니다. 원하는 동작의 예시를 전달하기 위해 어시스턴트 메시지를 정의할 수도 있습니다. 채팅 모델 사용에 대한 자세한 내용은 여기에서 확인하세요.

위의 프롬프트 예시에서 볼 수 있듯이 언어 모델은 “하늘은”이라는 맥락을 고려하여 의미가 통하는 토큰 시퀀스로 응답합니다. 출력은 예상과 다르거나 수행하려는 작업과 거리가 멀 수 있습니다. 사실 이 기본적인 예시는 시스템을 사용하여 무엇을 달성하고 싶은지에 대한 더 많은 맥락이나 지시 사항을 제공해야 하는 필요성을 강조합니다. 이것이 바로 프롬프트 엔지니어링의 핵심입니다.

조금 개선해 봅시다.

**프롬프트:**

문장 완성:
하늘은

**출력:**

낮에는 파랗고 밤에는 어둡습니다.

더 나아졌나요? 위 프롬프트에서는 모델에게 문장을 완성하도록 지시했으므로 결과가 훨씬 나아졌습니다. 모델이 지시한 대로(“문장 완성”) 정확하게 수행했기 때문입니다. 이 가이드에서 모델에게 원하는 작업을 수행하도록 지시하는 효과적인 프롬프트를 설계하는 이러한 접근 방식이 바로 프롬프트 엔지니어링입니다.

위 예시는 오늘날 LLM이 가능한 것에 대한 기본적인 설명입니다. 오늘날의 LLM은 텍스트 요약에서 수학적 추론, 코드 생성에 이르기까지 모든 종류의 고급 작업을 수행할 수 있습니다.

Prompt Formatting

위에서 매우 간단한 프롬프트를 시도했습니다. 표준 프롬프트는 다음 형식을 따릅니다.

<질문>?

또는

<지시>

이를 많은 QA 데이터 세트에서 표준인 질문 답변(QA) 형식으로 다음과 같이 형식화할 수 있습니다.

Q: <질문>?
A:

위와 같이 프롬프트를 입력하는 것을 제로샷 프롬프팅이라고 합니다. 즉, 수행하려는 작업에 대한 예시나 데모 없이 모델에 직접 응답을 요청하는 것입니다. 일부 대규모 언어 모델은 제로샷 프롬프팅을 수행할 수 있지만, 수행해야 하는 작업의 복잡성과 지식, 모델이 잘 수행하도록 훈련된 작업에 따라 달라집니다.

구체적인 프롬프트 예시는 다음과 같습니다.

**프롬프트**

Q: 프롬프트 엔지니어링이란 무엇인가요?

최신 모델 중 일부는 시퀀스가 구성되는 방식을 기반으로 질문 답변 작업으로 간주되므로 “Q:” 부분을 생략할 수 있습니다. 즉, 프롬프트를 다음과 같이 간소화할 수 있습니다.

**프롬프트**

프롬프트 엔지니어링이란 무엇인가요?

위의 표준 형식을 고려하여, 널리 사용되고 효과적인 프롬프팅 기법 중 하나는 예시(즉, 데모)를 제공하는 퓨샷 프롬프팅입니다. 퓨샷 프롬프트는 다음과 같이 형식화할 수 있습니다.

<질문>?
<답변>
<질문>?
<답변>
<질문>?
<답변>
<질문>?

QA 형식 버전은 다음과 같습니다.

Q: <질문>?
A: <답변>
Q: <질문>?
A: <답변>
Q: <질문>?
A: <답변>
Q: <질문>?
A:

QA 형식을 사용할 필요는 없다는 점을 기억하세요. 프롬프트 형식은 수행하는 작업에 따라 다릅니다. 예를 들어, 간단한 분류 작업을 수행하고 작업을 보여주는 예시를 제공할 수 있습니다.

**프롬프트:**

이것은 굉장해요! // 긍정적
이것은 나빠요! // 부정적
와, 그 영화 정말 멋졌어요! // 긍정적
끔찍한 쇼였어요! //

**출력:**

부정적

퓨샷 프롬프트는 컨텍스트 학습을 가능하게 합니다. 컨텍스트 학습은 언어 모델이 몇 가지 데모를 통해 작업을 학습하는 능력입니다. 제로샷 프롬프팅과 퓨샷 프롬프팅에 대한 자세한 내용은 다음 섹션에서 다룹니다.

Elements of a Prompt

프롬프트 엔지니어링의 예시와 응용 프로그램을 더 많이 살펴볼수록, 프롬프트를 구성하는 특정 요소를 발견하게 될 것입니다.

프롬프트에는 다음 요소 중 하나 이상이 포함됩니다.

* **지시 사항**: 모델이 수행해야 할 특정 작업이나 지시 사항
* **맥락**: 모델이 더 나은 응답을 생성하도록 안내할 수 있는 외부 정보 또는 추가 맥락
* **입력 데이터**: 응답을 찾고자 하는 입력 또는 질문
* **출력 지표**: 출력의 유형 또는 형식

General Tips for Designing Prompts

프롬프트를 디자인할 때 염두에 두어야 할 몇 가지 팁입니다.

간단하게 시작하기

프롬프트 디자인을 시작할 때, 최적의 결과를 얻으려면 많은 실험이 필요한 반복적인 과정이라는 점을 명심해야 합니다. OpenAI 또는 Cohere의 간단한 Playground를 사용하는 것이 좋은 시작점입니다.

간단한 프롬프트로 시작하여 더 나은 결과를 얻기 위해 더 많은 요소와 맥락을 추가할 수 있습니다. 이러한 이유로 프롬프트를 반복적으로 개선하는 것이 중요합니다. 이 가이드를 읽으면 특정성, 단순성 및 간결성이 더 나은 결과를 제공하는 경우가 많다는 것을 알 수 있습니다.

여러 하위 작업이 포함된 큰 작업이 있는 경우 작업을 더 간단한 하위 작업으로 분해하고 더 나은 결과를 얻으면서 계속 구축해 나갈 수 있습니다. 이렇게 하면 처음부터 프롬프트 디자인 프로세스에 너무 많은 복잡성을 추가하는 것을 방지할 수 있습니다.

지시 사항

모델에게 원하는 것을 수행하도록 지시하는 명령어를 사용하여 다양한 간단한 작업에 대한 효과적인 프롬프트를 디자인할 수 있습니다. 예를 들어, “작성”, “분류”, “요약”, “번역”, “정렬” 등의 명령어를 사용할 수 있습니다.

무엇이 가장 효과적인지 확인하기 위해 많은 실험을 해야 한다는 점을 명심하세요. 다양한 키워드, 맥락 및 데이터를 사용하여 다른 지시 사항을 시도하고 특정 사용 사례와 작업에 가장 적합한 것을 확인하세요. 일반적으로 수행하려는 작업에 맥락이 더 구체적이고 관련이 있을수록 더 좋습니다. 샘플링과 더 많은 맥락을 추가하는 중요성은 다음 가이드에서 다룰 것입니다.

일부 전문가는 지시 사항을 프롬프트의 시작 부분에 배치할 것을 권장합니다. 또 다른 권장 사항은 “###”와 같은 명확한 구분 기호를 사용하여 지시 사항과 맥락을 분리하는 것입니다.

예를 들어 다음과 같습니다.

**프롬프트:**

### 지시 사항 ###
아래 텍스트를 스페인어로 번역하세요.
텍스트: “안녕하세요!”

**출력:**

¡Hola!

Specificity

모델이 수행해야 할 지시 사항과 작업에 대해 매우 구체적으로 설명하세요. 프롬프트가 더 자세하고 상세할수록 결과가 더 좋습니다. 원하는 결과나 생성 스타일이 있는 경우 특히 중요합니다. 더 나은 결과로 이어지는 특정 토큰이나 키워드는 없습니다. 좋은 형식과 자세한 프롬프트를 갖는 것이 더 중요합니다. 사실, 프롬프트에 예시를 제공하는 것은 특정 형식으로 원하는 출력을 얻는 데 매우 효과적입니다.

프롬프트를 디자인할 때 프롬프트의 길이도 염두에 두어야 합니다. 프롬프트의 길이에는 제한이 있기 때문입니다. 얼마나 구체적이고 상세하게 해야 할지 생각해 보세요. 불필요한 세부 정보를 너무 많이 포함하는 것은 좋은 접근 방식이 아닙니다. 세부 정보는 관련성이 있어야 하며 수행 중인 작업에 기여해야 합니다. 이는 많은 실험을 통해 알아내야 하는 것입니다. 응용 프로그램에 맞게 프롬프트를 최적화하기 위해 많은 실험과 반복을 장려합니다.

예를 들어, 텍스트에서 특정 정보를 추출하는 간단한 프롬프트를 시도해 보겠습니다.

**프롬프트:**

다음 텍스트에서 장소 이름을 추출하세요.
원하는 형식:
장소: <쉼표로 구분된 장소 목록>
입력: “이러한 발전은 연구자들에게 고무적이지만, 여전히 많은 부분이 미스터리입니다. “우리는 종종 뇌와 주변에서 관찰되는 효과 사이에 블랙박스가 있습니다.”라고 리스본에 있는 챔피말마우드 미지의 중심부의 신경 면역학자인 앙리케 베이가-페르난데스는 말합니다. “치료적 맥락에서 사용하려면 실제로 메커니즘을 이해해야 합니다.””

**출력:**

장소: 챔피말마우드 미지의 중심부, 리스본

입력 텍스트는 이 Nature 기사에서 가져왔습니다.

부정확성 피하기

위에서 언급한 자세한 설명과 형식 개선에 대한 팁을 고려할 때, 프롬프트를 너무 똑똑하게 만들려고 부정확한 설명을 만들 가능성이 높아지는 함정에 빠지기 쉽습니다. 구체적이고 직접적인 것이 종종 더 좋습니다. 여기서 비유는 효과적인 의사소통과 매우 유사합니다. 더 직접적일수록 메시지가 더 효과적으로 전달됩니다.

예를 들어, 프롬프트 엔지니어링의 개념을 배우는 데 관심이 있을 수 있습니다. 다음과 같은 것을 시도할 수 있습니다.

프롬프트 엔지니어링의 개념을 설명하세요. 설명을 짧게, 몇 문장만 사용하고 너무 자세하게 설명하지 마세요.

위 프롬프트에서는 몇 문장을 사용해야 하는지, 어떤 스타일로 작성해야 하는지 명확하지 않습니다. 위 프롬프트를 사용해도 어느 정도 좋은 응답을 얻을 수 있지만, 더 나은 프롬프트는 매우 구체적이고 간결하며 요점을 명확하게 전달하는 것입니다. 다음과 같습니다.

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

해야 할 일과 하지 말아야 할 일

프롬프트를 디자인할 때 자주 사용되는 또 다른 팁은 하지 말아야 할 것을 말하지 말고 대신 해야 할 것을 말하는 것입니다. 이는 더 큰 특정성을 장려하고 모델에서 좋은 응답을 이끌어내는 세부 정보에 집중합니다.

다음은 제가 원하지 않는 것을 정확하게 하지 말라고 지시 사항을 작성했기 때문에 영화 추천 챗봇이 정확히 원하지 않는 것을 하지 못하는 예시입니다. 즉, 하지 말아야 할 것에 초점을 맞췄습니다.

**프롬프트:**

다음은 고객에게 영화를 추천하는 에이전트입니다. 관심사를 묻지 마세요. 개인 정보를 묻지 마세요.
고객: 제 관심사에 맞는 영화를 추천해 주세요.
에이전트:

**출력:**

네, 관심사에 맞는 영화를 추천해 드릴 수 있습니다. 어떤 종류의 영화를 보고 싶으신가요? 액션, 코미디, 로맨스, 아니면 다른 것을 선호하시나요?

다음은 더 나은 프롬프트입니다.

**프롬프트:**

다음은 고객에게 영화를 추천하는 에이전트입니다. 에이전트는 전 세계 트렌딩 영화 순위에서 영화를 추천할 책임이 있습니다. 사용자의 선호도를 묻거나 개인 정보를 묻지 않아야 합니다. 추천할 영화가 없으면 “죄송합니다. 오늘 추천할 영화가 없습니다.”라고 응답해야 합니다.
고객: 제 관심사에 맞는 영화를 추천해 주세요.
에이전트:

**출력:**

죄송합니다. 사용자의 관심사에 대한 정보가 없습니다. 하지만 현재 전 세계 트렌딩 영화 순위에 있는 영화 목록입니다. [영화 목록]. 마음에 드는 영화를 찾으시길 바랍니다!

위의 몇 가지 예시는 “OpenAI API를 사용한 프롬프트 엔지니어링 모범 사례” 기사에서 발췌했습니다.

Examples of Prompts

이전 섹션에서는 LLM에 프롬프트를 입력하는 기본적인 예시를 소개했습니다.

이 섹션에서는 다양한 작업을 수행하기 위해 프롬프트를 사용하는 방법에 대한 더 많은 예시를 제공하고 그 과정에서 핵심 개념을 소개합니다. 종종 개념을 배우는 가장 좋은 방법은 예시를 통해 배우는 것입니다. 아래의 몇 가지 예시는 잘 만들어진 프롬프트를 사용하여 다양한 유형의 작업을 수행하는 방법을 보여줍니다.

**주제:**

* 텍스트 요약
* 정보 추출
* 질문 답변
* 텍스트 분류
* 대화
* 코드 생성
* 추론

## 프롬프트 엔지니어링: 다양한 작업 예시 및 개념 소개

이전 섹션에서는 LLM에 프롬프트를 입력하는 기본적인 예시를 소개했습니다.

이 섹션에서는 다양한 작업을 수행하기 위해 프롬프트를 사용하는 방법에 대한 더 많은 예시를 제공하고 그 과정에서 핵심 개념을 소개합니다. 종종 개념을 배우는 가장 좋은 방법은 예시를 통해 배우는 것입니다. 아래의 몇 가지 예시는 잘 만들어진 프롬프트를 사용하여 다양한 유형의 작업을 수행하는 방법을 보여줍니다.

**주제:**

* 텍스트 요약
* 정보 추출
* 질문 답변
* 텍스트 분류
* 대화
* 코드 생성
* 추론

텍스트 요약

자연어 생성에서 표준적인 작업 중 하나는 텍스트 요약입니다. 텍스트 요약은 다양한 유형과 도메인을 포함할 수 있습니다. 사실 언어 모델의 가장 유망한 응용 프로그램 중 하나는 기사와 개념을 빠르고 읽기 쉬운 요약으로 요약하는 능력입니다. 프롬프트를 사용하여 기본적인 요약 작업을 시도해 봅시다.

예를 들어, 항생제에 대해 배우는 데 관심이 있다면 다음과 같은 프롬프트를 시도할 수 있습니다.

**프롬프트:**

항생제를 설명해 주세요.
A:

**출력:**

항생제는 박테리아 감염을 치료하는 데 사용되는 일종의 약물입니다. 항생제는 박테리아를 죽이거나 박테리아가 번식하는 것을 막아 신체의 면역 체계가 감염과 싸우도록 돕습니다. 항생제는 일반적으로 알약, 캡슐 또는 액체 용액 형태로 경구 투여되거나, 때로는 정맥 주사로 투여됩니다. 항생제는 바이러스 감염에는 효과가 없으며, 부적절하게 사용하면 항생제 내성으로 이어질 수 있습니다.

“A:”는 질문 답변에서 사용하는 명시적인 프롬프트 형식입니다. 여기에서 모델에게 답변이 기대된다는 것을 알리기 위해 사용했습니다. 이 예시에서는 이것을 사용하는 것이 유용한지 여부가 명확하지 않지만, 나중 예시에서 이 부분을 다루겠습니다. 이것이 너무 많은 정보이고 더 요약하고 싶다고 가정해 보겠습니다. 사실, 모델에게 다음과 같이 한 문장으로 요약하도록 지시할 수 있습니다.

**프롬프트:**

항생제는 박테리아 감염을 치료하는 데 사용되는 일종의 약물입니다. 항생제는 박테리아를 죽이거나 박테리아가 번식하는 것을 막아 신체의 면역 체계가 감염과 싸우도록 돕습니다. 항생제는 일반적으로 알약, 캡슐 또는 액체 용액 형태로 경구 투여되거나, 때로는 정맥 주사로 투여됩니다. 항생제는 바이러스 감염에는 효과가 없으며, 부적절하게 사용하면 항생제 내성으로 이어질 수 있습니다.
위 내용을 한 문장으로 설명해 주세요:

**출력:**

항생제는 박테리아를 죽이거나 번식을 막아 박테리아 감염을 치료하는 데 사용되는 약물이지만, 바이러스에는 효과가 없으며 과도하게 사용하면 항생제 내성이 생길 수 있습니다.

위 출력의 정확성은 나중 가이드에서 다룰 내용이므로, 너무 신경 쓰지 않고 모델이 한 문장으로 단락을 요약하려고 시도했다는 점을 알 수 있습니다. 지시 사항을 더 똑똑하게 만들 수 있지만, 이는 다음 장에서 다루겠습니다. 여기서 잠시 멈춰서 더 나은 결과를 얻을 수 있는지 실험해 보세요.

정보 추출

언어 모델은 자연어 생성 및 관련 작업을 수행하도록 훈련되지만, 분류 및 기타 다양한 자연어 처리(NLP) 작업도 수행할 수 있습니다.

다음은 주어진 단락에서 정보를 추출하는 프롬프트의 예시입니다.

**프롬프트:**

연구 논문의 저자 기여 진술 및 감사의 글은 저자가 원고 및 분석 준비에 ChatGPT와 같은 AI 기술을 사용했는지 여부와 그 정도를 명확하고 구체적으로 명시해야 합니다. 또한 사용된 LLM을 표시해야 합니다. 이렇게 하면 편집자와 검토자가 잠재적인 편견, 부정확성 및 부적절한 출처 표기를 더 주의 깊게 검토하도록 알릴 수 있습니다. 마찬가지로, 과학 저널은 제출된 원고를 선택할 때와 같이 LLM 사용에 대해 투명하게 공개해야 합니다.
위 단락에서 언급된 대규모 언어 모델 기반 제품을 언급해 주세요.

**출력:**

위 단락에서 언급된 대규모 언어 모델 기반 제품은 ChatGPT입니다.

위 결과를 개선할 수 있는 방법은 많지만, 이미 매우 유용합니다.

이제 모델에 무엇을 해야 하는지 지시하는 것만으로도 다양한 작업을 수행하도록 요청할 수 있다는 것을 알 수 있습니다. 이는 AI 제품 개발자가 이미 강력한 제품과 경험을 구축하는 데 사용하고 있는 강력한 기능입니다.

단락 출처: ChatGPT: 연구를 위한 5가지 우선순위

질문 답변

모델이 특정 답변으로 응답하도록 하는 가장 좋은 방법 중 하나는 프롬프트의 형식을 개선하는 것입니다. 앞서 언급했듯이, 프롬프트는 개선된 결과를 얻기 위해 지시 사항, 맥락, 입력 및 출력 지표를 결합할 수 있습니다. 이러한 구성 요소가 필수는 아니지만, 지시 사항이 더 구체적일수록 더 나은 결과를 얻으므로 좋은 관행이 됩니다. 다음은 더 구조화된 프롬프트를 따르는 방법의 예시입니다.

**프롬프트:**

아래 맥락을 바탕으로 질문에 답변하세요. 답변을 짧고 간결하게 유지하세요. 답변을 확신할 수 없으면 “답변을 모르겠습니다”라고 응답하세요.
맥락: 테플리주맙은 오쏘 파마슈티컬이라는 뉴저지의 제약 회사에서 시작되었습니다. 그곳에서 과학자들은 OKT3라는 초기 버전의 항체를 생성했습니다. 원래 마우스에서 추출된 이 분자는 T 세포 표면에 결합하여 세포 사멸 잠재력을 제한할 수 있었습니다. 1986년 신장 이식 후 장기 거부 반응을 예방하는 데 도움이 되도록 승인되었으며, 이는 인간에게 사용이 허용된 최초의 치료용 항체가 되었습니다.
질문: OKT3는 원래 어디에서 추출되었나요?
답변:

**출력:**

마우스.

맥락은 Nature에서 얻었습니다.

텍스트 분류

## 텍스트 분류

지금까지 간단한 지시 사항을 사용하여 작업을 수행했습니다. 프롬프트 엔지니어로서 더 나은 지시 사항을 제공하는 방법을 개선해야 합니다. 하지만 그것이 전부가 아닙니다! 더 어려운 사용 사례의 경우 지시 사항만 제공하는 것으로는 충분하지 않다는 것을 알게 될 것입니다. 여기에서 맥락과 프롬프트에서 사용할 수 있는 다른 요소에 대해 더 생각해야 합니다. 제공할 수 있는 다른 요소는 입력 데이터나 예시입니다.

텍스트 분류의 예시를 통해 이를 보여주겠습니다.

**프롬프트:**

텍스트를 중립, 부정 또는 긍정으로 분류하세요.
텍스트: 음식은 괜찮았던 것 같아요.
감정:

**출력:**

중립

텍스트를 분류하라는 지시를 내렸고 모델은 ‘중립’이라고 응답했으며, 이는 정확합니다. 이것에 문제가 있는 것은 아니지만, 실제로 모델이 원하는 정확한 형식으로 레이블을 제공하도록 하는 것이 목표라고 가정해 보겠습니다. 즉, ‘중립’ 대신 ‘neutral’이라고 반환하도록 하고 싶습니다. 이를 어떻게 달성할 수 있을까요? 이를 달성하는 방법은 여러 가지가 있습니다. 여기서는 특정성이 중요하므로 프롬프트에 제공할 수 있는 정보가 많을수록 더 나은 결과를 얻을 수 있습니다. 올바른 동작을 지정하기 위해 예시를 제공해 볼 수 있습니다. 다시 시도해 봅시다.

**프롬프트:**

텍스트를 중립, 부정 또는 긍정으로 분류하세요.
텍스트: 휴가는 괜찮았던 것 같아요.
감정: neutral
텍스트: 음식은 괜찮았던 것 같아요.
감정:

**출력:**

neutral

완벽해요! 이번에는 모델이 원하는 특정 레이블인 ‘neutral’을 반환했습니다. 프롬프트에 제공된 예시가 모델이 출력에서 특정성을 유지하는 데 도움이 된 것 같습니다.

때때로 특정성이 중요한 이유를 강조하기 위해 아래 예시를 살펴보고 문제점을 파악해 보세요.

**프롬프트:**

텍스트를 neutral, 부정 또는 긍정으로 분류하세요.
텍스트: 휴가는 괜찮았던 것 같아요.
감정:

**출력:**

중립

여기서 문제점은 무엇일까요? 힌트로, 만들어진 ‘neutral’ 레이블은 모델에서 완전히 무시됩니다. 대신 모델은 ‘중립’ 레이블에 대한 편향이 있기 때문에 ‘중립’을 출력합니다. 하지만 실제로 ‘nutral’을 원한다고 가정해 보겠습니다. 어떻게 수정할 수 있을까요? 레이블에 설명을 추가하거나 프롬프트에 더 많은 예시를 추가해 볼 수 있습니다. 잘 모르겠다면 다음 섹션에서 몇 가지 아이디어를 논의할 것입니다.

대화

아마도 프롬프트 엔지니어링을 통해 달성할 수 있는 가장 흥미로운 것 중 하나는 LLM 시스템이 어떻게 행동해야 하는지, 의도와 정체성을 지시하는 것입니다. 이는 고객 서비스 챗봇과 같은 대화형 시스템을 구축할 때 특히 유용합니다.

예를 들어, 질문에 대한 더 기술적이고 과학적인 응답을 생성할 수 있는 대화형 시스템을 만들어 봅시다. 지시 사항을 통해 시스템이 어떻게 행동해야 하는지 명시적으로 알려주는 점에 유의하세요. 이는 때때로 역할 프롬프팅이라고 합니다.

**프롬프트:**

다음은 AI 연구 보조원과의 대화입니다. 보조원의 어조는 기술적이고 과학적입니다.
인간: 안녕하세요, 당신은 누구인가요?
AI: 인사드립니다! 저는 AI 연구 보조원입니다. 오늘 무엇을 도와드릴까요?
인간: 블랙홀 생성에 대해 알려주시겠어요?
AI:

**출력:**

물론입니다! 블랙홀은 시공간에서 중력이 너무 강해서 빛조차 탈출할 수 없는 영역입니다. 블랙홀은 매우 무거운 별이 죽고 핵이 스스로 안으로 붕괴되어 무한한 밀도의 특이점을 형성할 때 생성됩니다. 특이점의 강력한 중력은 주변의 모든 물질과 복사를 끌어당겨 블랙홀을 형성합니다.

우리의 AI 연구 보조원이 너무 기술적인 것 같죠? 자, 이러한 행동을 바꾸고 시스템이 더 접근 가능한 답변을 제공하도록 지시해 봅시다.

**프롬프트:**

다음은 AI 연구 보조원과의 대화입니다. 보조원의 답변은 초등학생도 이해할 수 있도록 쉽게 설명해야 합니다.
인간: 안녕하세요, 당신은 누구인가요?
AI: 인사드립니다! 저는 AI 연구 보조원입니다. 오늘 무엇을 도와드릴까요?
인간: 블랙홀 생성에 대해 알려주시겠어요?
AI:

**출력:**

물론이죠! 블랙홀은 매우 무거운 별이 연료를 다 소모하고 스스로 안으로 붕괴될 때 생성됩니다. 별의 중력이 너무 강해서 빛조차 그 힘을 벗어날 수 없습니다. 이렇게 하면 블랙홀이라고 불리는 강력한 중력을 가진 시공간의 한 점이 생성됩니다.

진전이 있네요. 계속 개선할 수 있습니다. 더 많은 예시를 추가하면 더 나은 결과를 얻을 수 있습니다.

코드 생성

LLM이 매우 효과적인 응용 프로그램 중 하나는 코드 생성입니다. Copilot이 좋은 예시입니다. 똑똑한 프롬프트를 사용하여 수많은 코드 생성 작업을 수행할 수 있습니다. 아래에서 몇 가지 예시를 살펴보겠습니다.

먼저, 사용자에게 인사하는 간단한 프로그램을 시도해 봅시다.

**프롬프트:**

/*
사용자에게 이름을 묻고 “안녕하세요”라고 말하세요.
*/

**출력:**

let name = prompt(“이름이 무엇인가요?”);
console.log(안녕하세요, ${name}!);

언어를 지정할 필요도 없다는 것을 알 수 있습니다.

수준을 약간 바꿔 봅시다. 아래 예시는 프롬프트를 디자인하는 데 조금만 더 노력하면 LLM이 얼마나 강력한지 보여줍니다.

**프롬프트:**

“””
테이블 departments, 컬럼 = [DepartmentId, DepartmentName]
테이블 students, 컬럼 = [DepartmentId, StudentId, StudentName]
컴퓨터 과학 학과의 모든 학생에 대한 MySQL 쿼리를 생성하세요.
“””

**출력:**

SELECT StudentId, StudentName
FROM students
WHERE DepartmentId IN (SELECT DepartmentId FROM departments WHERE DepartmentName = ‘Computer Science’);

매우 인상적입니다. 이 경우 데이터베이스 스키마에 대한 데이터를 제공하고 유효한 MySQL 쿼리를 생성하도록 요청했습니다.

추론

아마도 오늘날 LLM에게 가장 어려운 작업 중 하나는 어떤 형태의 추론을 요구하는 작업일 것입니다. 추론은 LLM에서 나올 수 있는 복잡한 애플리케이션 유형 때문에 가장 흥미로운 분야 중 하나입니다.

수학적 기능을 포함하는 작업에 대한 몇 가지 개선이 있었습니다. 그러나 현재 LLM은 추론 작업을 수행하는 데 어려움을 겪고 있으므로 더 고급 프롬프트 엔지니어링 기법이 필요합니다. 다음 가이드에서 이러한 고급 기법을 다룰 것입니다. 지금은 산술 기능을 보여주는 몇 가지 기본적인 예시를 살펴보겠습니다.

**프롬프트:**

9,000 * 9,000은 얼마인가요?

**출력:**

81,000,000

더 어려운 것을 해봅시다.

프롬프트:

이 그룹에서 홀수들의 합은 짝수입니다: 15, 32, 5, 13, 82, 7, 1.
A:

출력

아니오, 이 그룹에서 홀수들의 합은 홀수입니다: 119.

그건 틀렸습니다! 프롬프트를 개선하여 이를 향상시켜 봅시다.

프롬프트:

이 그룹에서 홀수들의 합은 짝수입니다: 15, 32, 5, 13, 82, 7, 1.
문제를 단계별로 나누어 해결하세요. 먼저 홀수를 식별하고, 더한 다음, 결과가 홀수인지 짝수인지 표시하세요.

출력:

홀수: 15, 5, 13, 7, 1
합계: 41
41은 홀수입니다.

훨씬 좋아졌죠? 참고로, 우리는 이 작업을 몇 번 시도했고 모델이 때때로 실패합니다. 더 나은 지시사항과 예시를 함께 제공하면 더 정확한 결과를 얻는 데 도움이 될 수 있습니다.

다음 섹션에서는 이러한 모든 작업과 더 어려운 작업에 대한 성능을 향상시키기 위한 더욱 고급 프롬프트 엔지니어링 개념과 기술을 다룰 것입니다.

노트북
Python을 사용하여 위의 프롬프트를 연습하고 싶다면, OpenAI 모델을 사용하여 일부 프롬프트를 테스트할 수 있는 노트북을 준비했습니다.