GPT-4 API로 프롬프트 체이닝 구현하며 배운 것들
배경
사용자 피드백을 자동으로 분류하고 요약하는 기능을 만들어야 했다. 처음엔 하나의 긴 프롬프트로 모든 작업을 시키려 했는데, 결과가 일관성이 없었다.
프롬프트 체이닝 적용
작업을 3단계로 분리했다.
// 1단계: 카테고리 분류
const categoryPrompt = `다음 피드백을 기능/버그/UI/기타 중 하나로 분류:
${feedback}`;
// 2단계: 감정 분석
const sentimentPrompt = `다음 피드백의 감정을 긍정/중립/부정으로 분석:
${feedback}`;
// 3단계: 요약 (이전 결과 활용)
const summaryPrompt = `카테고리: ${category}, 감정: ${sentiment}
위 맥락을 바탕으로 다음 피드백을 한 문장으로 요약:
${feedback}`;
각 단계의 출력을 다음 단계의 입력으로 사용하니 훨씬 정확해졌다.
비용 최적화
문제는 API 호출이 3배로 늘어난 것이었다. 배치 처리로 개선했다.
async function processBatch(feedbacks) {
const categories = await Promise.all(
feedbacks.map(f => classifyCategory(f))
);
// 같은 카테고리끼리 묶어서 처리
const grouped = groupBy(feedbacks, (f, i) => categories[i]);
// ...
}
동시 요청 수를 제한하고, 짧은 피드백은 단일 프롬프트로 처리하도록 했다.
교훈
- 복잡한 작업은 단계별로 분리하는 게 정확도가 높다
- 각 단계의 출력을 구조화(JSON)하면 다음 단계에서 활용하기 좋다
- 비용과 레이턴시를 항상 모니터링해야 한다
- 모든 요청에 체이닝이 필요한 건 아니다
프롬프트 엔지니어링은 결국 작업 분해와 최적화의 문제였다.