Merge pull request #5 from neont21/02_App

Improve some Korean translation of Applications part
This commit is contained in:
11mLLM 2023-07-26 23:09:10 +09:00 committed by GitHub
commit 7080172002
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 84 additions and 87 deletions

View File

@ -2,8 +2,8 @@
import { Callout } from 'nextra-theme-docs'
이 장에서는 프롬프트 엔지니어링을 사용하여 유용하고 고급 작업을 수행할 수 있는 몇 가지 흥미로운 고급 방법을 다룹니다.
이 장에서는 프롬프트 엔지니어링을 사용하여 유용 고급 작업을 수행할 수 있는 몇 가지 흥미로운 고급 방법을 다룹니다.
<Callout emoji="⚠️">
This section is under heavy development.
해당 페이지는 개발 중에 있습니다.
</Callout>

View File

@ -1,5 +1,5 @@
{
"pal": "PAL프로그램 언어 지원 모델)",
"pal": "PAL프로그램지원언어모델)",
"generating": "데이터 생성",
"coding": "Generating Code",
"workplace_casestudy": "학위가 필요한 직업을 분류한 사례연구",

View File

@ -1,47 +1,44 @@
# 데이터 생성
일관된 텍스트를 생성하는 것은 LLM이 두각을 나타내는 분야입니다. 효과적인 프롬프트 전략을 사용하면 모델을 조정하여 보다 우수하고 일관적이며 더욱 사실에 입각한 답변을 생성할 수 있습니다. 또한 LLM은 모든 종류의 실험과 평가를 수행하기 위한 유용한 데이터를 생성하는 데 특히 유용합니다. 가령, 다음과 같이 감정 분류기에 대한 빠른 샘플을 생성할 수 있습니다.
일관된 텍스트를 생성하는 것은 LLMs이 두각을 나타내는 분야입니다. 효과적인 프롬프트 전략을 사용하면 모델을 더 낫고, 일관성 있고, 더 사실에 기반한 답변을 생성할 수 있습니다. LLMs는 여러 종류의 실험과 평가를 수행하는 데 큰 도움이 되는 데이터를 생성하는 데 특히 유용합니다. 예를 들어, 다음과 같이 감정 분석을 위한 10가지 예를 생성해보겠습니다:
_프롬프트:_
_Prompt:_
```
감정 분석을 위한 10가지 예시를 작성해 줘. 예시는 긍정적 혹은 부정적으로 둘 중 하나로 분류할 수 있어. 부정적인 예시 2개와 긍정적인 예시 8개를 생성해줘. 다음 예시와 같은 형식을 사용해줘:
감정 분석을 위한 10가지 예시를 작성해 줘. 예시는 긍정적 혹은 부정적 둘 중 하나로 분류할 수 있어. 부정적인 예시 2개와 긍정적인 예시 8개를 생성해줘. 다음 예시와 같은 형식을 사용해줘.
Q: <문장>
A: <감정>
```
_출력:_
_Output:_
```
Q: 나 방금 굉장한 소식을 들었어!
A: 긍정
A: 긍정
Q: 우리 급여가 올랐네요!
A: 긍정
Q: 우리 급여가 인상되었어!
A: 긍정
Q: 나는 오늘 내가 성취한 일에 뿌듯함을 느껴.
A: 긍정
A: 긍정
Q: 최고의 하루를 보내고 있어!
A: 긍정
A: 긍정
Q: 이번 주말을 매우 고대하고있어!
A: 긍정
Q: 이번 주말을 매우 고대하고 있어!
A: 긍정
Q: 나는 지금 최고의 선물을 받았어!
A: 긍정
A: 긍정
Q: 나는 지금 매우 행복해.
A: 긍정
A: 긍정
Q: 이렇게 훌륭한 가족의 일원으로서 축복받았다고 느껴.
A: 긍정
Q: 이렇게 훌륭한 가족의 일원이라는 건 정말 축복이야.
A: 긍정
Q: 바깥 날씨가 굉장히 흐리네요.
A: 부정
Q: 바깥 날씨가 굉장히 흐.
A: 부정
Q: 방금 끔찍한 소식을 들었어.
A: 부정
Q: 방금 끔찍한 소식을 들었어.
A: 부정
```
이는 매우 유용합니다. 실제로 이 가이드의 다른 섹션의 테스트에서 이 예시를 사용하고 있을정도로요.
이는 매우 유용합니다. 이 가이드의 다른 섹션의 테스트에서 실제로 이 예시를 사용하고 있을 정도로요.

View File

@ -1,19 +1,19 @@
# PAL (프로그램 지원 언어 모델)
# PAL (프로그램지원언어모델)
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)은 프로그램 지원 언어 모델(PAL)이라고 불리며 솔루션을 얻기 위한 자유 형식 텍스트 대신 Python 인터프리터와 같은 프로그램 실행 시 해결 단계를 오프로드합니다.
[Gao et al., (2022)](https://arxiv.org/abs/2211.10435)는 LLM을 이용하여 자연어 문제를 읽고 중간 추론 단계로서의 프로그램을 생성하는 방법을 제시합니다. 그 방법은 프로그램지원언어모델(program-aided language models; PAL)이라고 이름 붙었으며, 해답을 얻기 위해 자유 형식 텍스트를 사용하는 대신 파이썬 인터프리터와 같은 프로그래밍 방식의 런타임을 통해 단계적으로 해결해 나간다는 점에서 생각의 사슬(chain-of-thought) 프롬프팅과 차이가 있습니다.
<Screenshot src={PAL} alt="PAL" />
이미지 출처: [Gao et al., (2022)](https://arxiv.org/abs/2211.10435)
LangChain과 OpenAI GPT-3을 사용한 예를 살펴보겠습니다. 우리는 Python 인터프리터를 활용하여 질문을 해석하고 답변을 제공할 수 있는 간단한 애플리케이션을 개발해야하는 상황이라고 가정해보겠습니다.
LangChain과 OpenAI GPT-3을 사용한 예시를 살펴보겠습니다. 우리는 파이썬 인터프리터를 활용하여 질문을 해석하고 답변을 제공하는 간단한 애플리케이션을 개발해야 하는 상황이라고 가정해 보겠습니다.
특히, 날짜 이해가 필요한 질문에 LLM을 사용하여 답변할 수 있는 기능을 만드는 것에 초점을 맞추겠습니다. 프롬프트에 제공한 몇 가지 예시는 [여기](https://github.com/reasoning-machines/pal/blob/main/pal/prompt/date_understanding_prompt.py)에서 채택했습니다.
그 중에서도 날짜에 대한 이해가 필요한 질문에 대해서 LLM을 이용하여 답할 수 있는 기능을 만들고자 합니다. LLM에 제공할 프롬프트의 예제 중 일부는 [여기](https://github.com/reasoning-machines/pal/blob/main/pal/prompt/date_understanding_prompt.py)에서 채택했습니다.
다음은 우리가 필요로하는 import 문 입니다:
다음은 우리가 사용하는 import 문입니다.
```python
import openai
@ -24,69 +24,69 @@ from langchain.llms import OpenAI
from dotenv import load_dotenv
```
우선 몇 가지 설정을 해보겠습니다:
우선 몇 가지를 구성해 보겠습니다.
```python
load_dotenv()
# API 설정
# API 구성
openai.api_key = os.getenv("OPENAI_API_KEY")
# LangChain 설정
# LangChain 구성
os.environ["OPENAI_API_KEY"] = os.getenv("OPENAI_API_KEY")
```
모델 인스턴스를 셋업합니다:
모델 인스턴스를 설정합니다.
```python
llm = OpenAI(model_name='text-davinci-003', temperature=0)
```
설정 프롬프트 + 질문:
프롬프트와 질문을 설정합니다.
```python
question = "오늘은 2023년 2월 27일이야. 나는 정확히 25년전에 태어났어. 내가 태어난 날짜를 MM/DD/YYYY 형식으로 반환해줘"
question = "오늘은 2023년 2월 27일이야. 나는 정확히 25년 전에 태어났어. 내가 태어난 날짜를 MM/DD/YYYY 형식으로 알려줘."
DATE_UNDERSTANDING_PROMPT = """
# Q: 36시간이 지나면 2015년이야. 오늘로부터 일주일 뒤는 며칠인지 MM/DD/YYYY 형식으로 반환해줘.
# Q: 2015년까지 36시간 남았어. 오늘로부터 일주일 뒤는 며칠인지 MM/DD/YYYY 형식으로 알려줘.
# 2015년이 되기까지 36시간이 남았다면 오늘은 36시간 전이다.
today = datetime(2015, 1, 1) - relativedelta(hours=36)
# 오늘부터 일주일 뒤
# 오늘부터 일주일 뒤
one_week_from_today = today + relativedelta(weeks=1)
# The answer formatted with %m/%d/%Y is
# 답을 %m/%d/%Y 형식으로 하면
one_week_from_today.strftime('%m/%d/%Y')
# Q: 2019년의 첫 날은 화요일이고 오늘은 2019년의 첫 번째 월요일이야. 오늘 날짜를 MM/DD/YYY로 반환해줘.
# 2019년의 첫 날이 화요일이고 오늘이 2019년 첫 월요일이라면 오늘은 6일 후입니다.
# Q: 2019년의 첫 날은 화요일이고 오늘은 2019년의 첫 월요일이야. 오늘 날짜를 MM/DD/YYYY 형식으로 알려줘.
# 2019년의 첫 날이 화요일이고 오늘이 2019년 첫 월요일이라면 오늘은 6일 후다.
today = datetime(2019, 1, 1) + relativedelta(days=6)
# %m/%d/%Y 형식으로 포맷팅된 답변은
# 답을 %m/%d/%Y 형식으로 하면
today.strftime('%m/%d/%Y')
# Q: 콘서트는 1943년 6월 1일에 열리기로 예정되어 있었는데, 하루 연기되어 오늘로 변경됐어. 10일 전 날짜를 MM/DD/YYY 형식으로 반환해줘.
# 콘서트가 1943년 6월 1일로 예정되어 있었으나 오늘로 하루 연기되었다면, 오늘은 하루가 지난 것입니다.
# Q: 콘서트는 1943년 6월 1일에 열리기로 예정되어 있었는데, 하루 연기되어 오늘로 변경됐어. 10일 전 날짜를 MM/DD/YYY 형식으로 알려줘.
# 콘서트가 1943년 6월 1일로 예정되어 있었으나 오늘로 하루 연기되었다면, 오늘은 하루가 지난 것다.
today = datetime(1943, 6, 1) + relativedelta(days=1)
# 열흘 전,
# 열흘 전의 날짜는
ten_days_ago = today - relativedelta(days=10)
# %m/%d/%Y의 형식으로 반환된 답은
# 답을 %m/%d/%Y의 형식으로 하면
ten_days_ago.strftime('%m/%d/%Y')
# Q: 오늘은 1969년 4월 19일이야. 24시간 후의 날짜를 MM/DD/YYYY 형식으로 반환해줘.
# 오늘의 날짜는 4/19/1969 입니다.
# Q: 오늘은 1969년 4월 19일이야. 24시간 후의 날짜를 MM/DD/YYYY 형식으로 알려줘.
# 오늘의 날짜는 1969년 4월 19일이다.
today = datetime(1969, 4, 19)
# 24시간 후,
# 24시간 후의 날짜는
later = today + relativedelta(hours=24)
# %m/%d/%Y의 형식으로 반환된 답은
# 답을 %m/%d/%Y의 형식으로 하면
today.strftime('%m/%d/%Y')
# Q: Jane은 오늘이 2002년 3월 11일이라고 생각했지만 실제로는 3월 12일이고 하루 뒤야. 24시간 후의 날짜를 MM/DD/YYYY 형식으로 반환해줘.
# 제인은 오늘 날짜를 3/11/2002 라고 생각했고, 사실 오늘은 3월 12일이면 오늘 날짜는 3/1/2002 입니다.
# Q: 영희는 오늘이 2002년 3월 11일이라고 생각했지만 실제로는 다음날인 3월 12일이야. 24시간 후의 날짜를 MM/DD/YYYY 형식으로 알려줘.
# 영희는 오늘 날짜를 2002년 3월 11일이라고 생각했고, 사실 오늘은 3월 12일이면 오늘 날짜는 2002년 3월 12일이다.
today = datetime(2002, 3, 12)
# 24시간 후,
# 24시간 후의 날짜는
later = today + relativedelta(hours=24)
# %m/%d/%Y의 형식으로 반환된 답은
# 답을 %m/%d/%Y의 형식으로 하면
later.strftime('%m/%d/%Y')
# Q: Jane은 2001년 2월 마지막 날 태어났어. 오늘은 Jane의 16번째 생일이야. 어제의 날짜를 MM/DD/YYYY 형식으로 반환해줘.
# Jane이 2001년 2월의 마지막 날에 태어났다면 오늘은 16년 후입니다.
# Q: 영희는 2001년 2월 마지막 날 태어났어. 오늘은 영희의 16번째 생일이야. 어제의 날짜를 MM/DD/YYYY 형식으로 알려줘.
# 영희가 2001년 2월의 마지막 날에 태어났고 오늘이 영희의 16번째 생일이라면 오늘은 16년 후다.
today = datetime(2001, 2, 28) + relativedelta(years=16)
# 어제,
# 어제 날짜는
yesterday = today - relativedelta(days=1)
# %m/%d/%Y의 형식으로 반환된 답은
# 답을 %m/%d/%Y의 형식으로 하면
yesterday.strftime('%m/%d/%Y')
# Q: {question}
""".strip() + '\n'

View File

@ -1,41 +1,42 @@
# 학위가 필요한 직업을 분류한 사례연구
# 학위가 필요한 직업을 분류한 사례 연구
[Clavié et al., 2023](https://arxiv.org/abs/2303.07142)는 프롬프트 엔지니어링을 적용한 미디엄 스케일의 텍스트 분류 유스케이스 사례연구를 발표했습니다. 분류 작업을 통해서 특정 직업이 대학을 갓 졸업한 사람에게 꼭 맞는 "신입 레벨" 인지, 여러 프롬프트 엔지니어링 테크닉을 사용하여 평가한 뒤 GPT-3.5 (`gpt-3.5-turbo`)를 사용하여 결과를 공유했습니다.
[Clavié et al., 2023](https://arxiv.org/abs/2303.07142)는 생산 시스템에 중간 규모 텍스트 분류 사용 사례를 적용한 프롬프트 엔지니어링에 대한 사례 연구를 발표했습니다. 직업이 정말 대학을 갓 졸업한 사람에게 적합한 "입문 수준의 직업"인지 아닌지 분류하는 작업을 하여 일련의 프롬프트 엔지니어링 기술을 평가하고 GPT-3.5 (`gpt-3.5-turbo`)를 이용하여 결과를 보고했습니다.
이 연구는 강력한 베이스라인인 DeBERTa-V3를 포함한 여러 다른 모델들을 LLM이 가뿐히 능가했음을 증명합니다. 또한 `gpt-3.5-turbo`가 구 버전의 GPT3 variants의 모든 키 메트릭에서 두각을 나타냈음을 보여주었습니다만, 템플릿에 한정하여 추가 출력 파싱을 필요로 할 만큼 다른 variants보다는 조금 떨어진 성능을 확인할 수 있었습니다.
이 연구는 LLM이 DeBERTa-V3의 매우 강력한 기준선을 포함한 다른 모든 테스트된 모델들을 능가했음을 보여줍니다. `gpt-3.5-turbo` 또한 모든 주요 메트릭에서 구 버전의 GPT3 변종보다 눈에 띄게 뛰어난 성능을 보이지만, 템플릿에 대한 적용성이 다른 변종들에 비해 부족하여 추가적인 출력 파싱이 필요합니다.
프롬프트 엔지니어링 접근법에서 얻은 주요 결과는 다음과 같습니다:
이 연구의 프롬프트 엔지니어링 접근법에서 얻은 주요 결과는 다음과 같습니다.
- 전문가의 지식이 필요하지 않은 이러한 단순 작업의 경우, 모든 실험에서 Few-shot CoT 프롬프팅이 Zero-shot 프롬프팅에 비해 상대적으로 낮은 퍼포먼스를 보여주었습니다.
- 프롬프트는 올바른 추론 도출에 엄청난 영향을 미칩니다. 모델에게 직업을 분류하라고 간단하게 명령했을 때에는 65.6의 F1 점수를 얻었으나, 포스트-프롬프트 엔지니어링 모델은 91.7의 F1 점수를 보여주었습니다.
- 모델을 템플릿에 강제로 적용하려 한 모든 경우에 성능이 저하되었습니다. (이 방법은 논문 뒤 쪽의 GPT-4를 사용한 초기 테스트에서 사라졌습니다.)
- 아주 작은 수정사항이 성능에 엄청난 영향을 미쳤습니다.
- 아래 표에서 모든 수정사항에 따른 결과를 확인하세요.
- 적절한 지시를 내리고, 키 포인트를 반복하는 것이 가장 큰 성능 동력으로 나타났습니다.
- 모델에게 (사람)이름을 지어주고 불러주는 것은 F1 점수를 증가시켰습니다.
- 전문가의 지식이 필요하지 않은 이러한 단순 작업의 경우, 모든 실험에서 퓨샷 생각의 사슬 프롬프팅(Few-shot CoT prompting)이 제로샷 프롬프팅(Zero-shot prompting)에 비해 상대적으로 낮은 성능을 보여주었습니다.
- 프롬프트는 올바른 추론 도출에 엄청난 영향을 미칩니다. 모델에게 직업을 분류하라고 단순히 명령했을 때에는 65.6의 F1 점수를 얻었으나, 프롬프트 엔지니어링 모델은 91.7의 F1 점수를 보여주었습니다.
- 모델을 템플릿에 강제로 적용하려 한 모든 경우에 성능이 저하되었습니다(이 현상은 논문 후반의 GPT-4를 사용한 초기 테스트에서 사라졌습니다).
- 여러 작은 수정사항이 성능에 엄청난 영향을 미쳤습니다.
- 아래 표에서 테스트 된 모든 수정 사항을 확인할 수 있습니다.
- 적절한 지시를 내리고 요점을 반복하는 것이 가장 큰 성능 동력으로 나타났습니다.
- 단순히 모델에게 (사람) 이름을 지어주는 것으로 F1 점수가 0.6 상승했습니다.
### 실험에 쓰인 프롬프트 수정사항들
### 테스트 된 프롬프트 수정 사항들
| 약어 | 설명 |
| -------- | --------------------------------------------------------------------------------- |
| Baseline | 채용 공고를 제공하고 갓 졸업한 신입에게 적합한지 묻습니다. |
| CoT | 쿼리를 날리기 전에 몇 가지 정확한 예시를 제공합니다. |
| Zero-CoT | 모델에게 단계별로 추론한 뒤 정답을 제시하도록 요구합니다. |
| rawinst | 역할 및 작업에 대한 지침을 사용자 메시지에 추가하여 제공합니다. |
| sysinst | 시스템 메시지로서의 역할과 작업에 대한 지침을 제공합니다. |
| bothinst | 시스템 메시지로서의 역할과 사용자 메시지로서의 작업을 사용하여 명령을 분할합니다. |
| mock | 토론 내용을 인식하는 부분을 따라하여 작업 지시를 내립니다. |
| reit | 주요 요소를 반복하여 지시를 보강합니다. |
| Baseline | 채용 공고를 제공하고 갓 졸업한 사람에게 적합한지 묻습니다. |
| CoT | 질의를 하기 전에 정확히 분류된 몇 가지 예시를 제공합니다. |
| Zero-CoT | 모델에게 단계별로 추론하여 정답을 제시하도록 요구합니다. |
| rawinst | 역할 및 작업에 대한 지시를 사용자 메시지에 추가함으로써 제공합니다. |
| sysinst | 역할 및 작업에 대한 지시를 시스템 메시지로서 제공합니다. |
| bothinst | 시스템 메시지로서의 역할과 사용자 메시지로서의 작업으로 명령을 분할합니다. |
| mock | 그들을 인정하는 의사 토론을 통해 작업 지시를 제공합니니다. |
| reit | 요점을 반복하여 지시를 강화합니다. |
| strict | 모델에게 주어진 템플릿을 엄격히 준수하여 답변하도록 요청합니다. |
| loose | 주어진 템플릿 뒤에 최종 답변만 반환하도록 요청합니다. |
| loose | 최종 답변만 주어진 탬플릿을 준수하여 반환하도록 요청합니다. |
| right | 모델에게 올바른 결론에 도달하도록 요청합니다. |
| info | 일반적인 추론 실패를 해결하기 위한 추가 정보를 제공합니다. |
| name | 모델에게 이름을 지어주고 대화 시 사용합니다. |
| pos | 쿼리를 날리기 전 모델에게 긍정적인 피드백을 제공합니다. |
| name | 모델에게 대화에서 부를 이름을 제공합니다. |
| pos | 질의를 하기 전 모델에게 긍정적인 피드백을 제공합니다. |
### 위의 프롬프트 수정사항이 성능에 미치는 영향
| | 정확도 | 리콜 | F1 | 템플릿 고착도 |
### 프롬프트 수정 사항이 성능에 미치는 영향
| | 정확도 | 재현율 | F1 | 템플릿 고착도 |
| --------------------------------------- | -------- | ------ | -------- | ------------- |
| _Baseline_ | _61.2_ | _70.6_ | _65.6_ | _79%_ |
| _CoT_ | _72.6_ | _85.1_ | _78.4_ | _87%_ |
@ -52,5 +53,4 @@
| +bothinst+mock+reit+right+info+name | 85.7 | 96.8 | 90.9 | 79% |
| +bothinst+mock+reit+right+info+name+pos | **86.9** | **97** | **91.7** | 81% |
템플릿 고착도란 요구한 형식으로 모델이 응답한 빈도를 나타냅니다.
Template stickiness refers to how frequently the model answers in the desired format.
템플릿 고착도란 모델이 요구받은 형식으로 응답한 빈도를 나타냅니다.