프롬프트 버전 관리 시스템 도입기

배경

사내 AI 기능이 20개를 넘어가면서 프롬프트 관리가 문제가 되었다. 코드 리뷰 때마다 "이전 버전이 더 나았던 것 같은데"라는 말이 나왔지만, Git diff로는 미묘한 차이를 비교하기 어려웠다.

요구사항

  • A/B 테스트 결과와 프롬프트 버전 연결
  • 성능 지표(응답 품질, 토큰 사용량) 자동 기록
  • 롤백 시 관련 메트릭 함께 표시
  • 프롬프트별 변경 이력 시각화

구현

interface PromptVersion {
  id: string;
  promptId: string;
  content: string;
  version: number;
  metrics: {
    avgTokens: number;
    successRate: number;
    avgLatency: number;
  };
  createdBy: string;
  createdAt: Date;
  deployedAt?: Date;
}

class PromptVersionControl {
  async createVersion(promptId: string, content: string) {
    const latest = await this.getLatestVersion(promptId);
    const version = (latest?.version || 0) + 1;
    
    return prisma.promptVersion.create({
      data: { promptId, content, version, createdBy: getCurrentUser() }
    });
  }

  async compareVersions(v1: string, v2: string) {
    const [version1, version2] = await Promise.all([
      this.getVersion(v1),
      this.getVersion(v2)
    ]);
    
    return {
      contentDiff: diffLines(version1.content, version2.content),
      metrics: this.compareMetrics(version1.metrics, version2.metrics)
    };
  }
}

메트릭 수집

AI 응답마다 자동으로 메트릭을 수집하도록 미들웨어를 추가했다.

async function aiMiddleware(req: Request, res: Response, next: Next) {
  const startTime = Date.now();
  const promptVersion = await getActivePromptVersion(req.params.promptId);
  
  res.on('finish', () => {
    recordMetrics({
      versionId: promptVersion.id,
      tokens: res.locals.tokenCount,
      latency: Date.now() - startTime,
      success: res.statusCode === 200
    });
  });
  
  next();
}

결과

  • 프롬프트 변경 시 이전 버전 대비 성능 변화를 즉시 확인 가능
  • 문제 발생 시 3분 내 롤백 (이전엔 30분+)
  • A/B 테스트 결과 기반 의사결정으로 주관적 논쟁 감소

개선점

프롬프트 자체를 코드와 분리해 non-tech 팀원도 수정 가능하도록 UI를 추가할 예정이다. 현재는 개발자만 접근 가능해서 병목이 생기고 있다.