프롬프트 엔지니어링

**프롬프트 엔지니어링**(Prompt Engineering)은 대규모 언어 모델(Large Language Models, LLMs)과 시각-언어 모델(Vision-Language Models, VLMs)의 출력을 최적화하기 위해 입력 프롬프트를 설계하고 구조화하는 기술이다. 모델 파라미터를 수정하지 않고도 특정 작업에 대한 모델의 성능을 향상시키는 것을 목표로 한다.

## 개요
프롬프트는 LLM으로부터 사용자가 원하는 결과를 도출하기 위한 입력으로, AI 모델에게 내리는 지시사항이나 대화 시작의 기초가 된다. 프롬프트 엔지니어링은 생성된 결과물의 품질을 높일 수 있는 프롬프트 입력값들의 최적의 조합을 찾는 작업이다. 이는 자연어 지시사항을 통해 LLM의 동작을 제어하는 방법론으로, 모델 재훈련이나 미세조정 없이도 다양한 작업에서 원하는 출력을 얻을 수 있게 한다.

## 기본 구성 요소
프롬프트는 다음 네 가지 주요 구성 요소로 이루어진다:

# Instruction (지시사항) - System Prompt
#* LLM 모델이 수행해야 할 구체적인 작업에 대한 설명
#* 명확하고 구체적인 행동 지침 포함
# Context (맥락) - RAG의 결과물
#* 모델이 더 나은 답변을 할 수 있도록 제공되는 배경 정보
#* 관련된 예시나 참조 정보 포함
# Input Data (입력 데이터) - 유저 쿼리(유저입력 텍스트)
#* 해결하고자 하는 문제나 질문에 대한 구체적인 데이터
#* 모델이 처리해야 할 실제 내용
# Output Indicator (출력 지시자) - System Prompt
#* 원하는 결과물의 형식이나 구조를 명시
#* 응답의 길이, 형식, 스타일 등을 지정

## 프롬프트 엔지니어링 - 프롬프트 디자인
프롬프트 엔지니어링 중 한 영역인 프롬프트 디자인(Prompt Design)은 대규모 언어 모델의 출력을 제어하기 위한 입력 텍스트를 구조화하고 작성하는 과정이다. 이는 다음과 같은 요소들을 포함한다:

### 주요 구성 요소

* 프롬프트 구조화
* 맥락 설정
* 지시사항 명시
* 예시 제공
* 출력 형식 지정

### 고려 사항

* 명확성과 구체성
* 편향성 회피
* 모델의 제약사항 이해
* 사용 목적에 따른 맞춤화

## 프롬프트 엔지니어링 - 최적화
프롬프트 엔지니어링 중 한 영역인 프롬프트 최적화(Prompt Optimization)는 프롬프트의 성능을 개선하고 원하는 결과를 더 효과적으로 얻기 위한 체계적인 접근 방식이다. 다음과 같은 과정을 포함한다:

### 최적화 방법

* 성능 메트릭 정의
* 반복적 테스트
* 결과 분석
* 프롬프트 수정
* 검증 및 평가

### 주요 목표

* 응답 정확도 향상
* 일관성 개선
* 환각 현상 감소
* 계산 효율성 증대

## 프롬프트의 종류

### 사용자 프롬프트(User Prompt)

* 특정 작업이나 쿼리에 대한 구체적이고 동적인 지시사항
* 각 상호작용마다 변경되는 "what"에 해당하는 부분
* 명확한 목표와 원하는 출력 형식을 포함
* 예시:
** 데이터 분석 요청
** 콘텐츠 생성 지시
** 특정 질문에 대한 답변 요청

### 시스템 프롬프트(System Prompt)

* AI의 전반적인 행동과 응답 방식을 정의하는 기본 지침
* 일관된 "how"와 "why"를 설정하는 프레임워크
* 역할, 톤, 윤리적 가이드라인 등을 포함
* 예시:
** 전문가적 태도 유지 지침
** 윤리적 경계 설정
** 브랜드 톤앤보이스 가이드라인

## 프롬프트 엔지니어링의 역사

### 2018년: NLP 통합 접근법의 시작

* 2018년 연구진은 자연어처리(NLP)의 모든 개별 작업을 맥락 기반 질의응답 형태로 통합할 수 있다는 혁신적인 제안을 했다. 이들은 감정 분석, 번역, 일반 상식 질문 등 다양한 작업을 수행할 수 있는 최초의 다목적 통합 모델을 개발했다.

### 2021년: T0 모델의 등장

* 2021년에는 12개의 NLP 작업(62개 데이터셋 포함)을 처리하는 생성형 사전학습 모델 T0가 개발되었다. T0는 구조화된 프롬프트를 활용해 새로운 작업에서도 뛰어난 성능을 보였으며, 단일 작업 특화 모델의 성능을 넘어섰다.

### 2022년: 프롬프트 기술의 확장

* 2월: 170여 개의 데이터셋에 대한 2,000개 이상의 프롬프트가 공개 저장소를 통해 공유됨
* 구글 연구진이 '사고의 사슬(Chain-of-Thought)' 기법을 발표

### 2023년: 멀티모달 프롬프트의 발전

* 텍스트 기반 프롬프트와 이미지-텍스트 프롬프트 데이터베이스가 공개되며 프롬프트 엔지니어링이 멀티모달 영역으로 확장됨

## 프롬프트와 프롬프팅의 차이

### 프롬프트

* AI 모델에 제공되는 입력 텍스트
* 질문, 지시문, 문맥 정보 등을 포함
* AI 모델의 응답 방향을 결정하는 역할

### 프롬프팅

* 프롬프트를 활용한 AI 모델과의 전체 상호작용 과정
* 프롬프트 입력부터 응답 생성까지의 전체 흐름
* 반복적인 대화와 피드백을 포함

## 프롬프트 엔지니어링의 발전 단계

### 1기: 기초 확립기 ( ~ 2022 )

* Zero-shot과 Few-shot 학습 등을 활용한 프롬프트 엔지니어링 -> 높은 효율성
* "Let's think step by step"과 같은 단계적 사고 유도 기법 등장
* Chain-of-Thought(CoT) 추론의 기초가 확립됨
* 주요 특징: 상세한 설명과 중간 과정을 포함한 프롬프트 설계 강조

### 2기: 체계화 시기 ( ~ 2023 )

* Chain-of-Thought 프롬프팅의 고도화
* 자동화된 프롬프트 최적화 기법 등장
* 인간 수준의 프롬프트 엔지니어링 능력 달성
* 주요 특징: 구조화된 프롬프트 포맷의 중요성 부각

### 3기: 원칙 기반 시기( ~ 현재 )

* "less is more" 원칙 확립 - 간결하고 명확한 지시 선호
* 복잡한 작업의 모듈화 강조
* 새로운 프롬프트 최적화 전략 도입:
** 마음을 읽으려 하지 않고 명시적인 지시에 집중
** 텍스트 참조를 통한 환각 현상 감소
** 복잡한 작업의 하위 작업 분할
** 모델에게 "생각할 시간" 제공
** 외부 도구와의 통합 강화
** 체계적인 성능 테스트 도입
* 주요 패러다임 전환:
** 과거의 'step by step' 접근법에서 벗어나 더 자연스러운 지시 방식 채택
** 불필요한 공손성이나 감정적 조작 배제
** 구체적이고 직접적인 지시 선호
** 모듈식 접근방식 강조
* 성능 최적화를 위한 새로운 강조점:
** 참조 텍스트 기반 답변 생성
** 외부 도구 활용 (임베딩 기반 검색, 코드 실행 등)
** 체계적인 테스트와 평가

## 주요 기법

### 구조와 명확성

* 대상 청중 명시적 지정
* 긍정적인 지시문 사용
* 프롬프트 구성요소 간 명확한 구분

### 구체성과 정보

* few-shot 예시 제공
* 편향을 피하기 위한 명시적 지시
* 구체적인 출력 형식 지정

### 복잡한 작업 처리

* 작업을 단순한 하위 작업으로 분해
* 단계별 추론 유도
* 검증 단계 포함

## 프롬프트 종류별 작성 전략

### 유저 프롬프트 작성 전략
# 명확성과 구체성
#* 상세한 맥락 제공
#* 명확한 목표 정의
#* 원하는 출력 형식 지정
# 복잡한 작업 처리
#* 작업을 작은 단위로 분해
#* 단계별 지침 제공
#* 우선순위 지정 요청
# 데이터와 제약사항
#* 관련 데이터나 예시 포함
#* 필요한 제약사항 명시
#* 중요 지표나 KPI 지정

### 시스템 프롬프트 작성 전략

# 역할과 맥락 설정
#* AI의 역할 명확히 정의
#* 비즈니스 환경과 맥락 제공
#* 전문성 수준 설정
# 커뮤니케이션 가이드라인
#* 톤과 스타일 정의
#* 전문용어 사용 지침
#* 브랜드 일관성 유지
# 윤리와 규정 준수
#* 법적/윤리적 가이드라인 설정
#* 데이터 처리 프로토콜
#* 민감 정보 취급 지침

## 프롬프트 엔지니어링과 프롬프트 템플릿의 관계
프롬프트 엔지니어링(Prompt Engineering)과 프롬프트 템플릿(Prompt Template)은 모두 대규모 언어 모델(Large Language Models, LLMs)을 효과적으로 활용하기 위한 방법이다. 프롬프트 엔지니어링이 전체적인 설계 방법론이라면, 프롬프트 템플릿은 이를 실현하기 위한 구체적인 구현 도구로 볼 수 있다.

### 개요
프롬프트 엔지니어링은 AI 언어 모델에서 원하는 출력을 얻기 위해 입력(프롬프트)을 최적화하는 과정을 의미한다. 이 과정에서 프롬프트 템플릿은 재사용 가능하고 구조화된 프롬프트를 생성하기 위한 프레임워크 역할을 한다.

### 관계성

* 프롬프트 엔지니어링은 전략적 방법론을 제시
* 프롬프트 템플릿은 이를 실제로 구현하는 도구를 제공
* 템플릿은 엔지니어링 과정에서 도출된 최적의 프롬프트 구조를 재사용 가능한 형태로 표준화

### 확장성

* 프롬프트 엔지니어링이 제시하는 다양한 기법(Few-shot learning, Chain of Thought 등)을 템플릿 형태로 구조화
* 템플릿을 통해 엔지니어링된 프롬프트의 재현성과 일관성 확보

### 효율성

* 프롬프트 엔지니어링의 결과물을 템플릿화하여 반복 작업 최소화
* 최적화된 프롬프트 패턴의 재사용을 통한 개발 효율성 향상

## 프롬프트 체인

* 프롬프트 체인 : 하나의 복잡한 작업을 여러 개의 작은 단계로 분해하여 처리하는 프롬프팅 기법
* 각 단계의 출력이 다음 단계의 입력으로 연결되는 연쇄적 구조
* 대규모 프롬프트 대신 작은 단위의 프롬프트들을 연결하여 더 나은 결과 도출

## 프롬프트 압축

* 프롬프트 압축 : 하나의 복잡한 작업을 여러 개의 작은 단계로 분해하여 처리하는 프롬프팅 기법
* 각 단계의 출력이 다음 단계의 입력으로 연결되는 연쇄적 구조
* 대규모 프롬프트 대신 작은 단위의 프롬프트들을 연결하여 더 나은 결과 도출

## 프롬프트 템플릿(Prompt Template) - LangChain 기반

### 1. 기본 개념

* 프롬프트: 모델에 대한 입력을 의미
* 프롬프트 템플릿: 고정된 부분과 가변적인 부분으로 구성된 프롬프트 구조
* 목적: 사용자가 매번 전체 프롬프트를 작성하지 않고 필요한 부분만 입력하도록 함

### 2. 프롬프트 템플릿 종류

* 기본 프롬프트 템플릿: 일반적인 GPT 모델용
* 챗 프롬프트 템플릿: 챗봇 형태의 대화형 모델용
** 시스템 메시지 프롬프트
** AI 메시지 프롬프트
** 휴먼 메시지 프롬프트

### 3. Few-shot 예제 활용하는 법

#### ''개념''

* 딥러닝 모델이 결과물을 출력할 때 예시를 미리 제시하여 원하는 방향으로 결과 유도
* 특수하거나 구조화된 답변이 필요할 때 유용

#### ''Example Selector 기능''

* 동적으로 Few-shot 학습 수행
* 사용자 입력에 따라 적절한 예시를 선택
* SemanticSimilarityExampleSelector: 입력과 가장 유사한 예시 선택
* 불필요한 예시를 제외하여 프롬프트 길이 최적화

### 4. 출력값 조정을 위한 Output Parser

#### ''기능''

* 출력된 형태를 원하는 포맷으로 고정
* 리스트, JSON 등 다양한 형태로 변환 가능

#### ''예시(CommaSeparatedListOutputParser)''

* 콤마로 구분된 리스트 형태로 출력 변환
* 기본 instruction 포함
* 서비스 개발 시 데이터 처리 용이

### 5. 실습

#### ''기본 설정''

* LangChain과 OpenAI 라이브러리 설치
* API 키 설정
* 모델 설정 (GPT-3 Davinci-003, temperature=0 등)

##### ''실제 구현''

* 프롬프트 템플릿 생성 및 변수 설정
* Few-shot 예제 구성
* Example Selector 구현
* Output Parser 적용

## 기타 - LLM에게 공손하게(예의있게) 부탁하는게 좋은가?
Should we respect LLMs (2024.02) 연구를 보면, 공손함의 효과에 대해 아래와 같이 설명하고 있다.

### 공손함의 효과:

* 프롬프트에서 "공손함의 레벨"이 LLM의 성능에 영향을 미친다는 결과
* 영어, 중국어, 일본어 등 여러 언어에서 공손한 표현이 영향을 미침
* 무례한 프롬프트는 낮은 성능을 초래할 수 있음

### 주목할 만한 점:

* 지나치게 예의 바른 언어가 반드시 더 나은 결과를 보장하지는 않는다
* 성능 향상이 일관적이지 않음

### 성능이 향상된 진짜이유 :

* "그 이유는 공손한 표현 자체의 효과가 아니라 그 표현들이 대화에서 '요청사항을 더 명확하게 구분'하고

대화의 '흐름 전환을 표시'하는 역할을 하기 때문"

예)

* "부탁드립니다" → 여기서 요청이 시작된다는 것을 명확히 표시
* "감사합니다. 다음으로는..." → 한 주제가 끝나고 다른 주제로 넘어간다는 전환점 표시

## 효과성
연구에 따르면 체계적인 프롬프트 엔지니어링을 적용했을 때, GPT-4에서 응답 품질이 평균 57.7%, 정확도가 36.4% 향상되었다. 특히 모델의 규모가 클수록 프롬프트 엔지니어링의 효과가 더 크게 나타나며, LLaMA-2-7B에서 GPT-4로 갈수록 성능 향상 폭이 20% 이상 증가하는 것으로 나타났다. 효과적인 프롬프트 엔지니어링은 모델의 출력 품질을 크게 향상시키고, 특정 작업에 대한 성능을 최적화하는 데 핵심적인 역할을 한다.

## 각주
* Sahoo, P., Singh, A. K., Saha, S., Jain, V., Mondal, S., & Chadha, A. (2024). A Systematic Survey of Prompt Engineering in Large Language Models: Techniques and Applications.

* Zhou, Y., Muresanu, A. I., Han, Z., Paster, K., Pitis, S., Chan, H., & Ba, J. (2023). Large Language Models are Human-Level Prompt Engineers. Published as a conference paper at ICLR 2023.

* Bsharat, S. M., Myrzakhan, A., & Shen, Z. (2024). Principled Instructions Are All You Need for Questioning LLaMA-1/2, GPT-3.5/4.

* OpenAI. (2024). Prompt engineering: Enhance results with prompt engineering strategies. ( Link : https://platform.openai.com/docs/guides/prompt-engineering )

* AWS. (2024). What is Prompt Engineering?( Link: https://aws.amazon.com/ko/what-is/prompt-engineering/)

분류:인공지능
분류:딥 러닝
분류:기계 학습
분류:자연어 처리
분류:비지도 학습
분류:언어학
분류:2022년 신조어
분류:생성형 인공지능