mirror of
https://github.com/dair-ai/Prompt-Engineering-Guide
synced 2024-11-18 03:25:39 +00:00
Merge pull request #242 from 11mLLM/00_Intro
🇰🇷 Advanced Korean Translation - I Introduction
This commit is contained in:
commit
f210a1455f
@ -1,9 +1,18 @@
|
||||
# Prompt Engineering Guide
|
||||
# 프롬프트 엔지니어링 가이드
|
||||
|
||||
프롬프트 엔지니어링은 다양한 어플리케이션과 연구 주제에 언어 모델(LMs)을 효율적으로 사용할 수 있도록 프롬프트를 개발하고 최적화하는 비교적 새로운 분야입니다. 프롬프트 엔지니어링 기술은 대규모 언어 모델(LLMs)의 기능과 한계를 더 잘 이해하는 데 도움이 됩니다.
|
||||
프롬프트 엔지니어링은 다양한 애플리케이션과 연구 주제에 언어모델(LM)을 효율적으로 사용할 수 있도록 프롬프트를 개발하고 최적화하는 비교적 새로운 분야입니다. 프롬프트 엔지니어링 기술은 대규모언어모델(LLM)의 기능과 한계를 더 잘 이해하는 데 도움이 됩니다.
|
||||
|
||||
연구자들은 프롬프트 엔지니어링을 사용하여 질의응답 및 산술 추론과 같은 일반적이고 복잡한 작업에서 LLMs의 역량을 향상시킵니다. 개발자는 프롬프트 엔지니어링을 사용하여 LLMs 및 기타 도구와 인터페이스하는 강력하고 효과적인 프롬프트 기술을 설계합니다.
|
||||
연구자는 프롬프트 엔지니어링을 사용하여 질의응답 및 산술 추론과 같은 일반적 작업부터 복잡한 작업까지 다양한 범위에서 LLM의 역량을 향상시킵니다. 개발자는 프롬프트 엔지니어링을 사용하여 LLM 및 기타 도구와 인터페이스를 형성하는 강력하고 효과적인 프롬프트 기술을 설계합니다.
|
||||
|
||||
프롬프트 엔지니어링은 단순히 프롬프트를 설계하고 개발하는 것만이 아닙니다. 프롬프트 엔지니어링은 LLMs과 상호 작용하고 개발하는데 유용한 다양한 스킬과 기법을 포함합니다. 프롬프트 엔지니어링은 LLMs과 인터페이스하고, 빌드하고, LLMs의 기능을 이해하는데 중요한 기술입니다. 신속한 엔지니어링을 사용하여 LLMs의 안전성을 개선하고 도메인 지식 및 외부 도구로 LLMs을 보강하는 등 새로운 기능을 구축할 수 있습니다.
|
||||
프롬프트 엔지니어링은 단순히 프롬프트를 설계하고 개발하는 것만이 아닙니다. 프롬프트 엔지니어링은 LLM과 상호 작용 하고 개발하는 데 유용한 다양한 기술과 기법을 포함합니다. 프롬프트 엔지니어링은 LLM과 인터페이스를 형성하고, 빌드하고, LLM의 기능을 이해하는 데 중요한 기술입니다. 프롬프트 엔지니어링을 사용하여 LLM의 안전성을 개선하고 도메인 지식 및 외부 도구를 통해 LLM을 확장하는 등 새로운 기능을 구축할 수 있습니다.
|
||||
|
||||
LLMs을 사용한 개발에 대한 높은 관심덕에 프롬프트 엔지니어링과 관련된 모든 최신 논문, 학습 가이드, 모델, 강의, 참고 자료, 새로운 LLM 기능 및 도구가 포함된 이 새로운 프롬프트 엔지니어링 가이드를 만들었습니다.
|
||||
LLM을 기반으로 한 개발에 대한 높은 관심에 힘입어 이 새로운 프롬프트 엔지니어링 가이드를 만들었습니다. 프롬프트 엔지니어링에 관한 모든 최신 논문, 학습 가이드, 모델, 강의, 참고 문헌, 새로운 LLM 기능 및 도구가 포함되어 있습니다.
|
||||
|
||||
---
|
||||
높은 수요로 인해 Maven과의 제휴를 통해 [LLM을 위한 프롬프트 엔지니어링에 대한 코호트 기반 과정(Prompt Engineering for LLMs)](https://maven.com/dair-ai/prompt-engineering-llms)을 새롭게 제공하게 되었습니다.
|
||||
|
||||
이 과정에서는 Meta AI 및 Elastic과 같은 회사에서 근무하며 AI 및 LLM 분야에서 다년간의 경험을 쌓은 [Elvis Saravia](https://www.linkedin.com/in/omarsar/)가 강사로 함께합니다.
|
||||
|
||||
이 실습 과정에서는 대규모언어모델(LLM)을 통한 효과적인 작업과 구축을 위해 프롬프트 엔지니어링의 기법 및 도구, 사용 사례, 연습, 프로젝트를 다룹니다.
|
||||
|
||||
본 과정의 기존 수강자는 링크드인(LinkedIn), 아마존(Amazon), JP모건 체이스(JPMorgan Chase & Co), 인튜이트(Intuit), 피델리티 인베스트먼트(Fidelity investments), 코인베이스(Coinbase), 구루(Guru) 등 다양한 조직의 소프트웨어 엔지니어부터 AI 연구자 및 실무자에 이르기까지 넓은 범위에 걸쳐 활약하고 있습니다.
|
@ -1,7 +1,7 @@
|
||||
{
|
||||
"settings": "LLM 설정",
|
||||
"basics": "기본 프롬프팅",
|
||||
"elements": "프롬프트의 요소",
|
||||
"tips": "프롬프트 디자인 팁",
|
||||
"basics": "프롬프트의 기초",
|
||||
"elements": "프롬프트의 구성 요소",
|
||||
"tips": "프롬프트 설계에 관한 일반적인 팁",
|
||||
"examples": "프롬프트 예시"
|
||||
}
|
||||
|
@ -1,19 +1,17 @@
|
||||
# 프롬프트의 기초
|
||||
|
||||
## 기본 프롬프트의
|
||||
## 기초 프롬프트
|
||||
|
||||
간단한 프롬프트만으로도 많은 일들을 할 수 있지만, 제공하는 정보의 양과 퀄리티에 따라 그 결과의 퀄리티는 천차만별입니다. 모델에게 전달하는 프롬프트는 *지시*나 *질문*과 같은 정보, _맥락_, _입력_ 또는 *예시*와 같은 다른 세부 사항을 포함할 수 있습니다. 이러한 요소를 사용하여 모델에게 더욱 적절하게 지시하고 더 나은 결과를 얻을 수 있습니다.
|
||||
간단한 프롬프트만으로도 많은 일들을 할 수 있지만, 제공하는 정보의 양과 퀄리티에 따라 그 결과는 천차만별입니다. 모델에게 전달하는 프롬프트는 *지시*나 *질문*과 같은 정보와 *맥락*, *입력* 또는 *예시*와 같은 다른 세부 사항을 포함할 수 있습니다. 이러한 구성 요소를 사용하여 모델에게 더욱 적절하게 지시하고 더 나은 결과를 얻을 수 있습니다.
|
||||
|
||||
먼저 간단한 프롬프트의 기본 예시를 살펴보겠습니다:
|
||||
|
||||
_프롬프트_
|
||||
|
||||
_Prompt:_
|
||||
```
|
||||
하늘은
|
||||
```
|
||||
|
||||
_출력:_
|
||||
|
||||
_Output:_
|
||||
```
|
||||
푸른색입니다.
|
||||
|
||||
@ -27,27 +25,25 @@ _출력:_
|
||||
|
||||
한 발짝 더 나아가 보겠습니다:
|
||||
|
||||
_프롬프트:_
|
||||
|
||||
_Prompt:_
|
||||
```
|
||||
문장을 완성해 줘:
|
||||
|
||||
하늘은
|
||||
```
|
||||
|
||||
_출력:_
|
||||
|
||||
_Output:_
|
||||
```
|
||||
오늘 매우 아름답습니다.
|
||||
```
|
||||
|
||||
훨씬 괜찮아 보이나요? 우리가 문장을 완성하라고 지시한 대로 모델은 정확히 "문장 완성"을 수행해서 답변을 출력했습니다. 모델에게 작업을 수행하도록 지시하기 위해 최적의 프롬프트를 설계하는 이러한 접근 방식을 **프롬프트 엔지니어링**이라고 합니다
|
||||
훨씬 괜찮아 보이나요? 우리가 문장을 완성하라고 지시한 대로 모델은 정확히 수행("문장 완성")해서 답변을 출력했습니다. 모델에게 작업을 수행하도록 지시하기 위해 최적의 프롬프트를 설계하는 이러한 접근 방식을 **프롬프트 엔지니어링**이라고 합니다.
|
||||
|
||||
위의 예시를 통해 LLM(Language Model)이 할 수 있는 것을 간단히 살펴보았습니다. 오늘날의 LLM은 텍스트 요약부터 수학적 추론, 코드 생성까지 모든 종류의 고급 작업을 수행할 수 있습니다.
|
||||
위의 예시를 통해 LLM(대규모언어모델)이 할 수 있는 것을 간단히 살펴보았습니다. 오늘날의 LLM은 텍스트 요약부터 수학적 추론, 코드 생성까지 모든 종류의 고급 작업을 수행할 수 있습니다.
|
||||
|
||||
## 프롬프트 포맷팅
|
||||
## 프롬프트 형식
|
||||
|
||||
위에서 간단한 프롬프트를 입력해보았는데요, 기본적인 프롬프트는 다음과 같은 형식을 따릅니다:
|
||||
위에서 간단한 프롬프트를 입력해 보았습니다. 일반적인 프롬프트는 다음과 같은 형식을 따릅니다:
|
||||
|
||||
```
|
||||
<질문>?
|
||||
@ -59,16 +55,16 @@ _출력:_
|
||||
<지시>
|
||||
```
|
||||
|
||||
질문과 응답 형식으로도 작성이 가능하며, 다음과 같이 많은 QA 데이터 세트에서 표준형식으로 사용합니다:
|
||||
질의응답(QA) 형식으로도 작성이 가능하며, 다음과 같이 많은 QA 데이터 세트에서 표준 형식으로 사용합니다:
|
||||
|
||||
```
|
||||
Q: <질문>?
|
||||
A:
|
||||
```
|
||||
|
||||
위와 같이 프롬프트를 수행하는 방식을 *zero-shot prompting*이라고도 합니다. 즉, 어떤 예시나 설명 없이 직접 모델에 응답을 요구하고 있습니다. 몇몇 대규모 언어 모델에는 zero-shot prompting을 실행할 수 있는 기능이 있지만, 해당 작업의 복잡성과 지식에 따라 다른 결과를 낳습니다.
|
||||
위와 같이 프롬프트를 수행하는 방식을, *제로샷 프롬프팅(zero-shot prompting)*이라고도 합니다. 즉, 어떤 예시나 설명 없이 직접 모델에 응답을 요구하고 있습니다. 몇몇 대규모언어모델에는 제로샷 프롬프팅을 실행할 수 있는 기능이 있지만 해당 작업의 복잡성과 모델이 가진 지식에 따라 다른 결과를 만들어 냅니다.
|
||||
|
||||
표준 형식을 고려할 때, *few-shot prompting*이라고 불리는 인기 있는 뛰어난 프롬프트 기술이 있습니다. few-shot prompting은 예시를 제공합니다. few-shot prompting은 다음과 같은 형식을 가집니다.
|
||||
위의 표준 형식을 고려할 때, 인기 있고 효과적인 프롬프팅 기술 중 하나는 모범 예시(예: 시연)를 제공하는 *퓨샷 프롬프팅(few-shot prompting)*입니다. 퓨샷 프롬프팅은 다음과 같은 형식을 가집니다:
|
||||
|
||||
```
|
||||
<질문>?
|
||||
@ -84,7 +80,7 @@ A:
|
||||
|
||||
```
|
||||
|
||||
QA 형식을 따른다면 아래처럼 지시할 수 있겠지요.
|
||||
QA 형식을 따른다면 아래처럼 지시할 수 있습니다:
|
||||
|
||||
```
|
||||
Q: <질문>?
|
||||
@ -100,10 +96,9 @@ Q: <질문>?
|
||||
A:
|
||||
```
|
||||
|
||||
언제나 QA 포맷을 따라야하는 것은 아닙니다. 주어진 태스크에 따른 적절한 프롬프트 포맷을 사용하세요. 예를 들어, 간단한 분류를 통해 아래와 같이 샘플을 제공할 수 있습니다. :
|
||||
|
||||
_프롬프트:_
|
||||
언제나 QA 형식을 따라야 하는 것은 아닙니다. 주어진 태스크에 따른 적절한 프롬프트 형식을 사용해 보세요. 예를 들어, 간단한 분류를 통해 아래와 같이 모범 예시를 제공할 수 있습니다:
|
||||
|
||||
_Prompt:_
|
||||
```
|
||||
멋지다! // 긍정
|
||||
나빠! // 부정
|
||||
@ -111,10 +106,9 @@ _프롬프트:_
|
||||
이 얼마나 끔찍한 공연인가! //
|
||||
```
|
||||
|
||||
_출력:_
|
||||
|
||||
_Output:_
|
||||
```
|
||||
부정
|
||||
```
|
||||
|
||||
언어 모델의 학습을 위해 약간의 설명을 제공해주면 few-shot prompting은 문맥에 맞는 학습을 할 수 있습니다.
|
||||
언어 모델의 학습을 위해 몇 번의 모범 예시를 제공해주면, 퓨샷 프롬프팅은 문맥에 맞는 학습을 할 수 있습니다.
|
||||
|
@ -1,15 +1,15 @@
|
||||
# 프롬프트의 구성 요소
|
||||
|
||||
프롬프트 엔지니어링을 접목한 여러 응용 프로그램을 반복해서 사용하다 보면, 프롬프트를 구성하는 특정 요소들이 있다는 것을 알 수 있습니다.
|
||||
프롬프트 엔지니어링을 접목한 여러 애플리케이션을 반복해서 사용하다 보면, 프롬프트에는 특정 구성 요소들이 있다는 것을 알 수 있습니다.
|
||||
|
||||
프롬프트는 다음과 같은 구성 요소를 포함할 수 있습니다:
|
||||
프롬프트에는 다음 구성 요소들이 있습니다:
|
||||
|
||||
**명령** - 모델이 수행할 특정 작업 또는 명령
|
||||
**지시(Instruction)** - 모델이 수행할 특정 작업 또는 지시
|
||||
|
||||
**문맥** - 외부 정보나 추가 맥락이 포함될 수 있으며 이는 모델이 더 나은 응답을 하도록 돕습니다.
|
||||
**문맥** - 더 나은 응답을 위해 모델을 조종할 수 있는 외부 정보나 추가 문맥
|
||||
|
||||
**입력 데이터** - 응답받고자 하는 입력이나 질문
|
||||
|
||||
**출력 지시자** - 출력의 유형이나 형식을 나타냅니다.
|
||||
**출력 지시자** - 출력의 유형이나 형식
|
||||
|
||||
위의 모든 요소가 프롬프트에 필요한 것은 아니며 어떤 작업을 하느냐에 따라 포맷은 달라질 수 있습니다. 이어지는 가이드에서 더 구체적인 예를 다루겠습니다.
|
||||
위의 네 가지 구성 요소가 프롬프트에 모두 필요한 것은 아니며 형식은 어떤 작업인지에 따라 달라질 수 있습니다. 이어지는 가이드에서 더 구체적인 예시를 다루겠습니다.
|
||||
|
@ -1,28 +1,26 @@
|
||||
# 프롬프트 예시
|
||||
|
||||
이전 파트에서, LLM에 프롬프트를 입력하는 기본적인 예를 다뤄보았습니다.
|
||||
이전 절에서, 대규모언어모델(LLM)에 프롬프트를 입력하는 기본적인 예를 살펴보았습니다.
|
||||
|
||||
이번에는 프롬프트가 작업을 수행하는 추가 예시를 제공하고 그 과정에서 핵심 개념을 살펴보겠습니다. 개념을 배우는 가장 좋은 방법은 예시를 통해 이해하는 것입니다. 아래에서 잘 작성된 프롬프트가 다른 유형의 작업을 수행하기 위해 어떻게 사용되는지에 대한 몇 가지 예를 다루고 있습니다.
|
||||
이번 절에서는 프롬프트를 사용하여 다양한 작업을 수행하는 예시를 통해 핵심 개념을 살펴보겠습니다. 종종, 개념을 배우는 가장 좋은 방법은 예시를 통해 이해하는 것입니다. 아래의 잘 작성된 프롬프트 예시를 통해 서로 다른 유형의 작업을 어떻게 수행할 수 있는지에 대해 알아보겠습니다.
|
||||
|
||||
Topics:
|
||||
|
||||
- [문장 요약](#문장 요약)
|
||||
- [정보 추출](#정보 추출)
|
||||
- [문장 요약](#문장-요약)
|
||||
- [정보 추출](#정보-추출)
|
||||
- [질의응답](#질의응답)
|
||||
- [텍스트 분류](#텍스트 분류)
|
||||
- [회화](#회화)
|
||||
- [코드 생성](#코드 생성)
|
||||
- [텍스트 분류](#텍스트-분류)
|
||||
- [대화](#대화)
|
||||
- [코드 생성](#코드-생성)
|
||||
- [추론](#추론)
|
||||
|
||||
---
|
||||
|
||||
## 문장 요약
|
||||
|
||||
문장 요약은 자연어 생성의 대표적인 작업 중 하나입니다. 문장 요약은 여러 주제와 도메인을 포함합니다. 사실, 언어 모델의 가장 유망한 응용 프로그램 중 하나는 기사와 개념을 빠르게 요약할 수 있는 능력입니다. 프롬프트를 사용하여 간단한 요약 작업을 실행해보겠습니다.
|
||||
문장 요약은 자연어 생성의 대표적인 작업 중 하나입니다. 문장 요약은 여러 주제와 도메인을 포함합니다. 사실, 언어 모델의 가장 유망한 애플리케이션 중 하나는 기사와 개념을 빠르고 읽기 쉽게 요약할 수 있는 능력입니다. 프롬프트를 사용하여 간단한 요약 작업을 시도해 보겠습니다.
|
||||
|
||||
예를 들어 항생제에 대해 배우고 싶다면 다음과 같은 프롬프트를 시도할 수 있습니다:
|
||||
|
||||
_프롬프트:_
|
||||
*Prompt:*
|
||||
|
||||
```
|
||||
항생제에 대해 설명해 줘
|
||||
@ -30,70 +28,62 @@ _프롬프트:_
|
||||
A:
|
||||
```
|
||||
|
||||
_출력:_
|
||||
*Output:*
|
||||
|
||||
```
|
||||
항생제는 세균 감염을 치료하기 위해 사용되는 약제의 일종입니다. 세균을 죽이거나 재생을 방지하여 몸의 면역계가 감염에 대항할 수 있도록 합니다. 항생제는 정제, 캡슐, 액체의 형태로 일반적으로 입을 통해 섭취하지만 경우에 따라 정맥 내 투여되기도 합니다. 항생제는 바이러스 감염에는 효과가 없으며 남용 시 항생제 내성을 일으킬 수 있습니다.
|
||||
항생제는 세균 감염을 치료하기 위해 사용되는 약물의 일종입니다. 세균을 죽이거나 번식을 방지하여 신체의 면역 체계가 감염에 대항할 수 있도록 합니다. 항생제는 보통 알약, 캡슐, 액체의 형태로 경구 복용하거나 때때로 정맥 주사로 투여되기도 합니다. 항생제는 바이러스 감염에는 효과적이지 않고, 남용할 경우 항생제 내성이 생길 수 있습니다.
|
||||
```
|
||||
|
||||
"A:"는 질답 형식에 사용되는 명시적 프롬프트 형식을 띄고있습니다. 저는 모델에게 추가 질문을 할 것이라고 암시하기위해 이 방법을 사용했습니다. 이 예시가 어느 방식으로 유용한가에 대해서는 추후 살펴보도록하겠습니다. 우리가 원했던 것 보다 훨씬 더 많은 양의 정보를 받아서 요약이 필요하다고 가정해보도록 하겠습니다. 실제로 모델에게 다음과 같이 한 문장으로 요약하도록 지시할 수 있습니다:
|
||||
|
||||
_프롬프트:_
|
||||
"A:"는 질의응답에 사용되는 명시적 프롬프트 형식을 띠고 있습니다. 여러분은 모델에게 추가적으로 답변을 기대하고 있다는 것을 전달하기 위해서 이 방법을 사용했습니다. 이 예시가 얼마나 유용한가에 대해서는 추후에 다른 예시에서 살펴보도록 하겠습니다. 이제 이 출력이 우리가 원했던 것보다 더 많은 양의 정보라서 추가적인 요약이 필요하다고 가정해 보겠습니다. 실제로 모델에게 다음과 같이 한 문장으로 요약하도록 지시할 수 있습니다:
|
||||
|
||||
*Prompt:*
|
||||
```
|
||||
항생제는 세균 감염을 치료하기 위해 사용되는 약제의 일종입니다. 세균을 죽이거나 재생을 방지하여 몸의 면역계가 감염에 대항할 수 있도록 합니다. 항생제는 정제, 캡슐, 액체의 형태로 일반적으로 입을 통해 섭취하지만 경우에 따라 정맥 내 투여되기도 합니다. 항생제는 바이러스 감염에는 효과가 없으며 남용 시 항생제 내성을 일으킬 수 있습니다.
|
||||
항생제는 세균 감염을 치료하기 위해 사용되는 약물의 일종입니다. 세균을 죽이거나 번식을 방지하여 신체의 면역 체계가 감염에 대항할 수 있도록 합니다. 항생제는 보통 알약, 캡슐, 액체의 형태로 경구 복용하거나 때때로 정맥 주사로 투여되기도 합니다. 항생제는 바이러스 감염에는 효과적이지 않고, 남용할 경우 항생제 내성이 생길 수 있습니다.
|
||||
|
||||
위 내용을 한 문장으로 요약해줘.
|
||||
위 내용을 한 문장으로 요약해 줘:
|
||||
```
|
||||
|
||||
_출력:_
|
||||
|
||||
*Output:*
|
||||
```
|
||||
항생제는 박테리아를 죽이거나 번식을 막음으로써 감염을 치료하는 데 사용되는 약이지만, 바이러스에 효과적이지 않고 과도한 사용은 항생제 내성을 초래할 수 있습니다.
|
||||
```
|
||||
|
||||
위 대답의 정확성은 추후 가이드에서 다룰 예정이므로 차치하고, 일단 모델이 단락을 한 문장으로 요약했다는 것에 초점을 맞춰보겠습니다. 좀 더 정확한 지시를 내리는 방법에 대해서도 뒷 장에서 살펴볼 예정이므로 잠시 잊어버리고 지금 당장은 자유롭게 더 나은 결과를 얻을 수 있는 방법을 실험해보세요.
|
||||
위 대답의 정확성은 추후 가이드에서 다룰 예정이므로 차치하고, 일단 모델이 단락을 한 문장으로 요약했다는 것에 초점을 맞춰 보겠습니다. 좀 더 정확한 지시를 내리는 방법에 대해서도 뒷장에서 살펴보기로 하고, 지금은 자유롭게 더 나은 결과를 얻을 수 있는지 실험해 보겠습니다.
|
||||
|
||||
---
|
||||
|
||||
## 정보 추출
|
||||
언어 모델은 자연어 생성과 관련된 작업을 수행하도록 훈련되었지만 분류나 다양한 자연어 처리(NLP) 작업을 수행할 수도 있습니다.
|
||||
|
||||
언어 모델은 자연어 생성 관련 작업을 수행하도록 훈련되었지만 분류나 다양한 자연어 처리(NLP) 작업을 수행할 수도 있습니다.
|
||||
|
||||
주어진 단락에서 정보를 추출하는 프롬프트의 예시를 살펴봅시다.
|
||||
|
||||
_프롬프트:_
|
||||
주어진 단락에서 정보를 추출하는 프롬프트의 예시를 살펴보겠습니다.
|
||||
|
||||
*Prompt:*
|
||||
```
|
||||
연구 논문의 저자 기고문과 인정서는 저자들이 원고 작성과 분석에 ChatGPT 등 AI 기술을 사용했는지 여부와 범위를 명확하고 구체적으로 명시해야 합니다. 또한 어떤 LLM이 사용되었는지 표시해야 합니다. 이를 통해 편집자와 검토자는 잠재적 편향, 부정확성 및 부적절한 출처에 대해 원고를 보다 신중하게 검토하도록 유도할 수 있습니다. 마찬가지로, 과학 저널은 투고된 원고 선정 시 LLMs를 사용한 경우에는 그 이력을 투명하게 공개해야 합니다.
|
||||
연구 논문의 저자 기여도 진술서과 사사는 저자들이 원고 작성과 분석에 ChatGPT 등 AI 기술을 사용했는지 여부와 범위를 명확하고 구체적으로 명시해야 합니다. 또한 어떤 LLM이 사용되었는지 표기해야 합니다. 이를 통해 편집자와 심사자가 잠재적 편향, 부정확성 및 부적절한 출처 등의 문제를 고려해 원고를 보다 신중하게 검토하도록 유도할 수 있습니다. 마찬가지로, 과학 저널은 투고된 원고 선정 시 LLM 사용 여부를 투명하게 공개해야 합니다.
|
||||
|
||||
위 단락에서 언급된 대규모 언어 모델 기반 제품을 알려줘.
|
||||
위 단락에서 언급한 대규모언어모델 기반 제품을 알려줘.
|
||||
```
|
||||
|
||||
_출력:_
|
||||
|
||||
*Output:*
|
||||
```
|
||||
위 단락에서 언급된 대규모 언어 모델 기반 제품은 ChatGPT입니다.
|
||||
위 단락에서 언급한 대규모언어모델 기반 제품은 ChatGPT입니다.
|
||||
```
|
||||
|
||||
위의 결과를 개선하는 방법은 더러 있겠지만, 이미 그 자체로 꽤 쓸만합니다.
|
||||
위의 결과를 개선하는 방법은 여러 가지가 있겠지만, 이미 그 자체로도 꽤 유용합니다.
|
||||
|
||||
이제 우리는 단순한 지시만으로 모델이 다양한 작업을 수행하도록 할 수 있다는 사실을 배웠습니다. 이는 AI 제품 개발자들이 이미 강력한 제품이나 서비스를 구현하기 위해 사용하는 강력한 능력입니다.
|
||||
이제 우리는 단순히 무엇을 할지 지시하는 것으로 모델이 다양한 작업을 수행하도록 할 수 있다는 사실을 배웠습니다. 이는 AI 제품 개발자들이 이미 강력한 제품이나 서비스를 구현하기 위해 사용하고 있는 강력한 능력입니다.
|
||||
|
||||
원본 출처: [ChatGPT: five priorities for research](https://www.nature.com/articles/d41586-023-00288-7)
|
||||
|
||||
---
|
||||
|
||||
## 질의응답
|
||||
|
||||
모델로부터 원하는 답변을 끌어내는 가장 좋은 방법 중 하나는 프롬프트 포맷을 개선하는 것입니다. 앞서 살펴본 바와 같이 프롬프트는 지시, 문맥, 입력 및 출력 인디케이터를 조합하여 더 나은 결과를 얻을 수 있습니다. 이러한 요소는 필수적인 것은 아니지만, 지시가 구체적일수록 더 좋은 결과를 얻을 수 있기때문에 적절히 사용하는 방법을 익히세요. 다음은 보다 구조화된 프롬프트를 실행해보겠습니다.
|
||||
|
||||
_프롬프트:_
|
||||
모델로부터 원하는 답변을 끌어내는 가장 좋은 방법 중 하나는 프롬프트 형식을 개선하는 것입니다. 앞서 살펴본 바와 같이 프롬프트는 지시, 문맥, 입력 데이터와 출력 지시자를 조합하여 더 나은 결과를 얻을 수 있습니다. 이러한 요소는 필수적인 것은 아니지만, 지시가 구체적일수록 더 좋은 결과를 얻을 수 있습니다. 다음은 보다 구조화된 프롬프트를 실행해 보겠습니다.
|
||||
|
||||
*Prompt:*
|
||||
```
|
||||
아래 문맥을 고려해서 질문에 답변해 줘. 답변은 짧고 간결하게 해 줘. 답변이 정확하지 않다면, 「확실치 않은 대답」이라고 응답해 줘.
|
||||
|
||||
문맥: Teplizumab은 Ortho Pharmaceutical이라고 불리는 뉴저지의 약제 회사에서 유래했다. 그래서 과학자들은 OKT3라는 항체의 초기 버전을 생성했다. 원래 쥐에서 유래된 이 분자는 T 세포의 표면에 결합하여 세포를 죽이는 잠재력을 제한할 수 있다. 1986년, 신장 이식 후 장기 거부 반응 예방을 위해 승인되어 인간이 사용할 수 있는 최초의 치료용 항체가 되었다.
|
||||
문맥: Teplizumab은 Ortho Pharmaceutical이라는 뉴저지의 제약 회사에서 유래했다. 그곳에서, 과학자들은 OKT3라는 항체의 초기 버전을 만들어 냈다. 원래 쥐에서 유래된 이 분자는 T 세포의 표면에 결합하여 세포를 죽이는 잠재력을 제한할 수 있다. 1986년, 신장 이식 후 장기 거부 반응 예방을 위해 승인되어 인간이 사용할 수 있는 최초의 치료용 항체가 되었다.
|
||||
|
||||
|
||||
질문: OKT3는 어디서 유래했는가?
|
||||
@ -101,44 +91,38 @@ _프롬프트:_
|
||||
답변:
|
||||
```
|
||||
|
||||
_출력:_
|
||||
|
||||
*Output:*
|
||||
```
|
||||
쥐.
|
||||
```
|
||||
|
||||
문맥 원문의 출처는 [Nature](https://www.nature.com/articles/d41586-023-00400-x) 입니다.
|
||||
문맥의 출처는 [Nature](https://www.nature.com/articles/d41586-023-00400-x)입니다.
|
||||
|
||||
---
|
||||
|
||||
## 텍스트 분류
|
||||
지금까지 우리는 간단한 지시를 사용하여 작업을 수행했습니다. 프롬프트 엔지니어로서 점점 더 나은 지시를 내리는 것은 기본 소양입니다. 하지만 그것이 전부는 아닙니다. 더 까다로운 작업을 수행하기 위해서는 지시만으로는 충분하지 않다는 것을 깨닫게 될 것입니다. 문맥과 여러 요소들을 고려하여 적절한 프롬프트를 사용할 필요가 있습니다. `입력 데이터`나 `예시` 또한 요소로 할 수 있습니다.
|
||||
|
||||
지금 까지, 우리는 작업 수행을 위 간단한 지시들을 사용해보았습니다. 프롬프트 엔지니어로서 점점 더 바른 지시를 내리는 것은 기본 소양입니다. 하지만 그것만이 전부는 아닙니다. 더 까다로운 작업을 수행하기 위해서는 지시만으로는 해결되지 않는다는 것을 깨닫게 될 것입니다. 문맥과 여러 요소들을 고려하여 적절한 프롬프트를 사용할 필요가 있습니다. `데이터 입력`이나 `예시`또한 요소로 사용됩니다.
|
||||
|
||||
텍스트 분류 예시를 제공하여 이를 설명해보겠습니다.
|
||||
|
||||
_프롬프트:_
|
||||
텍스트 분류를 예시로 이를 설명해 보겠습니다.
|
||||
|
||||
*Prompt:*
|
||||
```
|
||||
문장을 중립, 부정 혹은 긍정으로 분류해줘.
|
||||
문장을 neutral, 부정 혹은 긍정으로 분류해 줘.
|
||||
|
||||
문구: 그 음식은 그럭저럭이었어.
|
||||
감정:
|
||||
```
|
||||
|
||||
_출력:_
|
||||
|
||||
*Output:*
|
||||
```
|
||||
중립
|
||||
Neutral
|
||||
```
|
||||
|
||||
모델에게 텍스트 분류법을 알려주었더니 모델은 `'중립'`이라는 올바른 답변을 반환했습니다. 오답은 아니지만, 우리가 원하는 특정 형식의 라벨이 있고 그것을 모델이 반환하기를 원한다고 가정해보겠습니다. `Neutral` 대신 `neutral`을 반환하도록 유도해봅시다. 그러기위해서는 어떻게 하면 될까요? 방법은 여러가지가 있습니다. 지금 이 예시에서는 정확성에 초점을 맞추고있고, 프롬프트에 더 많은 정보를 제공하는만큼 더 나은 결과를 얻을 수 있습니다. 원하는 결과를 얻기위해 예시들을 제공해보겠습니다. 다시 시도해보겠습니다 :
|
||||
|
||||
_프롬프트:_
|
||||
모델에게 텍스트 분류를 지시하자 모델은 `'Neutral'`이라는 올바른 답변을 반환했습니다. 오답은 아니지만, 모델이 우리가 원하는 특정 형식의 라벨을 반환하길 원한다고 가정해 보겠습니다. `Neutral` 대신 `neutral`을 반환하도록 유도해 봅시다. 그러기 위해서는 어떻게 해야 할까요? 방법은 여러 가지가 있습니다. 지금 이 예시에서는 정확성에 초점을 맞추고 있고, 프롬프트에 더 많은 정보를 제공할수록 더 나은 결과를 얻을 수 있습니다. 원하는 결과를 얻기 위해 예시들을 추가하여 다시 시도해 보겠습니다:
|
||||
|
||||
*Prompt:*
|
||||
```
|
||||
문장을
|
||||
문장을 중립, 부정 혹은 긍정으로 분류해줘.
|
||||
문장을 neutral, 부정 혹은 긍정으로 분류해 줘.
|
||||
|
||||
문구: 이번 휴가는 그럭저럭이었어.
|
||||
감정: neutral
|
||||
@ -147,119 +131,105 @@ _프롬프트:_
|
||||
감정:
|
||||
```
|
||||
|
||||
_출력:_
|
||||
|
||||
*Output:*
|
||||
```
|
||||
중립
|
||||
neutral
|
||||
```
|
||||
|
||||
우와! 의도한 대로 모델은 소문자로 시작하는 `중립`이라는 대답을 반환했습니다. 프롬프트에 예시를 제공함으로써 모델로부터 원하는 답변을 끌어낼 수 있었습니다. 꼼꼼히 질문하는 것이 중요하다는 것을 다음 예시를 통해서 살펴보도록 합시다:
|
||||
우와! 의도한 대로 모델은 소문자로 시작하는 `neutral`을 반환했습니다. 프롬프트에 예시를 제공함으로써 모델로부터 원하는 답변을 끌어낼 수 있었습니다.
|
||||
|
||||
_프롬프트:_
|
||||
구체적으로 질문하는 것이 중요하다는 것을 다음 예시를 통해서 살펴보겠습니다:
|
||||
|
||||
*Prompt:*
|
||||
```
|
||||
문장을 증립, 부정 혹은 긍정으로 분류해줘.
|
||||
문장을 nutral, 부정 혹은 긍정으로 분류해 줘.
|
||||
|
||||
문구: 이번 휴가는 그럭저럭이었어.
|
||||
감정:
|
||||
```
|
||||
|
||||
_출력:_
|
||||
|
||||
*Output:*
|
||||
```
|
||||
중립
|
||||
Neutral
|
||||
```
|
||||
|
||||
뭐가 문제일까요? 프롬프트에 입력된 "증립" 레이블은 모델에게 완전히 무시됐습니다. 대신, 모델은 "중립"을 출력하며 이는 해당 레이블에 대한 편향이 있기 때문입니다. 그러나 우리가 실제로 원하는 것은 "증립"이라고 가정해 봅시다. 이 문제를 해결하려면 어떻게 해야 할까요? 레이블에 설명을 추가하거나 프롬프트에 더 많은 예제를 추가해 볼 수 있을까요? 확신이 없으셔도, 우리는 다음 섹션에서 몇 가지 아이디어를 논의할 것 입니다.
|
||||
어떤 점이 문제일까요? 프롬프트에 입력된 `nutral` 라벨은 모델에게 완전히 무시됐습니다. 대신, 모델은 `Neutral`을 출력했으며 이는 해당 라벨에 대한 편향이 있기 때문입니다. 그러나 우리가 실제로 원하는 것은 `nutral`이라고 가정해 보겠습니다. 이 문제를 해결하려면 어떻게 해야 할까요? 라벨에 설명을 추가하거나 프롬프트에 더 많은 예제를 추가해 보는 것은 어떨까요? 확신이 들지 않는다면, 다음 절에서 몇 가지 생각을 논의해 보겠습니다.
|
||||
|
||||
---
|
||||
|
||||
## 회화
|
||||
|
||||
## 대화
|
||||
아마 프롬프트 엔지니어링을 통해 접할 수 있는 흥미로운 점들 중 하나는 LLM 시스템의 행동과 의도 그리고 정체성을 고려하여 지시를 내리는 것일 겁니다. 이러한 특성은 고객 서비스 챗봇과 같은 대화형 시스템을 구축할 때 특히 유용합니다.
|
||||
|
||||
예시로, 주어진 질문에 기술적이고 과학적인 대답을 반환 할 수있는 대화형 시스템을 구축해보겠습니다. 이른바 *role prompting*이라 불리우는 것입니다.
|
||||
|
||||
_프롬프트:_
|
||||
예를 들어 주어진 질문에 기술적이고 과학적인 대답을 반환할 수 있는 대화형 시스템을 구축해 보겠습니다. 이른바 *역할 프롬프팅(role prompting)*이라 불리는 것입니다.
|
||||
|
||||
*Prompt:*
|
||||
```
|
||||
|
||||
다음은 AI 연구 보조원과의 대화입니다. 이 보조원의 어조는 기술적이고 과학적입니다.
|
||||
|
||||
인간: 안녕, 너는 누구니?
|
||||
AI: 반갑습니다! 저는 AI 연구 보조원입니다. 무엇을 도와드릴까요?
|
||||
AI: 반갑습니다! 저는 AI 연구 보조원입니다. 오늘은 무엇을 도와드릴까요?
|
||||
인간: 블랙홀 생성에 대해 설명해 줄래?
|
||||
AI:
|
||||
```
|
||||
|
||||
_출력:_
|
||||
|
||||
*Output:*
|
||||
```
|
||||
물론입니다! 블랙홀은 중력이 너무 강해서 심지어 빛조차도 벗어날 수 없는 시공간의 영역입니다. 거대한 별이 죽고 그 중심핵이 스스로 붕괴하여 무한 밀도의 특이점을 형성할 때 생성됩니다. 특이점의 강한 중력은 그 주변의 모든 물질과 방사선을 끌어당겨 블랙홀을 만듭니다.
|
||||
물론입니다! 블랙홀은 중력이 너무 강해서 심지어 빛조차도 벗어날 수 없는 시공간의 영역입니다. 아주 거대한 별이 죽고 그 중심핵이 스스로 붕괴하여 무한한 밀도의 특이점을 형성할 때 생성됩니다. 특이점의 강한 중력은 그 주변의 모든 물질과 방사선을 끌어당겨 블랙홀을 만듭니다.
|
||||
```
|
||||
|
||||
우리 AI 연구원의 대답은 쉽게 이해할 수 있는 논조는 아니지요? 이 행동을 변경하여 시스템에 보다 접근하기 쉬운 답변을 지시해봅시다.
|
||||
|
||||
_프롬프트:_
|
||||
우리 AI 연구 보조원의 대답은 너무 기술적인 것 같습니다. 이 행동을 변경하여 시스템에 보다 접근하기 쉬운 답변을 지시해 보겠습니다.
|
||||
|
||||
*Prompt:*
|
||||
```
|
||||
다음은 AI 연구 보조원과의 대화입니다. 보조원은 초등학생도 이해할 수 있는 수준으로 답변해야 합니다.
|
||||
|
||||
인간: 안녕, 너는 누구니?
|
||||
AI: 반갑습니다! 저는 AI 연구 보조원입니다. 무엇을 도와드릴까요?
|
||||
AI: 반갑습니다! 저는 AI 연구 보조원입니다. 오늘은 무엇을 도와드릴까요?
|
||||
인간: 블랙홀 생성에 대해 설명해줄래?
|
||||
AI:
|
||||
```
|
||||
|
||||
_출력:_
|
||||
|
||||
*Output:*
|
||||
```
|
||||
물론이죠! 블랙홀은 아주 큰 별이 연료를 다 써버려 붕괴함으로써 만들어집니다. 별의 중력이 매우 강하기 때문에 빛조차도 끌어당겨 그 중력장에 의한 공간에 점이 생깁니다. 그것이 블랙홀이지요.
|
||||
물론이죠! 블랙홀은 아주 거대한 별이 연료를 다 써 버려서 스스로 붕괴함으로써 만들어집니다. 별의 중력이 매우 강하기 때문에 빛조차도 벗어날 수 없습니다. 이렇게 강력한 중력을 가진 시공간의 한 점이 블랙홀입니다.
|
||||
```
|
||||
|
||||
진전이 보이시지요? 여기서 더 개선할 수도 있어보입니다. 더 많은 예시를 지시할 수록 더 나은 결과가 나올것이라 확신합니다.
|
||||
우리는 결과를 개선했습니다. 여기서 더 개선할 수도 있습니다. 더 많은 예시를 추가한다면 더 나은 결과를 얻을 수도 있습니다.
|
||||
|
||||
---
|
||||
|
||||
## 코드 생성
|
||||
|
||||
LLM은 매우 효과적인 코드 생성 애플리케이션 중 하나입니다. Copilot이 대표적인 예시이지요.
|
||||
프롬프트를 영리하게 사용해서 많은 양의 코드를 생성할 수 있습니다. 아래에서 몇 가지 예시를 살펴보겠습니다.
|
||||
LLM은 매우 효과적인 코드 생성 애플리케이션 중 하나입니다. 코파일럿(Copilot)이 대표적인 예시입니다. 프롬프트를 영리하게 사용해서 코드를 생성하는 다양한 작업들이 있습니다. 아래에서 몇 가지 예시를 살펴보겠습니다.
|
||||
|
||||
먼저, 유저에게 인사를 건네는 단순한 프로그램을 생성해 보겠습니다.
|
||||
|
||||
_프롬프트:_
|
||||
|
||||
*Prompt:*
|
||||
```
|
||||
/*
|
||||
유저의 이름을 입력받고 "안녕"이라고 해 줘
|
||||
*/
|
||||
```
|
||||
|
||||
_출력:_
|
||||
|
||||
*Output:*
|
||||
```
|
||||
let name = prompt("이름이 뭐예요?");
|
||||
console.log(`안녕하세요, ${이름}!`);
|
||||
```
|
||||
|
||||
어느 프로그래밍 언어를 써야하는지 조차도 알려주지 않았습니다.
|
||||
어느 프로그래밍 언어를 사용해야 하는지 지정할 필요도 없었습니다.
|
||||
|
||||
좀 더 레벨을 올려보겠습니다. 프롬프트를 어떻게 디자인하느냐에따라 LLM이 얼마나 더 강력해질 수 있는 지 보여주겠습니다.
|
||||
|
||||
_프롬프트:_
|
||||
좀 더 수준을 올려 보겠습니다. 프롬프트를 어떻게 디자인하느냐에 따라 LLM이 얼마나 더 강력해질 수 있는지 살펴보겠습니다.
|
||||
|
||||
*Prompt:*
|
||||
```
|
||||
"""
|
||||
DB테이블 departments, columns = [DepartmentId, DepartmentName]
|
||||
DB테이블 students, columns = [DepartmentId, StudentId, StudentName]
|
||||
|
||||
컴퓨터과학부에 속한 모든 학생에 대한 MySQL 쿼리를 작성해 줘
|
||||
"""
|
||||
```
|
||||
|
||||
_출력:_
|
||||
|
||||
*Output:*
|
||||
```
|
||||
SELECT StudentId, StudentName
|
||||
FROM students
|
||||
@ -271,59 +241,52 @@ WHERE DepartmentId IN (SELECT DepartmentId FROM departments WHERE DepartmentName
|
||||
---
|
||||
|
||||
## 추론
|
||||
어떤 형태로든 추론이 필요한 작업은 아마도 오늘날 LLM으로 하기 가장 어려운 작업에 속합니다. 추론은 LLM에서 나타날 수 있는 복잡한 애플리케이션의 유형 중에서 가장 흥미로운 분야 중 하나입니다.
|
||||
|
||||
형태를 막론하고 추론하는 일은 오늘 날 LLM이 다루기 어려워하는 작업일 것입니다. 추론은 LLM을 활용하여 만들 수 있는 복잡한 응용 프로그램의 유형이므로 제가 가장 흥미로워하는 분야 중 하나입니다.
|
||||
|
||||
수학적인 능력을 필요로 하는 작업에서 눈에띄는 개선을 보여주었지만, 현재의 LLM은 추론 작업을 수행하는 데 아직은 어려움을 겪기 때문에 이를 위해서는 훨씬 더 진보된 프롬프트 엔지니어링 기술을 필요로합니다. 고급 기술에 대해서는 추후 가이드에서 설명 할 예정이고, 지금은 산술 능력을 증명 할 몇 가지 기본적인 예를 다뤄보겠습니다.
|
||||
|
||||
_프롬프트:_
|
||||
수학적인 능력을 필요로 하는 작업에서는 눈에 띄는 개선을 보여 주었지만, 현재의 LLM은 추론 작업을 수행하는 데 어려움을 겪기 때문에 훨씬 더 향상된 프롬프트 엔지니어링 기술을 필요로 합니다. 고급 기술에 대해서는 추후의 가이드에서 다루고, 지금은 산술 능력을 증명할 몇 가지 기본적인 예시를 다뤄 보겠습니다.
|
||||
|
||||
*Prompt:*
|
||||
```
|
||||
9,000 * 9,000는 뭐야?
|
||||
```
|
||||
|
||||
_출력:_
|
||||
|
||||
*Output:*
|
||||
```
|
||||
81,000,000
|
||||
```
|
||||
|
||||
좀 더 어려운 문제를 시도해 보겠습니다.
|
||||
|
||||
_프롬프트:_
|
||||
|
||||
*Prompt:*
|
||||
```
|
||||
주어진 수 중에서 홀수를 모두 더하면 짝수가 될거야: 15, 32, 5, 13, 82, 7, 1.
|
||||
주어진 수 중에서 홀수를 모두 더해서 짝수를 만들어 줘: 15, 32, 5, 13, 82, 7, 1.
|
||||
|
||||
A:
|
||||
```
|
||||
|
||||
_출력_
|
||||
|
||||
*Output*
|
||||
```
|
||||
아니요, 주어진 수 중 홀수를 더한 값은 홀수입니다: 119
|
||||
아니요, 주어진 수 중 홀수를 모두 더한 값은 홀수입니다: 119.
|
||||
```
|
||||
|
||||
이번에는 틀렸네요! 프롬프트를 개선하여 정확도를 향상시켜 봅시다.
|
||||
|
||||
_프롬프트:_
|
||||
이번에는 틀렸습니다! 프롬프트를 개선하여 정확도를 향상해 보겠습니다.
|
||||
|
||||
*Prompt:*
|
||||
```
|
||||
주어진 수 중에서 홀수를 모두 더하면 짝수가 될거야: 15, 32, 5, 13, 82, 7, 1.
|
||||
주어진 수 중에서 홀수를 모두 더해서 짝수를 만들어 줘: 15, 32, 5, 13, 82, 7, 1.
|
||||
|
||||
문제를 단계별로 해결해봐. 먼저 주어진 수 중 홀수를 찾아낸 뒤 그것들을 합해서 결과가 홀수인지 짝수인지 판별해줘.
|
||||
문제를 단계별로 해결해 봐. 먼저 주어진 수 중 홀수를 찾아낸 뒤, 그것들을 합해서, 결과가 홀수인지 짝수인지 판별해 줘.
|
||||
```
|
||||
|
||||
_출력:_
|
||||
|
||||
*Output:*
|
||||
```
|
||||
홀수: 15, 5, 13, 7, 1
|
||||
총합: 41
|
||||
41은 홀수입니다.
|
||||
```
|
||||
|
||||
훨씬 낫지요? 참고로 저는 이 명령을 여러 번 시도했지만 시스템은 가끔 오답을 제시할 때도 있었습니다.더 나은 지시와 예시를 제공함으로써 보다 정확한 결과를 얻을 수 있겠지요.
|
||||
훨씬 낫지 않나요? 참고로 저는 이 명령을 여러 번 시도했지만 시스템은 가끔 오답을 제시했습니다. 더 나은 지시와 예시를 결합하는 것으로 보다 정확한 결과를 얻을 수 있습니다.
|
||||
|
||||
이 가이드의 해당 섹션에서는 일반적인 응용 프로그램의 예시를 계속 소개 할 예정입니다.
|
||||
가이드의 이 절에서는 일반적인 애플리케이션의 예시를 계속 소개할 예정입니다.
|
||||
|
||||
다음 섹션에서는 이러한 모든 작업의 성능을 향상시키기 위한 보다 심화된 프롬프트 엔지니어링 개념과 기술에 대해 설명하겠습니다.
|
||||
다음 섹션에서는 이러한 모든 작업의 성능을 향상하기 위해 보다 심화된 프롬프트 엔지니어링의 개념과 기법에 대해 설명하겠습니다.
|
||||
|
@ -1,11 +1,11 @@
|
||||
# LLM 설정
|
||||
|
||||
프롬프트를 사용 시 API를 사용하거나 직접 LLM과 소통할 것입니다. 몇 가지 파라미터를 설정함으로써 프롬프트에 별 다른 결과를 얻을 수 있습니다.
|
||||
프롬프트를 사용할 때, API를 사용하거나 직접 대규모언어모델(LLM)과 상호 작용 할 수 있습니다. 몇 가지 파라미터를 설정하여 프롬프트에서 여러 가지 결과를 얻을 수 있습니다.
|
||||
|
||||
**Temperature** - 간단히 말해서, `temperature`값이 낮을수록 가장 확률이 높은 응답(token)이 항상 선택되기 때문에 결과는 더 결정론적입니다. 이 값을 올리면 랜덤성이 증가하여 보다 다양하고 창조적인 결과물을 배출합니다. 즉, 엉뚱한(?) 답변의 가능성이 있는 쪽으로 무게를 늘리는 셈입니다. QA와 같은 작업을 위해 사실기반의 간결한 응답을 원한다면 더 낮은 temperature값을 사용해야겠지요. 반대로 시를 창작하는 등의 창의적인 작업의 경우 temperature 값을 높이는 것이 적합할 것입니다.
|
||||
**Temperature** - 요컨대, `temperature` 값이 낮을수록 항상 가장 확률이 높은 토큰(말뭉치의 최소 단위)이 선택되기 때문에 더 결정론적인 결과를 낳습니다. temperature 값을 높였을 때 모델이 선택하는 토큰의 무작위성이 증가하여 보다 다양하고 창조적인 결과를 촉진합니다. 이는 다른 가능한 토큰의 가중치를 증가시키는 것과 같습니다. 애플리케이션의 경우, 사실을 기반으로 하는 질의응답과 같은 작업에는 낮은 temperature 값을 사용하여 보다 사실적이고 간결한 응답을 얻을 수 있습니다. 시를 생성하는 등 다른 창의적인 작업의 경우에는 temperature 값을 높이는 것이 도움이 될 수 있습니다.
|
||||
|
||||
**Top_p** - 마찬가지로, 핵 샘플링이라고 불리는 샘플링 기법인 `top_p`에서는 모델이 응답을 생성할 때 결정성을 제어할 수 있습니다. 사실에 근거한 답변을 원한다면 이 값을 낮추고, 더 다채로운 답변을 원한다면 더 높은 값으로 조정하세요.
|
||||
**Top_p** - 마찬가지로, temperature를 활용하는 핵 샘플링 기법인 `top_p`를 사용하면 모델이 응답을 생성하는 결정성을 제어할 수 있습니다. 정확하고 사실적인 답변을 원한다면 이를 낮게 유지합니다. 더 다양한 반응을 원한다면 더 높은 값으로 증가시킵니다.
|
||||
|
||||
일반적으로는 둘 중 하나를 변경하는 것을 권장합니다.
|
||||
일반적인 권장 사항은 둘 중 하나만 변경하는 것입니다.
|
||||
|
||||
기본적인 예시를 살펴보기에 앞서, 사용하는 LLM 버전에 따라 결과가 상이할 수 있음을 알립니다.
|
||||
몇 가지 기본적인 예시를 살펴보기에 앞서, 사용하는 LLM 버전에 따라 결과가 상이할 수 있음을 알립니다.
|
||||
|
@ -1,38 +1,35 @@
|
||||
# 프롬프트 디자인 팁
|
||||
# 프롬프트 설계에 관한 일반적인 팁
|
||||
|
||||
프롬프트를 설계할 때는 다음 사항에 주의해주세요:
|
||||
프롬프트를 설계할 때 주의해야 할 몇 가지 사항에 대해 소개합니다.
|
||||
|
||||
### 시작은 간단하게
|
||||
|
||||
프롬프트 설계를 시작할 때는 프롬프트 설계가 최적의 결과를 얻기 위해 많은 실험을 필요로 하는 반복적인 프로세스임을 염두에 두세요. OpenAI나 Cohere에서 제공하는 플레이그라운드로 시작해보는 것이 좋습니다.
|
||||
프롬프트 설계를 시작할 때는 프롬프트 설계가 최적의 결과를 얻기 위해 많은 실험이 필요한 반복적인 과정임을 명심해야 합니다. OpenAI 또는 Cohere에서 제공하는 간단한 플레이그라운드로 시작해 보는 것이 좋습니다.
|
||||
|
||||
간단한 프롬프트에서 시작하여 더 나은 결과를 위해 요소나 문맥을 추가해 나갈 수 있습니다. 이러한 이유에서 프롬프트 버전관리는 중요하겠지요. 이 가이드를 읽으면 구체성, 간결함, 명확함이 더 나은 결과를 가져온다는 것을 알 수 있을 것입니다.
|
||||
간단한 프롬프트로 시작하여 더 나은 결과를 위해 요소나 문맥을 계속해서 추가할 수 있습니다. 따라서 프롬프트의 버전 관리가 중요합니다. 이 가이드에서는 구체성, 단순성, 간결함을 통해 더 나은 결과를 얻을 수 있는 많은 예시를 제시하고 있습니다.
|
||||
|
||||
여러 하위 작업을 포함한 큰 단위 작업을 실행해야한다면, 작업들을 보다 작은 단위로 분해한 뒤 결과가 개선됨에 따라 점진적으로 구축해 나가세요.
|
||||
이러한 방식은 프롬프트 설계 초기 프로세스에 복잡도를 주는 것을 방지할 수 있습니다.
|
||||
여러 하위 작업을 포함한 큰 단위 작업을 실행해야 하는 경우, 작업을 보다 작은 단위로 세분화하고 결과가 개선됨에 따라 점진적으로 구축해 나갈 수 있습니다. 이러한 방식을 통해 프롬프트 설계 초기 과정에 너무 많은 복잡성이 추가되는 것을 방지할 수 있습니다.
|
||||
|
||||
### 지시
|
||||
|
||||
"작성하기", "분류하기", "요약하기", "번역하기", "정렬하기" 등의 명령어를 사용하여 모델에게 달성하고 싶은 결과를 지시함으로써 다양한 간단한 작업에 대한 효과적인 프롬프트를 설계할 수 있습니다.
|
||||
'작성하기', '분류하기', '요약하기', '번역하기', '정렬하기' 등의 명령어를 사용하여 달성하고자 하는 결과를 모델에 지시함으로써 다양한 간단 작업에 대해 효과적인 프롬프트를 설계할 수 있습니다.
|
||||
|
||||
어느 것이 가장 효과적인지 찾아내기 위해서는 여러 차례의 실험이 필요하다는 것을 명심하세요.
|
||||
다양한 키워드, 컨텍스트와 데이터를 활용하여 다양한 지시를 내려보고 특정 사용 사례나 작업에 가장 적합한 방법을 찾아나가세요.
|
||||
일반적으로 수행하려는 작업과 관련된 문맥이 구체적이고 적절할수록 더 좋습니다. 다음 가이드에서 샘플링과 컨텍스트 추가의 중요성에 대해 다뤄보도록 하겠습니다.
|
||||
또한, 무엇이 가장 효과적인지 확인하기 위해서는 여러 차례의 실험이 필요하다는 점을 명심하세요. 다양한 키워드, 문맥 및 데이터를 활용하여 다양한 지시를 내려 보고, 특정 사용 사례와 작업에 가장 적합한 방법을 확인하세요. 일반적으로, 수행하고자 하는 작업과 관련된 문맥이 구체적이고 적절할수록 더 좋은 결과를 얻을 수 있습니다. 다음 가이드에서 샘플링과 문맥 추가의 중요성에 대해 다뤄 보도록 하겠습니다.
|
||||
|
||||
보통은 프롬프트 시작 부분에 지시사항을 명시할 것을 권장합니다. 또한 "##"과 같은 명확한 구분 기호를 사용하여 명령어와 컨텍스트를 구분하는 것도 좋은 방법입니다.
|
||||
프롬프트의 시작 부분에 지시 사항을 명시하는 것이 좋다는 의견도 있습니다. 또 다른 권장 사항으로는 '###'과 같이 명확한 구분 기호를 사용하여 명령어와 지시 사항을 구분하는 것을 들 수 있습니다.
|
||||
|
||||
예를 들어:
|
||||
예시:
|
||||
|
||||
_프롬프트:_
|
||||
*Prompt:*
|
||||
|
||||
```
|
||||
### 지시 ###
|
||||
아래 문장을 스페인어로 번역해줘:
|
||||
다음 텍스트를 스페인어로 번역해 줘.
|
||||
|
||||
문장: "안녕하세요!"
|
||||
텍스트: "안녕하세요!"
|
||||
```
|
||||
|
||||
_출력:_
|
||||
*Output:*
|
||||
|
||||
```
|
||||
¡Hola!
|
||||
@ -40,85 +37,82 @@ _출력:_
|
||||
|
||||
### 특이성
|
||||
|
||||
모델이 실행하기를 바라는 작업에 대해 구체적인 지시를 내려주세요. 프롬프트가 상세하고 구체적일수록 결과는 좋아집니다. 특정 출력이나 스타일을 원하는 경우에는 특히 중요합니다. 더 나은 결과를 가져올 특정 토큰이나 키워드는 존재하지 않습니다. 좋은 포맷을 갖춘 상세한 프롬프트를 준비하는 것이 중요합니다. 프롬프트에 예시를 제공하는 것은 특정 포맷으로 출력을 얻는 데 실제로도 매우 효과적입니다.
|
||||
모델에 실행시킬 지시와 작업을 구체적으로 설명하세요. 프롬프트가 상세하고 구체적일수록 결과는 더 좋아집니다. 특정한 출력이나 스타일을 얻고자 하는 경우 특히 중요합니다. 더 나은 결과를 내는 특정한 토큰이나 키워드는 존재하지 않습니다. 좋은 형식과 상세한 프롬프트를 준비하는 것이 중요합니다. 프롬프트에 예시를 제공하는 것은 특정한 형식으로 출력을 얻는 데 실제로도 매우 효과적입니다.
|
||||
|
||||
프롬프트의 길이에는 제한이 있기 때문에 프롬프트 설계 시 그 길이를 염두에 두어야 합니다. 어느정도로 구체적이고 상세하게 대할 것인가를 고려해봐야겠지요. 불필요한 세부 사항을 포함하는 것은 언나 좋은 접근법은 아닙니다. 자세한 내용은 관련성이 있으며 당면한 과제에 기여해야 합니다. 프롬프팅은 많은 실험과 반복을 필요로 합니다. 애플리케이션에 최적인 프롬프트를 찾기 위해 많은 실험과 반복을 권장합니다.
|
||||
프롬프트의 길이에는 제한이 있기 때문에 프롬프트를 설계할 때는 그 사항을 염두에 두어야 합니다. 얼마나 구체적이고 상세하게 작성해야 하는지 생각할 필요가 있습니다. 불필요한 세부 사항을 많이 포함하는 것이 반드시 좋은 접근 방법은 아닙니다. 세부 사항은 관련성이 있어야 하고, 당면한 과제에 기여해야 합니다. 프롬프트의 설계는 많은 실험과 반복이 필요합니다. 애플리케이션에 맞는 프롬프트의 최적화를 위해 많은 실험과 반복을 거듭할 것을 권장합니다.
|
||||
|
||||
예시로, 텍스트에서 특정 정보를 추출하는 간단한 프롬프트를 시도해 봅시다.
|
||||
텍스트에서 특정 정보를 추출하는 간단한 프롬프트의 예시를 살펴봅시다.
|
||||
|
||||
_프롬프트:_
|
||||
*Prompt:*
|
||||
|
||||
```
|
||||
다음 문장에서 장소의 이름을 추출해줘.
|
||||
다음 텍스트에서 장소의 이름을 추출해 줘.
|
||||
|
||||
원하는 형식:
|
||||
Place: <comma_separated_list_of_company_names>
|
||||
|
||||
입력: "비록 이러한 발전이 연구원들에게 격려가 되지만, 많은 것들이 여전히 미스터리입니다. 리스본의 Champalimaud 센터 for the Unknown의 신경 면역학자인 Henrique Veiga-Fernandes는 "우리는 종종 뇌와 주변부에서 보는 효과 사이에 블랙박스를 가지고 있습니다,"라고 말합니다. "만약 우리가 그것을 치료적 맥락에서 사용하고 싶다면, 우리는 실제로 그 작용기전을 이해할 필요가 있습니다.""
|
||||
입력: "이러한 발전은 연구자들에게 격려가 되지만, 많은 것들이 여전히 수수께끼입니다. 리스본에 있는 샴팔리마우드 센터(CCU: Champalimaud Centre for the Unknown)의 신경면역학자인 Henrique Veiga-Fernandes는 "뇌와 주변부에서 보이는 효과 사이에 블랙박스가 있는 경우가 종종 있습니다."라고 말합니다. 그리고 다음과 같이 덧붙입니다. "치료적 맥락에서 이를 사용하고자 할 경우, 그 메커니즘을 실제로 이해할 필요가 있습니다."
|
||||
|
||||
```
|
||||
|
||||
_출력:_
|
||||
*Output:*
|
||||
|
||||
```
|
||||
장소: Champalimaud 센터 for the Unknown, 리스본
|
||||
장소: 샴팔리마우드 센터(CCU: Champalimaud Centre for the Unknown), 리스본
|
||||
```
|
||||
|
||||
입력 텍스트의 출처는 [this Nature article](https://www.nature.com/articles/d41586-023-00509-z) 입니다.
|
||||
입력 텍스트의 출처는 [네이처(Nature)지의 이 논문](https://www.nature.com/articles/d41586-023-00509-z)입니다.
|
||||
|
||||
### 부정확성을 피하라
|
||||
### 부정확성 피하기
|
||||
|
||||
위와 같은 팁을 고려해서 지나치게 상세하게 기술하거나 포맷을 개선하는 프롬프트를 급작스럽게 발전시킨다면, 부정확한 설명을 만들어 버리는 등 함정에 빠지기 쉽습니다. 프롬프트는 구체적이고 직접적이어야 좋은 결과를 얻을 수 있습니다. 직접적일수록 효과적인 메시지가 전달됩니다 -- 효과적인 커뮤니케이션 방식과 꽤나 흡사하지요.
|
||||
상세하게 기술하고 형식을 개선하는 방법에 대한 위 내용을 고려할 경우, 프롬프트를 교묘하게 다루려 하거나 부정확한 설명을 작성하는 등의 함정에 빠지기 쉽습니다. 프롬프트는 구체적이고 직접적이어야 더욱 좋은 결과를 얻을 수 있습니다. 직접적일수록 메시지가 더 효과적으로 전달됩니다. 효과적인 커뮤니케이션 방식과 매우 유사하다고 할 수 있습니다.
|
||||
|
||||
예를 들어 프롬프트 엔지니어링의 개념을 배우고 싶을 수도 있습니다. 그럼 이렇게 시도해 보는 것입니다:
|
||||
프롬프트 엔지니어링의 개념을 배우고자 하는 경우를 예시로 들어 보겠습니다. 이 경우, 다음과 같이 시도해 볼 수 있습니다.
|
||||
|
||||
```
|
||||
프롬프트 엔지니어링의 개념을 설명해 줘. 설명은 간결한 몇 문장으로, 너무 자세히는 하지말아줘.
|
||||
프롬프트 엔지니어링의 개념을 설명해 줘. 설명은 간결하게 몇 문장으로만 하고 너무 자세히는 하지 말아 줘.
|
||||
```
|
||||
|
||||
위의 프롬프트는 어떤 어조로 어느정도의 분량의 문장들로 설명해주기를 명확하게 지시하지 않았습니다. 물론 위의 프롬프트로도 여전히 좋은 답변을 얻을 수 있겠지만 매우 구체적이고 간결하며 정곡을 찌르는 프롬프트가 좋습니다. 마치 다음과 같은 것입니다.
|
||||
위의 프롬프트에서는 몇 문장을 사용해야 하는지, 어떤 스타일을 사용해야 하는지 명확하게 지시되어 있지 않습니다. 물론 이 프롬프트로도 여전히 좋은 답변을 얻을 수는 있겠지만, 매우 구체적이고 간결하며 정곡을 찌르는 프롬프트일수록 좋습니다. 적절한 예시로 다음을 살펴봅시다.
|
||||
|
||||
```
|
||||
고등학생에게 프롬프트 엔지니어링 개념을 2~3줄의 문장으로 설명해 주세요.
|
||||
고등학생에게 프롬프트 엔지니어링의 개념을 2~3개의 문장으로 설명해 줘.
|
||||
```
|
||||
|
||||
### 할까 말까?
|
||||
### 해야 하는 것과 하지 말아야 할 것
|
||||
|
||||
프롬프트를 설계할 시 적용할 수 있는 또 다른 일반적인 팁은 '하지 말아야 할 것'보다는 '해야하는 것'을 말하는 것입니다. 이를 통해 보다 구체적이고 모델로부터 좋은 답변을 얻기 위한 세부 사항에 초점이 맞춰집니다.
|
||||
프롬프트를 설계할 때 적용할 수 있는 또 다른 일반적인 팁은 '하지 말아야 할 것'보다는 '해야 하는 것'에 초점을 두는 것입니다. 이렇게 하면, 보다 구체적이고 모델로부터 좋은 답변을 이끌어 내는 세부 사항에 집중할 수 있습니다.
|
||||
|
||||
아래는 제가 '하지 말아야 할 것'에 초점을 맞춘 지시 때문에 영화 추천 챗봇이 실패한 예시입니다.
|
||||
다음은 '하지 말아야 할 것'에 초점을 둔 지시로 인해 영화 추천 챗봇이 실패한 예시입니다.
|
||||
|
||||
_프롬프트:_
|
||||
*Prompt:*
|
||||
|
||||
```
|
||||
다음은 고객에게 영화를 추천하는 보조원입니다. 관심사를 묻지 말고 개인정보도 묻지 마세요.
|
||||
|
||||
고객: 제 흥미를 바탕으로 영화를 추천해 주세요.
|
||||
|
||||
보조원:
|
||||
다음은 고객에게 영화를 추천하는 상담원입니다. 관심사를 묻지 마세요. 개인정보를 묻지 마세요.
|
||||
고객: 제 관심사를 바탕으로 영화를 추천해 주세요.
|
||||
상담원:
|
||||
```
|
||||
|
||||
_출력:_
|
||||
*Output:*
|
||||
|
||||
```
|
||||
네, 당신의 관심을 바탕으로 영화를 추천해 드리겠습니다.액션, 코미디, 로맨스, 아니면 어떤 종류의 영화를 좋아하세요?
|
||||
네, 당신의 관심사를 바탕으로 영화를 추천해 드리겠습니다. 액션, 코미디, 로맨스, 아니면 그 밖의 장르, 어떤 종류의 영화를 좋아하세요?
|
||||
```
|
||||
|
||||
다음은 개선된 프롬프트입니다:
|
||||
개선된 프롬프트는 다음과 같습니다.
|
||||
|
||||
_프롬프트:_
|
||||
*Prompt:*
|
||||
|
||||
```
|
||||
다음은 고객에게 영화를 추천하는 보조원입니다. 보조원은는 전세계적으로 유행하는 영화를 추천해줍니다. 사용자의 관심사를 묻는 것을 자제하고 개인 정보를 묻는 것 또한 피해야 합니다. 추천할만한 마땅한 영화가 없는 경우 "죄송합니다. 추천할 영화를 찾을 수 없습니다."라고 응답해야 합니다.
|
||||
다음은 고객에게 영화를 추천하는 상담원입니다. 상담원은 글로벌 인기 영화 중에서 영화를 추천해야 합니다. 사용자의 관심사를 묻지 않고, 개인 정보를 요구하지 않아야 합니다. 상담원이 추천할 영화가 없는 경우 "죄송합니다. 오늘 추천할 영화를 찾을 수 없습니다." 라고 응답해야 합니다.
|
||||
|
||||
고객: 제 흥미를 바탕으로 영화를 추천해 주세요.
|
||||
보조원:
|
||||
고객: 제 관심사를 바탕으로 영화를 추천해 주세요.
|
||||
상담원:
|
||||
```
|
||||
|
||||
_출력:_
|
||||
*Output:*
|
||||
|
||||
```
|
||||
죄송합니다만, 당신의 관심사에 관한 정보는 찾을 수 없었습니다. 하지만 여기 지금 가장 트렌디한 영화 목록이 있습니다: [영화 목록]. 좋아하는 것을 찾으시길 바라요!
|
||||
죄송합니다만, 당신의 관심사에 관한 정보를 찾을 수 없었습니다. 하지만 지금 가장 인기 있는 영화에 대한 목록이 있습니다: [영화 목록]. 좋아하는 것을 찾으시길 바랄게요!
|
||||
```
|
||||
|
||||
위의 예시 중 몇가지는 ["Best practices for prompt engineering with OpenAI API" article.](https://help.openai.com/en/articles/6654000-best-practices-for-prompt-engineering-with-openai-api)에서 발췌되었습니다.
|
||||
위의 예시 중 몇 가지는 ["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)에서 발췌하였습니다.
|
||||
|
Loading…
Reference in New Issue
Block a user