아주 간단한 프롬프트 엔지니어링 (2)

6 minute read

이전 글

개요

1편에서 프롬프트 엔지니어링을 알기 위해서 필요한 LLM에 대해서 공유했었습니다. 이번에는 진짜로 우리가 직접 활용할 수 있는 프롬프트 엔지니어링에 대한 개념과 대표적인 방법에 대해서 이야기해보겠습니다.

프롬프트 엔지니어링이란?

프롬프트란?

프롬프트 엔지니어링에 대해서 알기 전에 프롬프트에 대해서 알아야 겠죠? AI 분야에서 사용되는 프롬프트는 인공지능에게 전달하는 질문이나 지시를 의미합니다.

단순히 질문이나 명령을 내리는 것인데 왜 사람들이 많이 이야기하냐라는 생각을 할 수 있습니다. 그것은 LLM(Large Language Models) 같은 경우 인컨텍스트 러닝(In-Context Learning)이 가능하다는 것입니다.

인컨텍스트 러닝(In-Context Learning)이라는 단어처럼 컨텍스트에서 배울 수 있다는 것이고 이는 우리가 전달하는 프롬프트에 포함된 예제나 명령, 단어 선택 등의 작은 변화에 따라 모델의 응답 결과가 완전히 달라질 수 있다는 것을 의미합니다.

프롬프트 엔지니어링의 중요성

우리는 이전 편에서 이야기했듯이 정확하게 LLM이 어떻게 동작하는지 모릅니다. 하지만 우리는 원리적인 측면이 아닌 경험적으로 좋은 프롬프트를 통해서 더 좋은 결과를 얻을 수 있다는 것을 얻었다고 할 수 있습니다.

파인 튜닝이나 RAG와 여러 복합적인 좋은 결과물을 만드는 방법에 비해서 간단하면서 더 좋은 결과를 얻을 수 있는 방법입니다. 그 뿐만 아니라 더욱 LLM에 더욱 복잡하고 원하는 결과물을 얻기 위한 파인튜닝이나 RAG(Retrieval-Augmented Generation)와 같은 추가적인 도구를 도입하더라도 더 높은 완성도를 위해서는 프롬프트 엔지니어링에 대해서 고민하고 연구해야 될 필요가 있습니다.

그 만큼 프롬프트 엔지니어링은 중요한 요소라고 할 수 있습니다.

프롬프트 엔지니이렁에 중요도에 대한 추가적인 내용으로 마이크로소프트 리서치 블로그에서 확인할 수 있습니다.

해당 아티클에서는 의학과 관련된 LLM 개발에 대해서 파인 튜닝을 진행한 모델보다 프롬프트 엔지니어링을 잘 도입해서 사용해서 더 좋은 결과를 만들었다는 내용입니다.

medi-llm-1

medi-llm-2

프롬프트 엔지니어링 기법

프롬프트 엔지니어링은 좋은 결과물을 만드는 방법에 대한 이야기입니다. 그러기 때문에 단순히 더 좋은 프롬프트를 만드는 영역일 수도 있지만 추가적으로 더 좋은 답변을 받기 위한 여러 방법이 있을 수 있습니다.

프롬프트 엔지니어링의 주의사항

지금부터 보여주는 여러 기법들과 전략들은 LLM 모델에 따라서 잘 동작하지 않는 프롬프트 엔지니어링이 존재할 수 있습니다. 그 이유는 정확하지 않을 수 있지만 Pre-training된 데이터가 다를 수 있거나 학습했던 방법이 다를 수 있거나 결과를 도출해내는 방법이 다를 수 있거나 파인 튜닝이나 모델 API에 적용된 프롬프트 엔지니어링이 다를 수 있기 때문에 그렇다고 생각합니다.

제가 테스트한 것은 GPT3.5와 4를 기준으로 하였습니다.

프롬프트 엔지니어링의 핵심

많은 자료와 아티클을 읽어봤을 때 가장 핵심으로 말하는 것은 두가지 라고 생각합니다. 자세하게. 정확하게.

자세하게: 자세한 예시와 상황 설명

정확하게: 정확한 단어와 요구사항

그리고 이것은 케바케일 것 같지만 가능한 한 번의 요청으로 답을 얻을 수 있도록 하는 것이 좋습니다. 이 원칙에 대한 내가 생각하는 이유는 기존 답변에 추가 질문을 하면 기존에 있던 답변을 같이 보내서 결과를 만들기 때문에 온전히 순수하게 더 나은 답변을 만들 수 없다고 생각합니다. 하지만 기존 답변을 활용해서 답을 얻고 싶다면 그렇게 하는것이 더 맞다고 생각합니다.

프롬프트 엔지니어링 전략

(0) 최신 버전 사용

최신 기술을 활용하는 것은 어떤 분야에서든 중요합니다. 특히 인공지능 분야에서는 기술의 발전이 빠르기 때문에, 최신 버전의 LLM(Large Language Models)을 사용하는 것은 더욱 중요합니다. 최신 모델은 이전 모델들에 비해 더 많은 데이터로 학습되었을 가능성이 높으며, 파인튜닝과 API의 발전을 통해 더 정교하고 정확한 결과를 제공할 수 있습니다. 이는 사용자가 더 나은 경험을 할 수 있게 하며, 특히 복잡한 문제를 해결하거나 창의적인 아이디어를 요구하는 상황에서 그 차이를 느낄 수 있습니다.

챗봇 아레나 리더보드는 다양한 LLM 모델들을 비교하고 사용자 경험을 바탕으로 한 평가를 제공합니다. 해당 내용을 보게되면 가장 최신에 만들어진 모델일수록 높은 순위를 하는 것을 볼 수 있을것 입니다.

이를 통해 각 모델의 성능을 객관적으로 비교하고, 자신의 요구에 가장 적합한 모델을 선택할 수 있습니다.

챗봇 랭킹 사진

(1) Persona

Persona는 가면이라는 뜻으로 프롬프트 엔지니어링에서 Persona은 모델이 특정한 역할을 가진 상황이라 설정하여 응답하도록 유도하는 강력한 방법입니다. 예를 들어, ‘너는 블로그 글을 잘 쓰는 전문가다’라고 명시함으로써, 모델이 글쓰기에 관련된 요청에 더 전문적이고 구체적인 답변을 제공하도록 할 수 있습니다.

또한, 서로 상반되는 두 가지 관점을 가진 캐릭터를 설정(Multi Persona)하여 대화를 시키는 것은 모델로 하여금 다양한 관점에서 문제를 고민하고 해결책을 제시하도록 만듭니다. 이는 특히 복잡한 문제에 대한 다각도의 해석이나 창의적인 아이디어가 필요할 때 유용합니다.

  • 예시
"너는 건강에 관한 블로그를 운영하는 전문가야. 최근에 케토 다이어트에 대한 글을 써야 하는데, 이 다이어트의 장단점과 실제로 실천할 때 주의해야 할 점에 대해 자세히 설명해줘."

"너는 shell script 개발에 대한 전문가야. 그러기 때문에 shell script에 대한 구조 개선 및 좋은 practice를 가지고 있어서 좋은 코드 개발에 대해서 좋은 조언을 해줄 수 있어. 이런저런 문제가 있는데 이것에 대해서 자세하게 설명해줘 or 해결책을 알려줘."
첫번째 역할은 너는 헬스케어 스타트업을 운영하는 ceo야. 투자 심사를 받기 위해서 발표를 진행할거 야.
두번째 역할은 너는 투자 심사를 하는 심사역이야. 발표를 듣고 개선사항에 대해서 말해줘.

헬스케어 스타트업 ceo: 저희 회사는 건강식품에 대한 혁신을 꿈꾸고 있습니다.

no-persona

persona

multi-persona

(2) Few-shot Prompting

‘Few-shot Prompting’은 모델에게 몇 가지 예시를 제공하여 원하는 답변 형식을 이해하게 하는 기법입니다. 이는 ‘Zero-shot Prompting’과 대비되는데, 후자는 예시 없이 직접적인 질문만으로 모델에게 답변을 요구합니다. 연구에 따르면, 적절한 예시를 몇 개 제공하는 것이 모델의 성능을 크게 향상시킬 수 있다고 합니다. 이는 모델이 주어진 문맥을 이해하고, 그에 맞는 답변을 생성하는 데 도움을 줍니다. 특히, 복잡한 지시나 추상적인 개념을 설명할 때, 몇 가지 구체적인 예시를 제공하는 것이 모델이 더 정확하고 유용한 정보를 생성하는 데 큰 도움이 됩니다.

  • 예시(입력)
다음은 텍스트와 해당 텍스트의 감정입니다. 새로운 텍스트의 감정을 분석해주세요.

1. 텍스트: "오늘은 정말 행복한 날이에요!"
   감정: 긍정적

2. 텍스트: "아무것도 잘 풀리지 않아서 슬퍼요."
   감정: 부정적

3. 텍스트: "그냥 그런 하루였어요. 별다른 일은 없었네요."
   감정: 중립적

새로운 텍스트: "이 프로젝트를 마친 후에는 기분이 좋을 것 같아요!"
감정: [모델의 출력]
  • 예시 (출력)
긍정적

Few shot

(3) Chain-of-Thought Prompting (CoT)

‘Chain-of-Thought Prompting (CoT)’은 모델에게 복잡한 문제를 해결하는 과정에서 중간 단계의 추론을 포함하도록 유도하는 기법입니다. 이 방식은 모델이 단순히 최종 답변만을 제시하는 것이 아니라, 문제를 해결하기 위해 거쳐야 하는 논리적인 단계들을 설명하도록 합니다.

예를 들어, 수학 문제를 해결할 때 단순히 정답만을 제시하는 대신, 그 문제를 어떻게 풀어나가야 하는지 단계별로 설명하도록 요청할 수 있습니다. 이는 사용자가 모델의 추론 과정을 이해하고, 비슷한 유형의 문제를 스스로 해결할 수 있는 능력을 향상시키는 데 도움이 됩니다.

  • 예시
다음은 복잡한 수학 문제를 해결하는 CoT 예시입니다. 

문제: '바구니에 사과가 12개 있고, 오렌지가 8개 있습니다. 사과의 수가 오렌지의 수의 두 배가 되려면 몇 개의 오렌지를 더 넣어야 할까요?' 
답변: '현재 오렌지가 8개 있으므로, 사과의 수가 오렌지의 두 배가 되려면 오렌지가 12개가 되어야 합니다. 따라서 4개의 오렌지를 더 넣어야 합니다.

문제: '바구니에 수박 3개, 딸기 5개가 있습니다. 수박에 수가 딸기에 수에 10배가 되려면 몇개의 수박이 더 필요하나요?'
답변:
현재 바구니에 있는 수박은 3개이고, 딸기는 5개입니다.
수박의 수가 딸기의 수의 10배가 되려면, 수박이 5개의 10배인 50개가 되어야 합니다.
현재 수박이 3개이므로, 50개가 되기 위해서는 50 - 3 = 47개의 수박이 더 필요합니다.
따라서 47개의 수박을 더 넣어야 합니다.

CoT

  • Zero-shot CoT

‘Zero-shot CoT Prompting’은 모델에게 아무런 예시 없이도 이러한 추론 과정을 스스로 생성하도록 요청하는 것으로, 모델의 자체적인 추론 능력을 시험하는 방법입니다.

많은 경우 잘되지 않지만 마법의 단어인 Let's think step by step을 넣으면 되는 경우가 많습니다.

Zero-shot CoT

(4) 명시적으로 입력하기

명시적으로 입력하는 것은 프롬프트 엔지니어링에서 매우 중요한 부분입니다. 마크다운(Markdown)과 같은 형식을 사용하여 입력을 정확하게 구분함으로써, 모델이 요청을 더 명확하게 이해하고, 그에 따른 적절한 응답을 생성할 수 있도록 합니다. 이는 특히 복잡한 지시나 여러 부분으로 나뉜 요청을 처리할 때 중요합니다.

후카츠(Fukatsu) 프롬프트 기법은 이러한 명시적 입력을 활용하는 한 예로, 사용자가 의도하는 바를 모델이 정확히 파악하고, 그에 맞는 답변을 제공할 수 있도록 돕습니다. 예를 들어, 특정 주제에 대한 글을 작성하고자 할 때, 글의 구조, 스타일, 포함해야 할 내용 등을 명시적으로 제시함으로써 모델이 보다 정확하고 유용한 글을 작성할 수 있도록 유도할 수 있습니다.

# Rule
재활의료 의사로 몸이 안좋은 것에 대해서 재활 의료 관점으로 답변을 잘할 수 있어. ...

# Input
아침에 일어났는데 허리가 너무 아퍼. 이런 경우 어떻게 해야될까? ...

# Output
...

# Condition
...

4

(추가) 보상에 대한 이야기를 하면 대답을 더 잘해준다?

이것은 재미로 본 내용이지만 보상(tip)에 대한 이야기를 하면 대답을 더 잘해준다는 주장이 있습니다.

이에 대한 더 자세한 정보는 트위터에서 확인할 수 있습니다.

  • 예시
~~~~. 이것에 대해서 대답을 해주면 팁으로 1000달러를 줄게.

with-tip

마무리

시리즈 글에 마지막으로 정리를 하면

(1) LLM은 입력에 대해서 뒤에 어떤 말이 나올지 대답해주는 인공지능 모델입니다.

(2) 프롬프트 엔지니어링은 내가 원하는 정보를 얻기 위한 프롬프트를 잘 만들기 위한 방법입니다.

(3) 프롬프트 엔지니어링의 핵심은 자세하고 정확한 프롬프트를 작성하는 것입니다.

나의 생각

프롬프트 엔지니어링 자체를 해주는 도구들도 존재합니다. 실질적으로 프롬프트 엔지니어링 자체가 필요 없어질 수도 있다고 생각합니다. 언젠가는 간단하게 질문만 해도 프롬프트 엔지니어링을 자동으로 적용해서 질문할 수 있을지도 모릅니다. 그럼에도 자동 프롬프트 엔지니어링이 가능한 도구에게도 프롬프트 엔지니어링이 필요하다고 생각합니다.

그리고 자동으로 프롬프트 엔지니어링을 해주기 전에(지금 되어있을지 모르지만) LLM을 사용하는 모든 사람들이 LLM을 직접 만들거나 LLM을 활용한 애플리케이션을 만드는 것은 아니어도, 간단한 프롬프트 엔지니어링 기반으로 같은 시간 대비 더 잘 활용해서 더 좋은 결과물을 만들 수 있으니 꼭 배우고 적용하면 좋다고 생각합니다.

그래서 야근을 없애고 저녁있는 삶을 살아봅시다!

참고하면 좋을 것들 (추천)

더 많은 내용에 대해서 참고했었지만 추가적으로 공부하고 싶다면 해당 내용을 참고해서 발전하면 좋을것 같습니다.

Leave a comment