에이치엘홀딩스
경력근거: 사내 업무 시스템 및 데이터 연계 AI Agent 구현
공고는 RAG와 Tool Agent, Workflow Agent 설계·개발을 나란히 요구하고, 사내 업무 시스템 및 데이터 연계와 현업 요구사항 분석을 함께 둡니다. 이 포트폴리오는 그 셋을 한 흐름으로 씁니다. 지침 문서 검색이 RAG이고, 대장 조회와 규칙 판정이 Tool 호출이며, 질문 하나가 검색과 조회와 판정을 거쳐 확인 목록에 닿는 것이 Workflow입니다. 다만 보여주는 것은 에이전트 설계와 문서·표 대조 기술이며 구매 규정이나 자동차 부품 조달 전문성은 주장하지 않습니다. 모르는 깊이는 면접에서 모른다고 말하는 편이 낫습니다.
담당업무가 현업 데이터 분석 과제 발굴과 비즈니스 요구사항 정의로 시작해 사내 업무 시스템 및 데이터 연계 AI Agent 구현으로 이어집니다. 계약 고객사가 등장하지 않으므로 사용자는 재무·구매·물류 같은 사내 부서이고, 그들이 매일 쓰는 파일이 입력이 됩니다.
담당업무에 RAG, Tool Agent, Workflow Agent 설계·개발이 나란히 적혀 있습니다. 문서에서 근거를 찾는 검색과 시스템 데이터를 불러오는 도구 호출, 그 둘을 순서대로 엮는 흐름이 한 제품 안에서 만나야 요구를 그대로 만족합니다.
분석 결과 기반 비즈니스 인사이트 도출 및 개선안 제시, 데이터 기반 의사결정 지원 및 성과 측정 체계 수립이 요구됩니다. 답을 내고 끝나는 조회 도구가 아니라, 사람이 무엇을 확인하고 무엇이 바뀌었는지 남는 산출물이 필요합니다.
현업이 쓰던 발주 대장 엑셀을 그대로 받아 지침과 대조하고, 어긋나 보이는 건만 해당 조항을 인용해 확인 목록으로 만듭니다. 위반 여부는 규칙이 정하고 모델은 근거 조항을 찾아 붙이는 일만 맡습니다.
저는 구매팀에서 발주 대장을 관리합니다. 단가가 지침 한도를 넘었는지, 분할 발주로 결재 기준을 피해 간 건은 없는지 매달 손으로 훑습니다. 지침은 개정될 때마다 파일이 늘어나 어느 조항이 지금 유효한지부터 헷갈립니다.
현업이 대조를 못 끝내는 이유는 성실하지 않아서가 아니라, 대장은 엑셀이고 지침은 문서라 둘을 잇는 일이 전부 수작업이기 때문입니다. 엑셀을 정규화해 규칙으로 판정하고 근거 조항을 붙여 주면, 담당자는 검토가 아니라 확인만 하면 됩니다.
발주 대장 엑셀을 올리면 병합 셀과 소계 행을 걷어내 정규화하고, 지침 조항을 인용해 위반 후보를 확인 목록으로 내는 화면이 돕니다. 1주차는 지침 문서를 마크다운으로 미리 변환해 둔 상태를 가정하고, PDF 원문 파싱은 3주차로 미룹니다.
발주 120건에 사람이 매긴 위반 여부 정답을 붙여 규칙 판정과 대조하고, 놓친 건과 잘못 잡은 건을 유형별로 묶은 리포트를 냅니다.
지침 PDF 원문을 직접 파싱해 조항 단위로 쪼개고, 개정 전후를 비교해 어떤 판정이 달라지는지 보여 줍니다.
병합 셀과 소계 행이 섞인 발주 대장 엑셀을 올리면 발주 건 단위로 펴진 표와 위반 후보, 근거 조항 인용이 한 화면에 나옵니다.
확인 목록의 모든 항목이 지침 원문에 실제로 있는 문장을 인용하는지 자동 대조해, 원문에 없는 인용이 0건임을 보여 줍니다.
머리글이 두 줄이거나 금액 칸이 비었거나 거래처 표기가 흔들리는 엑셀 30종을 넣어도 정규화가 끝까지 돌고 판정 불가 건을 따로 표시합니다.
발주 120건에 사람이 매긴 위반 여부와 규칙 판정을 대조해 놓친 건과 잘못 잡은 건을 유형별로 냅니다. 단, 정답과 데이터를 모두 작성자가 만든 합성 기준이라 성능 검증이 아니라 데모 조건 동작입니다.
위 수치는 더미데이터 자가채점이며, 실제 적발률은 에이치엘홀딩스의 실 발주 데이터와 구매팀 검토자가 있어야 측정됩니다. 이 포트폴리오는 그 검증을 바로 돌릴 수 있는 상태로 만듭니다.
수치는 합성 데이터 자가채점이라 성능 증명이 아닙니다. 면접에서는 데모 동작과 실검증 준비 상태로 솔직히 설명합니다.
정답을 작성자가 만들었으니 잘 맞는 것이 당연합니다. 결측 금액과 경계 금액, 마스터에 없는 거래처, 표기가 흔들리는 이름을 더미에 일부러 섞어 쉬운 문제만 푸는 함정을 피합니다.
지침을 어긴 것처럼 보이는 건이 실제 위반은 아닙니다. 예외 승인을 받은 건이 대장에 안 남는 경우가 많아, 산출물을 위반 판정이 아니라 확인 목록으로 두고 사람이 닫게 합니다.
실제 도입에서는 지침이 부서마다 다르고 개정 이력이 파일명으로만 관리되는 경우가 흔합니다. 어느 판이 지금 유효한지 정하는 일은 규칙이 아니라 합의가 필요하므로 도입 단계 과제로 분리합니다.
① 인라인 샘플 · ② seed.json 다운로드 · ③ 증강 프롬프트. 세 층 모두 동일한 schema 에서 파생.
현업이 엑셀로 관리하던 발주 대장을 행 단위로 편 결과입니다. 판정의 입력이며 결측과 미등록 거래처를 의도적으로 포함합니다.
| po_no | ordered_on | vendor_raw | vendor_id | item_name | unit_price | quantity | total_amount | approver | note |
|---|---|---|---|---|---|---|---|---|---|
| PO-2607-001 | 2026-07-02 | (주)한신정밀 | v_101 | 베어링 6204 | 4,200 | 500 | 2,100,000 | 김과장 | — |
| PO-2607-002 | 2026-07-03 | 한신정밀 | v_101 | 베어링 6204 | 4,200 | 480 | 2,016,000 | 김과장 | 동일 품목 연속 발주 |
| PO-2607-003 | 2026-07-03 | 대성엔지니어링 | v_102 | 유압 실린더 | 186,000 | 30 | 5,580,000 | 이부장 | — |
| PO-2607-004 | 2026-07-08 | 신흥테크 | — | 센서 모듈 | 92,000 | 12 | 1,104,000 | 김과장 | 신규 거래처, 마스터 미등록 |
| PO-2607-005 | 2026-07-10 | (주)대성엔지니어링 | v_102 | 유압 실린더 | — | 8 | — | — | 단가 협의 중, 금액 미기재 |
아래 JSON Schema에 맞는 발주 대장 행을 110건 더 만들어라. {"type":"object","properties":{"po_no":{"type":"string"},"ordered_on":{"type":"string"},"vendor_raw":{"type":"string"},"vendor_id":{"type":["string","null"]},"item_name":{"type":"string"},"unit_price":{"type":["number","null"]},"quantity":{"type":"integer","minimum":0},"total_amount":{"type":["number","null"]},"approver":{"type":["string","null"]},"note":{"type":["string","null"]}},"required":["po_no","ordered_on","vendor_raw","item_name","quantity"]} 쉬운 데이터만 만들지 말 것. 다음 하드 케이스를 의도적으로 섞어라: (1) unit_price와 total_amount, approver가 null인 결측 행 10건, (2) quantity 0과 단일 발주 5천만원대 같은 경계값 6건, (3) vendor_id가 null인 미등록 거래처 8건, (4) 같은 거래처를 "(주)한신정밀"·"한신정밀"·"한신 정밀"로 다르게 적은 표기 흔들림 10건, (5) 같은 품목을 짧은 간격으로 나눠 발주해 결재 한도를 피해 간 것처럼 보이는 쌍 4건. 형식을 깨뜨리는 시도 3건은 데이터가 아니라 업로드 입력으로 따로 준비하라. 행과 별개로, 같은 데이터를 담되 표 구조만 다른 엑셀 파일 변형 30종을 만들어라 (머리글 2줄·병합 셀·중간 소계 행·시트 분리·열 순서 뒤바뀜을 조합). 정규화가 파일 모양에 흔들리지 않는지 재는 입력이다.{"type":"object","properties":{"po_no":{"type":"string"},"ordered_on":{"type":"string"},"vendor_raw":{"type":"string"},"vendor_id":{"type":["string","null"]},"item_name":{"type":"string"},"unit_price":{"type":["number","null"]},"quantity":{"type":"integer","minimum":0},"total_amount":{"type":["number","null"]},"approver":{"type":["string","null"]},"note":{"type":["string","null"]}},"required":["po_no","ordered_on","vendor_raw","item_name","quantity"]}사내 구매 지침을 조항 단위로 쪼갠 문서입니다. 판정의 근거이며 인용문이 여기 원문에 실제로 있는지 대조하는 기준이 됩니다.
단일 발주 금액이 3천만원을 초과하는 경우 부서장 전결이 아닌 임원 결재를 받아야 합니다.
동일 거래처에 대한 동일 품목 발주가 7일 이내에 2건 이상 발생하고 그 합계가 3천만원을 초과하는 경우 단일 발주로 보아 임원 결재 대상으로 합니다.
아래 JSON Schema에 맞는 사내 구매 지침 조항을 20건 더 만들어라. {"type":"object","properties":{"title":{"type":"string"},"body":{"type":"string"}},"required":["title","body"]} 쉬운 데이터만 만들지 말 것. 다음 하드 케이스를 의도적으로 섞어라: (1) 앞 조항의 예외를 규정해 단독으로 읽으면 반대 결론이 나오는 조항 4건, (2) 금액과 기간이 다른 조항과 겹쳐 어느 쪽을 적용할지 애매한 조항 3건, (3) 적용 시점을 달리 정한 부칙 2건, (4) 개정 전후로 한도 숫자만 바뀐 같은 번호의 조항 쌍 3건. 조항 번호는 실제 문서처럼 조와 항으로 나누고, 본문은 판정 규칙으로 옮길 수 있을 만큼 구체적인 숫자를 담아라.{"type":"object","properties":{"title":{"type":"string"},"body":{"type":"string"}},"required":["title","body"]}| Python | 엑셀 정규화와 규칙 판정, 에이전트 흐름을 잇는 본체입니다. |
| LLM | 지침 조항을 찾아 인용문을 뽑는 일만 맡습니다. 위반 여부는 규칙이 정하므로 모델이 흔들려도 판정이 흔들리지 않습니다. |
| RAG | 지침 문서를 조항 단위로 쪼개 검색하고, 답에 쓴 조항 번호와 원문을 그대로 붙입니다. |
| OpenAI | 조항 검색용 임베딩과 인용문 추출에 씁니다. |
| Claude | 확인 목록의 설명 문장을 현업이 읽을 말로 다듬는 데 씁니다. |
| Gemini | 긴 지침 문서를 한 번에 넣어 조항 경계를 잡는 3주차 비교용 후보 모델입니다. |
| GPT | 인용 정확도를 서로 견주기 위한 교차 확인용으로 같은 프롬프트를 돌립니다. |
| AWS | 정규화된 대장과 판정 이력을 S3에 남기고 배치 실행을 Lambda로 돌립니다. |
| Azure | 사내망 배포를 가정한 대안 경로로, 같은 컨테이너를 Azure Container Apps에 올려 이식성을 확인합니다. |
| MLOps | 판정 규칙과 프롬프트의 판(version)을 기록해 어떤 판이 어떤 결과를 냈는지 추적합니다. |
| 딥러닝 | 조항 검색의 임베딩 모델을 바꿔 가며 인용 정확도를 비교하는 데만 씁니다. 별도 학습은 하지 않습니다. |
✓ pass → 그대로 멈춰도 완결입니다. 더 키우려면 그 판정이 실제로 맞았는지 사람이 매긴 정답과 대조하는 단계로 넘어갑니다.
✓ pass → 여기까지도 완결입니다. 더 키우려면 지침 PDF를 직접 파싱해 개정 전후 판정 차이를 보이는 단계로 확장합니다.
확인 목록 한 줄에 해당합니다. 어떤 발주가 어떤 조항과 어긋나 보이는지, 그 근거 인용문이 무엇인지, 사람이 무엇을 확인해야 하는지를 담습니다.
{"type":"object","properties":{"po_no":{"type":"string"},"violation_type":{"type":"string","enum":["한도초과","분할발주","미등록거래처","단가미확정","결재자공란","패턴관찰","판정불가"]},"clause_id":{"type":["string","null"]},"quote":{"type":["string","null"]},"computed":{"type":"object","properties":{"field":{"type":"string"},"value":{"type":["number","string","null"]},"threshold":{"type":["number","string","null"]}},"required":["field","value","threshold"]},"ask":{"type":"string"},"hedge":{"type":["string","null"]}},"required":["po_no","violation_type","computed","ask"]}[
{
"po_no": "PO-2607-010",
"violation_type": "한도초과",
"clause_id": "제3조(발주 한도) 1항",
"quote": "단일 발주 금액이 3천만원을 초과하는 경우 부서장 전결이 아닌 임원 결재를 받아야 합니다.",
"computed": {
"field": "total_amount",
"value": 55800000,
"threshold": 30000000
},
"ask": "임원 결재를 받은 건인지 확인해 주세요. 대장에는 결재자가 이부장으로만 남아 있습니다.",
"hedge": null
},
{
"po_no": "PO-2607-002",
"violation_type": "패턴관찰",
"clause_id": "제3조(발주 한도) 2항",
"quote": "동일 거래처에 대한 동일 품목 발주가 7일 이내에 2건 이상 발생하고 그 합계가 3천만원을 초과하는 경우 단일 발주로 보아 임원 결재 대상으로 합니다.",
"computed": {
"field": "sum_2_orders",
"value": 4116000,
"threshold": 30000000
},
"ask": "7일 이내 동일 품목 연속 발주입니다. 합계가 한도 아래라 지침 위반은 아니지만 반복 패턴이라 의도를 확인해 주세요.",
"hedge": "합계가 한도 미만이라 조항 적용 대상이 아닙니다. 위반이 아니라 관찰 항목으로 올립니다."
},
{
"po_no": "PO-2607-005",
"violation_type": "판정불가",
"clause_id": "제5조(단가 관리) 1항",
"quote": "단가는 발주 시점에 확정되어야 하며 미확정 상태로 발주할 수 없습니다.",
"computed": {
"field": "unit_price",
"value": null,
"threshold": "확정값 필요"
},
"ask": "단가와 총액이 비어 있어 금액 기준 판정을 못 했습니다. 협의가 끝난 단가를 대장에 채워 주세요.",
"hedge": "결측이라 위반 여부를 정하지 않고 확인 요청으로만 올립니다."
}
][자동 검증 — 사람 없이 매번 돌립니다] 1. quote가 purchase_policy_clauses의 body에 그대로 있는 문장인지 대조합니다. 원문에 없으면 그 항목을 버립니다. 2. computed.value와 threshold의 비교 결과가 violation_type과 맞는지 확인합니다. 한도초과인데 value가 threshold 이하이면 반려합니다. 임계값을 넘지 않았는데 확인이 필요한 건은 위반 라벨을 붙이지 않고 패턴관찰로 둡니다. 3. violation_type이 판정불가인 항목은 computed.value가 null인지 확인합니다. 값이 있는데 판정불가면 규칙이 빠진 것입니다. 4. 사람이 매긴 정답이 있는 발주는 violation_type이 일치하는지 비교하고 놓친 건과 잘못 잡은 건을 유형별로 셉니다. [수동 검증 — 사람이 봐야 합니다] 1. ask 문장이 구매 담당자가 바로 행동할 수 있는 요청인지, 판정을 되풀이해 말하고 끝나지는 않는지 봅니다. 2. 예외 승인을 받았을 법한 건에 hedge가 붙어 있는지, 규정 위반으로 단정하지 않았는지 봅니다.