Prompt Engineering
프롬프트 엔지니어링은 재학습 없이 AI 모델의 출력을 유도하도록 지시사항, 컨텍스트 및 예제를 설계하는 작업으로, LLM부터 비전까지 다룹니다.
프롬프트 엔지니어링은 생성형 모델의 입력을 설계하는 작업으로, 모델이 생성하는 결과를 유도하기 위해 지침, 컨텍스트, 예시, 요청된 출력 형식을 구성하며 모델 가중치는 변경하지 않습니다. 이 분야는 GPT-3를 계기로 주목받았습니다. OpenAI는 언어 모델은 퓨샷 학습자(2020)에서 프롬프트가 작업을 설명하고 몇 가지 예시를 제공하면 1,750억 개의 파라미터를 가진 모델이 그래디언트 업데이트 없이도 새로운 작업을 수행할 수 있음을 보였습니다. 논문에서는 이 능력을 인컨텍스트 학습이라고 부릅니다. 오늘날 프롬프트는 대규모 언어 모델(LLM), 비전-언어 모델(VLM), 텍스트-이미지 생성기 및 프롬프트 가능한 비전 모델을 제어하는 주요 수단입니다.
핵심 기법#
- 지침과 역할: 시스템 프롬프트는 모델의 역할, 규칙, 대상을 설정하며, 제목이나 XML 형식 태그와 같은 구분 기호는 지침과 처리할 데이터를 분리합니다.
- 퓨샷 예시: 입력과 출력의 예시 쌍은 설명보다 작업과 답변 형식을 더 정확하게 보여줍니다. 예시가 없는 프롬프트는 제로샷입니다.
- 출력 형식: 프롬프트에서 목록이나 지정된 키가 있는 JSON과 같은 형식을 명시합니다. 코드에서 결과를 파싱해야 하는 경우, 구조화된 출력은 요청에 의존하지 않고 디코딩 과정에서 스키마를 적용합니다.
- 연쇄 사고 프롬프팅: 답변 전에 중간 추론 단계를 요청하여 여러 단계로 이루어진 문제의 정확도를 높입니다.
- 프롬프트 체이닝: 복잡한 작업을 각각 하나의 간결한 작업을 수행하는 여러 프롬프트로 나누고 코드로 연결합니다.
- 검색된 컨텍스트: 모델이 기억에 의존하지 않고 제공된 사실을 바탕으로 답하도록 검색으로 찾은 문서나 데이터를 삽입합니다.
제공된 사실은 환각을 줄이며, 사실이 배치되는 위치도 중요합니다. 중간에서 길을 잃다 연구에 따르면 모델은 긴 컨텍스트 윈도우의 시작이나 끝에 나타나는 정보를 가장 잘 활용하고, 한가운데 묻힌 정보는 가장 잘 활용하지 못합니다.
예시의 효과는 명령어 튜닝을 전혀 거치지 않은 기본 모델에서 가장 뚜렷하게 확인할 수 있습니다. 이 코드 조각은 Hugging Face Transformers로 불러온 GPT-2에 예시 세 개가 있을 때와 없을 때 동일한 지침을 제공합니다.
from transformers import AutoModelForCausalLM, AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained("gpt2")
model = AutoModelForCausalLM.from_pretrained("gpt2")
# The same instruction, without and with three worked examples that show the answer format
instruction = "Convert each country to its capital city.\n"
prompts = {
"zero-shot": instruction + "Italy:",
"few-shot": instruction + "France: Paris\nJapan: Tokyo\nCanada: Ottawa\nItaly:",
}
for name, prompt in prompts.items():
inputs = tokenizer(prompt, return_tensors="pt")
output = model.generate(**inputs, max_new_tokens=4, do_sample=False, pad_token_id=tokenizer.eos_token_id)
completion = tokenizer.decode(output[0, inputs.input_ids.shape[1] :])
print(f"{name}: {completion!r}")이 코드는 zero-shot: '\n\nItaly is'과 few-shot: ' Rome\nSpain:'을 출력합니다. 지침만 제공했을 때 GPT-2는 이탈리아에 관한 산문을 썼지만, 예시 세 개를 제공하자 예상된 형식으로 "Rome"이라고 답하고 다음 국가에 대해서도 패턴을 이어갔습니다.
프롬프트 설계는 경험적으로 이루어집니다#
표현이나 레이아웃을 조금만 바꾸어도 결과가 크게 달라질 수 있습니다. Melanie Sclar와 동료들은 구분 기호, 대소문자, 공백과 같은 형식 변경만으로 LLaMA-2-13B의 정확도 차이가 최대 76점에 달함을 측정했으며, 모델 규모가 커지고 예시가 늘어나고 명령어 튜닝이 이루어진 뒤에도 이러한 민감성은 지속되었습니다. 따라서 프롬프트는 코드처럼 개발합니다. 정답이 알려진 고정 입력 집합으로 테스트하고, 실패 사례를 바탕으로 수정한 뒤 버전을 관리하며, 이는 LLMOps의 일상적인 작업입니다.
이 과정을 자동화할 수 있습니다. Yongchao Zhou와 동료들이 만든 Automatic Prompt Engineer(APE)는 LLM이 지침 후보를 제안하게 하고 예시에서 가장 높은 점수를 받은 지침을 선택합니다. 대규모 언어 모델은 인간 수준의 프롬프트 엔지니어입니다에서 APE가 제안한 지침은 24개 작업 중 19개에서 사람이 작성한 지침과 같거나 더 나은 성능을 보였습니다.
비전 모델용 프롬프트#
컴퓨터 비전에서 프롬프트는 여러 형태로 사용됩니다. Stable Diffusion과 같은 텍스트-이미지 생성 모델은 대상, 스타일, 조명, 구도에 대한 설명과 피해야 할 항목을 나열하는 부정 프롬프트에 반응합니다. 프롬프트 기반 세그멘테이션 모델은 점과 박스 같은 시각 프롬프트를 받으며, Meta의 SAM 3는 짧은 명사구도 받아 해당 개념의 모든 인스턴스를 세그멘테이션합니다. Ultralytics Platform은 이를 텍스트 프롬프트 기반 자동 주석에 사용합니다.
개방형 어휘 탐지기는 클래스 이름을 프롬프트로 변환합니다. Ultralytics YOLOE는 set_classes()이 "forklift" 또는 "double-decker bus"와 같이 지정하는 클래스를 탐지하고 분할합니다. 해당 이름의 텍스트 임베딩과 영역 특징을 비교하므로 표현에 따라 탐지 결과가 직접 달라집니다. 매칭은 외관을 기준으로 하므로 "damaged", "left-most", "the one being carried"처럼 상태, 위치 또는 비교에 의존하는 프롬프트는 신뢰할 만한 시각적 기준이 없으며, 일상적인 범주와 가까운 이름이 가장 잘 작동합니다.
프롬프트 엔지니어링과 관련 용어 비교#
- 프롬프트 튜닝: 라벨이 있는 데이터에 경사 하강법을 적용해 연속적인 프롬프트 벡터를 학습합니다. 프롬프트 엔지니어링은 자연어로 프롬프트를 직접 작성합니다.
- 파인튜닝: 라벨이 있는 데이터셋으로 학습해 모델 가중치를 변경합니다. 프롬프트 엔지니어링은 모델을 변경하지 않고 추론 시점에 적용합니다.
- 컨텍스트 엔지니어링: 검색된 문서, 도구 결과, 메모리를 비롯해 애플리케이션에서 모델의 컨텍스트에 입력되는 모든 요소를 다룹니다. 프롬프트 엔지니어링은 지침과 예시를 작성하는 부분을 담당합니다.
- 프롬프트 인젝션: 모델이 읽는 텍스트나 이미지에 지침을 숨겨 개발자의 프롬프트를 덮어쓰도록 하는 공격입니다.










