이 모듈은 생성 AI 모델에서 효과적인 프롬프트를 만드는 데 필요한 필수 개념과 기술을 다룹니다. LLM에 프롬프트를 작성하는 방식도 중요합니다. 신중하게 작성된 프롬프트는 더 높은 품질의 응답을 얻을 수 있습니다. 그런데 '프롬프트'와 '프롬프트 엔지니어링'이라는 용어는 정확히 무엇을 의미할까요? 그리고 LLM에 보내는 프롬프트 입력을 어떻게 개선할 수 있을까요? 이 질문들에 대해, 이 장과 다음 장에서 답을 찾아보겠습니다.
_생성 AI_는 사용자 요청에 따라 새 콘텐츠(예: 텍스트, 이미지, 오디오, 코드 등)를 생성할 수 있습니다. 이는 OpenAI의 GPT("Generative Pre-trained Transformer") 시리즈와 같은 _대규모 언어 모델_을 사용하여 자연어와 코드를 처리함으로써 실현됩니다.
이제 사용자는 채팅 같은 익숙한 방식으로 이러한 모델과 상호작용할 수 있으며, 별도의 기술 전문성이나 교육이 필요하지 않습니다. 모델은 _프롬프트 기반_이며, 사용자가 텍스트 입력(프롬프트)을 보내면 AI가 응답(완료)을 반환합니다. 이후 사용자는 여러 차례 대화를 이어가며 프롬프트를 다듬어가며 원하는 응답이 나올 때까지 "AI와 대화"할 수 있습니다.
"프롬프트"는 이제 생성 AI 앱에서 모델에게 작업 지시를 내리고 반환되는 응답의 품질에 영향을 주는 주요 _프로그래밍 인터페이스_가 되었습니다. "프롬프트 엔지니어링"은 안정적이고 품질 높은 응답을 대규모로 제공하기 위해 프롬프트를 설계하고 최적화하는 데 중점을 둔 빠르게 성장하는 연구 분야입니다.
이번 수업에서는 프롬프트 엔지니어링이 무엇이며, 왜 중요한지, 그리고 특정 모델과 응용 목표에 맞게 보다 효과적인 프롬프트를 작성하는 방법을 배웁니다. 프롬프트 엔지니어링의 핵심 개념과 모범 사례를 이해하고, 이를 실제 예제에 적용할 수 있는 대화형 주피터 노트북 "샌드박스" 환경도 익힙니다.
수업이 끝나면 다음을 할 수 있게 됩니다:
- 프롬프트 엔지니어링이 무엇이며 왜 중요한지 설명할 수 있다.
- 프롬프트 구성 요소와 활용 방식을 설명할 수 있다.
- 프롬프트 엔지니어링을 위한 모범 사례와 기법을 배울 수 있다.
- 배운 기법을 실제 예제에 적용하고, OpenAI 엔드포인트를 사용해 실습할 수 있다.
프롬프트 엔지니어링: AI 모델이 원하는 출력을 생성하도록 입력을 설계하고 다듬는 실습. 토크나이제이션: 텍스트를 모델이 이해하고 처리할 수 있는 더 작은 단위인 토큰으로 변환하는 과정. 지침 튜닝된 LLM: 특정 지침으로 미세조정되어 응답 정확도와 관련성을 향상시킨 대규모 언어 모델.
프롬프트 엔지니어링은 현재 과학보다는 예술에 가깝습니다. 이를 직관적으로 익히는 가장 좋은 방법은 _더 많이 연습_하고, 적용 분야 전문 지식과 권장 기법, 모델별 최적화를 결합하는 시행착오 방식을 채택하는 것입니다.
이 수업에 동봉된 주피터 노트북은 여러분이 배운 내용을 즉석에서 또는 마지막 코드 도전 과제의 일부로 실습할 수 있는 샌드박스 환경을 제공합니다. 연습 문제를 수행하려면 다음이 필요합니다:
- Azure OpenAI API 키 - 배포된 LLM 서비스 엔드포인트.
- 파이썬 런타임 - 노트북 실행용.
- 로컬 환경 변수 설정 - 지금 SETUP 단계를 완료하세요.
노트북에는 시작용 연습문제가 포함되어 있지만, 여러분은 Markdown (설명)과 Code (프롬프트 요청) 섹션을 직접 추가해 더 많은 예제나 아이디어를 시험해보고 프롬프트 설계에 대한 직관을 쌓길 권장합니다.
본 수업에서 다루는 내용을 개괄적으로 보고 싶나요? 주요 주제와 각 주제별로 생각해볼 핵심 시사점을 보여주는 도해 가이드를 참고하세요. 수업 로드맵은 핵심 개념과 도전 과제를 이해하는 것부터 관련 프롬프트 엔지니어링 기법과 모범 사례를 적용하는 단계까지 안내합니다. 이 가이드의 "고급 기법" 섹션은 이 커리큘럼의 다음 장에서 다룰 내용을 의미합니다.
이제 _이 주제_가 교육 분야에 AI 혁신을 가져오는 우리의 스타트업 미션과 어떻게 연결되는지 이야기해 보겠습니다(AI 혁신의 교육 도입). 우리는 _개인화 학습_에 AI를 적용한 애플리케이션을 만들고자 하므로, 다양한 사용자가 우리 애플리케이션에서 어떻게 프롬프트를 "설계"할지 생각해 봅시다:
- 관리자는 AI에 _교육 과정 데이터를 분석해 누락 부분을 식별_하도록 요청할 수 있습니다. AI는 결과를 요약하거나 코드를 이용해 시각화할 수 있습니다.
- 교육자는 AI에 _대상 청중과 주제에 맞는 수업 계획을 생성_해 달라고 요청할 수 있습니다. AI는 지정된 형식으로 개인화된 계획을 작성합니다.
- 학생은 AI에 어려운 과목을 가르쳐 달라고 요청할 수 있습니다. AI는 학생 수준에 맞춘 수업, 힌트, 예제로 지도할 수 있습니다.
이것은 빙산의 일각에 불과합니다. 교육 전문가가 큐레이션한 공개 프롬프트 라이브러리인 Prompts For Education을 확인해 보세요. 더 폭넓은 가능성을 알 수 있습니다! 샌드박스나 OpenAI 플레이그라운드에서 이들 프롬프트를 실행해 보는 것도 권장합니다!
우리는 이 수업을 “주어진 응용 목표와 모델에 대해 일관적이고 품질 좋은 응답(완료)을 제공하기 위해 텍스트 입력(프롬프트)을 _설계_하고 _최적화_하는 과정”으로 프롬프트 엔지니어링을 정의하며 시작했습니다. 이를 두 단계 과정으로 생각할 수 있습니다:
- 특정 모델과 목표에 맞는 초기 프롬프트를 _설계_함
- 응답 품질을 개선하기 위해 프롬프트를 반복적으로 다듬음
이는 최적의 결과를 얻기 위해 사용자 직관과 노력이 필요한 필연적인 시행착오 과정입니다. 그렇다면 왜 중요한가요? 이 질문에 답하기 위해 다음 세 가지 개념을 먼저 이해해야 합니다:
- 토크나이제이션 = 모델이 프롬프트를 어떻게 “보는지”
- 기본 LLM = 기본 모델이 프롬프트를 어떻게 “처리하는지”
- 지침 튜닝된 LLM = 모델이 이제 “작업”을 어떻게 인식하는지
LLM은 프롬프트를 _토큰 시퀀스_로 인식하며, 서로 다른 모델(또는 같은 모델의 버전)은 같은 프롬프트도 다르게 토크나이즈할 수 있습니다. LLM은 토큰 단위로 훈련되어 (원문 텍스트가 아니라) 프롬프트가 어떻게 토크나이즈되는지가 생성된 응답 품질에 직접 영향을 미칩니다.
토크나이제이션이 어떻게 작동하는지 직관을 얻으려면, 아래의 OpenAI Tokenizer 같은 도구를 사용해 보세요. 프롬프트를 복사해 넣고, 공백 문자와 구두점이 어떻게 처리되는지 확인해 보세요. 이 예시는 이전 LLM(GPT-3)을 보여주므로, 최신 모델에서는 다른 결과가 나올 수 있습니다.
프롬프트가 토큰화되면, "Base LLM"(기본 모델)의 주 기능은 그 토큰 시퀀스 내 다음 토큰을 예측하는 것입니다. LLM은 방대한 텍스트 데이터셋으로 훈련되어 토큰 간 통계적 관계를 잘 파악하고, 어느 정도 자신감을 가지고 다음 토큰을 예측할 수 있습니다. 이들은 프롬프트 내 단어의 _의미_를 이해하는 것이 아니라, 단지 "완성"할 수 있는 패턴을 보는 것입니다. 사용자가 중지하거나 사전에 정해진 조건이 충족될 때까지 예측을 계속할 수 있습니다.
프롬프트 기반 완성이 어떻게 작동하는지 보고 싶다면, 위 프롬프트를 Azure OpenAI Studio 채팅 플레이그라운드에 기본 설정으로 입력해 보세요. 시스템은 프롬프트를 정보 요청으로 처리하도록 구성되어 있으므로, 이에 부합하는 완료 결과를 볼 수 있을 것입니다.
그런데 사용자가 특정 조건이나 작업 목표를 충족하는 응답을 원한다면 어떻게 될까요? 여기서 지침 튜닝된 LLM이 등장합니다.
지침 튜닝된 LLM은 기본 모델을 기반으로 하며, 명확한 지침이 포함된 예제나 입출력 쌍(예: 다중 턴 "메시지")으로 미세 조정된 모델입니다. AI의 응답도 그 지침을 따르도록 시도합니다.
이것은 인간 피드백을 활용한 강화학습(RLHF) 같은 기법을 사용해 모델이 지침을 따르고, 피드백을 통해 학습하도록 훈련하여, 실제 응용에 더 적합하고 사용자 목표에 더 관련성 높은 응답을 생성하게 합니다.
실습해 보겠습니다 - 위 프롬프트를 다시 입력하되, _시스템 메시지_를 다음과 같은 지침으로 변경하세요:
제공된 내용을 2학년 학생이 이해할 수 있도록 요약하세요. 결과는 한 문단과 3-5개의 핵심 항목으로 구성하세요.
결과가 원하는 목표와 형식에 맞게 조정된 것을 확인할 수 있나요? 교육자는 이 응답을 바로 수업 자료에 사용할 수 있습니다.
이제 LLM이 프롬프트를 어떻게 처리하는지 알았으니, 왜 프롬프트 엔지니어링이 필요한지 이야기해 봅시다. 답은 현재 LLM이 가진 여러 한계점에 있습니다. 이로 인해 프롬프트 작성과 최적화에 노력을 기울이지 않으면 _신뢰성 있고 일관된 완료_를 얻기 어렵기 때문입니다. 예를 들어:
-
모델 응답은 확률적입니다. _같은 프롬프트_도 서로 다른 모델이나 모델 버전에 따라 다르게 응답할 가능성이 높습니다. 심지어 같은 모델이라도 시간에 따라 다른 결과를 낼 수 있습니다. 프롬프트 엔지니어링 기법은 이러한 변동을 최소화하는 데 도움이 되는 더 나은 가드레일을 제공합니다.
-
모델은 응답을 지어낼 수 있습니다. 모델은 방대하지만 한정된 데이터셋으로 사전 훈련되었으므로, 범위를 벗어난 개념에 대해선 지식이 부족합니다. 그 결과 부정확하거나 허구적이거나 알려진 사실과 정면으로 모순되는 완료를 생성할 수 있습니다. 프롬프트 엔지니어링 기법은 AI에 출처나 이유를 묻는 식으로 이런 지어내기를 식별하고 완화하도록 돕습니다.
-
모델 능력은 다양합니다. 최신 모델이나 신규 세대는 더 풍부한 기능을 가지지만, 비용과 복잡성 측면에서 고유한 특성과 절충안을 동반합니다. 프롬프트 엔지니어링은 이러한 차이를 추상화하고 모델별 요구사항에 원활하고 확장 가능하게 적응하는 모범 사례와 워크플로우 수립에 기여합니다.
OpenAI 또는 Azure OpenAI 플레이그라운드에서 다음을 시도해 보세요:
- 서로 다른 LLM 배포(예: OpenAI, Azure OpenAI, Hugging Face)에서 같은 프롬프트를 사용해 보았나요? 결과가 달랐나요?
- 같은 LLM 배포(예: Azure OpenAI 플레이그라운드)에서 같은 프롬프트를 반복해서 실행해 보았나요? 결과 변동은 어땠나요?
이 과정에서는 LLM이 훈련 한계 등으로 인해 때때로 사실과 다른 정보를 생성하는 현상을 "지어내기(fabrication)"라는 용어로 부릅니다. 일반 기사나 연구에서는 이를 _"환각(hallucination)"_이라고도 하지만, 기계 결과에 인간적 특성을 부여하지 않도록 _"지어내기"_라는 용어 사용을 권장합니다. 이는 일부 맥락에서 공격적이거나 배제적으로 간주될 수 있는 용어를 배제하는 책임 있는 AI 지침과도 일치합니다.
지어내기 작동 방식을 이해하고 싶나요? AI가 훈련 데이터셋에 없을 가상의 주제에 대해 콘텐츠 생성하라고 지시하는 프롬프트를 떠올려 보세요. 예를 들어, 내가 시도한 프롬프트는 다음과 같습니다:
프롬프트: 2076년의 화성 전쟁에 관한 수업 계획을 생성하세요. 웹 검색 결과, 화성 전쟁에 관한 허구의 이야기들(예: 텔레비전 시리즈나 책) 은 있었지만 2076년에 관한 것은 없었습니다. 상식적으로도 2076년은 미래 이므로 실제 사건과 연관될 수 없습니다.
그렇다면 이 프롬프트를 서로 다른 LLM 제공자들과 함께 실행하면 어떻게 될까요?
응답 1: OpenAI Playground (GPT-35)
응답 2: Azure OpenAI Playground (GPT-35)
응답 3: : Hugging Face Chat Playground (LLama-2)
예상한 대로 각 모델(또는 모델 버전)은 확률적 행동과 모델 역량 차이 때문에 약간씩 다른 응답을 생성합니다. 예를 들어, 한 모델은 8학년 학생을 대상으로 한 반면, 다른 모델은 고등학생을 대상으로 합니다. 하지만 세 모델 모두 정보가 부족한 사용자를 속일 수 있을 만큼 실제 사건인 것처럼 응답을 생성했습니다.
메타프롬프트 와 온도 설정 같은 프롬프트 엔지니어링 기법은 어느 정도 모델의 허구 생성(fabrication)을 줄일 수 있습니다. 또한 새로운 프롬프트 엔지니어링 아키텍처 는 프롬프트 흐름에 새로운 도구와 기법을 자연스럽게 통합하여 이러한 효과를 완화하거나 줄입니다.
이 섹션을 마무리하며 실제 솔루션에 프롬프트 엔지니어링이 어떻게 사용되는지 감을 잡기 위해 한 사례 연구를 살펴봅시다: GitHub Copilot.
GitHub Copilot은 당신의 "AI 페어 프로그래머"입니다 - 텍스트 프롬프트를 코드 완성으로 변환하며 개발 환경(예: Visual Studio Code)에 통합되어 매끄러운 사용자 경험을 제공합니다. 아래 블로그 시리즈에 문서화된 대로, 초기 버전은 OpenAI Codex 모델을 기반으로 했으며 엔지니어들이 모델 미세 조정과 더 나은 프롬프트 엔지니어링 기술 개발의 필요성을 빠르게 인식하여 코드 품질을 향상했습니다. 7월에는 Codex를 넘어선 개선된 AI 모델을 공개해 훨씬 빠른 제안을 제공합니다.
학습 여정을 따라가려면 게시물을 순서대로 읽으세요.
- 2023년 5월 | GitHub Copilot이 코드 이해 능력을 향상하는 방법
- 2023년 5월 | GitHub 내부: GitHub Copilot 뒤의 LLM 작업
- 2023년 6월 | GitHub Copilot에 더 나은 프롬프트 작성법
- 2023년 7월 | GitHub Copilot, 개선된 AI 모델로 Codex를 넘어서다
- 2023년 7월 | 개발자를 위한 프롬프트 엔지니어링과 LLM 가이드
- 2023년 9월 | 엔터프라이즈 LLM 앱 구축 방법: GitHub Copilot 사례에서 배운 교훈
또한 아래 엔지니어링 블로그에서, 이 글과 같이 이 모델들과 기술들이 실제 애플리케이션 개발에 어떻게 적용 되는지 보여주는 게시물도 탐색할 수 있습니다.
프롬프트 엔지니어링이 중요한 이유를 살펴봤으니, 이제 프롬프트가 어떻게 구성 되는지 이해해서 더 효과적인 프롬프트 설계를 위한 다양한 기법을 평가해 봅시다.
먼저 기본 프롬프트를 살펴봅니다: 다른 맥락 없이 모델에 보내는 텍스트 입력입니다. 예를 들어, 미국 국가의 첫 몇 단어를 OpenAI Completion API에 보내면, 다음 몇 줄을 즉시 완성 해 기본 예측 동작을 보여줍니다.
| 프롬프트 (입력) | 완성 답변 (출력) |
|---|---|
| Oh say can you see | 당신이 시작한 것은 미국 국가인 "The Star-Spangled Banner"의 가사인 것 같습니다. 전체 가사는 ... |
이제 기본 프롬프트에 맥락과 지시사항을 추가해 봅니다. Chat Completion API는 다음과 같은 메시지 집합으로 복합 프롬프트를 구성할 수 있게 해줍니다:
- 사용자 입력과 어시스턴트 응답을 반영하는 입출력 쌍
- 어시스턴트의 행동 또는 성격을 설정하는 시스템 메시지
요청은 이제 아래 형식이며, 토큰화 는 맥락과 대화에서 관련 정보를 효과적으로 포착합니다. 시스템 맥락을 변경하는 것은 제공된 사용자 입력만큼 완성 품질에 영향을 줄 수 있습니다.
response = openai.chat.completions.create(
model="gpt-3.5-turbo",
messages=[
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": "Who won the world series in 2020?"},
{"role": "assistant", "content": "The Los Angeles Dodgers won the World Series in 2020."},
{"role": "user", "content": "Where was it played?"}
]
)위 예시에서 사용자 프롬프트는 단순한 정보 요청 쿼리였지만, 지시 프롬프트를 사용하면 더 자세한 작업 지시를 텍스트로 설명해 AI에 더 나은 가이드를 제공합니다. 예를 들어:
| 프롬프트 (입력) | 완성 (출력) | 지시 유형 |
|---|---|---|
| 남북전쟁에 대해 기술하라 | 간단한 단락 응답 | 단순 |
| 남북전쟁에 대해 기술하라. 주요 날짜와 사건을 제공하고 그 중요성을 설명하라 | 단락 후 주요 사건 날짜와 설명이 담긴 목록 반환 | 복합 |
| 남북전쟁에 대해 1단락으로 기술하라. 주요 날짜 3개와 그 중요성에 대한 불릿 3개를 제공하라. 주요 역사 인물 3명과 그 공헌에 대한 불릿 3개도 추가하라. JSON 파일 형식으로 결과를 반환하라 | JSON 형식으로 잘 정리된 상세 텍스트 박스를 반환, 복사 후 파일로 저장 및 검증 가능 | 복합. 포맷 포함 |
위 예시에서 프롬프트는 여전히 비교적 자유형으로, LLM이 사전 학습된 데이터셋에서 관련 정보를 자율적으로 판단했습니다. 주요 내용(primary content) 설계 패턴은 입력 텍스트를 두 부분으로 나눕니다:
- 지시 (행동)
- 관련 내용 (행동에 영향을 주는 내용)
예를 들어, 지시가 "2문장으로 요약하라"인 경우를 보겠습니다.
| 프롬프트 (입력) | 완성 (출력) |
|---|---|
| 목성은 태양으로부터 다섯 번째 행성이며 태양계에서 가장 큽니다. 가스 거성이며 질량은 태양의 1000분의 1에 불과하지만 태양계 내 다른 모든 행성 질량을 합친 것보다 2.5배 많습니다. 목성은 맨눈으로 볼 수 있는 가장 밝은 천체 중 하나이며 고대 문명에서 역사 기록 이전부터 알려져 있습니다. 로마 신 목성에서 이름을 따왔습니다.[19] 지구에서 볼 때 반사광이 그림자를 만들 정도로 밝을 수 있으며[20], 평균적으로 달과 금성 다음으로 밤하늘에서 세 번째로 밝은 자연 천체입니다. 2문장으로 요약하라 |
목성은 태양계에서 다섯 번째이자 가장 큰 행성으로, 밤하늘에서 가장 밝은 천체 중 하나로 알려져 있습니다. 로마 신 목성의 이름을 따온 이 가스 거성은 태양계 내 다른 모든 행성 질량을 합친 것보다 2.5배 더 무겁습니다. |
주요 내용 세그먼트는 더 효과적인 지시를 위해 다양한 방식으로 활용할 수 있습니다:
- 예시 - 명확한 지시 대신 원하는 출력 예시를 보여주어 모델이 패턴을 추론하게 합니다.
- 큐 - 지시 뒤에 '큐'를 넣어 완성 방향을 유도합니다.
- 템플릿 - 특정 데이터로 맞춤화 가능한 플레이스홀더(변수)를 가진 반복 가능한 프롬프트 레시피입니다.
이들을 실제로 살펴봅시다.
이 방법은 주요 내용을 활용해 특정 지시의 원하는 결과 예시를 모델에 제공하고, 모델이 패턴을 추론하도록 합니다. 제공된 예시 수에 따라 제로샷, 원샷, 퓨샷 프롬프트 등이 있습니다.
프롬프트는 세 요소로 구성됩니다:
- 작업 설명
- 원하는 출력 몇 가지 예시
- 새 예시의 시작 (암묵적 작업 설명 역할)
| 학습 유형 | 프롬프트 (입력) | 완성 (출력) |
|---|---|---|
| 제로샷 | "The Sun is Shining". 스페인어로 번역 | "El Sol está brillando". |
| 원샷 | "The Sun is Shining" => ""El Sol está brillando". "It's a Cold and Windy Day" => |
"Es un día frío y ventoso". |
| 퓨샷 | The player ran the bases => Baseball The player hit an ace => Tennis The player hit a six => Cricket The player made a slam-dunk => |
Basketball |
제로샷 프롬프트에는 명시적 지시("스페인어로 번역")가 필요하지만 원샷에서는 자동 추론됩니다. 퓨샷 예시는 더 많은 예시가 추가되면 별도 지시 없이도 모델이 더 정확히 추론할 수 있음을 보여줍니다.
주요 내용을 사용하는 또 다른 방법은 예시 대신 _큐_를 제공하는 것입니다. 이 방식은 원하는 답변 형식의 첫 부분을 모델에게 보여줌으로써, 모델이 그 흐름을 이어가도록 유도합니다.
| 큐 수 | 프롬프트 (입력) | 완성 (출력) |
|---|---|---|
| 0 | 목성은 태양으로부터 다섯 번째 행성이며 태양계에서 가장 큽니다. 가스 거성이며 질량은 태양의 1000분의 1에 불과하지만 태양계 내 다른 모든 행성 질량을 합친 것보다 2.5배 많습니다. 목성은 맨눈으로 볼 수 있는 가장 밝은 천체 중 하나이며 고대 문명에서 역사 기록 이전부터 알려져 있습니다. 요약하라 |
목성은 태양계에서 가장 큰 행성으로 태양에서 다섯 번째입니다. 질량은 태양의 1000분의 1이지만 다른 모든 행성을 합친 것보다 무겁습니다. 고대 문명에서도 오래전부터 알려져 있으며, 밤하늘에서 쉽게 볼 수 있습니다. |
| 1 | 목성은 태양에서 다섯 번째 행성이며 태양계에서 가장 큰 행성입니다. 목성은 태양 질량의 천분의 일에 해당하는 가스 거성이지만, 태양계 내 다른 모든 행성들의 질량을 합친 것보다 두 배 반이나 더 무겁습니다. 목성은 육안으로 관찰할 수 있는 가장 밝은 천체 중 하나이며, 기록된 역사 이전부터 고대 문명에 알려져 왔습니다. 요약하기 우리가 배운 것은 목성이 |
태양에서 다섯 번째 행성이며 태양계에서 가장 큰 행성이라는 점입니다. 목성은 태양 질량의 천분의 일에 해당하는 가스 거성이지만 다른 모든 행성을 합친 질량의 두 배 반에 달합니다. 육안으로 쉽게 볼 수 있으며 고대부터 알려져 왔습니다. |
| 2 | 목성은 태양에서 다섯 번째 행성이며 태양계에서 가장 큰 행성입니다. 목성은 태양 질량의 천분의 일에 해당하는 가스 거성이지만, 태양계 내 다른 모든 행성들의 질량을 합친 것보다 두 배 반이나 더 무겁습니다. 목성은 육안으로 관찰할 수 있는 가장 밝은 천체 중 하나이며, 기록된 역사 이전부터 고대 문명에 알려져 왔습니다. 요약하기 우리가 배운 주요 3가지 사실: |
1. 목성은 태양에서 다섯 번째 행성이며 태양계에서 가장 큰 행성입니다. 2. 목성은 태양 질량의 천분의 일에 해당하는 가스 거성입니다... 3. 목성은 고대부터 육안으로 볼 수 있었습니다... |
프롬프트 템플릿은 _미리 정의된 프롬프트 레시피_로, 필요에 따라 저장하고 재사용할 수 있으며 대규모로 더 일관된 사용자 경험을 제공하는 데 이용됩니다. 가장 단순한 형태에서는 OpenAI의 이 예시처럼 사용자 및 시스템 메시지로 구성된 인터랙티브 프롬프트 구성 요소와 API 기반 요청 형식을 모두 포함하는 예제 모음입니다.
더 복잡한 형태로는 LangChain의 이 예시처럼 _플레이스홀더_를 포함하여 사용자 입력, 시스템 컨텍스트, 외부 데이터 소스 등 다양한 원천에서 데이터를 대입해 동적으로 프롬프트를 생성할 수 있습니다. 이를 통해 일관된 사용자 경험을 프로그래밍적으로 대규모로 지원하는 재사용 가능한 프롬프트 라이브러리를 구축할 수 있습니다.
궁극적으로 템플릿의 진가는 수직적 애플리케이션 도메인에 특화한 _프롬프트 라이브러리_를 생성·배포하는 데 있습니다. 이 경우 해당 도메인에 맞게 최적화된 예제와 문맥을 반영하여 사용자 대상에게 더욱 적합하고 정확한 응답을 제공합니다. 이런 접근법의 훌륭한 예로, 수업 계획, 커리큘럼 설계, 학생 지도 등 핵심 목표에 중점을 둔 교육 도메인용 프롬프트 라이브러리를 큐레이션한 Prompts For Edu 저장소가 있습니다.
프롬프트 구성은 지시사항(작업)과 대상(주요 콘텐츠)을 포함하는데, _보조 콘텐츠_는 출력을 특정 방식으로 조정하기 위해 추가로 제공하는 문맥입니다. 튜닝 파라미터, 서식 지침, 주제 분류 체계 등이 모델이 원하는 사용자 목표나 기대에 맞게 응답을 _맞춤_하도록 도움을 줍니다.
예를 들어, 방대한 메타데이터(이름, 설명, 레벨, 태그, 강사 등)를 포함하는 코스 카탈로그가 있다고 가정해 봅시다.
- 지시사항을 "2023년 가을 학기 코스 카탈로그 요약하기"로 정의할 수 있습니다.
- 주요 콘텐츠에 원하는 출력 예시를 몇 가지 포함할 수 있습니다.
- 보조 콘텐츠에 상위 5개 "태그"를 지정할 수 있습니다.
그럼 모델이 몇 가지 예시 형식에 맞춰 요약을 제공하는 동시에, 결과에 여러 태그가 포함되어 있으면 보조 콘텐츠로 지정한 5개 우선 태그를 중점적으로 반영할 수 있습니다.
이제 프롬프트가 _구성_되는 방식을 이해했으니, 이를 _설계_할 때 모범 사례를 어떻게 적용할지 고민해볼 차례입니다. 크게 두 부분으로 나누어 생각할 수 있습니다. 올바른 마인드셋 갖기, 그리고 적절한 기술 적용하기입니다.
프롬프트 엔지니어링은 시행착오 과정입니다. 다음 세 가지 넓은 가이드를 기억하세요:
-
도메인 이해가 중요합니다. 응답의 정확성과 적합성은 애플리케이션이나 사용자가 속한 _도메인_에 따라 달라집니다. 직관과 도메인 전문성을 활용해 기법을 맞춤화하세요. 예를 들어, 시스템 프롬프트에 _도메인별 성격_을 정의하거나, 사용자 프롬프트에 _도메인 특화 템플릿_을 사용하는 방식입니다. 보조 콘텐츠를 통해 도메인별 문맥을 제공하거나, _도메인별 신호와 예시_를 써서 모델이 익숙한 사용 패턴을 따르도록 유도할 수도 있습니다.
-
모델 이해가 중요합니다. 모델은 본질적으로 확률적입니다. 하지만 사용하는 모델은 학습 데이터(사전 학습 지식), 제공하는 기능(API, SDK 등), 최적화된 콘텐츠 유형(코드, 이미지, 텍스트 등)에 따라 차이가 있습니다. 사용 중인 모델의 강점과 한계를 이해하고, 이를 바탕으로 우선순위를 정하거나, 모델에 맞춘 _맞춤형 템플릿_을 구축하세요.
-
반복과 검증이 중요합니다. 모델과 프롬프트 기술은 빠르게 발전합니다. 도메인 전문가라면 자신만의 추가 문맥이나 기준이 있을 수 있으며, 이는 넓은 커뮤니티에 반드시 적용되지는 않을 수 있습니다. 프롬프트 엔지니어링 도구와 기법으로 기초를 마련하고, 직접 반복적으로 검증해 최적의 결과를 찾아내세요. 통찰을 기록해 지식 기반(예, 프롬프트 라이브러리)을 구축하면, 나중에 더 빠른 반복 개발이 가능합니다.
이제 OpenAI와 Azure OpenAI 실무자들이 권장하는 공통 모범 사례를 살펴봅시다.
| 항목 | 이유 |
|---|---|
| 최신 모델을 평가하세요. | 최신 모델 세대는 기능과 품질이 개선된 경우가 많지만 비용이 더 들 수도 있습니다. 효과를 평가한 뒤 마이그레이션 여부를 결정하세요. |
| 지시사항과 문맥을 구분하세요. | 모델이나 제공자가 지시사항, 주요 및 보조 콘텐츠를 구분하는 _구분자_를 정의하는지 확인하세요. 이는 토큰에 더 정확히 가중치를 부여하는 데 도움이 됩니다. |
| 구체적이고 명확하게 작성하세요. | 원하는 문맥, 결과, 길이, 형식, 스타일 등에 대해 상세히 설명하세요. 이는 응답 품질과 일관성을 개선하며, 이를 재사용 가능한 템플릿으로 캡처하세요. |
| 설명적이고 예시를 활용하세요. | 모델은 ‘보여주고 설명하는’ 방식에 더 잘 반응할 수 있습니다. 먼저 예시 없는 제로샷(zero-shot) 지시를 준 후, 원할 경우 원하는 출력 예시를 몇 개 제공하는 퓨샷(few-shot)으로 다듬으세요. 비유도 활용하세요. |
| 완료를 위한 신호를 사용하세요. | 반응이 시작될 수 있도록 시작 단어나 구문을 주어 원하는 결과를 유도하세요. |
| 중복 활용하세요. | 때로는 모델에 반복해서 지시해야 할 때가 있습니다. 주요 콘텐츠 전후에 지시문을 넣거나, 지시문과 신호를 함께 쓰는 등의 방법으로 반복 후 검증하세요. |
| 순서가 중요합니다. | 모델에 정보가 제시되는 순서는 출력을 좌우할 수 있습니다. 학습 예시에서도 최신 정보 편향이 있으므로, 다양한 순서로 시도해 가장 효과적인 방법을 찾으세요. |
| 모델에 “안전망”을 주세요. | 모델이 작업을 완수할 수 없을 때 출력할 _대체 완료 응답_을 주세요. 이는 잘못됐거나 만들어낸 정보를 생성할 가능성을 줄입니다. |
모든 모범 사례에서 그렇듯, 결과는 모델, 작업, 도메인에 따라 다릅니다. 이를 시작점으로 삼아 반복하며 최적 방법을 찾아가세요. 새로운 모델과 도구가 나오면 프롬프트 설계와 프로세스를 재평가해 확장성과 품질을 높이도록 하세요.
축하합니다! 강의를 끝까지 마쳤습니다! 이제 배운 개념과 기술을 실제 예시로 시험할 시간입니다!
과제에서는 여러분이 참여하며 직접 해결할 수 있는 Jupyter Notebook을 사용합니다. 마크다운과 코드 셀로 노트북을 확장하여 자신의 아이디어와 기법을 탐구할 수도 있습니다.
- (추천) GitHub Codespaces 실행
- (대안) 저장소를 로컬 장치에 클론 후 Docker Desktop과 사용
- (대안) 선호하는 노트북 런타임으로 노트북 열기
- 저장소 루트에서
.env.copy파일을.env로 복사하고AZURE_OPENAI_API_KEY,AZURE_OPENAI_ENDPOINT,AZURE_OPENAI_DEPLOYMENT값을 채우세요. 설정 방법은 학습 샌드박스 섹션을 참고하세요.
- 런타임 커널을 선택하세요. 1번이나 2번 방식을 선택했다면, 개발 컨테이너에서 기본으로 제공하는 Python 3.10.x 커널을 선택하면 됩니다.
모든 준비가 끝났습니다. 연습 문제를 실행하세요. 정답이나 오답은 없습니다 — 시행착오로 옵션을 탐색하고 모델과 도메인에 적합한 감각을 키우는 게 목적입니다.
따라서 이 강의에는 코드 솔루션 섹션이 없습니다. 대신 "나의 해답:"이라는 제목 아래 마크다운 셀에 한 가지 예시 출력을 참고용으로 표시합니다.
다음 중 합리적인 모범 사례를 따른 좋은 프롬프트는 무엇일까요?
- Show me an image of red car
- Show me an image of red car of make Volvo and model XC90 parked by a cliff with the sun setting
- Show me an image of red car of make Volvo and model XC90
정답: 2번입니다. "무엇을" 요구하는지 구체적으로 세부 정보(단순한 자동차가 아니라 특정 제조사와 모델)와 전체 배경을 포함해 가장 좋은 프롬프트입니다. 3번도 많은 설명이 포함돼 차선입니다.
프롬프트 "Show me an image of red car of make Volvo and "에 "신호(cue)" 기법을 적용해 보세요. 모델의 반응은 어떠하며, 어떻게 개선할 수 있나요?
프롬프트 엔지니어링의 다양한 개념을 더 배우고 싶다면 계속 학습 페이지에서 더 좋은 자료를 찾아보세요.
5강에서 고급 프롬프트 기법을 다룹니다!
면책 조항: 이 문서는 AI 번역 서비스 Co-op Translator를 사용하여 번역되었습니다. 정확성을 기하기 위해 노력하고 있으나, 자동 번역은 오류나 부정확한 부분이 있을 수 있음을 유의하시기 바랍니다. 원본 문서의 원어본이 권위 있는 자료로 간주되어야 합니다. 중요한 정보의 경우, 전문가의 인간 번역을 권장합니다. 이 번역 사용으로 인해 발생하는 오해나 잘못된 해석에 대해 당사는 책임을 지지 않습니다.







