인터엑스
경력근거: 인터엑스 자체 개발 제조 문서 분석 솔루션 ‘Document.AI’가 AWS 마켓플레이스에
※ 실제 산출물이 아닌 AI 예측 시안입니다.
인터엑스는 '인터엑스 자체 개발 제조 문서 분석 솔루션 Document.AI' 를 회사 소개의 첫 성과로 적었습니다. 문서에서 값을 읽어내는 데까지가 그 제품의 일이라면, 읽어낸 값이 품목 기준과 맞는지는 사람이 열어 보는 화면이 맡습니다. 이 화면은 공고가 담당업무로 적은 '비즈니스 정책 분석 및 정보 구조(IA) 설계' 와 '다양한 상태와 조건별 분기 로직이 반영된' 화면을 React·TypeScript 로 만들어 보여줍니다. 제조 문서 분석 도메인 전문성은 주장하지 않습니다. 실제 항목 목록과 허용 표기는 인터엑스 고객사의 사양서와 품목 기준표가 있어야 정해집니다.
회사 소개가 첫 성과로 내세우는 제품이 '인터엑스 자체 개발 제조 문서 분석 솔루션 Document.AI' 입니다. 읽어낸 값이 품목 기준과 맞는지 사람이 확인하는 화면은 그 제품 바로 뒤에 붙는 자리입니다.
담당업무 첫 줄이 '비즈니스 정책 분석 및 정보 구조(IA) 설계'입니다. 품목 기준표라는 정책을 읽어 다섯 사유로 나눈 목록 구조가 그 설계의 결과물입니다.
담당업무가 '다양한 상태와 조건별 분기 로직이 반영된 인터랙티브 프로토타입'을, 우대사항이 'React, TypeScript 기반 UI 컴포넌트 구조'를 지목합니다. 판정 사유마다 갈라지는 화면 상태를 그 스택으로 만듭니다.
제조 문서에서 뽑힌 항목 값을 원문 표기 그대로 받습니다. 값 칸에 같이 들어온 단위와 천 단위 쉼표를 떼어 수치 표기를 맞추고, 문서마다 다르게 적힌 항목 이름을 품목 기준표의 별칭과 맞춘 다음, 기준과 어긋난 자리를 다섯 사유로 나눠 보여줍니다. 사유를 정하는 것은 기준표를 읽는 규칙이고, 모델은 어느 품번의 어느 항목이 얼마나 어긋났는지를 문서 담당자가 읽을 한 문장으로 적습니다.
인터엑스 Document.AI 에 제조 문서를 올려 두고 쓰는 고객사 문서 담당자입니다. 사양서·작업표준에서 뽑힌 값이 맞는지는 원본 문서를 열어 품목 기준표와 한 줄씩 대조해야 알 수 있어, 문서가 하루 수백 건씩 들어오면 앞쪽 몇 건만 보고 나머지는 그대로 넘기는 자리에 있습니다.
문서마다 항목 이름과 단위 표기가 흔들려도, 표기를 규칙으로 맞춘 뒤 품목 기준표와 견주면 어느 문서의 어느 항목이 어떤 사유로 어긋났는지 정해집니다.
문서 판독 결과 파일과 품목 기준표를 올리면 값 표기와 단위 표기를 맞춘 뒤 사유별로 나눈 목록과 근거를 보여주는 화면입니다. Document.AI 연동 없이 판독 결과 CSV 내려받기 파일을 입력으로 삼습니다.
문서 담당자 2명이 손으로 매긴 판정과 도구 판정이 얼마나 겹치는지 일치도로 냅니다. 기준값이 낡았을 때는 기준표를 화면에서 고친 뒤 같은 문서를 다시 넣어 사유가 어떻게 바뀌는지 봅니다. 운영 환경은 이 주차부터 AWS 입니다.
어긋난 항목을 문서별로 모아 고객사에 보낼 확인 요청 목록을 자동으로 한 번 만듭니다.
문서 담당자가 판독 결과 파일과 품목 기준표를 올리면 어긋난 항목이 사유별로 몇 초 안에 나옵니다.
단위 칸이 비고 항목 이름이 흔들린 판독 결과 30종을 섞어도 목록이 끊기지 않고 사유가 남습니다.
근거로 붙인 값이 판독 행·기준표 행에 실재하는 비율 100%. 실재하지 않으면 그 판정을 화면에서 막습니다
측정: 근거 대조 규칙, 표본: 판정 항목 60건
진짜 성능 검증은 여기서 멈춥니다. 위 수치는 작성자가 만든 더미데이터 자가채점이며, 실제 판정 정확도는 인터엑스 실데이터와 실 검수자가 있어야 잽니다. 이 포트폴리오는 그 측정을 바로 돌릴 수 있는 상태까지 만듭니다.
수치는 합성 데이터 자가채점이라 성능 증명이 아닙니다. 면접에서는 데모 동작과 실측 준비 상태로 솔직히 설명합니다.
정답을 작성자가 만들었으니 잘 맞는 것이 당연합니다. 단위 표기 결측·항목 이름 표기 흔들림·다른 품번의 기준값 같은 악성·경계 케이스를 더미에 일부러 섞어 쉬운 문제만 푸는 게 아님을 보입니다.
이 포트폴리오가 보여주는 것은 표기 정규화와 규칙 엔진, 그리고 화면 구현입니다. 제조 문서 분석 도메인 전문성은 주장하지 않습니다. 모르는 깊이는 면접에서 모른다고 말하는 편이 낫습니다.
기준과 같다는 판정이 그 문서가 맞다는 뜻은 아닙니다. 이 화면은 품목 기준표가 담은 항목까지만 말하고 문서 전체의 정확성은 단정하지 않습니다.
실제 도입에서는 항목 이름과 기준값이 고객사마다 다릅니다. 품목 기준표를 실데이터로 다시 채우는 것이 도입 단계 과제입니다.
① 인라인 샘플 · ② seed.json 다운로드 · ③ 증강 프롬프트. 세 층 모두 동일한 schema 에서 파생.
제조 문서에서 뽑힌 항목 값을 원문 표기 그대로 담습니다. 문서마다 항목 이름 표기가 흔들리고, 값과 단위가 한 칸에 같이 들어오거나 단위 칸이 비어 있는 행이 섞여 있습니다
| readout_id | doc_id | doc_type | item_code | field_name | read_value | read_unit | read_at |
|---|---|---|---|---|---|---|---|
| RD-4120-01 | DOC-4120 | 사양서 | PN-2201 | 포장 수량 | 24 | 개 | 2026-08-24 |
| RD-4120-02 | DOC-4120 | 사양서 | PN-2201 | 순중량 | 0.95 | kg | 2026-08-24 |
| RD-4120-03 | DOC-4120 | 사양서 | PN-2201 | 표면처리 등급 | A3 | — | 2026-08-24 |
| RD-4133-01 | DOC-4133 | 사양서 | PN-2204 | 포장수량 | 12 | 개 | 2026-08-24 |
| RD-4133-02 | DOC-4133 | 사양서 | PN-2204 | 순 중량 | 1.10 | kg | 2026-08-24 |
{"type":"object","properties":{"readout_id":{"type":"string"},"doc_id":{"type":"string"},"doc_type":{"type":"string","enum":["사양서","작업표준","검사성적서"]},"item_code":{"type":"string"},"field_name":{"type":"string"},"read_value":{"type":"string"},"read_unit":{"type":["string","null"]},"read_at":{"type":"string"}},"required":["readout_id","doc_id","doc_type","item_code","field_name","read_value","read_unit","read_at"]} 쉬운 데이터만 만들지 말 것. 다음 하드 케이스를 의도적으로 섞어라: read_unit 이 null 인 행(문서에 단위 표기가 없는 행과 등급처럼 단위가 없는 항목 행을 모두 만든다), read_value 에 '24개'·'1,200' 처럼 단위와 천 단위 쉼표가 섞인 표기, 같은 항목을 '포장 수량'·'포장수량'·'포장 수량(EA)' 로 적은 field_name, read_unit 을 'EA'·'㎏'·'KG' 로 적은 별칭 표기, 기준표가 필수로 둔 항목이 그 doc_id 에는 아예 없는 문서, 다른 품번의 기준값과 똑같은 read_value 를 가진 행. 형식 깨뜨리기 시도 3건도 별도로 만들어라.{"type":"object","properties":{"readout_id":{"type":"string"},"doc_id":{"type":"string"},"doc_type":{"type":"string","enum":["사양서","작업표준","검사성적서"]},"item_code":{"type":"string"},"field_name":{"type":"string"},"read_value":{"type":"string"},"read_unit":{"type":["string","null"]},"read_at":{"type":"string"}},"required":["readout_id","doc_id","doc_type","item_code","field_name","read_value","read_unit","read_at"]}품목마다 정해 둔 기준표입니다. 항목 이름과 문서에서 쓰이는 별칭, 기준값과 기준 단위, 문서에 반드시 있어야 하는 항목인지를 담습니다. 판독 행에는 이 값이 들어가지 않고 판정할 때 읽어 씁니다
| item_code | field_name | field_alias_raw | standard_value | standard_unit | is_required |
|---|---|---|---|---|---|
| PN-2201 | 포장 수량 | 포장수량 | 24 | 개 | true |
| PN-2201 | 순중량 | 순 중량 | 0.95 | kg | true |
| PN-2201 | 표면처리 등급 | 표면 처리 등급 | A3 | — | true |
| PN-2204 | 포장 수량 | 포장수량 | 24 | 개 | true |
| PN-2204 | 순중량 | 순 중량 | 1.10 | kg | true |
{"type":"object","properties":{"item_code":{"type":"string"},"field_name":{"type":"string"},"field_alias_raw":{"type":"string"},"standard_value":{"type":"string"},"standard_unit":{"type":["string","null"]},"is_required":{"type":"boolean"}},"required":["item_code","field_name","field_alias_raw","standard_value","standard_unit","is_required"]} 쉬운 데이터만 만들지 말 것. 다음 하드 케이스를 의도적으로 섞어라: standard_unit 이 null 인 무단위 항목(등급·재질), field_name 과 field_alias_raw 의 띄어쓰기가 다른 행, 같은 field_name 을 서로 다른 item_code 가 같은 standard_value 로 갖는 행, is_required 가 거짓이라 문서에 없어도 되는 항목. 형식 깨뜨리기 시도 3건도 별도로 만들어라.{"type":"object","properties":{"item_code":{"type":"string"},"field_name":{"type":"string"},"field_alias_raw":{"type":"string"},"standard_value":{"type":"string"},"standard_unit":{"type":["string","null"]},"is_required":{"type":"boolean"}},"required":["item_code","field_name","field_alias_raw","standard_value","standard_unit","is_required"]}| TypeScript | 판정 사유 다섯 값과 표기 정규화 단계를 타입으로 묶어, 스키마를 벗어난 응답이 화면까지 가지 못하게 합니다 |
| React | 사유별로 나눈 항목 목록과 근거 상세를 그립니다 |
| Next.js | 화면 셸과 판독 결과 업로드 라우트를 맡습니다 |
| AWS | 2주차에 판정 API 와 화면을 함께 올려 품질 담당자가 사내에서 접속합니다 |
| Figma | 사유마다 갈라지는 화면 상태와 조건별 분기를 UI 명세로 먼저 정리합니다 |
| LLM | 목록에 걸리는 요약 한 문장만 모델 몫입니다. 어긋난 항목과 두 수치는 기준표 대조 규칙이 확정합니다 |
✓ pass → 그대로 멈춰도 완성품입니다. 더 키우려면 2주차 사람 판정 대조로 갑니다.
✓ pass → 여기서 멈춰도 완결입니다. 더 키우려면 3주차 확인 요청 목록으로 갑니다.
위 예측 UI 는 3주차까지 완주했을 때의 화면입니다. 1주차에 실제로 만드는 것은 아래 표시된 화면 하나입니다.
verdict사유 라벨 · readout_id + 한 줄 요약(근거 수치 포함)화면·코드·면접에서 이 단어를 그대로 씁니다. 키는 출력 스키마의 enum 과 같습니다.
standard_matched기준과 같음value_differs값 다름unit_differs단위 표기 다름required_field_missing필수 항목 없음read_from_other_item다른 품번 값문서에서 읽어낸 항목 하나의 판정 카드입니다. 판정 사유와 정규화한 값·단위 표기, 그 판정에 쓰인 근거 행을 담습니다
{"type":"object","properties":{"readout_id":{"type":["string","null"]},"doc_id":{"type":"string"},"item_code":{"type":"string"},"field_name":{"type":"string"},"verdict":{"type":"string","enum":["standard_matched","value_differs","unit_differs","required_field_missing","read_from_other_item"]},"read_value_norm":{"type":["string","null"],"description":"read_value 에서 천 단위 쉼표와 앞뒤 수식어를 떼고, 값 칸에 같이 들어온 단위 표기를 단위 자리로 옮긴 뒤 남은 표기입니다."},"read_unit_norm":{"type":["string","null"],"description":"read_unit 에 단위 별칭 규칙(EA·PCS 는 개, ㎏·KG 는 kg)을 적용한 표기이고, 값 칸에서 옮겨 온 단위도 여기 들어갑니다. 표기를 못 채우면 null 입니다."},"source_item_code":{"type":["string","null"],"description":"read_from_other_item 일 때 그 값이 기준값으로 실려 있는 다른 품번입니다."},"evidence":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"value":{"type":["string","number","boolean","null"]},"agg":{"type":"string","enum":["count","sum","avg","min","max"]}},"required":["field","value"]}},"summary":{"type":"string"}},"required":["readout_id","doc_id","item_code","field_name","verdict","read_value_norm","read_unit_norm","source_item_code","evidence","summary"]}[
{
"readout_id": "RD-4120-01",
"doc_id": "DOC-4120",
"item_code": "PN-2201",
"field_name": "포장 수량",
"verdict": "standard_matched",
"read_value_norm": "24",
"read_unit_norm": "개",
"source_item_code": null,
"evidence": [
{
"field": "readout_id",
"value": "RD-4120-01"
},
{
"field": "read_value",
"value": "24"
},
{
"field": "read_unit",
"value": "개"
},
{
"field": "standard_value",
"value": "24"
},
{
"field": "standard_unit",
"value": "개"
}
],
"summary": "포장 수량이 문서와 기준 모두 24개라 이 항목은 기준과 같습니다."
},
{
"readout_id": "RD-4184-01",
"doc_id": "DOC-4184",
"item_code": "PN-2201",
"field_name": "포장 수량",
"verdict": "standard_matched",
"read_value_norm": "24",
"read_unit_norm": "개",
"source_item_code": null,
"evidence": [
{
"field": "readout_id",
"value": "RD-4184-01"
},
{
"field": "read_value",
"value": "24개"
},
{
"field": "read_unit",
"value": null
},
{
"field": "standard_value",
"value": "24"
},
{
"field": "standard_unit",
"value": "개"
}
],
"summary": "값 칸에 '24개'가 통째로 들어와 단위 칸이 비었지만, 단위 표기를 단위 자리로 옮기면 기준 24개와 같습니다."
},
{
"readout_id": "RD-4133-01",
"doc_id": "DOC-4133",
"item_code": "PN-2204",
"field_name": "포장수량",
"verdict": "value_differs",
"read_value_norm": "12",
"read_unit_norm": "개",
"source_item_code": null,
"evidence": [
{
"field": "readout_id",
"value": "RD-4133-01"
},
{
"field": "read_value",
"value": "12"
},
{
"field": "read_unit",
"value": "개"
},
{
"field": "standard_value",
"value": "24"
},
{
"field": "standard_unit",
"value": "개"
}
],
"summary": "단위는 둘 다 개인데 문서가 12개, 기준이 24개라 값이 다릅니다."
},
{
"readout_id": "RD-4147-01",
"doc_id": "DOC-4147",
"item_code": "PN-2210",
"field_name": "순중량",
"verdict": "unit_differs",
"read_value_norm": "1.2",
"read_unit_norm": "kg",
"source_item_code": null,
"evidence": [
{
"field": "readout_id",
"value": "RD-4147-01"
},
{
"field": "read_value",
"value": "1.2"
},
{
"field": "read_unit",
"value": "kg"
},
{
"field": "standard_value",
"value": "950"
},
{
"field": "standard_unit",
"value": "g"
}
],
"summary": "문서는 kg, 기준표는 g 로 적어 표기 단위가 달라 1.2 와 950 을 그대로 견주지 않습니다."
},
{
"readout_id": "RD-4190-01",
"doc_id": "DOC-4190",
"item_code": "PN-2204",
"field_name": "포장수량",
"verdict": "unit_differs",
"read_value_norm": "18",
"read_unit_norm": null,
"source_item_code": null,
"evidence": [
{
"field": "readout_id",
"value": "RD-4190-01"
},
{
"field": "read_value",
"value": "18"
},
{
"field": "read_unit",
"value": null
},
{
"field": "standard_value",
"value": "24"
},
{
"field": "standard_unit",
"value": "개"
}
],
"summary": "문서에 단위 표기가 아예 없고 값 칸에도 단위가 없어 기준 표기 개와 같다고 볼 수 없습니다."
},
{
"readout_id": null,
"doc_id": "DOC-4152",
"item_code": "PN-2213",
"field_name": "표면처리 등급",
"verdict": "required_field_missing",
"read_value_norm": null,
"read_unit_norm": null,
"source_item_code": null,
"evidence": [
{
"field": "doc_id",
"value": "DOC-4152"
},
{
"field": "item_code",
"value": "PN-2213"
},
{
"field": "field_name",
"value": "표면처리 등급"
},
{
"field": "is_required",
"value": true
},
{
"field": "readout_id",
"agg": "count",
"value": 1
}
],
"summary": "기준표가 필수로 둔 표면처리 등급이 이 문서에서 읽힌 항목 한 건 안에 없습니다."
},
{
"readout_id": "RD-4160-01",
"doc_id": "DOC-4160",
"item_code": "PN-2218",
"field_name": "포장수량",
"verdict": "read_from_other_item",
"read_value_norm": "36",
"read_unit_norm": "개",
"source_item_code": "PN-2213",
"evidence": [
{
"field": "readout_id",
"value": "RD-4160-01"
},
{
"field": "read_value",
"value": "36"
},
{
"field": "read_unit",
"value": "EA"
},
{
"field": "standard_value",
"value": "18"
},
{
"field": "item_code",
"value": "PN-2213"
},
{
"field": "standard_value",
"value": "36"
}
],
"summary": "PN-2218 의 기준은 18개인데 문서가 적은 36개는 PN-2213 의 포장 수량 기준값이라 다른 품번의 값이 들어온 자리입니다."
}
][자동 검증 · 매 실행] 1. verdict 가 standard_matched·value_differs·unit_differs·required_field_missing·read_from_other_item 다섯 값 안에 있는지 봅니다. 2. readout_id·doc_id·item_code·field_name·verdict·read_value_norm·read_unit_norm·source_item_code·evidence·summary 가 모든 판정 카드에 있는지 봅니다. 3. read_value_norm 을 read_value 에서 천 단위 쉼표와 앞뒤 수식어를 떼고 값 칸에 같이 들어온 단위 표기를 단위 자리로 옮긴 값으로, read_unit_norm 을 단위 별칭 규칙을 적용한 표기로 다시 계산해 값이 같은지 봅니다. 4. 한 행이 여러 사유에 걸리면 unit_differs·read_from_other_item·value_differs 순으로 먼저 걸리는 값 하나만 답니다. read_unit_norm 이 item_standard.standard_unit 과 다르면 verdict 는 unit_differs 이고, 둘이 같은 항목에서 read_value_norm 이 같은 item_code·field_name 의 standard_value 와 다르면 verdict 는 value_differs 인지 봅니다. 5. item_standard.is_required 가 참인 field_name 을 그 doc_id 의 doc_readouts.field_name 에서 찾지 못하면 verdict 는 required_field_missing 인지 봅니다. 6. read_value_norm 이 그 item_code 의 standard_value 와 다르면서 같은 field_name 을 가진 다른 item_code 의 standard_value 와 같으면 verdict 는 read_from_other_item 이고 source_item_code 가 그 품번인지 봅니다. 규칙 4 의 value_differs 조건까지 함께 성립하는 행에는 이 사유를 답니다. 7. evidence 의 field 가 doc_readouts·item_standard 의 컬럼에 실재하는지 봅니다. 8. agg 가 없는 evidence 의 value 가 그 컬럼에 수록된 행의 원문 값과 같은지 봅니다. 여러 행에서 센 수치는 agg 에 count 를 적습니다. 9. summary 가 존댓말 한 문장으로 끝나는지 봅니다. [평가 러너 · 2주차] 문서 담당자 2명이 손으로 매긴 판정과 도구 판정의 일치도(Cohen's κ: 우연히 맞은 몫을 뺀 일치 정도, 0~1)를 잽니다. [수동 검증 · 사람이 봅니다] 1. 기준표에 없는 항목 이름이 새 항목인지 오탈자인지는 표본 20건을 눈으로 확인합니다. 2. 단위 표기가 다른 항목을 반품 사유로 볼지 표기 정정으로 볼지는 품질 담당 리드가 정합니다.