클라썸
경력근거: 사람과 조직의 잠재력을 발견하고 극대화하는 서비스
※ 실제 산출물이 아닌 AI 예측 시안입니다.
클라썸은 대학·기업의 학습 Q&A 데이터를 가진 플랫폼이라, Q&A 중복을 묶고 미해결 질문을 짚는 이 도구는 클라썸에 쌓인 실제 질문·답변이 있어야 초안을 검증합니다.
'사람과 조직의 잠재력을 발견하고 극대화'가 미션. 묻고 답하는 학습/조직 데이터를 정리해 막힌 곳을 짚는 게 직접적 가치.
클라썸(러닝)·Telta(HR)가 AI 기반. Q&A·피드백 텍스트를 묶고 분류하는 LLM 작업이 제품 핵심과 정렬.
React·NestJS·PostgreSQL 풀스택. Q&A ingest→클러스터링→큐 제품화 흐름이 직무와 정렬.
강의·조직 Q&A 스레드를 받아 의미가 같은 질문을 묶고, 미해결·반복 질문을 근거와 함께 표시하며 답변 초안을 제안하는 1주 포트폴리오입니다.
클라썸 PE. 쌓이는 Q&A를 매번 사람이 읽고 중복·미해결을 추리던 상황을 끝내고, 그 정리를 자동 도구로 옮기고 싶은 사람입니다.
Q&A 스레드를 임베딩+LLM 으로 묶으면, (a) 표현이 달라도 같은 질문을 한 그룹으로 묶고 (b) 답 안 된/반복 질문을 근거와 함께 표시하며 답변 초안을 만들 수 있습니다.
강의·조직 Q&A를 받아 같은 질문을 묶고 미해결·반복을 짚으며 답변 초안을 근거와 함께 내는 동작하는 도구입니다.
답변 초안의 실제 채택률/수정량과 미해결 분류 정확도를 재고, 중복 묶음 정확도를 보여주는 대시보드입니다.
확정 답변을 RAG로 축적해 신규 질문에 자동 답변하고, 미해결만 사람에게 라우팅하는 단계입니다.
표현이 다른 같은 질문·결측·잡음 질문 30종을 넣어도 군집이 멈추지 않고 '미분류'로라도 처리하는 걸 시연합니다.
Q&A 스레드를 넣으면 질문 그룹과 미해결 큐, 답변 초안이 근거와 함께 몇 초 안에 나오는 걸 시연합니다.
모든 군집·큐 출력이 형식 검증(Zod)을 통과
측정: 자동 parse, 표본: 스레드 100건
같은 질문 묶음 30쌍 중 25쌍이 내가 만든 정답 그룹과 일치합니다. 단, 정답·데이터를 작성자가 만든 합성 기준이라 '성능 검증'이 아니라 '데모 조건 동작'
위 수치는 더미데이터 자가채점이며, 실제 군집·미해결 판정 정확도는 클라썸 실제 Q&A + 운영자 검수가 있어야 측정 가능합니다. 이 포트폴리오는 그 검증을 바로 돌릴 수 있는 상태까지 만듭니다.
수치는 합성 데이터 자가채점이라 성능 증명이 아닙니다. 면접에서는 데모 동작과 실검증 준비 상태로 솔직히 설명합니다.
정답을 작성자가 만들었으니 잘 맞는 것이 당연합니다. 같은 뜻 다른 표현·오타·결측·잡담 같은 헷갈리는 케이스를 더미에 일부러 섞어 쉬운 문제만 푸는 게 아님을 보여줍니다.
'미해결'의 기준은 강의·조직마다 다릅니다. 판정 규칙을 설정으로 외부화하고, 애매한 건 단정하지 말고 '검토 필요'로 표시합니다.
실제 도입 시 달라지는 것: 실 질문 분포·도메인 용어가 더미와 다르므로 유사도 임계와 미해결 규칙을 실데이터로 다시 맞춰야 한다(도입 단계 과제)
① 인라인 샘플 · ② seed.json 다운로드 · ③ 증강 프롬프트. 세 층 모두 동일한 schema 에서 파생.
강의/조직 Q&A 한 건 로그. 군집·미해결 판정 엔진이 가장 먼저 보는 표. 결측·중복표현·미분류를 일부러 섞었다.
| q_id | course_id | question | answered | answer_text | upvotes |
|---|---|---|---|---|---|
| q_001 | c_react | useEffect 의존성 배열은 언제 비워두나요? | true | 마운트 시 1회만 실행할 때 비웁니다. | 5 |
| q_002 | c_react | useEffect 디펜던시 빈 배열 의미가 뭐예요? | false | — | 3 |
| q_003 | c_react | 리렌더가 너무 자주 일어나요 | false | — | 8 |
| q_004 | c_db | 인덱스를 언제 걸어야 하나요? | true | 조회 조건 컬럼에 겁니다. | 2 |
| q_005 | c_db | index 거는 기준이 궁금합니다 | false | — | 1 |
아래 Zod 스키마에 맞는 강의 Q&A 스레드 100행 JSON 배열로 생성.
{"type":"object","properties":{"q_id":{"type":"string"},"course_id":{"type":["string","null"]},"question":{"type":"string"},"answered":{"type":"boolean"},"answer_text":{"type":["string","null"]},"upvotes":{"type":"integer"}},"required":["q_id","course_id","question","answered","answer_text","upvotes"]}
쉬운 데이터만 만들지 말 것. 하드 케이스 의도적 혼입: (1) 같은 뜻 다른 표현 질문쌍 3~4쌍(군집돼야 함), (2) 무의미('ㅁㄴㅇㄹ')·빈 question 각 1건, (3) course_id=null·answered=true인데 answer_text=null 모순 각 1건, (4) 미등록 course_id(orphan) 1건, (5) upvotes 0인 미해결 반복 질문 2건. JSON 배열만.{"type":"object","properties":{"q_id":{"type":"string"},"course_id":{"type":["string","null"]},"question":{"type":"string"},"answered":{"type":"boolean"},"answer_text":{"type":["string","null"]},"upvotes":{"type":"integer"}},"required":["q_id","course_id","question","answered","answer_text","upvotes"]}| TypeScript | Q&A ingest + 클러스터링 파이프라인 + Zod 런타임 검증 |
| NestJS | 정리 API (`POST /group`. 스레드 배열 → 질문 그룹 + 미해결 큐) |
| React | 질문 그룹·미해결 큐·답변 초안 대시보드 |
| PostgreSQL | Q&A 스레드 + 임베딩 저장 |
✓ pass → 그대로 멈춰도 완성품입니다. 더 키우려면 2주차(답변 초안·분류가 실제로 쓸 만한지 검증)로 갑니다.
✓ pass → 여기서 멈춰도 완결입니다. 더 키우려면 3주차(확정 답변 지식베이스화)로 갑니다.
질문 군집 + 미해결 여부 + 답변 초안 출력. 근거 인용 포함.
{"type":"object","properties":{"group_id":{"type":"string"},"member_q_ids":{"type":"array","items":{"type":"string"},"minItems":1},"canonical_question":{"type":"string","minLength":8},"status":{"type":"string","enum":["answered","open","needs_review"]},"draft_answer":{"type":["string","null"]},"evidence":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"quote":{"type":"string"}},"required":["field","quote"]},"minItems":1}},"required":["group_id","member_q_ids","canonical_question","status","draft_answer","evidence"]}[
{
"group_id": "g_useeffect_dep",
"member_q_ids": [
"q_001",
"q_002"
],
"canonical_question": "useEffect 의존성 빈 배열의 의미",
"status": "answered",
"draft_answer": "마운트 시 1회만 실행하라는 의미입니다.",
"evidence": [
{
"field": "answer_text",
"quote": "마운트 시 1회만 실행할 때 비웁니다."
}
]
},
{
"group_id": "g_rerender",
"member_q_ids": [
"q_003",
"q_012"
],
"canonical_question": "리렌더가 자주 발생하는 문제 해결",
"status": "open",
"draft_answer": "메모이제이션·의존성 점검을 제안합니다.",
"evidence": [
{
"field": "upvotes",
"quote": "8"
}
]
},
{
"group_id": "g_noise",
"member_q_ids": [
"q_006",
"q_007"
],
"canonical_question": "(분류 불가)",
"status": "needs_review",
"draft_answer": null,
"evidence": [
{
"field": "question",
"quote": "ㅁㄴㅇㄹ"
}
]
}
]자동: (1) Zod parse, (2) evidence.field 가 입력 스키마 실제 필드명인지, (3) status=needs_review 면 draft_answer=null 규칙 체크. 수동/judge: 군집 정확도는 LLM-as-judge + 5% 사람 확인.
근거: 사람과 조직의 잠재력을 발견하고 극대화하는 서비스