master-project
CHAPTER 38 / 50
읽기 약 2분
FUNCTION
AI 품질 관리: 프롬프트 버전 관리 + 평가
핵심 개념
프롬프트 DB·A/B 테스트·평가 데이터셋·LLM as judge·품질 지표 — 출시 후 지속 개선.
본문
프롬프트 버전 관리
create table prompts (
id uuid primary key default gen_random_uuid(),
name text not null,
version int not null,
template text not null, -- with {{variable}}
model text not null,
temperature float default 0.7,
is_active boolean default false,
created_at timestamptz default now(),
unique(name, version)
);// 활성 프롬프트 가져오기
async function getActivePrompt(name: string) {
const supabase = createServiceClient()
const { data } = await supabase
.from('prompts')
.select('*')
.eq('name', name)
.eq('is_active', true)
.single()
return data
}
// 사용
const prompt = await getActivePrompt('copy_generation')
const filled = prompt.template.replace('{{topic}}', userInput)
const result = await generateText({
model: anthropic(prompt.model),
temperature: prompt.temperature,
prompt: filled,
})A/B 테스트
// 50% v1, 50% v2
async function getPromptForUser(name: string, userId: string) {
const hash = parseInt(userId.slice(0, 8), 16)
const variant = hash % 2 === 0 ? 1 : 2
const supabase = createServiceClient()
const { data } = await supabase
.from('prompts')
.select('*')
.eq('name', name)
.eq('version', variant)
.single()
// 어느 variant를 사용했는지 기록
await supabase.from('generations').update({ prompt_version: variant })
return data
}평가 데이터셋
create table evaluations (
id uuid primary key default gen_random_uuid(),
prompt_name text not null,
prompt_version int,
input text,
expected text,
actual text,
score float, -- 0-1
judge_model text,
judge_reason text,
evaluated_at timestamptz default now()
);LLM as Judge (자동 평가)
async function evaluate(input: string, actual: string, criteria: string) {
const { object } = await generateObject({
model: anthropic('claude-opus-4-7'), // 평가는 더 강력한 모델
schema: z.object({
score: z.number().min(0).max(10),
reason: z.string(),
}),
prompt: `다음 카피를 평가하세요:
입력: ${input}
출력: ${actual}
기준: ${criteria}
10점 만점으로 평가하고 이유를 한 줄로 설명하세요.`,
})
return object
}
// 배치 평가
async function evaluateBatch(name: string, version: number) {
const supabase = createServiceClient()
const { data: testCases } = await supabase
.from('test_cases')
.select('*')
.eq('prompt_name', name)
for (const tc of testCases ?? []) {
const actual = await generateWithPrompt(name, version, tc.input)
const eval_ = await evaluate(tc.input, actual, '한국 마케팅 카피로 적합한가')
await supabase.from('evaluations').insert({
prompt_name: name,
prompt_version: version,
input: tc.input,
actual,
score: eval_.score / 10,
judge_reason: eval_.reason,
})
}
}품질 지표 대시보드
-- 버전별 평균 점수
select
prompt_version,
count(*) as runs,
avg(score) as avg_score,
percentile_cont(0.5) within group (order by score) as median
from evaluations
where prompt_name = 'copy_generation'
group by prompt_version;사용자 피드백
create table generation_feedback (
id uuid primary key default gen_random_uuid(),
generation_id uuid references generations(id) on delete cascade,
rating int check (rating in (-1, 0, 1)), -- 👎 / 보통 / 👍
comment text,
created_at timestamptz default now()
);// UI
<div className="flex gap-2 mt-4">
<button onClick={() => rate(1)}>👍</button>
<button onClick={() => rate(-1)}>👎</button>
<button onClick={() => regenerate()}>다시 생성</button>
</div>프롬프트 개선 워크플로우
1. 사용자 피드백 수집 (👍 / 👎)
2. 👎 케이스 분석 → 패턴 파악
3. 새 프롬프트 v2 작성
4. 평가 데이터셋에서 v1 vs v2
5. v2 점수 더 높음 → 활성화 (is_active 변경)
6. 50% A/B 1주
7. 통계 유의미 → 100% rollout다음 챕터 (배포 시작)
CH.39 "Vercel 배포: 환경 변수 + 도메인 + SSL".
AI 프롬프트
🤖 AI에게 잘 물어보는 법 — 모델·전략별 프롬프트
Claude
무료: Sonnet 4.6 / Pro $20/mo: Opus 4.6
내 마스터 프로젝트의 AI 품질 관리 부분을 분석해서 실전 적용 + 개선 우선순위 3가지를 알려줘.
ChatGPT
무료: GPT-5.5 / Plus $20/mo: GPT-5.5 Pro
AI 품질 관리 관련 모범 사례·안티패턴 5개를 비교 분석해서 실전 적용를 위한 추천 방안을 알려줘.
Gemini
무료: 2.5 Flash / Pro $19.99/mo: 3.1 Pro
내 프로젝트 전체에서 AI 품질 관리 최적화 가능 위치와 리스크를 보고해줘.
Grok
무료: Grok 4.1 / SuperGrok $30/mo
2026년 한국 1인 개발자 시장의 AI 품질 관리 트렌드와 차별화 포인트를 정리해줘.
⭐ 이것만 기억하세요
AI 품질 관리: 프롬프트 버전 관리 + 평가는 이 3가지만 확실히 잡으세요
1.프롬프트 DB + A/B 테스트 = 데이터 기반 개선
2.LLM as Judge + 사용자 피드백 = 자동 품질 측정
3.다음 챕터에서 Vercel 배포
공유하기
진행도 38 / 50