프롬프트 엔지니어링 기법 (1)

2024. 1. 7. 15:35GenerativeAI

 프롬프트 엔지니어링은 최근 대형언어모델(이하 LLM)의 등장과 함께 주목받고 있는 분야로 언어모델로부터 원하는 결과를 효율적으로 얻기 위해 프롬프트를 설계하고 최적화하는 기술입니다. 사용자는 모델을 추가 학습시키지 않고, 프롬프트 엔지니어링을 통해 보다 나은 결과물을 얻을 수 있습니다. 

 

 이번 포스팅에서는 다양한 프롬프트 엔지니어링 기법들 중에 기본적인 몇 가지 기법들에 대해 정리해보겠습니다.

 

 


1. 제로샷 프롬프팅 (Zero-Shot Prompting)

 

  제로샷 프롬프팅은 언어 모델이 특정 작업에 대해 훈련되지 않았음에도 단순 프롬프트를 통해 새로운 작업을 수행하고 문제를 해결할 수 있는 능력을 말합니다. 특정 작업에 필요한 데이터나 설명을 덧붙이지 않고, 프롬프트에 의해 제시된 지침을 따라 작업을 할 수 있는 능력을 의미합니다. 

 

  예를 들어,

[Prompt]

인공지능 기술의 발전에 기여한 핵심인물은?
[Output] by ChatGPT 3.5

인공지능 기술의 발전에 기여한 핵심 인물로는 여러 명이 있습니다. 하지만 그 중에서도 가장 주목받는 몇몇 인물을 소개해드리겠습니다.

1. Geoffrey Hinton: 딥러닝 및 신경망 분야에서 혁신적인 연구를 통해 엄청난 기여를 했습니다. 역전파(backpropagation) 알고리즘과 Boltzmann Machine 등을 개발하여 신경망 연구를 선도해왔습니다.
2. Yoshua Bengio: 심층 신경망과 딥러닝 분야의 선도적인 인물 중 한 명으로, 장기 기억을 위한 장단기 메모리(Long Short-Term Memory, LSTM) 네트워크 등을 개발하여 기여했습니다.
3. Yann LeCun: 합성곱 신경망(Convolutional Neural Network, CNN) 개발에 큰 역할을 하였으며, 컴퓨터 비전 분야에서의 딥러닝 발전을 이끌어 왔습니다.
4. Andrew Ng: 기계 학습과 딥러닝 교육의 중요성을 강조하며, Coursera와 같은 플랫폼을 통해 수많은 사람들에게 기계 학습과 딥러닝을 가르치고 있습니다.

이들은 인공지능 분야의 발전을 이끄는 핵심적인 인물들 중 일부입니다. 그 외에도 더 많은 연구자와 개발자들이 이 분야에 기여하고 있습니다.

 

  이 예시는 ChatGPT로부터 생성하였습니다. 일반적인 제로샷 프롬프트의 예시/답변들과 비교하면 ChatGPT는 간단한 질문에도 다양한 정보를 포함하여 친절하게 답변하려는 특징을 보입니다.

 

2. 퓨샷 프롬프팅 (Few-Shot Prompting)

 

  LLM 모델은 대부분의 제로샷 프롬프팅에 대해서도 좋은 성능을 보이지만, 그렇지 못한 경우 프롬프트의 개선을 통해 해결할 수 있습니다. 퓨샷 프롬프팅은 수행할 작업에 대한 예시를 작성해 줌으로써 힌트를 주는 방법입니다. 

 

  예를 들어, 

[Prompt]

"whatpu"는 탄자니아에 서식하는 작은 털복숭이 동물입니다.
whatpu라는 단어를 사용하는 문장의 예입니다:
우리는 아프리카를 여행하고 있었는데 아주 귀여운 whatpu를 보았습니다.

"farduddle"을 한다는 것은 정말 빠르게 위아래로 점프한다는 뜻입니다.
farduddle을 사용하는 문장의 예입니다:
[Output] by ChatGPT 3.5

"whatpu"와 "farduddle"을 사용하는 예시 문장을 작성하겠습니다.
1. "whatpu"를 사용하는 문장 예시:
아프리카 여행 중, 우리는 아주 귀여운 whatpu를 보았어요. 그 작은 털복숭이는 나무 위에서 장난을 쳐 하고 있었답니다.
2. "farduddle"을 사용하는 문장 예시:
새들이 높은 나무 위에서 farduddle하는 모습을 보면 정말 빠른 속도로 날아다닌다고 느꼈어요.

 

  위의 예시는 특정 문자열에 의미를 부여하고, 해당 문자열을 활용한 문장을 만드는 작업입니다. 먼저 예시를 보여주고, 작업을 요청했을 때, 잘 작동하는 것을 볼 수 있습니다.

 

3. Chain of Thought (CoT) Prompting

 

  생각의 사슬(이하 CoT) 프롬프트는 Wei et al.(2022)에서 소개된 개념으로 중간 추론 단계를 프롬프트에 작성함으로써 복잡한 추론을 가능하게 합니다. 지금의 ChatGPT는 이전 버전에 비해 CoT를 활용한 답변을 많이 하고 있습니다.

 

  예를 들어, 아래와 같은 질문에 이전에는 "사과 11개" 라는 답변을 주었다면, 지금의 ChatGPT-3.5의 경우 아래와 같은 답변을 생성해줍니다.

 [Prompt]

나는 시장에 가서 사과 10개를 샀어. 사과 2개를 이웃에게 주고, 2개를 수리공에게 주었어. 그리고 사과 5개를 더 사서 1개는 내가 먹었어. 나는 몇 개의 사과를 가지고 있었니?
[Output] by ChatGPT-3.5

시작할 때 당신은 10개의 사과를 가지고 있었습니다. 이후 2개를 이웃에게, 2개를 수리공에게 주었으므로, 10 - 2 - 2 = 6개의 사과가 남았습니다. 그리고 추가로 5개의 사과를 더 사서 6 + 5 = 11개의 사과를 가지게 됩니다.

 

  하지만, ChatGPT는 수학 문제를 못 푸는 경향이 있는데요. 언어모델의 특성상 다음에 올 확률이 높은 텍스트를 생성하는데 초점이 맞춰지다 보니 답을 수학적으로 계산하기 보다는 그럴듯한 답을 생성하려는 특성이 강한거 같습니다.

  따라서 다음과 같이 CoT를 활용해서 프롬프트를 작성해주는 것이 도움이 됩니다.

[Prompt]

Q: 나는 20살이고 내 동생은 5년이 지나면 내 나이의 2/5가 될거야. 내동생의 현재 나이는 얼마지?
A: 나는 지금 20살이고 5년이 지나면 25살이 된다. 동생은 내 나이의 2/5가 될 것이므로 25의 2/5를 구하면 10살이 된다. 5년 후에 10살이 될 것이므로 동생의 현재 나이는 5살이다.

Q: 나는 10살이고 내동생은 5년이 지나면 내 나이의 4/5가 될거야. 내동생의 현재 나이는 얼마지?
A:

CoT 답변 예시 (by ChatGPT-3.5)

 

   이렇게 계산 흐름을 프롬프트에 작성해 줄 수도 있지만 "Step by step." (단계별로 생각해보자) 라는 문구를 추가하는 것만으로도 동일한 수준의 결과물을 얻을 수 있다고 합니다. 이러한 방식을 Zero-shot CoT 프롬프팅이라고 부릅니다.

Kojima et al.(2022), Figure 1

 

4. Tree of Thought (ToT) Prompting

 

  생각의 나무(이하 ToT) 개념이 나온 배경으로는 언어 모델은 답변을 생성하는 과정에서 중간에 잘못된 것 같아도 다시 되돌아 갈 수 없다고 합니다. 그래서 여러가지 결과를 생성해보고 그 결과 중에 가장 많이 나온 결과를 채택하는 머신러닝의 방식을 프롬프팅에도 도입하는 것입니다. 

 

  어떤 추론 문제에 대해 다음과 같은 방식으로 프롬프트를 작성할 수 있습니다.

세 명의 다른 전문가들이 이 질문에 답하고 있다고 상상해보도록 해. 모든 전문가들은 자신의 생각의 한 단계를 적어내고, 그것을 그룹과 공유할거야. 그런 다음 모든 전문가들은 다음 단계로 넘어가. 만약 어떤 전문가가 어떤 시점에서든 자신이 틀렸다는 것을 깨닫게 되면 그들은 떠나. 그렇다면 질문은...
1단계: 영수는 거실에 있습니다.
2단계: 그는 컵을 들고 부엌으로 걸어갑니다.
3단계: 그는 컵 안에 공을 넣고, 컵을 들고 침실로 갑니다.
4단계: 그는 정원에 컵을 내려놓고, 차고로 걸어갑니다.
그렇다면 공은 어디에 있을까요?

 

  하지만 의도한 결과는 1단계에서 3명의 전문가가 의견을 작성하고 공유를 통해 평가하고, 2단계에서 또 의견을 작성하고 서로 평가하는 방식으로 최종 답변을 도출하기를 바랬는데 프롬프트가 생각대로 작동하지는 않았습니다. 

 


 

  이번 글에서는 기본적인 프롬프트 엔지니어링 기법 중 4가지인 Zero-Shot, Few-Shot, CoT, ToT 의 개념과 예제에 대해 살펴보았습니다. 각 예제는 참고의 블로그 및 책을 참고하였습니다. 실제 ChatGPT 를 이용해서 답변을 작성해보았을 때 예시와 같은 답변이 나오지 않는 경우도 많았습니다. ChatGPT 가 단점을 보완하면서 버전을 업그레이드함에 따라 자연스럽게 해결된 부분도 있는 것 같습니다. 하지만 언급한 프롬프팅 방법들은 공통적으로 사람의 인지, 추론 방식을 모방하여 부족한 부분을 해결하려 했습니다. 이는 이후에 나온 프롬프팅 방법에도 동일하게 적용되는 부분인것 같습니다.

 

5. 참고

[1] https://www.promptingguide.ai/kr

[2] https://github.com/dave1010/tree-of-thought-prompting

[3] 챗GPT 개발자 핸드북 (주한나 지음)