본문 바로가기
AI2025년 1월 28일6분 읽기

프롬프트 체이닝 — 복잡한 작업을 단계별로 분해하기

YS
김영삼
조회 149

프롬프트 체이닝이란?

프롬프트 체이닝(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

아직 댓글이 없습니다.
Ctrl+Enter로 등록