mirror of
https://github.com/dair-ai/Prompt-Engineering-Guide
synced 2024-11-04 12:00:10 +00:00
Merge pull request #305 from sunday-sketching/main
Correction needed for some ko-KR pages
This commit is contained in:
commit
e6cc2d77a9
@ -10,7 +10,7 @@ import CODE1 from '../../img/code-generation/chat-mode.png'
|
||||
|
||||
ChatGPT와 같은 대규모언어모델은 코드 생성에 매우 유용합니다. 이 절은 코드 생성을 위해 ChatGPT를 사용하는 방법에 대한 많은 예시를 다룰 것입니다.
|
||||
|
||||
앞으로 나오는 모든 예시에는 OpenAI의 Playground(채팅 모드)와 gpt-3.5-turbo 모델이 사용됩니다.
|
||||
앞으로 나오는 모든 예시에는 OpenAI 플레이그라운드(Playground)와 gpt-3.5-turbo 모델이 사용됩니다.
|
||||
|
||||
OpenAI의 모든 채팅 모델과 마찬가지로, 사용자는 System Message를 사용하여 응답의 동작과 형식을 정의할 수 있습니다. 프롬프트의 예시로 다음 시스템 메시지를 사용해보겠습니다.
|
||||
|
||||
|
@ -4,12 +4,12 @@ import { Callout, FileTree } from "nextra-theme-docs";
|
||||
import { Screenshot } from "components/screenshot";
|
||||
import PAL from "../../img/pal.png";
|
||||
|
||||
[Gao et al., (2022)](https://arxiv.org/abs/2211.10435)는 LLM을 이용하여 자연어 문제를 읽고 중간 추론 단계로서의 프로그램을 생성하는 방법을 제시합니다. 그 방법은 프로그램지원언어모델(program-aided language models; PAL)이라고 이름 붙었으며, 해답을 얻기 위해 자유 형식 텍스트를 사용하는 대신 파이썬 인터프리터와 같은 프로그래밍 방식의 런타임을 통해 단계적으로 해결해 나간다는 점에서 생각의 사슬(chain-of-thought) 프롬프팅과 차이가 있습니다.
|
||||
[Gao et al., (2022)](https://arxiv.org/abs/2211.10435)는 LLM을 이용하여 자연어 문제를 읽고 중간 추론 단계로서의 프로그램을 생성하는 방법을 제시합니다. 그 방법은 프로그램지원언어모델(program-aided language models; PAL)이라고 이름 붙었으며, 해답을 얻기 위해 자유 형식 텍스트를 사용하는 대신 Python 인터프리터와 같은 프로그래밍 방식의 런타임을 통해 단계적으로 해결해 나간다는 점에서 생각의 사슬(chain-of-thought) 프롬프팅과 차이가 있습니다.
|
||||
|
||||
<Screenshot src={PAL} alt="PAL" />
|
||||
이미지 출처: [Gao et al., (2022)](https://arxiv.org/abs/2211.10435)
|
||||
|
||||
LangChain과 OpenAI GPT-3을 사용한 예시를 살펴보겠습니다. 우리는 파이썬 인터프리터를 활용하여 질문을 해석하고 답변을 제공하는 간단한 애플리케이션을 개발해야 하는 상황이라고 가정해 보겠습니다.
|
||||
LangChain과 OpenAI GPT-3을 사용한 예시를 살펴보겠습니다. 우리는 Python 인터프리터를 활용하여 질문을 해석하고 답변을 제공하는 간단한 애플리케이션을 개발해야 하는 상황이라고 가정해 보겠습니다.
|
||||
|
||||
그중에서도 날짜에 대한 이해가 필요한 질문에 대해서 LLM을 이용하여 답할 수 있는 기능을 만들고자 합니다. LLM에 제공할 프롬프트의 예제 중 일부는 [여기](https://github.com/reasoning-machines/pal/blob/main/pal/prompt/date_understanding_prompt.py)에서 채택했습니다.
|
||||
|
||||
|
@ -18,7 +18,7 @@ Topics:
|
||||
## 문장 요약
|
||||
문장 요약은 자연어 생성의 대표적인 작업 중 하나입니다. 문장 요약은 여러 주제와 도메인을 포함합니다. 사실, 언어 모델의 가장 유망한 애플리케이션 중 하나는 기사와 개념을 빠르고 읽기 쉽게 요약할 수 있는 능력입니다. 프롬프트를 사용하여 간단한 요약 작업을 시도해 보겠습니다.
|
||||
|
||||
예를 들어 항생제에 대해 배우고 싶다면 다음과 같은 프롬프트를 시도할 수 있습니다:
|
||||
예를 들어 항생제에 대해 배우고 싶다면 다음과 같은 프롬프트를 시도할 수 있습니다.
|
||||
|
||||
*Prompt:*
|
||||
|
||||
@ -34,7 +34,7 @@ A:
|
||||
항생제는 세균 감염을 치료하기 위해 사용되는 약물의 일종입니다. 세균을 죽이거나 번식을 방지하여 신체의 면역 체계가 감염에 대항할 수 있도록 합니다. 항생제는 보통 알약, 캡슐, 액체의 형태로 경구 복용하거나 때때로 정맥 주사로 투여되기도 합니다. 항생제는 바이러스 감염에는 효과적이지 않고, 남용할 경우 항생제 내성이 생길 수 있습니다.
|
||||
```
|
||||
|
||||
"A:"는 질의응답에 사용되는 명시적 프롬프트 형식을 띠고 있습니다. 여러분은 모델에게 추가적으로 답변을 기대하고 있다는 것을 전달하기 위해서 이 방법을 사용했습니다. 이 예시가 얼마나 유용한가에 대해서는 추후에 다른 예시에서 살펴보도록 하겠습니다. 이제 이 출력이 우리가 원했던 것보다 더 많은 양의 정보라서 추가적인 요약이 필요하다고 가정해 보겠습니다. 실제로 모델에게 다음과 같이 한 문장으로 요약하도록 지시할 수 있습니다:
|
||||
"A:"는 질의응답에 사용되는 명시적 프롬프트 형식을 띠고 있습니다. 여러분은 모델에게 추가적으로 답변을 기대하고 있다는 것을 전달하기 위해서 이 방법을 사용했습니다. 이 예시가 얼마나 유용한가에 대해서는 추후에 다른 예시에서 살펴보도록 하겠습니다. 이제 이 출력이 우리가 원했던 것보다 더 많은 양의 정보라서 추가적인 요약이 필요하다고 가정해 보겠습니다. 실제로 모델에게 다음과 같이 한 문장으로 요약하도록 지시할 수 있습니다.
|
||||
|
||||
*Prompt:*
|
||||
```
|
||||
@ -118,7 +118,7 @@ A:
|
||||
Neutral
|
||||
```
|
||||
|
||||
모델에게 텍스트 분류를 지시하자 모델은 `'Neutral'`이라는 올바른 답변을 반환했습니다. 오답은 아니지만, 모델이 우리가 원하는 특정 형식의 라벨을 반환하길 원한다고 가정해 보겠습니다. `Neutral` 대신 `neutral`을 반환하도록 유도해 봅시다. 그러기 위해서는 어떻게 해야 할까요? 방법은 여러 가지가 있습니다. 지금 이 예시에서는 정확성에 초점을 맞추고 있고, 프롬프트에 더 많은 정보를 제공할수록 더 나은 결과를 얻을 수 있습니다. 원하는 결과를 얻기 위해 예시들을 추가하여 다시 시도해 보겠습니다:
|
||||
모델에게 텍스트 분류를 지시하자 모델은 `'Neutral'`이라는 올바른 답변을 반환했습니다. 오답은 아니지만, 모델이 우리가 원하는 특정 형식의 라벨을 반환하길 원한다고 가정해 보겠습니다. `Neutral` 대신 `neutral`을 반환하도록 유도해 봅시다. 그러기 위해서는 어떻게 해야 할까요? 방법은 여러 가지가 있습니다. 지금 이 예시에서는 정확성에 초점을 맞추고 있고, 프롬프트에 더 많은 정보를 제공할수록 더 나은 결과를 얻을 수 있습니다. 원하는 결과를 얻기 위해 예시들을 추가하여 다시 시도해 보겠습니다.
|
||||
|
||||
*Prompt:*
|
||||
```
|
||||
@ -160,7 +160,7 @@ Neutral
|
||||
## 대화
|
||||
아마 프롬프트 엔지니어링을 통해 접할 수 있는 흥미로운 점들 중 하나는 LLM 시스템의 행동과 의도 그리고 정체성을 고려하여 지시를 내리는 것일 겁니다. 이러한 특성은 고객 서비스 챗봇과 같은 대화형 시스템을 구축할 때 특히 유용합니다.
|
||||
|
||||
예를 들어 주어진 질문에 기술적이고 과학적인 대답을 반환할 수 있는 대화형 시스템을 구축해 보겠습니다. 이른바 *역할 프롬프팅(role prompting)*이라 불리는 것입니다.
|
||||
예를 들어 주어진 질문에 기술적이고 과학적인 대답을 반환할 수 있는 대화형 시스템을 구축해 보겠습니다. *역할 프롬프팅*이라 불리는 것입니다.
|
||||
|
||||
*Prompt:*
|
||||
```
|
||||
|
@ -2,9 +2,9 @@
|
||||
|
||||
프롬프트를 사용할 때, API를 사용하거나 직접 대규모언어모델(LLM)과 상호 작용 할 수 있습니다. 몇 가지 파라미터를 설정하여 프롬프트에서 여러 가지 결과를 얻을 수 있습니다.
|
||||
|
||||
**Temperature** - 요컨대, `temperature` 값이 낮을수록 항상 가장 확률이 높은 토큰(말뭉치의 최소 단위)이 선택되기 때문에 더 결정론적인 결과를 낳습니다. temperature 값을 높였을 때 모델이 선택하는 토큰의 무작위성이 증가하여 보다 다양하고 창조적인 결과를 촉진합니다. 이는 다른 가능한 토큰의 가중치를 증가시키는 것과 같습니다. 애플리케이션의 경우, 사실을 기반으로 하는 질의응답과 같은 작업에는 낮은 temperature 값을 사용하여 보다 사실적이고 간결한 응답을 얻을 수 있습니다. 시를 생성하는 등 다른 창의적인 작업의 경우에는 temperature 값을 높이는 것이 도움이 될 수 있습니다.
|
||||
**temperature** - 요컨대, `temperature` 값이 낮을수록 항상 가장 확률이 높은 토큰(말뭉치의 최소 단위)이 선택되기 때문에 더 결정론적인 결과를 낳습니다. temperature 값을 높였을 때 모델이 선택하는 토큰의 무작위성이 증가하여 보다 다양하고 창조적인 결과를 촉진합니다. 이는 다른 가능한 토큰의 가중치를 증가시키는 것과 같습니다. 애플리케이션의 경우, 사실을 기반으로 하는 질의응답과 같은 작업에는 낮은 temperature 값을 사용하여 보다 사실적이고 간결한 응답을 얻을 수 있습니다. 시를 생성하는 등 다른 창의적인 작업의 경우에는 temperature 값을 높이는 것이 도움이 될 수 있습니다.
|
||||
|
||||
**Top_p** - 마찬가지로, temperature를 활용하는 핵 샘플링 기법인 `top_p`를 사용하면 모델이 응답을 생성하는 결정성을 제어할 수 있습니다. 정확하고 사실적인 답변을 원한다면 이를 낮게 유지합니다. 더 다양한 반응을 원한다면 더 높은 값으로 증가시킵니다.
|
||||
**top_p** - 마찬가지로, temperature를 활용하는 핵 샘플링 기법인 `top_p`를 사용하면 모델이 응답을 생성하는 결정성을 제어할 수 있습니다. 정확하고 사실적인 답변을 원한다면 이를 낮게 유지합니다. 더 다양한 반응을 원한다면 더 높은 값으로 증가시킵니다.
|
||||
|
||||
일반적인 권장 사항은 둘 중 하나만 변경하는 것입니다.
|
||||
|
||||
|
@ -54,7 +54,7 @@ GPT-4 API는 현재 텍스트 입력만 지원하지만, 앞으로 이미지 입
|
||||
이것은 GPT-4의 결괏값입니다:
|
||||
|
||||
```
|
||||
조지아와 서아시아의 하루평균 육류 소비량을 구하려면 다음과 같은 단계를 따릅니다:
|
||||
조지아와 서아시아의 하루평균 육류 소비량을 구하려면 다음과 같은 단계를 따릅니다.
|
||||
|
||||
1. 조지아의 하루평균 고기 소비량을 파악합니다.
|
||||
2. 서아시아의 하루평균 고기 소비량을 파악합니다.
|
||||
@ -104,7 +104,7 @@ _조력자 응답:_
|
||||
}
|
||||
```
|
||||
|
||||
아래는 OpenAI 플레이그라운드(Playground)에서 찍은 스크린샷입니다:
|
||||
아래는 OpenAI 플레이그라운드(Playground)에서 찍은 스크린샷입니다.
|
||||
|
||||
<Screenshot src={GPT44} alt="GPT44" />
|
||||
|
||||
@ -132,7 +132,7 @@ TruthfultQA 벤치마크에서, RLHF(Reinforcement Learning from Human Feedback)
|
||||
|
||||
<Screenshot src={GPT45} alt="GPT45" />
|
||||
|
||||
다음은 실패 사례입니다:
|
||||
다음은 실패 사례입니다.
|
||||
|
||||
<Screenshot src={GPT46} alt="GPT46" />
|
||||
|
||||
|
@ -1,8 +1,8 @@
|
||||
# Self-Consistency
|
||||
|
||||
프롬프트 엔지니어링을 위한 더 진보된 기법 중 하나로 자기 일관성(Self-Consistency)이 있습니다. [Wang et al. (2022)](https://arxiv.org/pdf/2203.11171.pdf)에서 제안한 자기 일관성은 "생각의 사슬 프롬프트에 사용되는 naive greedy 디코딩을 대체하는 것"을 목표로 합니다. 이 아이디어는 퓨샷 생각의 사슬(few-shot CoT)을 통해 여러 가지 다양한 추론 경로를 샘플링하고, 여러 번의 프롬프트 생성 과정을 거쳐 가장 일관된 답을 선택하는 것입니다. 이를 통해 산술 및 상식적인 추론과 관련된 작업에서 생각의 사슬 프롬프트의 성능을 향상시킬 수 있습니다.
|
||||
프롬프트 엔지니어링을 위한 더 진보된 기법 중 하나로 자기 일관성(self-consistency)이 있습니다. [Wang et al. (2022)](https://arxiv.org/pdf/2203.11171.pdf)에서 제안한 자기 일관성은 "생각의 사슬 프롬프팅에 사용되는 일반적인 탐욕 알고리즘 디코딩을 대체하는 것"을 목표로 합니다. 이 아이디어는 퓨샷 생각의 사슬(few-shot CoT)을 통해 여러 가지 다양한 추론 경로를 샘플링하고, 여러 번의 프롬프트 생성 과정을 거쳐 가장 일관된 답을 선택하는 것입니다. 이를 통해 산술 및 상식적인 추론과 관련된 작업에서 생각의 사슬 프롬프트의 성능을 향상시킬 수 있습니다.
|
||||
|
||||
다음의 산술 추론에 대한 예제를 살펴봅시다:
|
||||
다음의 산술 추론에 대한 예제를 살펴봅시다.
|
||||
|
||||
*Prompt:*
|
||||
```
|
||||
@ -15,7 +15,7 @@
|
||||
35
|
||||
```
|
||||
|
||||
결과가 틀렸습니다. 자기 일관성을 이용해 이 문제를 어떻게 개선할 수 있을까요? 한번 해봅시다. [Wang et al. 2022] 논문의 (Table 17) 퓨샷 예제를 이용할 겁니다:
|
||||
결과가 틀렸습니다. 자기 일관성을 이용해 이 문제를 어떻게 개선할 수 있을까요? 한번 해봅시다. [Wang et al. 2022] 논문의 (Table 17) 퓨샷 예제를 이용해 보겠습니다.
|
||||
|
||||
*Prompt:*
|
||||
```
|
||||
|
@ -12,7 +12,7 @@ import AUTOCOT from '../../img/auto-cot.png'
|
||||
|
||||
이미지 출처: [Wei et al. (2022)](https://arxiv.org/abs/2201.11903)
|
||||
|
||||
[Wei et al. (2022)](https://arxiv.org/abs/2201.11903)에서 소개된 생각의 사슬(Chain-of-Thought, CoT) 프롬프트는 중간 추론 단계를 통해 복잡한 추론을 가능하게 합니다. 이를 단답형 프롬프트와 결합하면 응답하기 전에 추론이 필요한 복잡한 작업에서 더 나은 결과를 얻을 수 있습니다.
|
||||
[Wei et al. (2022)](https://arxiv.org/abs/2201.11903)에서 소개된 생각의 사슬(chain-of-thought, CoT) 프롬프트는 중간 추론 단계를 통해 복잡한 추론을 가능하게 합니다. 이를 단답형 프롬프트와 결합하면 응답하기 전에 추론이 필요한 복잡한 작업에서 더 나은 결과를 얻을 수 있습니다.
|
||||
|
||||
*Prompt:*
|
||||
```
|
||||
@ -55,7 +55,7 @@ A:
|
||||
|
||||
논문의 저자들은 위와 같은 결과가 충분히 큰 대규모언어모델에서만 발생하는 특성이라고 주장한다는 점을 명심하세요.
|
||||
|
||||
## Zero-shot COT Prompting
|
||||
## Zero-shot CoT Prompting
|
||||
|
||||
<Screenshot src={ZEROCOT} alt="Zero-shot COT" />
|
||||
|
||||
@ -96,14 +96,14 @@ A:
|
||||
|
||||
데모와 함께 생각의 사슬 프롬프트를 적용할 때, 이 과정은 효과적이고 다양한 예시를 수작업으로 포함합니다. 이러한 수작업은 차선의 해결책으로 이어질 수 있습니다. [Zhang 등(2022)](https://arxiv.org/abs/2210.03493)은 "단계별로 생각해보자"라는 프롬프트가 있는 대규모언어모델을 활용하여 데모를 위한 추론 사슬을 하나씩 생성함으로써 수작업을 없애는 접근 방식을 제안합니다. 이 자동 프로세스는 여전히 생성된 체인에 실수가 있을 수 있습니다. 실수로 인한 영향을 완화하기 위해서는 데모의 다양성이 중요합니다. 이 연구에서는 다양한 질문을 샘플링하고 데모를 구성하기 위한 추론 체인을 생성하는 Auto-CoT를 제안합니다.
|
||||
|
||||
Auto-CoT는 두 가지 주요 단계로 구성됩니다:
|
||||
Auto-CoT는 두 가지 주요 단계로 구성됩니다.
|
||||
|
||||
- 1단계): **질문 클러스터링\(question clustering\)**: 주어진 데이터 세트의 질문을 몇 개의 클러스터로 분할합니다.
|
||||
- 2단계): **데모 샘플링\(demonstration sampling\)**: 각 클러스터에서 대표 질문을 선택하고 간단한 휴리스틱과 함께 제로샷 생각의 사슬(Zero-Shot-CoT)를 사용해 추론 체인을 생성합니다.
|
||||
|
||||
간단한 휴리스틱은 질문의 길이(예: 60개의 토큰)와 추론 단계 수(예: 5개의 추론 단계)가 될 수 있습니다. 이렇게 하면 모델이 간단하고 정확한 데모를 사용하도록 장려합니다.
|
||||
|
||||
그 과정은 아래에 설명되어 있습니다:
|
||||
그 과정은 아래에 설명되어 있습니다.
|
||||
|
||||
<Screenshot src={AUTOCOT} alt="AUTOCOT" />
|
||||
|
||||
|
@ -8,7 +8,7 @@ import DSP from '../../img/dsp.jpeg'
|
||||
|
||||
조정 가능한 정책 언어모델\(Tuneable policy LM\)은 자극\(stimulus\)/힌트\(hint\)를 생성하도록 훈련됩니다. 대규모언어모델을 최적화하기 위해 강화 학습\(RL\)을 더 많이 사용하고 있습니다.
|
||||
|
||||
아래 그림은 Directional Stimulus 프롬프팅이 표준 프롬프팅과 어떻게 비교되는지 보여줍니다. 정책 언어모델은 블랙박스 고정 대규모언어모델\(black-box frozen LLM\)을 안내하는 힌트를 생성하기 위해 작게 최적화될 수 있습니다.
|
||||
아래 그림은 방향 자극 프롬프팅(directional stimulus prompting)이 표준 프롬프팅과 어떻게 비교되는지 보여줍니다. 정책 언어모델은 블랙박스 고정 대규모언어모델\(black-box frozen LLM\)을 안내하는 힌트를 생성하기 위해 작게 최적화될 수 있습니다.
|
||||
|
||||
<Screenshot src={DSP} alt="DSP" />
|
||||
이미지 출처: [Li et al., (2023)](https://arxiv.org/abs/2302.11520)
|
||||
|
@ -1,10 +1,10 @@
|
||||
# Few-Shot Prompting
|
||||
|
||||
대규모 언어 모델은 뛰어난 zero-shot 기능을 보여주지만, 복잡한 작업에서는 여전히 개선이 필요합니다. Few-shot 프롬프트는 프롬프트에서 데모를 제공하여 모델이 더 나은 성능을 발휘하도록 유도하는 문맥 내 학습을 가능하게 하는 기술로 사용할 수 있습니다. 이 데모는 모델이 응답을 생성하기를 원하는 후속 예제에 대한 조건부 역할을 합니다.
|
||||
대규모언어모델은 뛰어난 제로샷(zero-shot) 기능을 보여 주지만, 복잡한 작업에서는 여전히 개선이 필요합니다. 퓨샷(few-shot) 프롬프트는 프롬프트에서 데모를 제공하여 모델이 더 나은 성능을 발휘하도록 유도하는 문맥 내 학습을 가능하게 하는 기술로 사용할 수 있습니다. 이 데모는 모델이 응답을 생성하기를 원하는 후속 예제에 대한 조건부 역할을 합니다.
|
||||
|
||||
[Touvron et al. 2023](https://arxiv.org/pdf/2302.13971.pdf)에 따르면 모델이 충분한 크기로 커졌을 때 [(Kaplan et al., 2020)](https://arxiv.org/abs/2001.08361)에 처음으로 few-shot 속성이 나타났습니다.
|
||||
[Touvron et al. 2023](https://arxiv.org/pdf/2302.13971.pdf)에 따르면 모델이 충분한 크기로 커졌을 때 [(Kaplan et al., 2020)](https://arxiv.org/abs/2001.08361)에 처음으로 퓨샷 속성이 나타났습니다.
|
||||
|
||||
[Brown et al. 2020](https://arxiv.org/abs/2005.14165)에 제시된 예제를 통해 few-shot 프롬프트를 시연해 보겠습니다. 이 예제에서는 문장에서 새로운 단어를 올바르게 사용하는 것이 과제입니다.
|
||||
[Brown et al. 2020](https://arxiv.org/abs/2005.14165)에 제시된 예제를 통해 퓨샷 프롬프트를 시연해 보겠습니다. 이 예제에서는 문장에서 새로운 단어를 올바르게 사용하는 것이 과제입니다.
|
||||
|
||||
*Prompt:*
|
||||
```
|
||||
@ -22,13 +22,13 @@
|
||||
|
||||
게임에서 이겼을 때, 우리는 모델이 하나의 예시(예, 1-shot)만 제공함으로써 어떻게든 과제를 수행하는 방법을 학습했음을 관찰할 수 있습니다. 더 어려운 과제의 경우 예시(예, 3-shot, 5-shot, 10-shot, etc.)를 늘려가며 실험해 볼 수 있습니다.
|
||||
|
||||
[Min et al. (2022)](https://arxiv.org/abs/2202.12837)의 연구 결과에 따라, 다음은 few-shot을 사용할 때 시연/예시를 위한 몇 가지 팁입니다:
|
||||
[Min et al. (2022)](https://arxiv.org/abs/2202.12837)의 연구 결과에 따라, 다음은 퓨샷을 사용할 때 시연 및 예시에 도움이 되는 몇 가지 팁입니다.
|
||||
|
||||
- "레이블 공간과 데모에서 지정한 입력 텍스트의 분포는 (개별 입력에 대해 레이블이 올바른지 여부와 관계없이) 모두 중요합니다."
|
||||
- 사용하는 형식도 성능에 중요한 역할을 하며, 무작위 레이블만 사용하더라도 레이블이 전혀 없는 것보다 훨씬 낫습니다.
|
||||
- 추가 결과에 따르면 라벨의 실제 분포에서 (균일한 분포 대신) 무작위 라벨을 선택하는 것도 도움이 됩니다.
|
||||
|
||||
몇 가지 예를 살펴보겠습니다. 먼저 무작위 레이블이 있는 예제(즉, 부정 및 긍정 레이블이 입력에 무작위로 할당됨)를 시도해 보겠습니다:
|
||||
몇 가지 예를 살펴보겠습니다. 먼저 무작위 레이블이 있는 예제(즉, 부정 및 긍정 레이블이 입력에 무작위로 할당됨)를 시도해 보겠습니다.
|
||||
|
||||
*Prompt:*
|
||||
```
|
||||
@ -63,7 +63,7 @@
|
||||
|
||||
### Limitations of Few-shot Prompting
|
||||
|
||||
일반적인 few-shot 프롬프트는 많은 작업에 효과적이지만, 특히 복잡한 추론 작업을 처리할 때는 여전히 완벽한 기술은 아닙니다. 그 이유를 설명해 보겠습니다. 다음 작업을 제공했던 이전 예제를 기억하시나요?
|
||||
일반적인 퓨샷 프롬프트는 많은 작업에 효과적이지만, 특히 복잡한 추론 작업을 처리할 때는 여전히 완벽한 기술은 아닙니다. 그 이유를 설명해 보겠습니다. 다음 작업을 제공했던 이전 예제를 기억하시나요?
|
||||
|
||||
```
|
||||
이 집합{15, 32, 5, 13, 82, 7, 1}에서 홀수를 모두 더하면 짝수이다.
|
||||
@ -71,7 +71,7 @@
|
||||
A:
|
||||
```
|
||||
|
||||
이 작업을 다시 시도하면 모델이 다음과 같이 출력합니다:
|
||||
이 작업을 다시 시도하면 모델이 다음과 같이 출력합니다.
|
||||
|
||||
```
|
||||
네, 이 집합의 홀수를 모두 더하면 짝수인 107입니다.
|
||||
@ -104,6 +104,6 @@ A:
|
||||
답은 참입니다.
|
||||
```
|
||||
|
||||
작동하지 않았습니다. 이러한 유형의 추론 문제에 대해 신뢰할 수 있는 답변을 얻으려면 몇 번의 프롬프트만으로는 충분하지 않은 것 같습니다. 위의 예는 작업에 대한 기본 정보를 제공합니다. 자세히 살펴보면 우리가 소개한 작업 유형에는 몇 가지 추론 단계가 더 포함되어 있습니다. 즉, 문제를 여러 단계로 나누고 이를 모델에 시연하면 도움이 될 수 있습니다. 최근에는 더 복잡한 산술, 상식, 상징적 추론 작업을 처리하기 위해 [chain-of-thought (CoT) prompting](https://arxiv.org/abs/2201.11903) 가 대중화되었습니다.
|
||||
작동하지 않았습니다. 이러한 유형의 추론 문제에 대해 신뢰할 수 있는 답변을 얻으려면 몇 번의 프롬프트만으로는 충분하지 않은 것 같습니다. 위의 예는 작업에 대한 기본 정보를 제공합니다. 자세히 살펴보면 우리가 소개한 작업 유형에는 몇 가지 추론 단계가 더 포함되어 있습니다. 즉, 문제를 여러 단계로 나누고 이를 모델에 시연하면 도움이 될 수 있습니다. 최근에는 더 복잡한 산술, 상식, 상징적 추론 작업을 처리하기 위해 [생각의 사슬(chain-of-thought; CoT) 프롬프팅](https://arxiv.org/abs/2201.11903)이 대중화되었습니다.
|
||||
|
||||
전반적으로 예제를 제공하는 것이 특정 문제를 해결하는 데 유용한 것으로 보입니다. zero-shot 프롬프트와 few-shot 프롬프트가 만족할 만한 답변을 주지 못한 경우 모델이 학습한 내용이 해당 작업을 잘 수행하기에 충분하지 않다는 의미일 수 있습니다. 이때부터 모델을 미세 조정하거나 고급 프롬프트 기법을 실험해 보는 것이 좋습니다. 다음에는 많은 인기를 얻고 있는 chain-of-thought 프롬프트라는 인기 있는 프롬프트 기법 중 하나에 대해 이야기하겠습니다.
|
||||
전반적으로 예제를 제공하는 것이 특정 문제를 해결하는 데 유용한 것으로 보입니다. 제로샷 프롬프트와 퓨샷 프롬프트가 만족할 만한 답변을 주지 못한 경우 모델이 학습한 내용이 해당 작업을 잘 수행하기에 충분하지 않다는 의미일 수 있습니다. 이때부터 모델을 미세 조정하거나 고급 프롬프트 기법을 실험해 보는 것이 좋습니다. 다음에는 인기 있는 프롬프트 기법 중 하나인 생각의 사슬 프롬프팅에 대해 이야기해 보겠습니다.
|
@ -6,7 +6,7 @@ import REACT from '../../img/react.png'
|
||||
import REACT1 from '../../img/react/table1.png'
|
||||
import REACT2 from '../../img/react/alfworld.png'
|
||||
|
||||
[Yao et al., 2022](https://arxiv.org/abs/2210.03629)에서는 대규모언어모델을 사용하여 *추론 추적\(reasoning traces\)*과 *작업별 행동\(task-specific actions\)*을 인터리브 방식으로 생성하는 ReAct라는 프레임워크를 소개했습니다.
|
||||
[Yao et al., 2022](https://arxiv.org/abs/2210.03629)에서는 대규모언어모델을 사용하여 *추론 추적*과 *작업별 행동*을 인터리브 방식으로 생성하는 ReAct라는 프레임워크를 소개했습니다.
|
||||
|
||||
추론 추적을 생성하면 모델이 행동 계획을 유도, 추적, 업데이트하고 예외를 처리할 수 있습니다. 행동 단계\(action step\)에서는 지식 기반이나 환경과 같은 외부 소스와 상호 작용하고 정보를 수집할 수 있습니다.
|
||||
|
||||
@ -26,18 +26,18 @@ ReAct는 추론과 행동을 대규모언어모델과 결합하는 일반적인
|
||||
<Screenshot src={REACT} alt="REACT" />
|
||||
이미지 출처: [Yao et al., 2022](https://arxiv.org/abs/2210.03629)
|
||||
|
||||
위의 예에서, 우리는 [HotpotQA](https://hotpotqa.github.io/)에서 아래 질문과 같은 프롬프트를 전달합니다:
|
||||
위의 예에서, 우리는 [HotpotQA](https://hotpotqa.github.io/)에서 아래 질문과 같은 프롬프트를 전달합니다.
|
||||
|
||||
```
|
||||
Apple Remote 외에 Apple Remote가 원래 상호 작용하도록 설계된 프로그램을 제어할 수 있는 다른 장치는 어떤 것이 있니?
|
||||
```
|
||||
|
||||
문맥내(in-context) 예시는 프롬프트에 추가되지만, 여기에서는 단순화를 위해 제외됨을 유의하세요. 우리는 모델이 작업 해결 궤적(생각, 행동)으 생성하는 것을 볼 수 있습니다. Obs는 상호작용 중인 환경(예: 검색 엔진)에서의 관찰에 해당합니다. 본질적으로, ReAct는 추론을 지원하기 위해 정보를 검색할 수 있으면, 추론은 다음에 검색할 대상을 타겟팅하는데 도움이 됩니다.
|
||||
문맥 내(in-context) 예시는 프롬프트에 추가되지만, 여기에서는 단순화를 위해 제외됨을 유의하세요. 우리는 모델이 작업 해결 궤적(생각, 행동)을 생성하는 것을 볼 수 있습니다. Obs는 상호작용 중인 환경(예: 검색 엔진)에서의 관찰에 해당합니다. 본질적으로, ReAct는 추론을 지원하기 위해 정보를 검색할 수 있으면, 추론은 다음에 검색할 대상을 타겟팅하는데 도움이 됩니다.
|
||||
|
||||
## ReAct Prompting
|
||||
ReAct 프롬프팅이 어떻게 작동하는지 설명하기 위해, 논문에서 예시를 살펴보겠습니다.
|
||||
|
||||
첫 번째 단계는 트레이닝 세트(예:HotPotQA)에서 사례를 선택하고 ReAct 형식의 궤적을 구성하는 것이다. 이것들은 프롬프트에서 퓨샷(few-shot) 견본으로 사용됩니다. 궤적은 위 그림과 같이 여러 생각-행동-관찰 단계로 구성됩니다. 자유 형태 사고는 질문 분해, 정보 추출, 상식/산술적 추론 수행, 검색 공식화 안내, 그리고 최종 답변 합성과 같은 다른 작업들을 수행하는데 사용됩니다.
|
||||
첫 번째 단계는 트레이닝 세트(예:HotPotQA)에서 사례를 선택하고 ReAct 형식의 궤적을 구성하는 것입니다. 이것들은 프롬프트에서 퓨샷(few-shot) 견본으로 사용됩니다. 궤적은 위 그림과 같이 여러 생각-행동-관찰 단계로 구성됩니다. 자유 형태 사고는 질문 분해, 정보 추출, 상식/산술적 추론 수행, 검색 공식화 안내, 그리고 최종 답변 합성과 같은 다른 작업들을 수행하는데 사용됩니다.
|
||||
|
||||
다음은 ReAct 프롬프트 모범 예시입니다(논문에서 가지고 온 것으로, 간결하게 하기 위해 하나의 예로 줄였습니다).
|
||||
|
||||
@ -71,7 +71,7 @@ ReAct 프롬프팅이 어떻게 작동하는지 설명하기 위해, 논문에
|
||||
|
||||
서로 다른 프롬프팅 방법을 사용하는 HotPotQA와 Fever에 대한 프롬프팅 결과를 보면 일반적으로 두 작업 모두에서 ReAct가 Act(행동만 포함)보다 더 나은 성능을 보입니다.
|
||||
|
||||
또한 ReAct가 Fever에서는 CoT보다 성능이 뛰어나고 HotPotQA에서는 CoT보다 뒤처지는 것을 관찰할 수 있습니다. 자세한 오류 분석은 논문에서 확인할 수 있습니다. 요약하자면:
|
||||
또한 ReAct가 Fever에서는 CoT보다 성능이 뛰어나고 HotPotQA에서는 CoT보다 뒤처지는 것을 관찰할 수 있습니다. 자세한 오류 분석은 논문에서 확인할 수 있습니다. 요약하자면 다음과 같습니다.
|
||||
|
||||
- CoT 는 사실 착각에 시달립니다.
|
||||
- ReAct의 구조적 제약은 추론 단계를 공식화할 때 유연성이 떨어집니다.
|
||||
@ -92,9 +92,9 @@ ReAct는 ALFWorld와 Webshop 모두에서 Act 보다 성능이 뛰어납니다.
|
||||
|
||||
## LangChain ReAct Usage
|
||||
|
||||
아래는 ReAct 프롬프팅 접근 방식이 실제로 어떻게 이루어지는지에 대한 개략적인 예입니다. 우리는 대규모언어모델과 다른 도구의 힘을 결합하여 작업을 수행하는 에이전트를 구축하기 위해 ReAct 프레임워크를 활용하는 기능이 이미 내장되어 있기 때문에 대규모언어모델과 [LangChain](https://python.langchain.com/en/latest/index.html)에 대해 OpenAI를 사용할 것이다.
|
||||
아래는 ReAct 프롬프팅 접근 방식이 실제로 어떻게 이루어지는지에 대한 개략적인 예입니다. 우리는 대규모언어모델과 다른 도구의 힘을 결합하여 작업을 수행하는 에이전트를 구축하기 위해 ReAct 프레임워크를 활용하는 기능이 이미 내장되어 있기 때문에 대규모언어모델과 [LangChain](https://python.langchain.com/en/latest/index.html)에 대해 OpenAI를 사용합니다.
|
||||
|
||||
먼저 필요한 라이브러리를 설치하고 가지고 옵니다:
|
||||
먼저 필요한 라이브러리를 설치하고 가지고 옵니다.
|
||||
|
||||
``` python
|
||||
%%capture
|
||||
@ -133,7 +133,7 @@ agent = initialize_agent(tools, llm, agent="zero-shot-react-description", verbos
|
||||
agent.run("Olivia Wilde의 남자 친구는 누구이니? 0.23 거듭제곱을 하면 현재 그의 나이는 얼마이니?")
|
||||
```
|
||||
|
||||
체인 실행\(chain execution\)은 다음과 같습니다:
|
||||
체인 실행(chain execution)은 다음과 같습니다.
|
||||
|
||||
``` yaml
|
||||
> Entering new AgentExecutor chain...
|
||||
@ -156,7 +156,7 @@ agent.run("Olivia Wilde의 남자 친구는 누구이니? 0.23 거듭제곱을
|
||||
> Finished chain.
|
||||
```
|
||||
|
||||
출력은 다음과 같습니다:
|
||||
출력은 다음과 같습니다.
|
||||
|
||||
```
|
||||
"Olivia Wilde의 남자 친구인 Harry Styles는 29 세이고, 그의 나이에 0.23 거듭제곱한 값은 2.169459462491557 이야."
|
||||
@ -164,4 +164,4 @@ agent.run("Olivia Wilde의 남자 친구는 누구이니? 0.23 거듭제곱을
|
||||
|
||||
이 예제는 [LangChain 문서](https://python.langchain.com/docs/modules/agents/agent_types/react)에서 가져온 것이므로 해당 문서에 공로가 있습니다. 우리는 학습자가 다양한 도구와 작업의 조합을 탐색해 볼 것을 권장합니다.
|
||||
|
||||
이 코드에 대한 노트북은 여기에서 찾을 수 있습니다: https://github.com/dair-ai/Prompt-Engineering-Guide/blob/main/notebooks/react.ipynb
|
||||
이 코드에 대한 노트북은 [이곳](https://github.com/dair-ai/Prompt-Engineering-Guide/blob/main/notebooks/react.ipynb)에서 확인할 수 있습니다.
|
@ -8,9 +8,9 @@ import TOT3 from "../../img/TOT3.png";
|
||||
|
||||
탐구나 전략적인 예측이 필요한 복잡한 작업들을 해결하기 위해서는 기존의 단순한 프롬프팅 기법으로는 부족합니다. [Yao et el. (2023)](https://arxiv.org/abs/2305.10601)와 [Long (2023)](https://arxiv.org/abs/2305.08291)는 최근 Tree of Thoughts(ToT)의 개념을 제안했는데, 이 프레임워크는 '생각의 사슬(chain-of-thought)' 프롬프팅 기법을 일반화하며, 언어모델을 사용하여 일반적인 문제 해결을 위한 중간 단계 역할을 하는 생각에 대한 탐색을 촉진합니다.
|
||||
|
||||
ToT는 문제를 해결하기 위한 중간 단계로서 일관된 언어 시퀀스를 나타내는 Tree of Touhgts를 유지합니다. 이 접근법을 통해 언어모델은 신중한 추론 과정을 거쳐 문제를 해결하기 위한 중간 생각들이 문제를 해결해나가는 과정을 자체적으로 평가할 수 있게 됩니다. 그리고 이 언어모델이 생각을 생성하고 평가하는 능력은 탐색 알고리즘(예: 너비 우선 탐색과 깊이 우선 탐색(DFS))과 결합되어, 선제적 탐색과 백트래킹이 가능한 생각의 체계적인 탐색을 가능하게 합니다.
|
||||
ToT는 문제를 해결하기 위한 중간 단계로서 일관된 언어 시퀀스를 나타내는 Tree of Thoughts를 유지합니다. 이 접근법을 통해 언어모델은 신중한 추론 과정을 거쳐 문제를 해결하기 위한 중간 생각들이 문제를 해결해나가는 과정을 자체적으로 평가할 수 있게 됩니다. 그리고 이 언어모델이 생각을 생성하고 평가하는 능력은 탐색 알고리즘(예: 너비 우선 탐색과 깊이 우선 탐색(DFS))과 결합되어, 선제적 탐색과 백트래킹이 가능한 생각의 체계적인 탐색을 가능하게 합니다.
|
||||
|
||||
ToT 프레임워크는 다음과 같습니다:
|
||||
ToT 프레임워크는 다음과 같습니다.
|
||||
|
||||
<Screenshot src={TOT} alt="TOT" />
|
||||
이미지 출처: [Yao et el. (2023)](https://arxiv.org/abs/2305.10601){" "}
|
||||
@ -22,7 +22,7 @@ ToT를 사용할 때, 다른 작업들은 후보의 수와 생각/단계의 수
|
||||
<Screenshot src={TOT2} alt="TOT2" />
|
||||
이미지 출처: [Yao et el. (2023)](https://arxiv.org/abs/2305.10601){" "}
|
||||
|
||||
아래 그림에서 보고된 결과에서 볼 수 있듯, ToT는 다른 프롬프팅 방법들에 비해 월등히 뛰어납니다:
|
||||
아래 그림에서 보고된 결과에서 볼 수 있듯, ToT는 다른 프롬프팅 방법들에 비해 월등히 뛰어납니다.
|
||||
|
||||
<Screenshot src={TOT3} alt="TOT3" />
|
||||
이미지 출처: [Yao et el. (2023)](https://arxiv.org/abs/2305.10601){" "}
|
||||
@ -31,7 +31,7 @@ ToT를 사용할 때, 다른 작업들은 후보의 수와 생각/단계의 수
|
||||
|
||||
높은 수준에서 보면, [Yao et el. (2023)](https://arxiv.org/abs/2305.10601)와 [Long (2023)](https://arxiv.org/abs/2305.08291)의 주요 아이디어는 유사합니다. 두 연구 모두 다중 라운드 대화를 통한 트리 검색을 통해 대규모언어모델의 복잡한 문제 해결 능력을 향상시킵니다. 주요 차이점 중 하나는 [Yao et el. (2023)](https://arxiv.org/abs/2305.10601)이 깊이 우선 탐색/너비 우선 탐색/빔 탐색을 활용하는 반면, [Long (2023)](https://arxiv.org/abs/2305.08291)에서 제안하는 트리 검색 전략(즉, 언제 백트래킹을 하고, 몇 단계로 백트래킹을 하는지 등)은 강화 학습을 통해 훈련된 "ToT 컨트롤러"에 의해 주도됩니다. 깊이 우선 탐색/너비 우선 탐색/빔 탐색은 특정 문제에 대한 적응 없이 일반적인 해결책 검색 전략입니다. 반면, RL을 통해 훈련된 ToT 컨트롤러는 새로운 데이터 세트나 자체 플레이를 통해 학습할 수 있을 수 있으며(AlphaGo vs 무차별 검색), 따라서 RL 기반의 ToT 시스템은 고정된 LLM으로도 계속해서 발전하고 새로운 지식을 배울 수 있습니다.
|
||||
|
||||
[Hulbert (2023)](https://github.com/dave1010/tree-of-thought-prompting)은 Tree-of-Thought 프롬프팅을 제안했는데, 이는 ToT 프레임워크의 주요 개념을 단순한 프롬프팅 기법으로 적용하여 LLM이 단일 프롬프트에서 중간 생각을 평가하게 합니다. 샘플 ToT 프롬프트는 다음과 같습니다:
|
||||
[Hulbert (2023)](https://github.com/dave1010/tree-of-thought-prompting)은 Tree-of-Thought 프롬프팅을 제안했는데, 이는 ToT 프레임워크의 주요 개념을 단순한 프롬프팅 기법으로 적용하여 LLM이 단일 프롬프트에서 중간 생각을 평가하게 합니다. 샘플 ToT 프롬프트는 다음과 같습니다.
|
||||
|
||||
```
|
||||
세 명의 다른 전문가들이 이 질문에 답하고 있다고 상상해보도록 해.
|
||||
|
@ -1,5 +1,5 @@
|
||||
# Zero-Shot Prompting
|
||||
대량의 데이터를 학습하고 지침을 따르도록 튜닝된 오늘날의 머신러닝은 제로샷(zero-shot)으로 작업을 수행할 수 있습니다. 이전 장에서 몇 가지 제로 샷(zero-shot) 예제를 시도해 보았습니다. 다음은 우리가 사용한 예제 중 하나입니다:
|
||||
대량의 데이터를 학습하고 지침을 따르도록 튜닝된 오늘날의 머신러닝은 제로샷(zero-shot)으로 작업을 수행할 수 있습니다. 이전 장에서 몇 가지 제로샷 예제를 시도해 보았습니다. 다음은 우리가 사용한 예제 중 하나입니다.
|
||||
|
||||
*Prompt:*
|
||||
```
|
||||
@ -14,8 +14,8 @@
|
||||
중립
|
||||
```
|
||||
|
||||
위의 프롬프트에서는 모델에 예제를 제공하지 않았습니다. 이는 제로샷(zero-shot)으로 동작된 것을 알 수 있습니다.
|
||||
위의 프롬프트에서는 모델에 예제를 제공하지 않았습니다. 이는 제로샷으로 동작된 것을 알 수 있습니다.
|
||||
|
||||
명령어 튜닝(Instruction tuning)은 제로샷(zero-shot) 학습을 개선한다고 다음의 논문에서 보고되었습니다. [Wei et al. (2022)](https://arxiv.org/pdf/2109.01652.pdf). 명령어 튜닝은 본질적으로 명령어를 통해 설명된 데이터 세트에 대한 모델을 미세 조정 하는 개념입니다. 또한, [RLHF](https://arxiv.org/abs/1706.03741) (사람의 피드백을 통한 강화 학습)는 모델이 사람이 원하는 결과에 더 잘 맞도록 조정되는 명령어 튜닝을 확장하는 데 사용되었습니다. 이러한 개발 방식은 ChatGPT와 같은 모델에서 사용되었습니다. 다음 장에서 이러한 모든 접근 방식과 방법에 대해 설명하겠습니다.
|
||||
|
||||
제로샷(zero-shot)이 동작하지 않는 경우에는 프롬프트에 데모나 예시를 제공하여 퓨샷(few-shot)으로 프롬프트를 유도하는 것이 좋습니다. 다음 장에서는 제로샷(zero-shot) 프롬프트에 대한 데모를 보여 드리겠습니다.
|
||||
제로샷이 동작하지 않는 경우에는 프롬프트에 데모나 예시를 제공하여 퓨샷으로 프롬프트를 유도하는 것이 좋습니다. 다음 장에서는 제로샷 프롬프트에 대한 데모를 보여 드리겠습니다.
|
Loading…
Reference in New Issue
Block a user