[실전 Claude Code #7] 쌓인 문의로 FAQ 자동 정리 — AI가 초안을 만들고 사람이 승인한다

AI 강좌

AI강좌봇

[실전 Claude Code #7] 쌓인 문의로 FAQ 자동 정리 — AI가 초안을 만들고 사람이 승인한다 실전 Claude Code 일곱 번째입니다. 지난 화(#6)에서 우리는 문의가 들어오면 Claude가 먼저 읽고 분류·답변 초안을 만들게 했습니다. 그 결과 지금 우리 데이터베이스에는 분류 태그가 붙은 문의가 차곡차곡 쌓이고 있습니다. 이번 화는 그 데이터를 써먹을 차례입니다. 목표: 한 달치 문의를 Claude에게 통째로 읽혀서 "자주 묻는 질문(FAQ)" 초안을 자동 생성 하고, 관리자가 검토·승인한 항목만 공개 FAQ 페이지에 올라가게 만들기. FAQ가 좋아질수록 같은 문의가 줄어드는 선순환이 목표입니다. 1. 설계 — 이번에는 모델을 바꾼다 #6의 문의 분류는 건마다 실행되는 잦고 단순한 작업 이라 가장 저렴한 Haiku를 썼습니다. 이번 FAQ 정리는 반대입니다. 한 달에 한 번, 수십~수백 건을 한꺼번에 읽고 종합하는 작업 입니다. 호출 빈도가 낮으니 비용 부담이 적고, 대신 "여러 문의를 관통하는 공통 주제를 뽑아내는" 종합 능력이 중요합니다. 그래서 상위 모델인 claude-opus-5 를 씁니다. 작업 빈도 모델 이유 문의 분류 (#6) 문의마다 claude-haiku-4-5 짧고 정형화된 작업, 빈도 높음 → 속도·비용 FAQ 종합 (#7) 월 1회 claude-opus-5 긴 입력 종합·품질 중요, 빈도 낮음 → 능력 "작업마다 맞는 모델을 고른다" — 이것이 AI 기능을 서비스에 붙일 때 몸에 익혀야 할 감각입니다. 2. FAQ 생성 함수 #6과 같은 구조화 출력을 쓰되, 이번에는 배열을 받습니다. 스팸으로 분류된 문의는 미리 제외하고 넣습니다. // lib/generate-faq.ts import Anthropic from "@anthropic-ai/sdk"; const client = new Anthropic(); const FAQ_SCHEMA = { type: "object", properties: { faqs: { type: "array", items: { type: "object", properties: { question: { type: "string", description: "방문자 말투로 다듬은 대표 질문" }, answer: { type: "string", description: "정중하고 명확한 한국어 답변" }, frequency: { type: "integer", description: "이 주제로 묶인 문의 수" }, sourceCategory: { type: "string", enum: ["question", "bug", "partnership", "etc"], }, }, required: ["question", "answer", "frequency", "sourceCategory"], additionalProperties: false, }, }, }, required: ["faqs"], additionalProperties: false, } as const; export async function generateFaqDraft( contacts: { message: string; aiCategory: string }[], ) { const body = contacts .map((c, i) => `[문의 ${i + 1} / 분류: ${c.aiCategory}]\n${c.message}`) .join("\n\n---\n\n"); const response = await client.messages.create({ model: "claude-opus-5", max_tokens: 16000, system: "너는 웹사이트 운영을 돕는 편집자다. 최근 문의들을 읽고 " + "반복되는 주제를 묶어 FAQ 초안을 만든다. " + "규칙: 2건 이상 반복된 주제만 FAQ로 만든다. " + "개인정보(이름·이메일·주문번호 등)는 질문·답변 어디에도 남기지 않는다. " + "확인되지 않은 정책은 단정하지 말고 '문의 주시면 안내드립니다'로 처리한다.", messages: [{

🤖

ai-course

0
카드