본문 바로가기

AI

효과적인 프롬프트 엔지니어링 (기초) : 프롬프트 구성요소와 효과적인 프롬프트 구조

이번 글은 프롬프트를 작성할 때 기본적으로 이해하면 좋을 기초 내용으로 프롬프트의 구성요소, 프롬프트의 구조에 대해서 예제와 함께 소개하고 있습니다.

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

ChatGPT 프롬프트 입력 창

  프롬프트 엔지니어링(Prompt Engineering)은 AI 모델 (LLM, Large Language Model)이 내가 원하는 답변을 출력할 수 있도록 프롬프트를 효과적으로 설계하고 최적화하는 기술을 말합니다. 여기서 프롬프트(Prompt)는 AI에게 주어지는 입력 문장을 말합니다. 쉽게 말해, 우리가 ChatGPT에게 물어볼 때 입력하는 문장과 질문들이라고 보면 됩니다. 단순하게 내가 모르는 부분에 대해서 질문만 입력할 수 있지만, '개조식으로 말해줘', '영어로 말해줘'와 같이 특정 지시도 함께 전달할 수 있는데요. 이런 모든 입력문을 프롬프트라고 말할 수 있습니다. 
프롬프트 엔지니어링이 중요한 이유는 Fine-tuning 없이 프롬프트 엔지니어링만으로도 텍스트 요약 및 분류, 질의응답, 코드 생성 등 특정 Task 수행이 가능하고, 프롬프트에 따라 답변 퀄리티가 확연히 달라지기 때문입니다. 그래서 전문적으로 프롬프트 엔지니어링을 다루는 프롬프트 엔지니어라는 직업도 생겨났으며, 해외에서 시간당 40달러, 28~37만 달러의 높은 연봉으로 고용되고 있습니다. 한국에서도 AI 스타트업 뤼튼테크놀로지스에서 최대 1억 원의 연봉을 제시하며 프롬프트 엔지니어를 공개 채용하기도 했습니다. 또한 프롬프트를 사고파는 프롬프트 베이스(Prompt Base)와 같은 마켓플레이스도 등장했다고 하니 프롬프트를 잘 작성하는 게 매우 중요하면서도 쉬운 일이 아니라는 걸 알 수 있습니다. 

Prompt Base 사이트

2. 두 가지 프롬프트 형태 : 정적 프롬프트, 동적 프롬프트

프롬프트의 형태는 크게 정적 프롬프트와 동적 프롬프트로 나뉩니다. 일반적인 문제를 구조화하고 명확히할 때 사용할 때는 정적 콘텐츠를, 검색을 통해 사용자의 특정 문제의 세부 정보를 전달해야 할 때는 동적 콘텐츠를 사용해 프롬프트를 구성하게 됩니다. 

  • 콘텐츠 : 프롬프트 내부에서 사용되는 정보, 즉, 프롬프트를 구성하는 텍스트, 지시문, 질문을 의미 
  • 정적 콘텐츠: 문제 정의와 지시를 제공하는 고정 텍스트
  • 동적 콘텐츠: 특정 상황이나 맥락에 맞는 세부 정보를 제공하는 가변적 텍스트

2.1 정적 프롬프트 

정적 프롬프트는 항상 동일하게 유지되는 고정된 내용의 지시문을 말합니다. LLM에게 어떻게 작업을 해야 할 지 명확하게 설명하거나 예시를 들어 질문을 작성하는 것이 정적 프롬프트에 해당합니다. 예를 들어 Bing의 Sydney라는 챗봇은 "시드니는 대화가 시작될 때 "This is Bing"이라고 자기소개를 합니다."라고 지시문을 작성하여 항상 챗봇을 시작할 때 "This is Bing"시작하게 만들었습니다.  

명확한 지시를 내리는 '명시적 지시'와 예시로 설명하는 '암묵적 지시'

정적 프롬프트는 명시적 지시(Explicit Clarification)와 암묵적 지시(Implicit Clarification) 두 가지 유형이 있습니다. 명시적 지시직접적인 설명을 통해 답변 형식을 제한하는 것을 말합니다. 암묵적 지시몇 가지 예시를 통해 AI가 패턴을 학습하도록 유도하는 방법으로 Few-Shot Prompting이라고도 말합니다. 

  • 명시적 지시 예시
마크다운을 사용하세요. 
하이퍼링크를 사용하지 마세요. 
영어로 답변하세요. 
  • 암묵적 지시 (Few-shot Prompting) 예시
책 리뷰에 대한 점수를 매겨주세요.  
예)
트렌드 코리아 : 5점
함께 자라기 :  3점
데미안 : 2점
어린왕자 : 1점

Few-Shot Prompting 의 주의사항

Few-shot Prompting의 효과는 "Language Models are Few-shot Learners" 논문에서 증명되었으며, 위에 예시처럼 몇 가지 예로 프롬프트를 구성하게 되면 점수가 1~5점 사이구나, 출력할 때 단순히 "5"라고 정수만 출력하는 것이 아니라 "5점"이라고 답변해야겠구나 등을 학습하게 됩니다. 하지만 Few-shot Prompting을 작성할 때 주의해야 할 몇 가지 사항이 있습니다.
(1) 컨텍스트 길이 증가
예시로 인해 컨텍스트 길이(모델이 입력 받을 수 있는, 처리할 수 있는 길이)가 길어져 모델의 처리 범위를 넘길 수 있습니다. 컨텍스트에 담기는 예시의 개수를 너무 많이 작성하는 것을 지양하고, 출력 형식을 설명할 때만 적절하게 사용해야 합니다.
(2) 예시에 의존한 예측 편향
예시가 불완전하거나 어떤 답변 형식에 치우쳐져 있으면 모델이 예시에 작성된 내용과 유사하게만 답변할 수 있습니다. 예를 들어, 책 리뷰에서 예시 점수를 4, 5점만 주게 되면 해당 모델은 리뷰 점수를 엄청 후하게 주는 모델이 되게 되고, 점수를 1, 2점 위주로 주게 되면 점수를 적게 주는 모델이 되게 됩니다. 특정 평점 분포가 제시되면 모델은 그 분포를 따르려고 하기 때문에 예시를 선택할 때에는 대표적인 샘플을 사용하고 엣지 케이스를 포함하는 것이 좋습니다. 

(3) 잘못된 패턴 학습
예시에서 특정 패턴(예: 오름차순이나 내림차순)이 반복되면 모델은 이를 그대로 학습하고 적용할 수 있습니다. 아래 예시는 같은 질문과 예시지만 오름차순과 내림차순으로 예시가 구성되어 다르게 답변하는 경우를 보여줍니다. 이처럼 원래 의도한 바가 아니지만 예시에 내포된 다른 패턴을 찾아 학습할 수 있으므로 주의가 필요합니다. 

Few-shot Prompting 잘못된 패턴 학습 예

명시적 지시 vs. 암묵적 지시 

Few-Shot Prompt의 주의사항을 살펴보았지만, 그래도 명시적인 지시보다 암묵적인 지시가 보통 더 효과적이기 때문에 프롬프트를 작성할 때에는 예시를 같이 작성하는 것이 좋습니다. 책 리뷰 점수에 대한 답변을 출력하기 위해 명시적으로 프롬프트를 작성을 한다면 '책 리뷰에 대한 점수를 1~5점 사이의 점수로 표현해서 알려줘' 이렇게 작성할 수 있습니다. 반면, 책 제목과 책에 해당하는 점수를 같이 예시로 작성하면 점수의 답변 형식도 고려해서 출력할 수 있고, 점수의 패턴을 기반으로 내가 의도한 페르소나를 모방하게 하여 매운맛 리뷰어, 순한맛 리뷰어를 만들 수가 있습니다. 

2.2 동적 프롬프트 

동적 프롬프트는 사용자의 상황이나 요구에 따라 실시간으로 수집되는 동적 콘텐츠를 활용해 사용자의 맥락에 맞춰 맞춤형 질문을 작성하는 것을 말합니다. 예를 들어, 정적 프롬프트는 "책을 추천해줘."라고 작성하지만 동적 프롬프트는 "마지막으로 읽은 ‘{최근 읽은 책}’과 유사한 책을 추천해줘."라고 작성하여 최근 읽은 책을 검색해서 찾아 사용자 맞춤형으로 추천하게 됩니다.  

Retrieval-Augmented Generation (RAG)

동적 콘텐츠의 주요 수집 방식은 검색기반증강(RAG) 입니다. RAG는 사용자 질문에 답변하기 전 사용자 요청과 관련한 정보를 검색해 컨텍스트에 추가하는 기법으로, 학습 데이터에 없는 최신 정보나 외부 데이터를 활용할 수 있어 최신 내용으로 보다 정확하게 답변할 수 있습니다. RAG를 사용할 때에도 두 가지 주의사항이 있습니다. 하나는 검색에 사용되는 데이터의 품질 이슈로, 검색 시 부적절한 정보를 포함하게 되면 답변도 그에 맞춰 잘못된 응답할 수 있기 때문에 RAG에 사용되는 데이터의 품질 관리가 중요합니다. 두번째는 RAG가 검색을 통해 관련 정보도 같이 context에 넣어 응답할 수 있게 하는 기법이기 때문에, Context의 길이가 길어지게 된다는 것입니다. 이를 해결하기 위해 RAG 문서를 적절한 크기로 자르는 것과 요약을 통해 참고하는 내용을 압축하는 방법을 사용할 수 있습니다.

계층적 요약

LLM(대형 언어 모델)은 입력할 수 있는 최대 토큰 수(컨텍스트 윈도우 크기)가 제한되어 있습니다. 그래서 책이나 논문, 코드베이스와 같이 많은 정보를 담고 있는 문서는 모두 반영해 답변할 수 없기 때문에 문서의 계층적 요약을 통해 효율적으로 답변할 수 있습니다. 

계층적 요약 예시

계층적 요약 과정은 다음과 같습니다.

계층적 요약 프로세스

 
긴 텍스트를 효과적으로 처리하기 위해서는 컨텍스트 윈도우 크기를 고려하여 적절한 단위로 분할하는 것이 중요합니다. 이를 위해 문서를 장, 절, 섹션과 같은 논리적인 단위로 나눈 뒤, 각 부분을 개별적으로 요약합니다. 예를 들어, 논문의 경우 서론, 방법론, 결과 등의 각 섹션을 따로 요약하는 방식입니다. 이후, 생성된 요약 리스트를 하나로 모아 다시 한 번 종합적인 요약을 수행합니다. 만약 여전히 길이가 길다면, 이 과정을 재귀적으로 반복하여 최종적으로 원하는 길이의 요약을 도출해냅니다. 예를 들어, 100페이지짜리 논문이라면 먼저 10페이지로 요약한 후, 이를 다시 2페이지, 1문단 단위로 축약하는 방식으로 점진적인 요약이 가능합니다. 이와 같은 과정으로 계층적 요약을 수행하면 방대한 정보 속에서도 전체 흐름은 유지한 채, 중요한 내용을 효율적으로 정리하고 활용할 수 있습니다.
 

3. 효과적인 프롬프트 구조

LLM(대형 언어 모델)을 활용할 때, 프롬프트는 모델의 출력을 결정하는 중요한 요소입니다. 동일한 정보라도 프롬프트의 구성 방식에 따라 답변의 질과 정확도가 달라질 수 있습니다. 특히, 긴 프롬프트를 사용할 경우 모델의 기억과 처리 방식에 따라 정보가 왜곡될 수 있기 때문에 효과적인 구조가 필요합니다.

효과적인 프롬프트 구조

3.1 도입부 (Introduction)

프롬프트의 도입부는 전체 내용의 주제와 목적을 설정하는 역할을 합니다. 도입부의 지시문은 모델이 자신이 답변해야 할 답변 유형을 이해하고 나머지 콘텐츠에 해당 유형에 맞춰 올바르게 접근할 수 있도록 방향성을 제시하여 전체 프롬프트의 일관성을 유지시킵니다.

(도입부) 이것은 책 추천에 관한 것입니다. 독자의 관심사와 최근 읽은 책을 기반으로 인기있는 책을 추천해주세요. 

이러한 도입부를 포함하면 모델이 책 추천과 관련된 문맥 안에서 답변을 생성하도록 유도할 수 있습니다.

3.2  중간 부분   - Valley of Meh 현상 주의

프롬프트의 중간 부분에는 다양한 컨텍스트를 포함합니다. 해당 부분에서 주의해야 할 점은 중간 정보의 영향을 상대적으로 덜 받는  Valley of Meh 구간이 존재한다는 것입니다. 이 구간은 아래 연구에서 입증된 것처럼 중간 부분의 프롬프트가 상대적으로 정보를 처리하는데 비효율적이기 때문에 필연적으로 발생하게 됩니다.

  • In-context learning (2023) : 프롬프트의 끝 부분에 가까울수록 모델에 미치는 영향이 커 모델이 정보를 더 잘 반영한다고 보고함.
  • The lost middle phenomenon (2023) : 모델이 프롬프트의 시작과 끝을 쉽게 기억하지만, 중간 정보는 제대로 반영하지 못하는 현상이 발생한다고 분석함.

“Valley of Meh”에 대해 완벽한 해결책은 없지만 핵심적인 정보를 앞, 뒤에 배치하고 프롬프트를 가능한 간결하게 유지하여 모델이 핵심 내용에 집중하도록 유도함으로써 해당 현상의 영향을 줄일 수 있습니다.

3.3. 재집중(Refocus) - 샌드위치 기법

긴 프롬프트를 사용할 때, 모델이 핵심 목표를 잊어버리는 경우가 많습니다. 이를 방지하기 위해 재집중(refocus) 구문을 삽입하는 ‘샌드위치 기법’을 활용할 수 있습니다. 프롬프트 중간에 모델의 목적을 다시 강조함으로써 핵심 내용을 상기시켜 모델이 산만해지는 것을 방지하고 일관된 출력을 유도합니다.

(도입부) 독자의 관심사와 최근 읽은 책을 기반으로 인기있는 책을 추천해주세요. 

(중간 요소) 최근에 ‘1984’와 ‘브레이브 뉴 월드’를 읽었으며, 디스토피아 장르를 선호합니다.

(재집중) 중요한 점은 ‘최근 읽은 책을 기반으로 베스트셀러’를 추천하는 것입니다. 이 점을 기억해주세요.

위와 같이 ‘기억하세요’ 또는 ‘다시 강조하면’ 등의 구문을 사용하면, 모델이 더욱 정확한 답변을 제공할 가능성이 높아집니다.

3.4 전환부(Transition) 

전환부는 문제 설명에서 문제 해결로 전환하는 부분으로 프롬프트의 마지막 부분에서 모델이 실행해야 할 구체적인 행동을 명확하게 지시합니다. 이를 통해 모델이 적절한 방식으로 출력을 생성하도록 유도할 수 있습니다. 질문을 명확히 정의하고 출력 형식을 지정하여  모델이 사용자의 의도를 명확히 이해하고 정확한 정보를 출력할 수 있도록 합니다.

(도입부) 독자의 관심사와 최근 읽은 책을 기반으로 인기있는 책을 추천해주세요. 

(중간 요소) 최근에 ‘1984’와 ‘브레이브 뉴 월드’를 읽었으며, 디스토피아 장르를 선호합니다.

(재집중) 중요한 점은 ‘최근 읽은 책을 기반으로 베스트셀러’를 추천하는 것입니다. 이 점을 기억해주세요.

(전환부) 따라서, 3권의 책을 추천하고, 각 책의 주요 특징을 한 문장으로 요약해주세요.

 

4. 프롬프트 설계 전략

지금까지 프롬프트의 구성요소인 정적 콘텐츠와 동적 콘텐츠를 활용해 프롬프트를 구성하는 방법과 효과적인 프롬프트 구조에 대해서 살펴보았습니다. 해당 내용을 기반으로 최적화된 프롬프트 설계 전략을 정리해보겠습니다. 
1. 동적 콘텐츠 활용 

  • RAG를 이용해 최신 정보와 정확한 정보 제공
  • 계층적 요약: 긴 텍스트를 분할 → 요약 → 통합

2. 효과적인 구조 설계

  1. (도입부) 목적과 역할 명확히 정의하기
  2. (중간 부분) 중간 요소를 간결하게 유지하고, 핵심 정보를 앞뒤에 배치하기
  3. (Refocus) 샌드위치 기법을 활용하여 재집중(refocus) 시켜 중요한 내용을 다시 강조하기
  4. (Transition) 전환부에서 명확한 질문과 기대하는 출력 형식을 제시하기

3. 콘텐츠의 우선순위와 의존성에 따라 콘텐츠 추가 및 제거  

  • 유용성, 관련성, 최신성 기준으로 콘텐츠의 중요도 평가
  • 시간 순서나 전제 조건 등 콘텐츠 간의 의존성을 고려하여 콘텐츠 배치   
  • 프롬프트 길이에 맞춰 콘텐츠 중요도에 따라 적절한 필터링

참고자료