brunch

You can make anything
by writing

C.S.Lewis

by 기획하는 족제비 Nov 30. 2023

닭갈비와 볶음밥으로 이해하는
프롬프트 엔지니어링

다양한 프롬프트 엔지니어링 기법

다양한 프롬프트 엔지니어링 기법

인트로

올해는 생성형 AI의 시대다. 전 세계를 막론하고 2023년에는 챗 GPT를 필두로 생성형 AI들이 빠르게 상용화되며 현실에 적용되고 있다. 이 때문에 직업과 산업에 지각변동이 일어나고 있으며, 생성형 AI를 잘 사용하기 위한 컨텐츠들이 쏟아져 나오고 있다.


이번 글은 그중에서도 내가 생성형 AI를 잘 사용하기 위해 조사하고, 공부한 것들을 소개할 예정이다. 목적은 지식 아카이빙과 공유다. 모르고 사용할 때와 알고 사용할 때의 차이가 분명히 있는 만큼, 필요한 사람들에게 도움이 되었으면 하는 바람이다.




닭갈비와 볶음밥으로 이해하는

프롬프트 엔지니어링

프롬프트는 특정 작업을 수행하도록 생성형 AI에게 요청하는 자연어로 이루어진 텍스트를 의미한다. 대화를 위한 질문의 대상이 생성형 AI로 옮겨간 것뿐이다.


그렇다면 프롬프트 엔지니어링은 뭘까? 프롬프트 엔지니어링은 대규모 언어 모델(Large Language Model, LLM)에서 원하는 결과를 얻기 위해 프롬프트를 공들여 만들고 최적화하는 과정을 의미한다. 대규모 언어 모델이 적용된 생성형 AI에서 내가 해결해야 하는 것 혹은 궁금한 것에 대해서 '내가 원하는 답변'을 받는 것이 어렵기 때문이다.


이는 사람과 대화를 하는 과정을 생각해 보면 이해하기 쉽다. 사람과 대화할 때 질문은 단순히 텍스트로만 구성되어 있는 것이 아니다. 우리의 질문은 다양한 맥락과 상황이 전제로 깔려있다는 것을 간과해서는 안된다.


예를 들어, 친구와 저녁으로 닭갈비를 먹었다고 가정해 보자. 그리고 그 집은 닭갈비를 먹은 후에 후식으로 먹는 볶음밥이 아주 맛있다고 소문난 집이다. 그리고 우리는 방금 닭갈비를 다 먹었고, 나는 내심 볶음밥이 먹고 싶다고 생각한다. 친구의 의사를 넌지시 떠보기 위해 "야, 배불러?"라고 묻는다. 이를 들은 친구는 눈치를 채고 대답한다. "볶음밥 먹을까?". 그 대답을 통해 나는 친구도 볶음밥을 먹는 것에 긍정적이라는 것을 확인했다. 그리고 볶음밥을 얼마나 많이 주문해야 할지 정하기 위해 한 번 더 질문한다. "야, 배 많이 불러?". 친구는 대답한다. "2개 먹어도 될 것 같은데." 그래서 나는 볶음밥을 2개 주문한다.


사실 저 질문을 이루는 단어 자체는 큰 의미를 가지지 않는다. '배불러?'에 대해서 즉답을 하면, '배불러' 혹은 '배부르지 않아'와 같은 대답이 오히려 자연스럽다. 하지만 저 질문을 하게 된 상황(맥락)이 있기 때문에 비로소 질문의 의도에 알맞은 대답을 할 수 있는 것이다. 


하지만 거대 언어 모델 기반의 생성형 AI와 대화할 때 AI는 우리와 같은 상황을 공유하고 있지 않다. 그래서 질문을 '이해할 수 있을' 정도의 풍부한 배경 설명(맥락)과 의도가 질문과 함께 전달되어야 한다.


그래서 우리는 대화를 잘하기 위한 기법을 정리하고, 학습하고, 공유하곤 한다. 이는 생성형 AI의 생태계도 마찬가지다. 여기도 현실과 동일하게 (생성형 AI와) 대화를 더 잘하기 위한 기법들이 존재한다.



다양한 프롬프트 엔지니어링 기법을 알아보자

1. 프롬프트의 기본 구성 요소

생성형 AI가 프롬프트를 이해하기 위해서 기본적으로 갖추는 것을 권장하는 형태가 있다. 보통 프롬프트를 제작할 때 구성하는 요소로는 1) 모델이 수행하기를 원하는 지침이나 작업을 의미하는 Instruction, 2) 답변을 위한 맥락(외부 정보 등)을 의미하는 Context, 3) 답을 얻기 원하는 데이터 Input data, 4) 나아가 출력 형식, 예시 등을 의미하는 Output data를 말할 수 있다.

[프롬프트 예시: 제품 리뷰 글쓰기]
#제약 조건(Instruction)
- '해요체'를 사용해서 친근감이 느껴지도록 글을 써줘
- 인사를 하면서 글을 시작해 줘
- 글 마지막에 "제품 체험단을 통해 제공받은 제품이지만 제 솔직한 후기입니다." 문장을 넣어줘

#배경(Context)
- 너는 이제부터 [제품명] 리뷰를 적는 '제품 체험 블로그를 운영하는 블로거'야
- 한국 [타깃층]의 취향을 고려해서 블로그 글을 써줘
- 글 중간중간에 [제품 설명]을 추가해 줘
- 제약 조건을 지켜서 내용을 작성해 줘

#입력문(Input data)
- [제품명]: 1977 힘찬 드라이기
- [타깃층]: 30, 40대 여성
- [제품 설명]: 제품 체험단을 통해 제공받은 ~~

#출력 형식(Output data)
- 마크다운


▼ 결과

기본 프롬프트 결과 ⓒ 327roy


2. Zero-shot

이 방식은 언어 모델에게 특정 작업에 대해 사전에 학습된 예시를 제공하지 않고 작업을 수행하게 하는 방법이다. Zero-shot 기법은 언어 모델에게 직접적인 예시를 제공하지 않는다는 것이 특징인데, 이 때문에 작업을 수행하도록 지시하는 프롬프트가 명확하고, 직관적일수록 좋다. Zero-shot 기법은 우리들이 사용하기에 가장 덜 귀찮고, 모델의 성능만 좋다면 효율성을 챙길 수 있다.

[Zero-shot 기법 예시]
"이 화장품을 쓰고 피부가 다 뒤집어졌어요."라는 리뷰는 긍정적인 리뷰야 혹은 부정적인 리뷰야?


3. Few-shot

일반적인 대화를 기준으로 이해하면 편하다. 상대방에게 단편적인 설명을 했을 때 상대방이 알아듣지 못한다면? 우리는 이해를 돕기 위해 예시를 들어가며 부 설명을 한다.


마찬가지로 Zero-shot 기법으로 작성한 프롬프트가 실패하는 경우, 우리는 프롬프트에 예시를 추가하여 모델의 성능을 향상하는 방법을 고려할 수 있다.


쉽게 말해 모델이 작업을 이해하고 수행하는 데 도움이 되는 몇 가지 예시(표본)를 함께 제공하는 방법을 Few-shot기법이라고 한다. 따라서 Few-shot 기법을 사용할 때는 작업에 대한 설명과 함께 예시를 포함하는 프롬프트를 작성하고 원하는 질문을 한다.

[Few-shot 기법 예시]
다음과 같이 문장을 부정형으로 바꿔줘:
  - Positive: 'The cat is sleeping.'
  - Negative: 'The cat is not sleeping.'
  - Positive: 'He was very happy.'
  - Negative: [여기에 답을 작성해 줘]


4. Chain-of-Thought (CoT)

번역하면 '생각의 사슬'이다. 'Chain-of-Thought Prompting Elicits Reasoning in Large Language Models'라는 논문으로 개제 되었는데, 프롬프트에 질문의 인과관계를 잘 풀어서 설명하면 보다 원하는 것에 근접한 결과를 얻을 수 있다는 내용이다. (논문을 다 읽지는 읺았다.)


프롬프트를 작성할 때 그 과정을 단계별로 설명하도록 하는 방법으로써  문제를 해결하는데 필요한 논리적 단계를 사전에 학습시키는 형태라고도 말할 수 있다. 이를 통해 모델의 답변이 더 투명하고 이해하기 쉬워진다는 장점이 있다. 보통 복잡한 추론이 필요한 문제에서 최적의 결정을 내릴 필요가 있을 때 유용한 기법이다.


예를 들면 수학 문제, 특정 시나리오에 대한 대응 등이 있다. 복잡한 수학 문제를 해결해야 할 때 CoT 기법을 사용해서 질문하면 모델이 각 계산 단계를 설명하고, 왜 그런 계산을 했는지, 그리고 최종적으로 어떻게 답을 도출했는지를 단계별로 설명하는 것을 확인할 수 있다.


모델이 단순히 정답을 제시하는 것이 아니라 논리의 과정을 풀어서 설명하기 때문에 질문한 사람에게도 교육적으로 좋은 방법이라고 할 수 있다. (프롬프트에 'Step-by-step' 정도의 문장을 추가하는 것으로도 비슷한 교육 효과를 누릴 수 있다.)

CoT 기법 예시 ⓒ Wei et al. (2022)


5. Zero-shot CoT

CoT 이후에 나온 아이디어 중 하나로 Zero-shot 기법에 CoT를 접목한 것이 있다. 기존의 프롬프트에 단계별로 생각하는 과정을 추가하는 것이다.


Zero-shot CoT 기법 예시 ⓒ Kojima et al. (2022)

아래는 예시 사진이다. '단계별로 생각해 달라는 것'이 핵심 키워드다. GPT가 정확한 답변을 줬다. 굿.

Zero-shot CoT 예시 프롬프트 결과 ⓒ 327roy


6. 그 외..

위에서 적은 5가지 외에도 Self-Consistency(자기 일관성)을 유지하거나, 신중하고 반복적인 추론 과정을 통해 문제를 해결해 나가는 Tree of Thoughts(ToT) 등 다양한 프롬프트 연구가 발제되며 실험되고 있다.


각 기법별로 정석적으로 사용하기에 좋은 환경이 존재하지만, 일반적으로는 기본 구성요소만 잘 챙겨서 프롬프트를 활용해도 충분할 것이라고 생각한다.


거대 언어 모델, 생성형 AI와 더 정확하고 효율적인 대화를 위한 프롬프트는 아직까지 계속 연구 중이고, 논의가 되고 있는 영역이다. 아는 이쪽 영역의 대표님은 일본 쪽에 있는 연구원들과 관련 논의를 한다는데, 그쪽은 그쪽대로 분위기가 재밌다고 한다. 각 나라마다 문장의 구성요소나 배치 순서에 차이가 있는 만큼, 모델과 소통하는 방식 또한 나라마다 어느 정도 특성을 가질 수 있는 듯하다.




그래서?

일단 나는 현재 사내에서 진행 중인 개인 프로젝트에 있어서 프롬프트를 만들 때 주로 Few-shot 기법을 사용하고 있다. 프로젝트 특성상 영문으로 프롬프트를 작성할 수 없고 국문으로만 작성해야 하는 상황인데, 한 번에 많은 예시를 말해줘야 하는 상황이어서 어떻게 더 잘 알아듣게 프롬프트를 만들 수 있을지가 당면한 과제다.


프롬프트 엔지니어링 기법에 대해서 자료를 찾아보고, 학습하고, 테스트하면서 느낀 것은 결국 사람이 대화하는 방식이 기계화 대화하는 방식이 되기 위한 과정들이 정형화되고 있다는 것이다. 수학적 사고를 하는 기계에게 인간의 대화 방식을 알려준다는 느낌도 든다.


소통기술을 갈고닦는 것의 장점이 비단 사람에게만 한정되는 것이 아닌 세상이 오고 있다고 생각한다. 우리는 본인의 생각을 잘 구조화하고, 잘 질문할 수 있는 능력을 키울 필요가 있다.




레퍼런스

https://www.promptingguide.ai/

https://aws.amazon.com/ko/what-is/prompt-engineering/

https://modulabs.co.kr/blog/prompt-engineering/

https://learnprompting.org/ko/docs/basics/formalizing

http://cloudinsight.net/ai/%EA%B1%B0%EB%8C%80-%EB%AA%A8%EB%8D%B8%EC%9D%98-%EB%B0%9C%EC%A0%84%EA%B3%BC-zero-shot%EC%9D%98-%EC%9D%98%EB%AF%B8/


ⓒ 327ro

브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari