프롬프트 체이닝이란?
프롬프트 체이닝(Prompt Chaining)은 하나의 복잡한 작업을 여러 개의 단순한 단계로 분해하고, 각 단계의 출력을 다음 단계의 입력으로 연결하는 기법입니다. 단일 프롬프트로 모든 것을 처리하려 할 때 발생하는 정확도 저하, 환각(hallucination), 맥락 초과 문제를 해결합니다.
단일 프롬프트 vs 체이닝 비교
| 항목 | 단일 프롬프트 | 프롬프트 체이닝 |
|---|---|---|
| 정확도 | 복잡할수록 저하 | 단계별 검증으로 높음 |
| 디버깅 | 어려움 | 단계별 확인 가능 |
| 비용 | 한 번의 큰 호출 | 여러 번 작은 호출 |
| 유연성 | 전체 수정 필요 | 개별 단계 수정 |
| 맥락 관리 | 한계 있음 | 단계별 최적화 |
구현: 기술 문서 자동 생성 체인
const OpenAI = require('openai');
const openai = new OpenAI();
async function chat(systemPrompt, userMessage, options = {}) {
const response = await openai.chat.completions.create({
model: options.model || 'gpt-4-turbo',
messages: [
{ role: 'system', content: systemPrompt },
{ role: 'user', content: userMessage }
],
temperature: options.temperature || 0.7,
});
return response.choices[0].message.content;
}
async function generateTechArticle(topic) {
// Step 1: 주제 분석
const analysis = await chat(
'기술 콘텐츠 전략가로서 주제를 분석하세요.',
'주제: "' + topic + '"
' +
'다음을 JSON으로 답하세요:
' +
'- targetAudience, prerequisites, keyTopics(5개), difficulty',
{ temperature: 0.3 }
);
console.log('Step 1 완료: 주제 분석');
const parsed = JSON.parse(analysis);
// Step 2: 상세 아웃라인
const outline = await chat(
'기술 문서 아키텍트로서 체계적인 아웃라인을 작성하세요.',
'주제: "' + topic + '"
분석 결과: ' + analysis
);
console.log('Step 2 완료: 아웃라인 생성');
// Step 3: 섹션별 초안 작성
const sections = outline.split(/^## /m).filter(Boolean);
const drafts = [];
for (const section of sections) {
const draft = await chat(
'기술 블로그 작가로서 다음 섹션을 작성하세요.
' +
'대상: ' + parsed.targetAudience + '
난이도: ' + parsed.difficulty,
'섹션: ' + section + '
실용적인 코드 예제를 포함하세요.'
);
drafts.push(draft);
}
console.log('Step 3 완료: 섹션별 초안');
const fullDraft = drafts.join('
');
// Step 4: 기술 검토
const reviewed = await chat(
'시니어 엔지니어로서 기술 문서를 검토하세요.',
'다음 기술 문서를 검토하고 수정하세요:
' + fullDraft +
'
검토 기준:
1. 기술적 정확성
2. 코드 동작 여부
3. 논리적 흐름
4. 누락 내용',
{ temperature: 0.2 }
);
console.log('Step 4 완료: 기술 검토');
return reviewed;
}
Gate 패턴: 조건부 체이닝
async function processUserRequest(input) {
// Gate 1: 입력 분류
const classification = await chat(
'사용자 요청을 분류하세요.',
'요청: "' + input + '"
' +
'카테고리: [질문, 요약, 번역, 코드생성, 분석]
' +
'JSON으로 답: { "category": "...", "confidence": 0.0-1.0 }',
{ temperature: 0 }
);
const { category, confidence } = JSON.parse(classification);
// Gate 2: 신뢰도가 낮으면 명확화 요청
if (confidence < 0.7) {
return { action: 'clarify', message: '요청을 더 구체적으로 말씀해주세요.' };
}
// Gate 3: 카테고리별 전문 체인으로 라우팅
const handlers = {
'질문': answerChain,
'요약': summarizeChain,
'번역': translateChain,
'코드생성': codeGenChain,
'분석': analysisChain,
};
return handlers[category](input);
}
async function codeGenChain(input) {
const spec = await chat('요구사항 분석가', '코드 생성 요청을 분석: ' + input);
const code = await chat('시니어 개발자', '다음 요구사항의 코드를 작성: ' + spec);
const tested = await chat('QA 엔지니어', '코드를 검토하고 엣지케이스 테스트 추가: ' + code);
return tested;
}
체이닝 설계 원칙
- 각 단계는 하나의 명확한 목표만 가져야 합니다 (Single Responsibility)
- 중간 결과를 구조화된 형식(JSON)으로 주고받으면 파싱 오류가 줄어듭니다
- 분류/판단 단계는
temperature: 0으로, 생성 단계는0.5~0.7로 설정합니다 - 각 단계에서 다른 모델을 사용할 수 있습니다 (간단한 분류는 GPT-3.5, 생성은 GPT-4)
- 실패한 단계만 재시도하면 되므로 전체 비용과 지연이 절감됩니다
댓글 0