생성형 AI 모듈에서는 생성형 AI 모델의 입력 공간이 사실상 무한하다는 것을 배웠습니다. 사용자의 기대치에 부합하는 출력을 생성하려면 프롬프트를 구성해야 합니다. 프롬프트는 애플리케이션과 모델 간의 구조화된 계약입니다.
잘 작성된 프롬프트:
- LLM이 대답을 구성하는 방법을 명시합니다.
- 시간이 지남에 따라 버전을 관리하고 테스트하고 개선할 수 있는 여러 구성요소로 구성됩니다.
- 팀 간 공동작업을 위한 공유 아티팩트 역할을 할 수 있습니다.
이 모듈에서는 효과적인 프롬프트를 작성하는 방법을 알아봅니다. 프롬프트가 구조화되는 방식과 구성요소가 시스템과 최종 사용자 간에 분산되는 방식을 설명합니다. 또한 기본적인 프롬프트 기법과 각 기법을 적용해야 하는 시나리오도 알아봅니다.
이 모듈에서는 CyberAgent의 프롬프트 API 사용에서 영감을 받은 AI 기반 글쓰기 도우미인 BlogBuddy라는 공유 예시를 사용합니다.
BlogBuddy 시스템 청사진의 생성형 AI 모듈로 돌아갑니다.
프롬프트 구성요소
각 프롬프트 구성요소는 모델 동작을 유도하는 데 특정 역할을 합니다.
- 컨텍스트: 모델의 역할과 도메인을 설정하여 모델이 어떻게 행동해야 하는지 이해합니다.
- 명령어: 모델에 특정 작업을 할당합니다.
- 입력 변수: 애플리케이션에서 실시간으로 제공하는 상황별 컨텍스트입니다.
- 출력 형식: 예상되는 출력 구조를 정의합니다. 예를 들어 JSON 출력을 원할 수 있습니다.
- 예: 하나 이상의 다른 입력에 대해 작업을 실행하는 방법을 보여줍니다.
- 제약 조건: 출력이 일관되고 안전하며 브랜드에 부합하도록 명확한 한도를 설정합니다.
프롬프트에는 이러한 구성요소의 일부 또는 전체가 포함될 수 있습니다. 다음 예는 BlogBuddy의 글쓰기 도우미 기능의 이러한 구성요소를 보여줍니다.
### Context
You are a writing assistant for blog authors.
Your job is to generate helpful, concise, and engaging content.
### Instruction
Generate 3 alternative titles for the user's blog post with a given style.
### Input variables
Here is the content of the blog post:
${blogPostContent}
Here is the desired style:
${titleStyle}
### Output format
Return valid JSON ONLY, in the following exact structure:
{
"titles": ["Title option 1", "Title option 2", "Title option 3"]
}
### Examples
Example input:
{
"blogPostContent": "I finally visited the small neighborhood café I've been eyeing for months...",
"titleStyle": "friendly"
}
Example output:
{
"titles": [
"A First Visit to the Neighborhood Café",
"Trying the Café I've Wanted to Visit for Months",
"My Experience at a Long-Awaited Local Spot"
]
}
### Constraints
- Each title must be under 128 characters.
- Titles must be original, not copied verbatim from the draft.
- Keep the tone natural and human. Avoid emojis unless explicitly requested.
- Avoid sensationalism or clickbait.
- If the draft includes multiple topics, choose the most prominent topic.
첫 번째 프롬프트에서는 필수 요소인 명령어와 출력 형식부터 시작하세요. 그런 다음 결과를 분석하고 성공에 필요한 세부적인 컨트롤을 결정하면서 구성요소를 반복적으로 추가합니다.
시스템 프롬프트와 사용자 프롬프트
프롬프트 구성요소 중 일부는 하드 코딩되어 있지만 다른 구성요소는 최종 사용자가 제공할 수 있습니다.
시스템 프롬프트는 애플리케이션 개발자가 제공하며 모델의 전반적인 동작을 정의합니다. 모델의 역할, 예상되는 어조, 출력 형식 (예: 엄격한 JSON 스키마), 전역 제약 조건을 설정할 수 있습니다. 시스템 프롬프트는 안전 및 책임 요구사항을 인코딩하는 곳이기도 합니다. 요청 전반에서 일관성을 유지하며 모델 동작의 안정적인 기반을 제공합니다.
사용자 프롬프트에는 출력을 생성하는 즉각적인 요청이 포함됩니다. 사용자가 특정 변수를 포함할 수 있는 특정 작업을 요청합니다. 예를 들어 '이 게시물의 제목을 3개 보여 줘', '이 단락을 계속 작성해 줘' 또는 '이 문구를 더 격식 있게 만들어 줘'와 같은 프롬프트를 입력할 수 있습니다.
대부분의 생성형 AI API를 사용하면 각각 역할 (시스템 또는 사용자)과 콘텐츠가 있는 메시지 배열로 프롬프트를 구성할 수 있습니다. 이렇게 하면 안정적인 전역 명령어와 동적인 요청별 입력을 더 쉽게 구분할 수 있습니다.
시스템 프롬프트에 포함할 구성요소와 사용자가 지정하도록 남겨둘 구성요소를 어떻게 결정하나요? 대답은 사용자 환경의 유연성과 모델의 성능에 따라 다릅니다.
제약이 있는 사용 사례
매우 구체적인 사용 사례의 경우 프롬프트의 대부분을 시스템 프롬프트에서 사전 정의할 수 있습니다. 예를 들어 BlogBuddy에서 사용자는 제목 표시를 클릭하여 초안에 대해 생성된 제목 추천을 나열할 수 있습니다.

작업이 고정되어 있고 출력 형식을 알고 있으며 사용자가 예상 결과를 얻기 위해 추가 컨텍스트를 제공할 필요가 없습니다. 이 경우 안정적인 규칙, 어조 가이드라인, 출력 스키마, 예시를 모두 시스템 프롬프트에 배치합니다.
프롬프트 API로 이를 빌드하려면 initialPrompts를 사용하여 전체 세션의 시스템 수준 동작을 정의합니다.
// Defines stable behavior for the entire session
const session = await LanguageModel.create({
initialPrompts: [
{
role: "system",
content: `You are a blog-writing assistant.
Your task is to generate high-quality titles for blog posts.
Always respond in concise, friendly language.
Return exactly 3 alternative titles.
Produce valid JSON with a "titles" array of strings.`
}
]
});
사용자가 제목 표시를 클릭하면 현재 콘텐츠에 대한 프롬프트가 호출됩니다.
// The only variable input is the blog content
const result = await session.prompt(blogContent);
시간이 지남에 따라 사용자는 더 많은 유연성과 제어 기능을 요구할 수 있습니다. 이 경우 인터페이스 컨트롤을 사용하여 특정 구성요소를 사용자 프롬프트로 이동할 수 있습니다. 예를 들어 스타일 또는 어조 사양의 드롭다운 메뉴가 있습니다.
하지만 구조화된 작업이 너무 많으면 사용자 환경이 복잡해질 수 있습니다. 이러한 경우 사용자가 대부분의 프롬프트를 직접 지정할 수 있는 더 개방적인 디자인으로 전환하는 것이 좋습니다. 이 디자인을 최적화하는 방법은 UX 패턴 모듈에서 자세히 알아볼 수 있습니다.
유연한 작업은 상세한 사용자 프롬프트에 의존합니다.
사용자가 처음부터 블로그 게시물을 작성할 수 있도록 지원하는 개방형 대화형 환경은 사용자에게 더 많은 유연성을 제공합니다. 아이디어, 개요, 다시 쓰기, 어조 변경, 브레인스토밍을 요청하거나 작업을 정확히 어떻게 실행해야 하는지 지정할 수 있습니다. 이러한 유형의 애플리케이션에는 더 강력한 서버 측 모델이 필요할 수 있습니다.

유연한 작업을 사용하면 가능한 옵션의 범위가 훨씬 넓기 때문에 사용자가 더 많은 정보를 지정해야 합니다. 시스템 프롬프트는 여전히 전반적인 동작을 관리합니다.
권장사항은 다음과 같습니다.
- 안정적인 규칙, 구조, 예시를 시스템 프롬프트에 넣습니다. 사용자 프롬프트에 동적 콘텐츠와 작업별 요청을 넣습니다.
- UX가 더 개방적일수록 예측할 수 없는 입력을 수용하기 위해 사용자 프롬프트에 더 많은 유연성이 필요합니다.
- 사용자 프롬프트가 더 많은 작업을 수행해야 할수록 모델은 더 많은 기능을 갖춰야 합니다. 내장된 구조가 적을수록 더 큰 변동을 처리해야 하기 때문입니다.
이러한 규칙을 사용하여 제품 컨텍스트에서 제어와 사용자 유연성 간의 균형을 점진적으로 최적화할 수 있습니다. 사용자 환경설정과 행동을 면밀히 관찰합니다. 유연성이 높다고 해서 항상 실제 가치로 전환되는 것은 아닙니다. 또한 사용자가 더 광범위한 프롬프트를 작성할 시간, 기술, 인지 대역폭이 있어야 합니다.
일반적인 프롬프트 작성 기법
개발자는 일반적으로 여러 프롬프트 작성 기법을 시도하여 사용 사례와 모델에 가장 적합한 방법을 찾습니다.
제로샷 프롬프팅
모델의 작업을 설명하고 최상의 결과를 기대합니다. 예를 들면 다음과 같습니다.
"What is the capital of France?"
제로샷 프롬프팅은 많은 AI 작업에 효율적인 기준입니다. 백과사전 지식 쿼리와 같이 복잡하지 않은 요청의 경우 이 기법을 사용하는 것이 가장 좋습니다. 하지만 대부분의 실제 애플리케이션에서는 추가 컨디셔닝과 로직을 사용하여 프롬프트를 확장해야 합니다.
퓨샷 프롬프팅
퓨샷 프롬프트를 사용하면 올바른 동작, 스타일, 구조, 기타 중요한 변수를 보여주는 예시를 제공할 수 있습니다. 다음은 감정 분류를 위한 프롬프트의 예입니다.
You classify user messages into one of the following categories:
- "positive"
- "negative"
- "neutral"
Here are examples to guide your classifications:
Input: "I love this product! It works perfectly."
Output: { "label": "positive" }
Input: "This is terrible. I want a refund."
Output: { "label": "negative" }
퓨샷 프롬프팅은 이러한 종류의 의사 예측 작업에 유용합니다. 그림 1의 제목 생성과 같이 인식 가능한 구조를 따르는 작업에도 적용할 수 있습니다.
출력 공간이 개방형 또는 긴 형식 콘텐츠와 같이 매우 넓은 경우 few-shot 프롬프트가 최적의 기법이 아닐 수 있습니다. 의미 있게 공간을 다루는 예시를 제공하기가 어렵거나 불가능합니다.
연쇄적 사고(CoT) 프롬프팅
모델이 대답을 생성하기 전에 단계별로 추론하도록 유도합니다. 단계는 명시적으로 설명할 수도 있고 모델이 정의하도록 할 수도 있습니다. 예를 들면 다음과 같습니다.
"Think step-by-step to identify the main idea of this paragraph. Then produce a
short heading under 60 characters."
사고의 연쇄는 블로그 게시물 개요 작성이나 복잡한 결정 지원과 같이 다단계 추론과 실행이 필요한 작업에 적합합니다. 이것이 소위 추론 모델의 주요 기술입니다.
이 경우 비용이 많이 들 수 있습니다. 단계별 추론 트레이스를 생성하면 컴퓨팅, 비용, 지연 시간이 증가합니다. 사용 사례에 복잡한 추론과 계획이 필요한 경우에만 사용하세요.
자기 성찰 프롬프트
초기 생성 후 모델이 자체 출력을 비판하고 수정하도록 요청합니다. 예를 들면 다음과 같습니다.
"Review your previous output.
Identify unclear phrasing and rewrite it more concisely."
자기 성찰은 편집 또는 재작성 도구와 같이 반복적인 개선의 이점을 누리는 작업에 특히 유용합니다. 구현이 빠르고 상당한 품질 향상을 가져올 수 있습니다. 프롬프트가 잘 작동하면 자기 성찰 루프가 유용합니다. 먼저 출력을 다듬어 명확성을 높이거나 사용자 만족도를 높입니다.
핵심 내용
이 모듈에서는 구조화된 구성요소로 프롬프트를 빌드하는 방법을 알아봤습니다. 실제로 프롬프트 엔지니어링은 실험적인 부분이 많습니다. 명확성과 신뢰성은 여러 차례의 개선을 거쳐야만 나타납니다.
다음 모듈에서는 평가 기반 프롬프트 개발을 살펴봅니다. 이 방법을 사용하면 프롬프트를 체계적으로 개선하고 제품과 사용자에게 가장 적합한 프롬프트를 찾을 수 있습니다.
리소스
이러한 각 기법에는 자체 변형과 권장사항이 있습니다. 다음과 같은 다양한 세부 외부 리소스가 있습니다.
- Google Cloud의 프롬프트 엔지니어 가이드
- DAIR의 프롬프트 엔지니어링 가이드
- Janna Lipenkova의 프롬프트 작성 간소화
- AI 제품 개발의 기술의 6장을 읽어보세요.
최상의 결과를 얻기 위한 구체적인 조언이 있을 수 있으므로 선택한 모델의 문서를 확인하세요.
이해도 확인
시스템 프롬프트에서 어떤 유형의 규칙을 지정할 수 있나요?
모델이 대답을 생성하기 전에 단계별로 추론하도록 하려면 어떤 기법을 사용해야 하나요?
퓨샷 프롬프팅은 언제 가장 유용할까요?
자기 성찰 프롬프팅 기법이란 무엇인가요?