디피니트
경력근거: 현업이 자연어로 데이터를 묻고 의사결정할 수 있게 만드는 B2B AI 솔루션
※ 실제 산출물이 아닌 AI 예측 시안입니다.
디피니트는 RAG·Text-to-SQL로 현업이 자연어로 데이터를 묻고 의사결정하게 만드는 B2B AI 데이터 플랫폼을 만듭니다. 재고 표 하나에 자연어로 묻고 근거를 남기는 이 작은 도구는 그 핵심 업무를 1주에 혼자 완결되는 크기로 줄여 MVP로 만든 것입니다. 백엔드 PE가 API·DB·로그·배포를 설계하는 자리라 질의 API(Python)·재고 저장(PostgreSQL)·실행 로그·Docker 배포까지 한 사람이 끝까지 구현하는 데 적합합니다.
현업이 자연어로 데이터를 묻고 의사결정하게 만드는 게 디피니트의 핵심 제품입니다. 재고 질문을 읽기 전용 SQL로 바꿔 답하는 이 도구가 그 업무와 곧바로 정렬됩니다.
응답 근거·실행 SQL·실패를 추적하는 로그와 운영 도구를 만드는 자리입니다. 실행 SQL과 근거 행을 남기는 이 콘솔의 추적 구조와 직접 닿습니다.
AI 기능이 실제 고객 환경에서 안정적으로 도는 제품 백엔드를 만들고 Docker 기반 dev/staging/prod 배포를 담당합니다. 위험 질의 차단을 갖춘 작은 운영 콘솔과 맞습니다.
창고 관리자의 재고 질문을 받아 재고 현황 표(품목·창고·현재고·안전재고·입고일) 하나에 대한 읽기 전용 SQL을 생성해 실행하고, 실행한 SQL과 근거가 된 재고 행을 함께 보여주는 관리자 페이지입니다. 쓰기·삭제 같은 위험한 질의는 규칙으로 막고, 품목이 모호하면 추측 대신 되묻습니다. 품목 별칭 사전을 붙여 같은 품목의 다른 표기를 정규화합니다.
디피니트 Product Engineer가 만드는 도구를 쓰는 창고 관리자입니다. '안전재고 밑으로 떨어진 품목이 뭐지', '지난주 입고된 게 뭐였지'를 알고 싶을 때마다 데이터팀에 요청하고 기다리던 상황을, 한 콘솔에서 자연어로 묻고 생성된 SQL과 근거 재고 행을 함께 보며 답이 맞는지 직접 확인하고 싶은 사람입니다.
재고 현황 표 하나와 품목 별칭 사전을 한 구조로 묶으면, (a) 재고 질문을 읽기 전용 SQL로 변환해 실행하고, (b) 쓰기·삭제 같은 위험 질의를 규칙으로 차단하며, (c) 생성 SQL이 심어둔 정답 SQL과 같은 결과를 내는지 실행 결과 대조로 채점합니다.
재고 질문을 받아 재고 표 하나에 대한 읽기 전용 SQL을 생성해 실행하고, 실행한 SQL과 근거 재고 행을 함께 보여주는 동작하는 콘솔입니다. 입력은 창고 재고를 가정한 더미 표 하나로 시작하고, 위험 질의 차단은 규칙으로 처리합니다. 1주차 기본 기능은 Next 프론트를 Vercel로 배포해 바로 도는 데모로 만듭니다.
생성한 SQL을 심어둔 정답 SQL과 같은 데이터를 돌려주는지 실행 결과로 대조해 정확도를 보여주고, 모호 질의는 검토자 2명이 의도를 라벨링해 일치도를 보여주는 화면입니다. 이 단계부터 질의 API(Python)·PostgreSQL을 AWS(ECS·RDS)에 배포·운영하고 클라우드 비용을 대략 산정합니다.
재고 표 하나에서 입고·출고 같은 표 여러 개로 늘리고, 표가 많아질 때 질문에 맞는 표·컬럼을 Elasticsearch로 검색해 고르는 단계입니다. 표 간 조인과 동의어 사전을 더해 질의 범위를 넓힙니다.
창고 관리자 질문 12종(안전재고 미달 품목·지난주 입고·창고별 재고 등)을 넣으면, 읽기 전용 SQL과 실행 결과·근거 행이 몇 초 안에 나오는 걸 시연합니다
일부러 만든 악성·결측 입력 30종(쓰기·삭제 시도·없는 컬럼·모호한 품목·전체 스캔 유도)을 넣어도 출력 형식(스키마)이 한 번도 안 깨지고 위험 질의는 전부 차단되는 걸 보여줍니다
질문이 들어오면 SQL 생성과 읽기 전용 실행이 자동으로 이어지는 걸 시연으로 보여줍니다
내가 만든 정답 40건 중 생성 SQL이 정답 SQL과 같은 결과를 낸 게 34건(약 85%)입니다. 정답 SQL을 미리 심어 실행 결과로 대조하므로 객관 채점되고 위험 질의 차단은 규칙으로 결정됩니다. 단, 정답과 데이터를 모두 작성자가 만든 합성 기준이라 '성능 검증'이 아니라 '데모 조건에서의 동작'임을 명시합니다
진짜 성능 검증은 여기서 멈춥니다. 위 수치는 전부 작성자가 만든 더미데이터 자가채점이며, 실제 SQL 정확도는 디피니트 실 고객 재고 표와 실 창고 관리자 질문이 있어야 측정 가능합니다. 이 도구는 그 검증을 바로 돌릴 수 있는 상태까지 만듭니다
수치는 합성 데이터 자가채점이라 성능 증명이 아닙니다. 면접에서는 데모 동작과 실검증 준비 상태로 솔직히 설명합니다
정답 SQL을 작성자가 만들었으니 잘 맞는 게 당연합니다. 모호한 품목·없는 컬럼·표기 흔들림 같은 경계 케이스를 더미에 일부러 섞어, 쉬운 문제만 푸는 게 아님을 보여줍니다
Text-to-SQL은 없는 컬럼이나 잘못된 조건을 지어낼 수 있습니다. 생성 SQL은 컬럼 사전과 대조해 검증하고, 읽기 전용 SELECT만 허용하며, 모호하면 단정 대신 되묻습니다
품목 표기가 입력마다 제각각입니다. 별칭 사전으로 같은 품목으로 묶고, 못 묶은 건 추측하지 말고 '미매핑 품목'으로 알립니다
실제 도입 시 달라지는 점을 명시합니다. 실 고객 재고 표 구조·권한 정책·질문 분포는 더미와 다르므로 별칭 사전·차단 규칙을 다시 맞추고 검토자도 실제 데이터팀으로 교체해야 합니다(도입 단계 과제로 분리)
① 인라인 샘플 · ② seed.json 다운로드 · ③ 증강 프롬프트. 세 층 모두 동일한 schema 에서 파생.
질의 대상이 되는 창고 재고 현황 표 하나. SQL 생성·실행이 읽는 입력입니다. 결측·경계값·미등록 품목·표기 흔들림을 일부러 섞어, 쉬운 데이터만 푸는 게 아님을 보여줍니다.
| sku_raw | sku_id | name | warehouse | on_hand | safety_stock | received_date |
|---|---|---|---|---|---|---|
| AX-100 | sku_ax100 | 방수자켓 | seoul | 12 | 20 | 2026-05-02 |
| ax 100 | sku_ax100 | 방수자켓 | busan | 0 | 10 | 2026-05-03 |
| BX-220 | — | 등산화 | seoul | 60 | 30 | — |
| CX-330 | sku_cx330 | 텐트 | seoul | 5 | 15 | 2026-05-06 |
| CX-330 | sku_cx330 | 텐트 | busan | 9,999 | 15 | 2026-05-04 |
아래 JSON Schema({"type":"object","properties":{"sku_raw":{"type":"string"},"sku_id":{"type":["string","null"]},"name":{"type":"string"},"warehouse":{"enum":["seoul","busan"]},"on_hand":{"type":["integer","null"]},"safety_stock":{"type":["integer","null"]},"received_date":{"type":["string","null"]}},"required":["sku_raw","sku_id","name","warehouse","on_hand","safety_stock","received_date"]})에 맞는 창고 재고 현황 표 40행을 JSON 배열로 생성합니다. 품목 6~8개(아웃도어 용품), 창고 seoul/busan. 모두 가상 더미.
쉬운 데이터만 만들지 말 것. 다음 하드 케이스를 의도적으로 섞어라(쉬운 문제만 푸는 함정 회피): (1) 미등록 품목(sku_id=null, sku_raw·name만 채움) 4건, (2) 경계값(on_hand=0 품절, on_hand 극단 9999, on_hand=safety_stock 동일) 3건, (3) 품목 코드 표기 흔들림('AX-100'/'ax 100'/'CX 330') 3건, (4) 결측(on_hand·safety_stock·received_date 일부 null) 4건. JSON 배열만.{"type":"object","properties":{"sku_raw":{"type":"string"},"sku_id":{"type":["string","null"]},"name":{"type":"string"},"warehouse":{"enum":["seoul","busan"]},"on_hand":{"type":["integer","null"]},"safety_stock":{"type":["integer","null"]},"received_date":{"type":["string","null"]}},"required":["sku_raw","sku_id","name","warehouse","on_hand","safety_stock","received_date"]}재고 질문과 그에 대한 정답 SQL·기대 결과 정답셋. 생성 SQL 채점이 대조하는 기준입니다. 모호 질문·위험 질문·답 없는 질문을 일부러 섞어, 쉬운 문제만 푸는 게 아님을 보여줍니다.
| q_id | question | gold_sql | expected_rows | kind |
|---|---|---|---|---|
| q_001 | 안전재고 밑으로 떨어진 품목 보여줘 | SELECT sku_raw, name, on_hand, safety_… | 1 | normal |
| q_002 | 방수자켓 서울 창고 재고 얼마야? | SELECT on_hand FROM inventory_table WH… | 1 | normal |
| q_003 | 그 품목 재고 알려줘 | — | — | ambiguous |
| q_004 | 재고 표 다 지워줘 | — | — | dangerous |
| q_005 | 지난주에 입고된 품목 목록 보여줘 | SELECT sku_raw, name, received_date FR… | 1 | normal |
아래 JSON Schema에 맞는 재고 질문 정답셋 40행을 JSON 배열로 생성합니다.
{"type":"object","properties":{"q_id":{"type":"string"},"question":{"type":"string"},"gold_sql":{"type":["string","null"]},"expected_rows":{"type":["integer","null"]},"kind":{"enum":["normal","ambiguous","dangerous","unanswerable"]}},"required":["q_id","question","gold_sql","expected_rows","kind"]}
쉬운 데이터만 만들지 말 것. 정답 SQL은 inventory_table 한 표만 대상으로 명확히 심되 다음 하드 케이스를 의도적으로 섞어라: (1) 모호 질문(지시어 '그 품목'·기준 불명, gold_sql=null, kind=ambiguous) 5건, (2) 위험 질문(삭제·전체 스캔, gold_sql=null, kind=dangerous) 4건, (3) 답 없는 질문(재고 표에 없는 지표 '매출', kind=unanswerable) 3건, (4) 여러 행을 기대하는 정상 질문(expected_rows>=2) 2건. 정상 질문은 읽기 전용 SELECT만. JSON 배열만.{"type":"object","properties":{"q_id":{"type":"string"},"question":{"type":"string"},"gold_sql":{"type":["string","null"]},"expected_rows":{"type":["integer","null"]},"kind":{"enum":["normal","ambiguous","dangerous","unanswerable"]}},"required":["q_id","question","gold_sql","expected_rows","kind"]}| Python | Text-to-SQL 질의 API·SQL 생성 파이프라인·위험 질의 검사 규칙의 구현 언어 |
| PostgreSQL | 재고 현황 표와 품목 별칭 사전·질의 로그·정답 SQL의 주 저장소 |
| Docker | 질의 API의 dev/staging/prod 컨테이너 구성과 배포 |
| AWS | 2주차부터 질의 API·PostgreSQL을 AWS(ECS·RDS)로 배포·운영 |
| LLM | 재고 질문을 읽기 전용 SQL로 변환하고 답을 자연어로 요약 |
| RAG | few-shot 예시 질의를 검색해 SQL 생성의 근거로 제공(표 하나라 가벼운 예시 검색) |
| Elasticsearch | 3주차에 표가 여러 개로 늘 때 질문에 맞는 표·컬럼을 검색해 고르는 용도(1주차 단일 표에서는 미사용) |
| Go | 3주차 다중 표 단계에서 읽기 전용 실행 프록시를 별도 서비스로 분리할 때의 고성능 경로 가정 |
| MySQL | 3주차에 일부 레거시 출고 데이터를 연동할 때의 보조 저장소 가정 |
| ChatGPT | SQL 생성 프롬프트 보조·위험 패턴 규칙 초안 작성 도구로 활용 |
| Claude | 재고 질문의 SQL 생성과 결과 요약 본 모델로 활용 |
| REST | 콘솔과 질의 API 사이의 질문 제출·결과 조회 인터페이스 |
✓ pass → 그대로 멈춰도 완결입니다. 더 키우려면 2주차(정답 대조 채점 + AWS 배포)로 진행합니다.
✓ pass → 여기서 멈춰도 완결입니다. 더 키우면 3주차(여러 창고 표로 확장 + 표·컬럼 검색)로 진행합니다.
재고 질문 1건의 질의 결과 카드. 생성 SQL·근거 재고 행·확신도와 안전 검사(읽기 전용·위험 차단)·모호 시 되묻기를 한 스키마로 담아 질의 콘솔에 씁니다.
{"type":"object","properties":{"q_id":{"type":"string"},"generated_sql":{"type":["string","null"]},"evidence_rows":{"type":"array","items":{"type":"string"}},"answer":{"type":["string","null"]},"confidence":{"enum":["low","mid","high"]},"safety":{"type":"object","properties":{"read_only":{"type":"boolean"},"blocked":{"type":"boolean"},"clarify_needed":{"type":"boolean"},"note":{"type":["string","null"]}},"required":["read_only","blocked","clarify_needed","note"]},"hedge":{"type":["string","null"]}},"required":["q_id","generated_sql","evidence_rows","answer","confidence","safety","hedge"]}[
{
"input_ref": "q_001 (안전재고 미달 품목 — 정상)",
"output": {
"q_id": "q_001",
"generated_sql": "SELECT sku_raw, name, on_hand, safety_stock FROM inventory_table WHERE on_hand < safety_stock",
"evidence_rows": [
"AX-100 방수자켓 on_hand 12 < safety_stock 20",
"CX-330 텐트 on_hand 5 < safety_stock 15"
],
"answer": "안전재고 밑으로 떨어진 품목은 방수자켓, 텐트 등입니다.",
"confidence": "high",
"safety": {
"read_only": true,
"blocked": false,
"clarify_needed": false,
"note": null
},
"hedge": null
}
},
{
"input_ref": "q_004 (재고 표 삭제 — 위험)",
"output": {
"q_id": "q_004",
"generated_sql": null,
"evidence_rows": [],
"answer": null,
"confidence": "high",
"safety": {
"read_only": true,
"blocked": true,
"clarify_needed": false,
"note": "쓰기·삭제 질의라 차단했습니다. 이 콘솔은 읽기 전용만 실행합니다."
},
"hedge": null
}
},
{
"input_ref": "q_003 (그 품목 재고 — 모호)",
"output": {
"q_id": "q_003",
"generated_sql": null,
"evidence_rows": [],
"answer": null,
"confidence": "low",
"safety": {
"read_only": true,
"blocked": false,
"clarify_needed": true,
"note": "어떤 품목인지 지정되지 않아 되물어야 합니다."
},
"hedge": "지시어 '그 품목'의 대상이 모호해 단정하지 않고 되묻습니다."
}
}
][자동 검증 — 코드가 매 출력마다 자동으로 거릅니다] 1) JSON Schema 형식 통과: 출력이 정한 필드·타입을 지키는지 검사하고, 어기면 거부합니다. 2) generated_sql 이 읽기 전용(SELECT)인지, 쓰기·삭제·전체 스캔 패턴이 없는지 코드가 검사합니다. 위반이면 safety.blocked=true 로 강제합니다. 3) generated_sql 의 컬럼이 재고 표 컬럼 사전에 있는지 대조합니다 — 없는 컬럼을 지어내지 못하게 합니다. 4) generated_sql 을 읽기 전용으로 실행한 결과가 정답 SQL 결과와 같은지 비교해 채점합니다(결과 동치). 5) generated_sql 이 null 이면 confidence=high 를 금지합니다(빈 답에 높은 확신 방지). [수동 검증 — 사람이 일부만 확인합니다] 1) 검토자 2명이 같은 모호 질의의 의도를 따로 라벨링해, 두 사람 판단이 우연 이상으로 일치하는지 봅니다(Cohen's κ ≥ 0.6 — 0~1, 높을수록 일치). 2) 전체 출력의 5%는 사람이 직접 다시 확인합니다(spot check). [전제] 정답 SQL을 미리 심어 실행 결과로 대조하므로, SQL 정밀도·재현율을 객관적으로 채점할 수 있습니다.
근거: 현업이 자연어로 데이터를 묻고 의사결정할 수 있게 만드는 B2B AI 솔루션