Merge pull request #244 from 11mLLM/02_App

🇰🇷 Advanced Korean Translation - III Applications
This commit is contained in:
Elvis Saravia 2023-08-09 15:49:19 -06:00 committed by GitHub
commit 0c3d283980
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 390 additions and 93 deletions

View File

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

View File

@ -1,7 +1,7 @@
{ {
"pal": "PAL프로그램 언어 지원 모델)", "pal": "PAL프로그램지원언어모델)",
"generating": "데이터 생성", "generating": "데이터 생성",
"coding": "Generating Code", "coding": "코드 생성",
"workplace_casestudy": "학위가 필요한 직업을 분류한 사례 연구", "workplace_casestudy": "학위가 필요한 직업을 분류한 사례 연구",
"pf": "Prompt Function" "pf": "프롬프트 함수"
} }

View File

@ -1,3 +1,199 @@
# Generating Code # Generating Code
Needs translation! Feel free to contribute a translation by clicking the `Edit this page` button on the right side. import { Callout, FileTree } from 'nextra-theme-docs'
import {Screenshot} from 'components/screenshot'
import CODE1 from '../../img/code-generation/chat-mode.png'
<Callout emoji="⚠️">
이 장은 활발하게 개발 중입니다.
</Callout>
ChatGPT와 같은 대규모언어모델은 코드 생성에 매우 유용합니다. 이 절은 코드 생성을 위해 ChatGPT를 사용하는 방법에 대한 많은 예시를 다룰 것입니다.
앞으로 나오는 모든 예시에는 OpenAI의 Playground(채팅 모드)와 gpt-3.5-turbo 모델이 사용됩니다.
OpenAI의 모든 채팅 모델과 마찬가지로, 사용자는 System Message를 사용하여 응답의 동작과 형식을 정의할 수 있습니다. 프롬프트의 예시로 다음 시스템 메시지를 사용해보겠습니다.
```
너는 주니어 개발자에게 코딩을 가르칠 수 있는 코딩 도우미야. 언어는 Python이야. 코드를 설명하지는 말고 코드 블록 자체를 생성해.
```
## 기본 예시
User Message는 사용자가 모델로 생성하고자 하는 특정 코드의 지시를 가진 프롬프트 자체가 됩니다. 아래는 코드 생성을 위한 첫 번째 기초 프롬프트의 스냅샷입니다. 최종 코드는 Assistant로 생성되었음을 인지하시기 바랍니다.
<Screenshot src={CODE1} alt="CODE1" />
직접 시도한다면 프롬프트는 다음과 같습니다:
```
사용자에게 이름을 묻고 "안녕하세요"라고 말하는 코드를 작성해.
```
## 주석을 코드로 변환
이러한 대규모언어모델의 코드 생성 기능을 사용하여 주석만으로도 코드를 생성할 수도 있습니다. 다음은 지시를 주석 블록으로 전달하는 예시입니다:
*Prompt:*
```
"""
1. 영화들을 리스트로 생성해
2. 이 영화들의 평점을 리스트로 생성해
3. 이들을 결합하여 평점이 매겨진 영화의 json 객체를 10개 만들어.
"""
```
*Output:*
```python
movies = ["쇼생크 탈출", "대부", "다크 나이트", "쉰들러 리스트", "펄프 픽션", "반지의 제왕: 왕의 귀환", "포레스트 검프", "스타워즈: 에피소드 V - 제국의 역습", "인셉션", "양들의 침묵"]
ratings = [9.3, 9.2, 9.0, 8.9, 8.9, 8.9, 8.8, 8.7, 8.7, 8.6]
movie_ratings = {}
for i in range(len(movies)):
movie_ratings[movies[i]] = ratings[i]
json_object = json.dumps(movie_ratings, indent=4)
print(json_object)
```
생성된 코드는 작동하는 코드처럼 보입니다. 하지만 출력에는 중요한 import 문, 즉 import json이 포함되어 있지 않습니다. 따라서 이러한 모델들이 작동하는 코드를 생성하는 동안, 이와 같은 작은 디테일에 각별히 주의를 기울여야 하며 항상 코드를 테스트해야 합니다.
## 함수 또는 이후 내용을 완성시키기
이러한 대규모언어모델은 개발자에게 유용한 GitHub Copilot 같은 툴과도 통합되었습니다. 한가지 유용한 기능은 모델이 함수를 완성하는 것입니다.
*Prompt:*
```python
# 두 수를 곱하고 75를 더하는 함수
def multiply(
```
*Output:*
```python
a, b):
result = a * b
result += 75
return result
```
## MySQL 쿼리 생성
위에 등장한 기본 코드 생성의 예시 외에도 모델을 사용하여 MySQL 쿼리 생성 및 테스트와 같은 프로그래밍과 다른 측면으로 사용될 수 있는 유용한 코드를 생성할 수 있습니다.
프롬프트의 일부를 포함하고 특정 쿼리를 생성하도록 지시할 수 있는 정보가 담긴 데이터세트가 있다고 가정해 보겠습니다. 예를 들어:
```
"""
Table departments, columns = [DepartmentId, DepartmentName]
Table students, columns = [DepartmentId, StudentId, StudentName]
컴퓨터공학과의 모든 학생들의 MySQL 쿼리를 생성해
"""
```
*Output:*
```mysql
SELECT students.StudentId, students.StudentName
FROM students
INNER JOIN departments
ON students.DepartmentId = departments.DepartmentId
WHERE departments.DepartmentName = 'Computer Science';
```
모델이 쿼리를 생성합니다! 그러나 이 예제는 생성된 쿼리를 테스트할 데이터베이스가 없는 채로 구성되었습니다. 이 예시를 테스트할 경우 이 데이터베이스를 생성하는 것이 유용할 수도 있습니다. 다행히 ChatGPT로 이를 생성할 수 있습니다. 한 가지 방법은 데이터베이스 스키마를 생성하기 위해 약간 다른 지시를 하여 위 프롬프트의 수정된 버전을 사용하는 것입니다.
```mysql
Table departments, columns = [DepartmentId, DepartmentName]
Table students, columns = [DepartmentId, StudentId, StudentName]
위 테이블과 컬럼의 유효한 데이터베이스 스키마를 생성해
```
모델은 다음과 같은 스키마를 생성했습니다:
```mysql
CREATE TABLE departments (
DepartmentId INT PRIMARY KEY,
DepartmentName VARCHAR(50)
);
CREATE TABLE students (
DepartmentId INT,
StudentId INT PRIMARY KEY,
StudentName VARCHAR(50),
FOREIGN KEY (DepartmentId) REFERENCES departments(DepartmentId)
);
```
[sqliteonline.com](https://sqliteonline.com/)에서 임시 데이터베이스를 만들 수 있습니다.
기존에 생성된 쿼리가 유효한지 테스트하려면 더미 데이터도 필요합니다. 이것도 ChatGPT를 써봅시다! 프롬프트는 다음과 같습니다:
```mysql
CREATE TABLE departments (
DepartmentId INT PRIMARY KEY,
DepartmentName VARCHAR(50)
);
CREATE TABLE students (
DepartmentId INT,
StudentId INT PRIMARY KEY,
StudentName VARCHAR(50),
FOREIGN KEY (DepartmentId) REFERENCES departments(DepartmentId)
);
위의 데이터베이스 스키마를 바탕으로 각 테이블에 4개의 로우을 포함하는 유효한 Insert 구문을 생성해.
```
Insert 구문이 포함된 출력은 다음과 같습니다:
```mysql
INSERT INTO departments (DepartmentId, DepartmentName)
VALUES (1, 'Computer Science'), (2, 'Mathematics'), (3, 'Physics'), (4, 'Biology');
INSERT INTO students (DepartmentId, StudentId, StudentName)
VALUES (1, 101, '철수'), (1, 102, '영희'), (2, 201, '민수'), (2, 202, '길동');
```
이제 데이터베이스와 더미 데이터가 있으므로 기존 쿼리를 테스트할 수 있습니다. 더미 데이터를 기반으로 결과는 철수와 영희가 포함된 두 로우여야 합니다.
## 코드 설명
특정 언어로 프로그래밍을 배운다면 모델이 특정한 몇 가지 코드를 설명하도록 유도하는 것이 유용할 수 있습니다. 위에서 생성한 쿼리를 재사용하여 모델에게 설명을 요청해 봅시다.
이전과 동일한 Sysyem Message를 사용한다면 모델에 지시하는 방법에 주의하시기 바랍니다. 예를 들어, 다음 예시를 사용하는 경우 모델은 Python의 코딩 도우미라는 이유로 지시를 거부하는 듯하지만 설명은 제공합니다. 모델은 시스템 메시지를 따르도록 설계되었기 때문에 가끔 지시하는 내용을 생성하지 않는 경우가 있습니다.
*Prompt:*
```mysql
SELECT students.StudentId, students.StudentName
FROM students
INNER JOIN departments
ON students.DepartmentId = departments.DepartmentId
WHERE departments.DepartmentName = 'Computer Science';
위를 SQL 문으로 설명해.
```
*Output:*
```
죄송합니다. Python의 코딩 도우미로서 SQL 코드를 생성할 수 없습니다. 하지만 제공된 SQL 문의 목적을 설명할 수는 있습니다.
이 SQL 문은 `students` 테이블에서 `StudentId` 및 `StudentName` 컬럼을 선택합니다. 여기서 `departments` 테이블의 `DepartmentName` 컬럼은 'Computer Science'와 같습니다. 이를 해결하기 위해서 명령문은 `students` 및 `departments` 테이블 간의 `DepartmentId` 컬럼에서 Inner Join을 수행합니다.
쉽게 말해 컴퓨터공학과에 재학 중인 학생의 이름과 아이디를 뽑는 것입니다.
```
## 코드 수정
해당 페이지는 개발 중에 있습니다.
## 코드 디버깅
해당 페이지는 개발 중에 있습니다.
## 우수 사례
해당 페이지는 개발 중에 있습니다.

View File

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

View File

@ -4,16 +4,16 @@ import { Callout, FileTree } from "nextra-theme-docs";
import { Screenshot } from "components/screenshot"; import { Screenshot } from "components/screenshot";
import PAL from "../../img/pal.png"; 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" /> <Screenshot src={PAL} alt="PAL" />
이미지 출처: [Gao et al., (2022)](https://arxiv.org/abs/2211.10435) 이미지 출처: [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 ```python
import openai import openai
@ -24,69 +24,69 @@ from langchain.llms import OpenAI
from dotenv import load_dotenv from dotenv import load_dotenv
``` ```
우선 몇 가지 설정을 해보겠습니다: 우선 몇 가지를 구성해 보겠습니다.
```python ```python
load_dotenv() load_dotenv()
# API 설정 # API 구성
openai.api_key = os.getenv("OPENAI_API_KEY") openai.api_key = os.getenv("OPENAI_API_KEY")
# LangChain 설정 # LangChain 구성
os.environ["OPENAI_API_KEY"] = os.getenv("OPENAI_API_KEY") os.environ["OPENAI_API_KEY"] = os.getenv("OPENAI_API_KEY")
``` ```
모델 인스턴스를 셋업합니다: 모델 인스턴스를 설정합니다.
```python ```python
llm = OpenAI(model_name='text-davinci-003', temperature=0) llm = OpenAI(model_name='text-davinci-003', temperature=0)
``` ```
설정 프롬프트 + 질문: 프롬프트와 질문을 설정합니다.
```python ```python
question = "오늘은 2023년 2월 27일이야. 나는 정확히 25년전에 태어났어. 내가 태어난 날짜를 MM/DD/YYYY 형식으로 반환해줘" question = "오늘은 2023년 2월 27일이야. 나는 정확히 25년 전에 태어났어. 내가 태어난 날짜를 MM/DD/YYYY 형식으로 알려줘."
DATE_UNDERSTANDING_PROMPT = """ DATE_UNDERSTANDING_PROMPT = """
# Q: 36시간이 지나면 2015년이야. 오늘로부터 일주일 뒤는 며칠인지 MM/DD/YYYY 형식으로 반환해줘. # Q: 2015년까지 36시간 남았어. 오늘로부터 일주일 뒤는 며칠인지 MM/DD/YYYY 형식으로 알려줘.
# 2015년이 되기까지 36시간이 남았다면 오늘은 36시간 전이다. # 2015년이 되기까지 36시간이 남았다면 오늘은 36시간 전이다.
today = datetime(2015, 1, 1) - relativedelta(hours=36) today = datetime(2015, 1, 1) - relativedelta(hours=36)
# 오늘부터 일주일 뒤 # 오늘부터 일주일 뒤
one_week_from_today = today + relativedelta(weeks=1) 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') one_week_from_today.strftime('%m/%d/%Y')
# Q: 2019년의 첫 날은 화요일이고 오늘은 2019년의 첫 번째 월요일이야. 오늘 날짜를 MM/DD/YYY로 반환해줘. # Q: 2019년의 첫 날은 화요일이고 오늘은 2019년의 첫 월요일이야. 오늘 날짜를 MM/DD/YYYY 형식으로 알려줘.
# 2019년의 첫 날이 화요일이고 오늘이 2019년 첫 월요일이라면 오늘은 6일 후입니다. # 2019년의 첫 날이 화요일이고 오늘이 2019년 첫 월요일이라면 오늘은 6일 후다.
today = datetime(2019, 1, 1) + relativedelta(days=6) today = datetime(2019, 1, 1) + relativedelta(days=6)
# %m/%d/%Y 형식으로 포맷팅된 답변은 # 답을 %m/%d/%Y 형식으로 하면
today.strftime('%m/%d/%Y') today.strftime('%m/%d/%Y')
# Q: 콘서트는 1943년 6월 1일에 열리기로 예정되어 있었는데, 하루 연기되어 오늘로 변경됐어. 10일 전 날짜를 MM/DD/YYY 형식으로 반환해줘. # Q: 콘서트는 1943년 6월 1일에 열리기로 예정되어 있었는데, 하루 연기되어 오늘로 변경됐어. 10일 전 날짜를 MM/DD/YYY 형식으로 알려줘.
# 콘서트가 1943년 6월 1일로 예정되어 있었으나 오늘로 하루 연기되었다면, 오늘은 하루가 지난 것입니다. # 콘서트가 1943년 6월 1일로 예정되어 있었으나 오늘로 하루 연기되었다면, 오늘은 하루가 지난 것다.
today = datetime(1943, 6, 1) + relativedelta(days=1) today = datetime(1943, 6, 1) + relativedelta(days=1)
# 열흘 전, # 열흘 전의 날짜는
ten_days_ago = today - relativedelta(days=10) ten_days_ago = today - relativedelta(days=10)
# %m/%d/%Y의 형식으로 반환된 답은 # 답을 %m/%d/%Y의 형식으로 하면
ten_days_ago.strftime('%m/%d/%Y') ten_days_ago.strftime('%m/%d/%Y')
# Q: 오늘은 1969년 4월 19일이야. 24시간 후의 날짜를 MM/DD/YYYY 형식으로 반환해줘. # Q: 오늘은 1969년 4월 19일이야. 24시간 후의 날짜를 MM/DD/YYYY 형식으로 알려줘.
# 오늘의 날짜는 4/19/1969 입니다. # 오늘의 날짜는 1969년 4월 19일이다.
today = datetime(1969, 4, 19) today = datetime(1969, 4, 19)
# 24시간 후, # 24시간 후의 날짜는
later = today + relativedelta(hours=24) later = today + relativedelta(hours=24)
# %m/%d/%Y의 형식으로 반환된 답은 # 답을 %m/%d/%Y의 형식으로 하면
today.strftime('%m/%d/%Y') today.strftime('%m/%d/%Y')
# Q: Jane은 오늘이 2002년 3월 11일이라고 생각했지만 실제로는 3월 12일이고 하루 뒤야. 24시간 후의 날짜를 MM/DD/YYYY 형식으로 반환해줘. # Q: 영희는 오늘이 2002년 3월 11일이라고 생각했지만 실제로는 다음날인 3월 12일이야. 24시간 후의 날짜를 MM/DD/YYYY 형식으로 알려줘.
# 제인은 오늘 날짜를 3/11/2002 라고 생각했고, 사실 오늘은 3월 12일이면 오늘 날짜는 3/12/2002 입니다. # 영희는 오늘 날짜를 2002년 3월 11일이라고 생각했고, 사실 오늘은 3월 12일이면 오늘 날짜는 2002년 3월 12일이다.
today = datetime(2002, 3, 12) today = datetime(2002, 3, 12)
# 24시간 후, # 24시간 후의 날짜는
later = today + relativedelta(hours=24) later = today + relativedelta(hours=24)
# %m/%d/%Y의 형식으로 반환된 답은 # 답을 %m/%d/%Y의 형식으로 하면
later.strftime('%m/%d/%Y') later.strftime('%m/%d/%Y')
# Q: Jane은 2001년 2월 마지막 날 태어났어. 오늘은 Jane의 16번째 생일이야. 어제의 날짜를 MM/DD/YYYY 형식으로 반환해줘. # Q: 영희는 2001년 2월 마지막 날 태어났어. 오늘은 영희의 16번째 생일이야. 어제의 날짜를 MM/DD/YYYY 형식으로 알려줘.
# Jane이 2001년 2월의 마지막 날에 태어났다면 오늘은 16년 후입니다. # 영희가 2001년 2월의 마지막 날에 태어났고 오늘이 영희의 16번째 생일이라면 오늘은 16년 후다.
today = datetime(2001, 2, 28) + relativedelta(years=16) today = datetime(2001, 2, 28) + relativedelta(years=16)
# 어제, # 어제 날짜는
yesterday = today - relativedelta(days=1) yesterday = today - relativedelta(days=1)
# %m/%d/%Y의 형식으로 반환된 답은 # 답을 %m/%d/%Y의 형식으로 하면
yesterday.strftime('%m/%d/%Y') yesterday.strftime('%m/%d/%Y')
# Q: {question} # Q: {question}
""".strip() + '\n' """.strip() + '\n'

View File

@ -1,3 +1,107 @@
# Prompt Function # 프롬프트 함수(Prompt Function)
Needs translation! Feel free to contribute a translation by clicking the `Edit this page` button on the right side. ## 도입
GPT의 대화 인터페이스와 프로그래밍 언어의 쉘(shell)을 유사하게 생각하면 프롬프트(prompt)를 캡슐화(encapsulation) 하는 것은 함수를 생성하는 것으로 생각할 수 있습니다. 이 함수는 고유한 이름을 가지며, 입력 텍스트와 함께 이 이름을 호출하면, 설정된 내부 규칙에 따라 결과를 생성합니다. 간단히 말해, GPT를 쉽게 사용할 수 있도록 이름과 함께 재사용 가능한 프롬프트를 만든다는 것입니다. GPT가 우리 대신 특정 작업을 수행하는 편리한 도구가 되는 것과 같습니다. - 우리는 그냥 입력을 주고, 원하는 결과를 돌려 받는 것입니다.
프롬프트를 함수로 캡슐화하여, 일련의 함수를 만들어 워크플로우(workflow)를 만들 수 있습니다. 각각의 함수는 특정 단계 혹은 작업을 나타내며, 특정 순서로 작업을 결합하면 복잡한 프로세스(process)를 자동화하거나 문제를 보다 효율적으로 해결할 수 있습니다. 이 접근법을 통해 GPT와 보다 체계적이고 간소화된 상호작용이 가능해져, 궁극적으로 GPT의 기능을 향상하고, GPT를 다양한 작업을 수행할 수 있는 강력한 도구로 만듭니다.
함수를 사용하기 전에 GPT에 함수에 대해 알려줘야 합니다. 다음은 함수를 정의하는 프롬프트입니다.
*Prompt:*
> 이 프롬프트를 **메타 프롬프트(meta prompt)** 라고 부릅시다.
이 프롬프트는 GPT 3.5에서 실행되었고, GPT 4에서 더 잘됩니다.
```
안녕 ChatGPT! 그동안 잘 지냈니? 나는 특정 함수를 통해 너의 도움을 받고 싶어. 나는 네가 제공된 지침에 따라 다양한 작업을 수행할 수 있는 기능이 있다고 알고 있어. 내 요청을 알아듣기 쉽도록 함수, 입력 그리고 입력에 대한 지시사항을 설명하는 탬플릿을 쓸거야. 아래 자세한 내용을 확인해.
function_name: [함수 명]
input: [입력]
rule: [입력 처리 방법에 대한 지침]
내가 제공한 세부 정보를 바탕으로 이 함수에 대한 출력을 제공해. 도와주면 좋겠어. 땡큐!
대괄호 안의 텍스트는 내가 수행하고자 하는 기능에 대한 관련 정보로 대체할 거야. 이렇게 자세히 소개하면 내 요청을 더 효율적으로 이해하고 원하는 출력을 제공하는데 도움이 될거야. 형식은 function_name(input) 이며, 이해했으면 ok 한 단어만 출력해.
```
## 예시
### 영어 공부 도우미
예를 들어 영어 공부를 돕기 위해 GPT를 사용한다고 가정해 보겠습니다. 일련의 함수를 만들어 프로세스를 단순화할 수 있습니다.
이 프롬프트는 GPT 3.5에서 실행되었고, GPT 4에서 더 잘됩니다.
#### 함수 설명
위에서 정의한 **메타 프롬프트**를 GPT에 먼저 붙여 넣어야 합니다.
다음으로 우리는 `trans_word`라는 함수를 만들 것입니다.
이 프롬프트 함수는 GPT가 중국어를 영어로 번역하게 만듭니다.
*Prompt:*
```
function_name: [trans_word]
input: ["텍스트"]
rule: [너는 영어 번역가, 맞춤법 교정자이자 언어 개선자야. 내가 어떤 언어로든 "텍스트"를 포함한 입력 양식을 제공하면, 내 텍스트를 영어로 번역해.]
```
텍스트를 확장하는 함수를 작성해 봅니다.
*Prompt:*
```
function_name: [expand_word]
input: ["텍스트"]
rule: [너는 투머치토커인 맞춤법 교정자이자 언어 개선자야. 어떤 언어로든 "텍스트"를 포함한 입력 양식과 원어 출력을 제공할테니 원래 언어로 출력해줘. 의미는 유지하면서 문학적으로 바꿔줘.]
```
거야
텍스트를 교정하는 함수를 작성합니다.
*Prompt:*
```
function_name: [fix_english]
input: ["텍스트"]
rule: [영어 마스터이자 맞춤법 교정자 및 언어 개선자로 일해. "텍스트"를 포함한 입력 양식을 줄거야. 이 입력을 좀 더 자연스럽고 우아한 어휘와 문장을 사용해서 개선해줘. 의미는 유지한 채로.]
```
마지막으로 함수를 독립적으로 실행하거나 함께 연결(chain)할 수 있습니다.
*Prompt:*
```
trans_word('婆罗摩火山处于享有“千岛之国”美称的印度尼西亚. 多岛之国印尼有4500座之多的火山, 世界著名的十大活火山有三座在这里.')
fix_english('Finally, you can run the function independently or chain them together.')
fix_english(expand_word(trans_word('婆罗摩火山处于享有“千岛之国”美称的印度尼西亚. 多岛之国印尼有4500座之多的火山, 世界著名的十大活火山有三座在这里.')))
```
함수를 이 형식으로 표현하면 각 함수의 이름, 입력, 입력을 처리하는 규칙을 명확하게 볼 수 있습니다. 이를 통해 워크플로우의 각 단계의 기능과 목적을 체계적으로 이해할 수 있습니다.
_팁:_
ChatGPT가 과도한 정보를 출력하지 않도록 하려면 함수의 규칙을 정의한 후 아래 문장을 추가하면 됩니다.
```
이해했으면 OK만 출력해
```
### 다중 파라미터(params) 함수
5개의 입력 파라미터를 받아 비밀번호를 생성하는 함수를 만들어 봅시다!
*Prompt:*
```
function_name: [pg]
input: ["길이", "대문자", "소문자", "숫자", "특수문자"]
rule: [너는 안전한 비밀번호를 원하는 개인을 위한 비밀번호 생성기야. "길이", "대문자", "소문자", "숫자", 그리고 "특수문자" 이렇게 5개 입력을 줄거야. 주어진 입력을 사용해 복잡한 비밀번호를 생성해. 설명이나 부가 정보 없이 그냥 생성한 비밀번호만 반환해. 예를 들어 길이 = 8, 대문자 = 1, 소문자 = 5, 숫자 = 2, 특수문자 = 1이 주어지면 출력은 "D5%t9Bgf" 등의 비밀번호가 되는 거야.]
```
```
pg(길이 = 10, 대문자 = 1, 소문자 = 5, 숫자 = 2, 특수문자 = 1)
pg(10,1,5,2,1)
```
### 생각
현재, 다음과 같이 많은 프로젝트 들에서 GPT 프롬프팅을 사용하고 있습니다. 예는 다음과 같습니다.
- [GitHub Copilot](https://github.com/features/copilot)
- [Microsoft AI](https://www.microsoft.com/en-us/ai)
- [chatgpt-plugins](https://openai.com/blog/chatgpt-plugins)
- [LangChain](https://github.com/hwchase17/langchain)
- [marvin](https://github.com/PrefectHQ/marvin)
하지만 이 프로젝트들은 제품의 구매자 혹은 파이썬(Python) 이나 다른 프로그래밍 언어를 작성할 수 있는 사람들을 대상으로 합니다.
일반 유저들은 간단한 탬플릿을 일상에 반복적으로 사용합니다. 노트 애플리케이션을 이용해 함수를 작성하고 라이브러리로 업데이트 할 수도 있습니다.
대체제로 [ChatGPT-Next-Web](https://github.com/Yidadaa/ChatGPT-Next-Web), [chatbox](https://github.com/Bin-Huang/chatbox), [PromptAppGPT](https://github.com/mleoking/PromptAppGPT), 그리고 [ChatGPT-Desktop](https://github.com/lencx/ChatGPT) 등의 몇몇 오픈 소스 ChatGPT 도구를 사용할 수 있습니다. 현재 ChatGPT-Next-Web은 새로운 채팅을 시작하기 전 퓨샷(few-shot)을 더하는 것을 허용합니다. PromptAppGPT는 프롬프트 템플릿을 기반으로 한 웹 애플리케이션을 로우-코드(low-code)로 작성할 수 있게 하여, AutoGPT 비슷한 애플리케이션을 프롬프트 몇 라인으로 만들 수 있도록 합니다.
이러한 도구들을 이용해 함수를 만들고 사용할 수 있습니다.

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 프롬프팅에 비해 상대적으로 낮은 퍼포먼스를 보여주었습니다. - 전문가의 지식이 필요하지 않은 이러한 단순 작업의 경우, 모든 실험에서 퓨샷 생각의 사슬 프롬프팅(Few-shot CoT prompting)이 제로샷 프롬프팅(Zero-shot prompting)에 비해 상대적으로 낮은 성능을 보여주었습니다.
- 프롬프트는 올바른 추론 도출에 엄청난 영향을 미칩니다. 모델에게 직업을 분류하라고 간단하게 명령했을 때에는 65.6의 F1 점수를 얻었으나, 포스트-프롬프트 엔지니어링 모델은 91.7의 F1 점수를 보여주었습니다. - 프롬프트는 올바른 추론 도출에 엄청난 영향을 미칩니다. 모델에게 직업을 분류하라고 단순히 명령했을 때에는 65.6의 F1 점수를 얻었으나, 프롬프트 엔지니어링 모델은 91.7의 F1 점수를 보여주었습니다.
- 모델을 템플릿에 강제로 적용하려 한 모든 경우에 성능이 저하되었습니다. (이 방법은 논문 뒤 쪽의 GPT-4를 사용한 초기 테스트에서 사라졌습니다.) - 모델을 템플릿에 강제로 적용하려 한 모든 경우에 성능이 저하되었습니다(이 현상은 논문 후반의 GPT-4를 사용한 초기 테스트에서 사라졌습니다).
- 아주 작은 수정사항이 성능에 엄청난 영향을 미쳤습니다. - 여러 작은 수정사항이 성능에 엄청난 영향을 미쳤습니다.
- 아래 표에서 모든 수정사항에 따른 결과를 확인하세요. - 아래 표에서 테스트 된 모든 수정 사항을 확인할 수 있습니다.
- 적절한 지시를 내리고, 키 포인트를 반복하는 것이 가장 큰 성능 동력으로 나타났습니다. - 적절한 지시를 내리고 요점을 반복하는 것이 가장 큰 성능 동력으로 나타났습니다.
- 모델에게 (사람)이름을 지어주고 불러주는 것은 F1 점수를 증가시켰습니다. - 단순히 모델에게 (사람) 이름을 지어주는 것으로 F1 점수가 0.6 상승했습니다.
### 실험에 쓰인 프롬프트 수정사항들 ### 테스트 된 프롬프트 수정 사항들
| 약어 | 설명 | | 약어 | 설명 |
| -------- | --------------------------------------------------------------------------------- | | -------- | --------------------------------------------------------------------------------- |
| Baseline | 채용 공고를 제공하고 갓 졸업한 신입에게 적합한지 묻습니다. | | Baseline | 채용 공고를 제공하고 갓 졸업한 사람에게 적합한지 묻습니다. |
| CoT | 쿼리를 날리기 전에 몇 가지 정확한 예시를 제공합니다. | | CoT | 질의를 하기 전에 정확히 분류된 몇 가지 예시를 제공합니다. |
| Zero-CoT | 모델에게 단계별로 추론한 뒤 정답을 제시하도록 요구합니다. | | Zero-CoT | 모델에게 단계별로 추론하여 정답을 제시하도록 요구합니다. |
| rawinst | 역할 및 작업에 대한 지침을 사용자 메시지에 추가하여 제공합니다. | | rawinst | 역할 및 작업에 대한 지시를 사용자 메시지에 추가함으로써 제공합니다. |
| sysinst | 시스템 메시지로서의 역할과 작업에 대한 지침을 제공합니다. | | sysinst | 역할 및 작업에 대한 지시를 시스템 메시지로서 제공합니다. |
| bothinst | 시스템 메시지로서의 역할과 사용자 메시지로서의 작업을 사용하여 명령을 분할합니다. | | bothinst | 시스템 메시지로서의 역할과 사용자 메시지로서의 작업으로 명령을 분할합니다. |
| mock | 토론 내용을 인식하는 부분을 따라하여 작업 지시를 내립니다. | | mock | 그들을 인정하는 의사 토론을 통해 작업 지시를 제공합니다. |
| reit | 주요 요소를 반복하여 지시를 보강합니다. | | reit | 요점을 반복하여 지시를 강화합니다. |
| strict | 모델에게 주어진 템플릿을 엄격히 준수하여 답변하도록 요청합니다. | | strict | 모델에게 주어진 템플릿을 엄격히 준수하여 답변하도록 요청합니다. |
| loose | 주어진 템플릿 뒤에 최종 답변만 반환하도록 요청합니다. | | loose | 최종 답변만 주어진 탬플릿을 준수하여 반환하도록 요청합니다. |
| right | 모델에게 올바른 결론에 도달하도록 요청합니다. | | right | 모델에게 올바른 결론에 도달하도록 요청합니다. |
| info | 일반적인 추론 실패를 해결하기 위한 추가 정보를 제공합니다. | | info | 일반적인 추론 실패를 해결하기 위한 추가 정보를 제공합니다. |
| name | 모델에게 이름을 지어주고 대화 시 사용합니다. | | name | 모델에게 대화에서 부를 이름을 제공합니다. |
| pos | 쿼리를 날리기 전 모델에게 긍정적인 피드백을 제공합니다. | | pos | 질의를 하기 전 모델에게 긍정적인 피드백을 제공합니다. |
### 위의 프롬프트 수정사항이 성능에 미치는 영향
| | 정확도 | 리콜 | F1 | 템플릿 고착도 | ### 프롬프트 수정 사항이 성능에 미치는 영향
| | 정확도 | 재현율 | F1 | 템플릿 고착도 |
| --------------------------------------- | -------- | ------ | -------- | ------------- | | --------------------------------------- | -------- | ------ | -------- | ------------- |
| _Baseline_ | _61.2_ | _70.6_ | _65.6_ | _79%_ | | _Baseline_ | _61.2_ | _70.6_ | _65.6_ | _79%_ |
| _CoT_ | _72.6_ | _85.1_ | _78.4_ | _87%_ | | _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 | 85.7 | 96.8 | 90.9 | 79% |
| +bothinst+mock+reit+right+info+name+pos | **86.9** | **97** | **91.7** | 81% | | +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.