# 프롬프트 함수(Prompt Function)

## 도입
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 비슷한 애플리케이션을 프롬프트 몇 라인으로 만들 수 있도록 합니다. 
이러한 도구들을 이용해 함수를 만들고 사용할 수 있습니다.
