아빔컨설팅(영업소)
경력근거: 생성형 AI, LLM, RAG, Agent 기반 솔루션 구현
공고는 주요업무에 AI 기반 MVP·PoC 및 서비스 개발, 생성형 AI·LLM·RAG·Agent 기반 솔루션 구현, 웹 애플리케이션·백엔드 API 및 데이터 연동 개발, 고객 시스템 및 데이터 연계 구현을 한 줄씩 나열하고, 마지막을 서비스 고도화 및 운영 안정성 개선으로 닫습니다. 이 포트폴리오는 그 목록을 장식이 아니라 골조로 씁니다. 규정 문서를 조항 단위로 색인해 근거를 찾고(RAG), 한도 판정은 규칙이 맡고, 화면은 Next.js 로 백엔드는 FastAPI 로 나누며, 인사 시스템과 환율 조회는 커넥터 뒤에 두어 연계 지점을 드러냅니다. 아빔컨설팅의 AX 사업이 다루는 대상이 산업별 엔터프라이즈 업무이므로, 규정 문서와 사내 시스템이 함께 얽힌 업무를 제품 화면 하나로 닫아 보이는 편이 이 공고에 맞습니다. 다만 이 포트폴리오는 조항 검색과 규칙 판정, 화면과 API 구현을 보여줍니다. 세무 처리나 회계 비용 인정 기준 같은 정산 실무 전문성은 주장하지 않습니다. 모르는 깊이는 면접에서 모른다고 말하는 편이 낫습니다.
주요업무가 AI 기반 MVP, PoC 및 서비스 개발로 시작해 서비스 고도화 및 운영 안정성 개선으로 끝납니다. 만들고 넘기는 자리가 아니라 만든 서비스를 계속 키우는 자리라, 1주차 완결품에서 검증과 확장으로 이어지는 구조가 이 공고와 맞습니다.
주요업무에 생성형 AI, LLM, RAG, Agent 기반 솔루션 구현이 한 줄로 적혀 있고 우대사항에 OpenAI, LangChain, LlamaIndex 활용 경험이 다시 나옵니다. 문서에서 근거 조항을 찾아 붙이고 여러 시스템을 순서대로 부르는 구성이 이 두 줄을 그대로 씁니다.
웹 애플리케이션, 백엔드 API 및 데이터 연동 개발과 고객 시스템 및 데이터 연계 구현이 나란히 적혀 있고, 우대사항이 React, Next.js, Node.js, FastAPI 와 클라우드 구축, B2B SaaS 경험을 함께 요구합니다. 화면 한 벌과 판정 API, 사내 시스템 커넥터를 한 사람이 붙이는 범위가 여기에 대응합니다.
직원이 출장 경비 항목을 넣으면 나라와 직급과 지출일로 규정 조항을 좁혀, 한도를 넘은 항목과 그 근거 조항을 보여줍니다. 초과분에는 사유를 받아 제출본을 만듭니다. 한도를 넘었는지는 조항에 적힌 금액과 신청 금액을 비교하는 규칙이 정하고, 모델은 판정에 관여하지 않고 그 조항이 왜 걸렸는지를 사람이 읽을 한 문장으로 요약합니다. 실제 지급과 이체는 다루지 않고 제출 전 확인까지를 범위로 둡니다.
저는 해외 프로젝트를 다니며 출장 경비를 정산합니다. 나라마다 숙박 한도가 다른데 규정이 본사 문서와 국가별 부칙으로 나뉘어 있어, 어느 조항이 제 건에 맞는지 찾다가 결국 감으로 올립니다. 반려되면 어느 조항 때문인지 메일로 다시 묻고, 그 사이 정산이 한 주씩 밀립니다.
정산이 밀리는 이유는 계산이 어려워서가 아니라 내 건에 맞는 조항을 찾는 데 시간이 들기 때문입니다. 나라와 직급과 시행일로 조항을 좁혀 한도를 규칙으로 비교하고 그 조항 문구를 보여주면, 직원이 제출 전에 초과분 사유를 적고 끝냅니다.
직원이 쓰는 화면 하나가 돕니다. 경비 항목을 넣으면 나라와 직급과 지출일로 조항을 좁혀 한도를 넘은 항목과 근거 조항을 보여주고, 사유를 적어 제출본을 내려받습니다. 직급과 환산 금액은 목업 API 로 받는 것으로 시작하고, 인사 시스템과 환율 실연계는 3주차로 미룹니다.
정답을 붙인 신청 60건으로 판정 코드와 인용 조항이 일치하는지 자동으로 맞춰 보고, 어긋난 유형을 리포트로 냅니다. 2주차부터 AWS 로 배포해 직원이 사내 주소로 들어와 씁니다.
인사 시스템과 환율 조회를 순서대로 부르는 도구 호출을 붙여 직원이 직급과 원화 금액을 적지 않아도 판정이 돌고, 조회가 실패하거나 늦어도 화면이 버티도록 재시도와 대기 시간 상한을 둡니다.
직원이 출장 경비 항목 20건을 넣으면 한도를 넘은 항목과 그 근거 조항이 나오고, 초과분에는 사유 입력이 열립니다.
규정에 없는 나라, 영수증 번호 누락, 통화 표기가 흔들린 입력 30종을 넣어도 응답 형식이 깨지지 않고, 조항을 못 찾은 건은 규정 없음으로 나옵니다.
지출일이 개정 전인 건에는 구 조항이, 개정 후인 건에는 새 조항이 붙습니다. 규정 문서를 개정본으로 바꿔 넣으면 같은 신청의 판정이 달라지고 어느 조항이 바뀌었는지 기록에 남습니다.
정답을 붙인 신청 60건으로 판정 코드 일치율과 인용 조항 일치율을 냅니다. 단, 정답과 데이터를 모두 작성자가 만든 합성 기준이라 성능 검증이 아니라 데모 조건 동작입니다.
위 수치는 더미데이터 자가채점이며, 실제 판정 정확도는 도입 회사의 실제 규정 문서와 실 정산 담당자의 확인이 있어야 측정됩니다. 이 포트폴리오는 그 검증을 바로 돌릴 수 있는 상태로 만듭니다.
수치는 합성 데이터 자가채점이라 성능 증명이 아닙니다. 면접에서는 데모 동작과 실검증 준비 상태로 솔직히 설명합니다.
정답을 작성자가 만들었으니 잘 맞는 것이 당연합니다. 결측·경계값·규정 없는 나라·통화 표기 흔들림을 더미에 일부러 섞어 쉬운 문제만 푸는 함정을 피합니다.
이 포트폴리오는 조항 검색과 규칙 판정, 화면과 API 구현을 보여줍니다. 세무 처리나 회계 비용 인정 기준 같은 정산 실무 전문성은 주장하지 않습니다. 모르는 깊이는 면접에서 모른다고 말하는 편이 낫습니다.
한도를 넘었다는 판정이 곧 부적절한 지출을 뜻하지는 않습니다. 야간 이동이나 현지 물가로도 벌어지므로 판정을 결론으로 읽지 않게 근거 조항을 항상 보여주고 사유를 남깁니다.
실제 도입에서는 규정이 회사마다 다르고 개정도 잦습니다. 조항 메타를 사람이 넣어야 하므로 등록 화면과 개정 이력 관리가 도입 단계 과제로 남습니다.
인사 조회와 환율 조회는 이 포트폴리오에서 목업 API 로 둡니다. 실제 연계는 인증 방식과 응답 지연이 달라 어댑터를 바꿔 끼우고 실패 처리를 다시 재야 합니다.
① 인라인 샘플 · ② seed.json 다운로드 · ③ 증강 프롬프트. 세 층 모두 동일한 schema 에서 파생.
직원이 올린 출장 경비 항목입니다. 판정의 입력이며 환산 금액 결측, 영수증 번호 누락, 규정 없는 나라, 통화와 상호 표기 흔들림, 한도와 같은 경계 금액을 의도적으로 포함합니다.
| item_id | request_id | employee_grade | country_code | spent_on | category | amount | currency | amount_krw | receipt_no | merchant_raw | note |
|---|---|---|---|---|---|---|---|---|---|---|---|
| it_001 | req_9001 | senior | JP | 2026-07-06 | lodging | 19,000 | JPY | 176,700 | JP-0706-118 | Hotel Granvia Osaka | — |
| it_002 | req_9001 | senior | JP | 2026-07-06 | meal | 4,200 | JPY | 39,060 | JP-0706-119 | 야키니쿠 무라타 | — |
| it_003 | req_9001 | senior | JP | 2026-07-07 | lodging | 21,500 | JPY | 199,950 | JP-0707-204 | hotel granvia osaka | 상호 표기 흔들림 |
| it_004 | req_9002 | manager | US | 2026-07-14 | lodging | 210 | USD | 289,800 | US-0714-77 | Hyatt Place Chicago | — |
| it_005 | req_9002 | manager | US | 2026-07-14 | meal | 72 | usd | 99,360 | US-0714-78 | The Purple Pig | 통화 표기 소문자 |
아래 JSON Schema 에 맞는 출장 경비 항목을 더 만들어 주세요. {"type":"object","properties":{"item_id":{"type":"string"},"request_id":{"type":"string"},"employee_grade":{"type":"string","enum":["staff","senior","manager","director"]},"country_code":{"type":"string"},"spent_on":{"type":"string"},"category":{"type":"string","enum":["lodging","meal","transport","entertainment","misc"]},"amount":{"type":"number"},"currency":{"type":"string"},"amount_krw":{"type":["integer","null"]},"receipt_no":{"type":["string","null"]},"merchant_raw":{"type":"string"},"note":{"type":["string","null"]}},"required":["item_id","request_id","employee_grade","country_code","spent_on","category","amount","currency","merchant_raw"]} 쉬운 데이터만 만들지 말 것 — 다음 하드 케이스를 의도적으로 섞어라: (1) amount_krw 가 null 인 환율 미조회 건, (2) receipt_no 가 null 인데 30,000원을 넘는 지출 건, (3) 규정 문서에 조항이 없는 country_code(MN·KZ 등), (4) currency 가 소문자로 들어오거나 merchant_raw 의 공백과 대소문자가 흔들린 건, (5) 한도와 정확히 같은 금액과 amount 가 0 인 건, (6) spent_on 이 규정 개정일(2026-04-01) 이전인 건. 생성한 행은 반드시 위 스키마를 통과해야 하며, 형식을 깨뜨리는 시도는 별도로 3건만 표시해 두세요.{"type":"object","properties":{"item_id":{"type":"string"},"request_id":{"type":"string"},"employee_grade":{"type":"string","enum":["staff","senior","manager","director"]},"country_code":{"type":"string"},"spent_on":{"type":"string"},"category":{"type":"string","enum":["lodging","meal","transport","entertainment","misc"]},"amount":{"type":"number"},"currency":{"type":"string"},"amount_krw":{"type":["integer","null"]},"receipt_no":{"type":["string","null"]},"merchant_raw":{"type":"string"},"note":{"type":["string","null"]}},"required":["item_id","request_id","employee_grade","country_code","spent_on","category","amount","currency","merchant_raw"]}사내 출장비 규정을 조항 단위로 나눈 문서입니다. 검색으로 후보를 좁히고 규칙이 하나를 골라 근거로 씁니다. 본사 기본 조항과 국가별 부칙, 개정으로 대체된 구 조항, 한도가 없는 실비 조항을 함께 둡니다.
국외 출장비는 실비로 정산합니다. 규정은 지출일을 기준으로 적용하며, 국가별 부칙이 있는 경우 부칙이 본사 기본 한도에 우선합니다. 규정에 없는 국가와 항목은 판정하지 않고 정산 담당자 확인을 거칩니다.
사원과 선임의 숙박비는 1박 150,000원까지 인정합니다. 초과분은 사유를 적어 제출하며 부서장 승인을 받습니다.
아래 JSON Schema 에 맞는 사내 출장비 규정 조항을 더 만들어 주세요. {"type":"object","properties":{"clause_id":{"type":"string"},"doc_name":{"type":"string"},"title":{"type":"string"},"body":{"type":"string"},"category":{"type":"string","enum":["lodging","meal","transport","entertainment","misc","general"]},"country_scope":{"type":"array","items":{"type":"string"}},"grade_scope":{"type":"array","items":{"type":"string"}},"limit_krw":{"type":["integer","null"]},"effective_from":{"type":"string"},"superseded_by":{"type":["string","null"]}},"required":["clause_id","doc_name","title","body","category","country_scope","grade_scope","effective_from"]} body 안의 금액과 limit_krw 는 반드시 같은 값으로 씁니다. 쉬운 데이터만 만들지 말 것 — 다음 하드 케이스를 의도적으로 섞어라: (1) 같은 나라와 같은 항목에 본사 기본 조항과 국가별 부칙이 함께 걸려 부칙이 우선해야 하는 짝, (2) superseded_by 가 채워진 구 조항과 그것을 대체하는 새 조항의 짝(effective_from 이 다름), (3) limit_krw 가 null 인 실비 조항, (4) grade_scope 가 일부 직급만 담긴 조항, (5) 한 조항에 두 항목이 섞여 카테고리를 하나로 정하기 애매한 문구. 생성한 행은 반드시 위 스키마를 통과해야 하며, 형식을 깨뜨리는 시도는 별도로 3건만 표시해 두세요.{"type":"object","properties":{"clause_id":{"type":"string"},"doc_name":{"type":"string"},"title":{"type":"string"},"body":{"type":"string"},"category":{"type":"string","enum":["lodging","meal","transport","entertainment","misc","general"]},"country_scope":{"type":"array","items":{"type":"string"}},"grade_scope":{"type":"array","items":{"type":"string"}},"limit_krw":{"type":["integer","null"]},"effective_from":{"type":"string"},"superseded_by":{"type":["string","null"]}},"required":["clause_id","doc_name","title","body","category","country_scope","grade_scope","effective_from"]}| Next.js | 직원이 쓰는 신청 화면과 서버 라우트입니다. 항목 입력, 판정 결과, 제출본 미리보기가 한 경로 안에서 돕니다. |
| React | 초과 항목과 근거 조항을 한 화면에 두는 컴포넌트입니다. 조항 문구를 접었다 펴고 사유 입력을 초과 항목에만 띄웁니다. |
| Node.js | 사내 시스템 커넥터를 맡습니다. 인사 조회와 환율 조회를 어댑터로 감싸 화면이 부르는 조회 API 하나로 묶습니다. |
| FastAPI | 판정 엔진 API 입니다. 조항 후보 검색과 한도 비교, 판정 코드 부여가 이쪽 한 곳에만 있습니다. |
| RAG | 규정 문서에서 그 나라와 직급과 지출일에 맞는 조항을 찾아 근거로 붙입니다. 조항 수백 개를 한 번에 넣을 수 없어 검색이 필요합니다. |
| LlamaIndex | 규정 문서를 조항 단위로 자르고 적용 나라·직급·시행일을 메타로 붙여 색인합니다. 검색 단계에서 그 메타로 후보를 먼저 거릅니다. |
| LangChain | 3주차 도구 호출을 묶습니다. 조항 검색, 인사 조회, 환율 조회를 순서대로 부르고 중간 실패를 한 곳에서 처리합니다. |
| OpenAI | text-embedding-3-small 로 조항을 색인하고, 인용 조항이 후보에 실재하는지 GPT-4o-mini 로 한 번 더 거릅니다. |
| LLM | 판정이 끝난 뒤 그 조항이 왜 걸렸는지를 사람이 읽을 한 문장으로 요약합니다. 한도를 넘었는지는 규칙이 정합니다. |
| AWS | 2주차부터 배포와 운영을 맡습니다. 백엔드는 컨테이너로 올리고 규정 문서 원본은 S3 에, 신청과 판정 기록은 RDS 에 둡니다. |
| Azure | 모델 호출과 파일 저장을 어댑터 뒤에 두고 같은 컨테이너 이미지를 Azure Container Apps 에 올려, 설정만 바꿔도 뜨는지 확인합니다. |
| GCP | 배포 스크립트가 한 클라우드에 묶이지 않게 같은 이미지를 Cloud Run 에 올리고, 규정 문서 보관만 Cloud Storage 로 바꿔 끼웁니다. |
✓ pass → 그대로 멈춰도 완결입니다. 더 키우려면 판정이 실제로 맞았는지 정답 세트와 맞춰 보는 단계로 넘어갑니다.
✓ pass → 여기까지도 완결입니다. 더 키우려면 직급과 환산 금액을 사내 시스템에서 직접 가져오는 단계로 확장합니다.
신청 항목 한 건의 판정 결과입니다. 판정 코드와 한도는 규칙이 채우고, 인용 조항 번호와 한 문장 안내만 모델이 씁니다.
{"type":"object","properties":{"item_id":{"type":"string"},"verdict":{"type":"string","enum":["within_limit","over_limit","needs_receipt","no_rule_found","unmapped_country"]},"limit_krw":{"type":["integer","null"]},"amount_krw":{"type":["integer","null"]},"over_krw":{"type":["integer","null"]},"cited_clause_id":{"type":["string","null"]},"citation":{"type":["string","null"]},"required_action":{"type":"string","enum":["none","write_reason","attach_receipt","ask_admin"]},"summary":{"type":"string"},"hedge":{"type":["string","null"]}},"required":["item_id","verdict","required_action","summary"]}[
{
"item_id": "it_003",
"verdict": "over_limit",
"limit_krw": 180000,
"amount_krw": 199950,
"over_krw": 19950,
"cited_clause_id": "LOD-JP-01",
"citation": "일본 출장의 사원과 선임 숙박비는 1박 180,000원까지 인정합니다.",
"required_action": "write_reason",
"summary": "일본 부칙 한도보다 19,950원 많습니다.",
"hedge": null
},
{
"item_id": "it_013",
"verdict": "over_limit",
"limit_krw": 150000,
"amount_krw": 165540,
"over_krw": 15540,
"cited_clause_id": "LOD-JP-00",
"citation": "일본 출장의 사원과 선임 숙박비는 1박 150,000원까지 인정합니다. 본 조항은 2026년 4월 1일 개정으로 대체되었으므로 그 이전 지출에만 적용합니다.",
"required_action": "write_reason",
"summary": "지출일이 개정 전이라 구 조항 한도 150,000원을 적용해 15,540원 초과입니다.",
"hedge": null
},
{
"item_id": "it_009",
"verdict": "needs_receipt",
"limit_krw": null,
"amount_krw": 46350,
"over_krw": null,
"cited_clause_id": "RCP-001",
"citation": "1건 30,000원을 넘는 지출은 영수증 번호를 등록합니다.",
"required_action": "attach_receipt",
"summary": "30,000원을 넘는 지출인데 영수증 번호가 비어 있습니다.",
"hedge": null
},
{
"item_id": "it_010",
"verdict": "unmapped_country",
"limit_krw": null,
"amount_krw": null,
"over_krw": null,
"cited_clause_id": "MISC-001",
"citation": "규정에 국가나 항목이 없으면 판정하지 않고 정산 담당자에게 확인을 요청합니다.",
"required_action": "ask_admin",
"summary": "몽골 조항이 없고 원화 환산 금액도 비어 있어 판정하지 않습니다.",
"hedge": "합성 기준 판정이라 실제로는 지역 본부의 별도 지침이 있을 수 있습니다."
}
][자동 검증 — 코드가 판정합니다] 1. verdict 가 enum 다섯 값 중 하나인지 확인합니다. 규칙이 정한 코드라 모델이 새 코드를 만들면 그 응답을 버립니다. 2. cited_clause_id 가 검색으로 좁힌 후보 조항에 실재하는지 대조합니다. 없는 번호를 인용하면 지어낸 근거라는 뜻이라 규칙이 고른 조항으로 되돌립니다. 3. citation 이 그 조항 body 의 실제 문장인지 대조합니다. 문장이 조금이라도 달라지면 원문으로 바꿔 넣습니다. 4. limit_krw 가 조항의 limit_krw 와 같은지, over_krw 가 amount_krw 에서 limit_krw 를 뺀 값과 같은지 다시 계산합니다. 5. 지출일이 조항의 effective_from 이후인지, superseded_by 가 채워진 구 조항을 개정 이후 지출에 붙이지 않았는지 확인합니다. [수동 검증 — 사람이 봅니다] 1. 본사 기본 조항과 국가별 부칙이 함께 걸린 20건을 눈으로 보고 부칙 우선이 맞는지 확인합니다. 2. 한 조항에 두 항목이 섞인 문구에서 어느 카테고리로 묶는 편이 신청자에게 편한지 판단합니다.