프롬프트 체이닝으로 LLM 응답 품질 개선하기
문제 상황
사용자 입력을 받아 분석하고 응답을 생성하는 기능을 구현하면서, 단일 프롬프트에 모든 요구사항을 담았더니 응답이 일관성 없고 중요한 정보를 누락하는 경우가 잦았다.
const prompt = `다음 요청을 분석하고, 카테고리를 분류하고, 적절한 응답을 생성하세요: ${userInput}`;
const response = await llm.generate(prompt);
프롬프트 체이닝 적용
작업을 3단계로 분리했다.
1단계: 요청 분석
const analysisPrompt = `다음 요청의 핵심 의도와 포함된 엔티티를 JSON으로 추출:
${userInput}
출력 형식: {"intent": "...", "entities": []}`;
const analysis = await llm.generate(analysisPrompt);
2단계: 카테고리 분류
const categoryPrompt = `분석 결과를 바탕으로 카테고리 분류:
${analysis}
가능한 카테고리: [support, sales, feedback]`;
const category = await llm.generate(categoryPrompt);
3단계: 응답 생성
const responsePrompt = `카테고리 ${category}에 맞는 응답 생성.
분석 결과: ${analysis}
톤: 전문적이고 친절하게`;
const finalResponse = await llm.generate(responsePrompt);
결과
- 응답 정확도가 약 40% 향상됨
- 각 단계별 출력을 검증할 수 있어 디버깅이 용이해짐
- API 호출이 늘어 비용은 증가했지만 품질 개선으로 상쇄
주의사항
각 단계 사이에 출력 검증 로직을 추가하는 것이 중요하다. 한 단계의 오류가 다음 단계로 전파되면 전체 체인이 무너진다.
if (!isValidJSON(analysis)) {
// 재시도 또는 폴백 로직
}
체이닝 깊이가 깊어질수록 레이턴시와 비용이 선형적으로 증가하므로, 실시간 응답이 필요한 경우 병렬 처리나 캐싱 전략을 함께 고려해야 한다.