앵글컴퍼니
경력근거: 앵글컴퍼니는 Angle OS로 기업을 AI 네이티브 조직으로 전환합니다
※ 실제 산출물이 아닌 AI 예측 시안입니다.
앵글컴퍼니는 Angle OS 위에서 도메인 특화 에이전트를 설계·배포하고, FDE 는 고객사에 들어가 워크플로우를 파악해 대상 업무를 발굴하고 요구사항으로 정의하는 자리입니다. 공고가 우대로 든 ‘비즈니스 로직 설계, 정책 설계, 업무 분석 등 비정형 업무를 구조화해본 경험’ 이 이 도구의 골조라, 산문 지침서를 분기와 승인 지점으로 끊는 일이 그대로 첫 주 고객사 킥오프에서 하는 일이 됩니다. 다만 이 포트폴리오는 문서 파싱과 조건 추출, 출력 스키마 강제라는 기술을 보여주며 금융·제조·공공 같은 규제 산업의 도메인 전문성은 주장하지 않습니다.
‘비즈니스 로직 설계, 정책 설계, 업무 분석 등 비정형 업무를 구조화해본 경험’ 이 우대라, 산문으로 쓰인 지침서를 절차와 분기로 끊는 작업이 그대로 이 일입니다.
‘고객사의 실제 워크플로우를 파악해 대상 업무를 발굴하고 요구사항으로 정의한다’ 가 첫 업무라, 고객사 문서에서 요구사항 초안을 뽑는 도구가 직격입니다.
‘RAG, 프롬프트 설계, Function Calling, 툴 연동’ 경험을 자격요건으로 못 박아, 추출한 분기를 툴 시그니처와 승인 게이트로 옮기는 층이 필요합니다.
고객사에서 받은 업무 지침서 워드·PDF 를 문단 단위로 읽어 절차 단계와 분기 조건, 사람이 승인해야 하는 지점을 뽑고, 항목마다 근거가 된 원문 문장을 붙여 에이전트 실행 절차서 Markdown 파일로 내는 FDE PoC 입니다. 결과물은 화면이 아니라 터미널에서 실행해 떨어지는 파일입니다.
앵글컴퍼니 FDE 입니다. 고객사 현업이 워드와 PDF 로 관리해 온 업무 지침서를 킥오프 때마다 눈으로 훑으며 ‘여기까지는 에이전트가 하고 이 지점은 사람이 승인한다’ 를 손으로 옮겨 적던 사람입니다.
업무 지침서 문장에는 조건(금액·기간·대상)과 예외, 승인 주체가 이미 글로 적혀 있어서, 문장을 절차 단계와 분기로 끊고 원문 인용을 강제하면 사람이 손으로 옮기던 절차서 초안이 규칙으로 검증 가능한 형태로 나옵니다.
고객사 업무 지침서 워드·PDF 를 명령 한 줄로 받아 절차 단계와 분기 조건, 승인 지점을 뽑고 근거 원문을 붙인 Markdown 절차서 파일을 떨어뜨리는 도구입니다. 표가 이미지로만 들어간 스캔 PDF 는 빠진 20% 기술이라 1주차는 텍스트 레이어가 있는 문서를 전제로 시작하고, 이미지 판독은 2·3주차로 미룹니다.
다른 문서를 참조하는 대목을 찾아 선행 절차 관계를 절차서에 함께 적고, 개정판 지침서를 넣으면 신설·삭제·조건 변경만 표로 내는 단계입니다.
추출한 분기를 에이전트가 부를 Function Calling 툴 시그니처와 승인 게이트 JSON 으로 옮기고, 고객사 폐쇄망을 가정해 도커 이미지 하나로 묶어 인터넷 연결 없이 도는 것까지 확인하는 단계입니다.
지침서 워드 파일 하나를 명령 한 줄로 넣으면 절차 단계와 분기 표, 승인 지점이 담긴 Markdown 절차서가 몇 초 안에 파일로 떨어지는 걸 시연합니다
절차서의 모든 단계와 분기가 인용한 문장이 지침서 본문에 그대로 있는 비율 100%를 보여줍니다. 없으면 그 항목을 버리고 미기재로 남겨 없는 조건을 지어내지 못하게 막습니다
측정: 인용 substring 대조, 표본: 분기 180건
조건이 두 문장에 나뉘거나 예외가 별첨에만 있는 어려운 지침서 12건을 넣어도 출력 형식이 한 번도 안 깨지는 걸 보여줍니다
2주차부터는 직접 만든 정답 분기표와 대조해 조건 일치율을 봅니다
측정: 숫자·단위·비교기호·승인자 네 항목 완전 일치, 표본: 분기 180건
진짜 성능 검증은 여기서 멈춥니다. 위 수치는 전부 작성자가 만든 지침서 더미와 직접 만든 정답을 대조한 자가채점이며, 실제 추출 정확도는 앵글컴퍼니 고객사의 실제 지침서와 현업 확인이 있어야 측정됩니다. 이 도구는 그 검증을 바로 돌릴 수 있는 상태까지 만듭니다.
이건 고객사도 실데이터도 없이 혼자 만든 포트폴리오라 모든 수치는 합성 지침서 자가채점이고 성능 증명이 아닙니다. 면접에서 ‘더미 조건에서 도는 것과 실검증 준비 상태’ 로 솔직히 말합니다
이 포트폴리오는 문서 파싱과 조건 추출, 출력 스키마 강제라는 기술을 보여주며 금융·제조·공공 같은 규제 산업의 업무 지식이나 Angle OS 내부 구조 전문성은 주장하지 않습니다. 모르는 깊이는 면접에서 모른다고 말하는 편이 낫습니다
정답 분기표를 작성자가 만들었으니 잘 맞는 게 당연합니다. 조건이 두 문장에 나뉜 경우와 예외가 별첨에만 있는 경우를 더미에 섞어 쉬운 문제만 푸는 게 아님을 보여줍니다
뽑아낸 절차서는 초안이지 확정 요구사항이 아닙니다. 지침서에 안 적힌 관행이 실제 업무를 좌우하는 경우가 많아, 미기재로 남긴 항목은 현업 확인 질문으로 넘기고 도구가 자동으로 채우지 않습니다
실제 도입 시 달라지는 점을 분리해 둡니다. 고객사 지침서는 서식과 장·절 체계가 제각각이고 스캔 이미지로만 남은 문서도 있어, 파서 규칙과 분기 유형 사전을 다시 맞춰야 합니다
① 인라인 샘플 · ② seed.json 다운로드 · ③ 증강 프롬프트. 세 층 모두 동일한 schema 에서 파생.
고객사에서 받은 업무 지침서를 문단 단위로 끊어 담은 원문입니다. 추출 엔진이 읽는 입력이자 인용 대조의 기준이라, 조건이 두 문장에 나뉜 경우·예외가 별첨에만 있는 경우·승인자가 안 적힌 경우를 일부러 섞어 쉬운 문서만 푸는 게 아님을 보여줍니다.
| doc_id | doc_title | section | para_no | text | has_table |
|---|---|---|---|---|---|
| doc_p01 | 구매 발주 및 검수 업무 지침 | 제2장 발주 | 11 | 구매 담당자는 자재 요청서를 접수한 날로부터 3영업일 이내에 발주서를… | false |
| doc_p01 | 구매 발주 및 검수 업무 지침 | 제2장 발주 | 12 | 발주 금액이 500만원 이상인 경우 팀장 승인을 받은 뒤 발주서를 발… | false |
| doc_p01 | 구매 발주 및 검수 업무 지침 | 제2장 발주 | 13 | 다만 긴급 발주로 분류된 건은 금액과 무관하게 본부장 승인을 받는다. | false |
| doc_p01 | 구매 발주 및 검수 업무 지침 | 제2장 발주 | 14 | 긴급 발주의 분류 기준은 별첨 2를 따른다. | false |
| doc_p01 | 구매 발주 및 검수 업무 지침 | 별첨 2 긴급 발주 분류 기준 | 41 | 생산 라인 중단이 예상되거나 납기가 5일 이내로 남은 건을 긴급 발주… | false |
아래 Zod 스키마에 맞는 고객사 업무 지침서 문단 90행 JSON 배열로 생성하세요. 지침서 3~4건, 각 지침서는 장·절 번호가 이어지고 별첨이 하나씩 붙습니다.
{"type":"object","properties":{"doc_id":{"type":"string"},"doc_title":{"type":"string"},"section":{"type":"string"},"para_no":{"type":"integer"},"text":{"type":"string"},"has_table":{"type":"boolean"}},"required":["doc_id","doc_title","section","para_no","text","has_table"]}
쉬운 문서만 만들지 마세요. 다음 하드 케이스를 의도적으로 섞으세요(쉬운 문제만 푸는 함정 회피): (1) 하나의 분기가 두 문단에 나뉜 경우(‘3% 이내이면 합격’ 과 ‘3%를 초과하면 재검수’ 처럼) 3쌍, (2) 예외 조건이 본문이 아니라 별첨 문단에만 적힌 경우 2건, (3) 조건은 있는데 승인자가 안 적힌 문단 2~3건, (4) ‘아래 표와 같다’ 로 표에 위임한 문단(has_table=true) 2건, (5) 같은 뜻을 다르게 쓴 승인자 표기(‘팀장’/‘부서장’) 1쌍, (6) 금액을 ‘500만원’ 과 ‘5,000,000원’ 으로 달리 쓴 문단 1쌍. text 는 실제 사내 지침서처럼 ‘~한다’ 체 단문으로 쓰세요. JSON 배열만 출력하세요.{"type":"object","properties":{"doc_id":{"type":"string"},"doc_title":{"type":"string"},"section":{"type":"string"},"para_no":{"type":"integer"},"text":{"type":"string"},"has_table":{"type":"boolean"}},"required":["doc_id","doc_title","section","para_no","text","has_table"]}지침서 문단에서 사람이 직접 읽어 옮긴 정답 분기표입니다. 추출 결과의 숫자·단위·비교기호·승인자를 이 표와 완전 일치로 대조해 채점하므로, 정답이 LLM 판단이 아니라 원문에서 결정됩니다. 승인자가 원문에 안 적힌 행은 approver 를 null 로 두어, 값을 채워 넣으면 오답으로 셉니다.
| doc_id | para_no | branch_type | condition | threshold | unit | comparator | approver |
|---|---|---|---|---|---|---|---|
| doc_p01 | 11 | 기간기준 | 자재 요청서 접수 후 3영업일 이내에 발주서 작성 | 3 | 영업일 | <= | — |
| doc_p01 | 12 | 금액기준 | 발주 금액 500만원 이상이면 승인 후 발송 | 5,000,000 | 원 | >= | 팀장 |
| doc_p01 | 13 | 대상예외 | 긴급 발주 분류 건은 금액과 무관하게 상위 승인 | — | — | — | 본부장 |
| doc_p01 | 41 | 대상예외 | 납기가 5일 이내로 남은 건은 긴급 발주로 분류 | 5 | 일 | <= | — |
| doc_p01 | 21 | 기간기준 | 입고일 기준 2영업일 이내에 검수 결과 입력 | 2 | 영업일 | <= | — |
아래 Zod 스키마에 맞는 정답 분기표 60행 JSON 배열로 생성하세요. sop_paragraphs 의 doc_id·para_no 와 1:1로 대응하고, 조건이 없는 단순 서술 문단은 행을 만들지 마세요.
{"type":"object","properties":{"doc_id":{"type":"string"},"para_no":{"type":"integer"},"branch_type":{"type":"string","enum":["금액기준","기간기준","대상예외","서류요건"]},"condition":{"type":"string"},"threshold":{"type":["number","null"]},"unit":{"type":["string","null"]},"comparator":{"type":["string","null"],"enum":[">=",">","<=","<","="]},"approver":{"type":["string","null"]}},"required":["doc_id","para_no","branch_type","condition","threshold","unit","comparator","approver"]}
조건: (1) threshold 는 원문 표기가 ‘500만원’ 이어도 5000000 처럼 숫자로 정규화하고 unit 을 따로 둡니다, (2) 원문에 승인자가 안 적힌 행은 approver 를 반드시 null 로 두고 추측해 채우지 마세요, (3) ‘이내’ 는 <=, ‘초과’ 는 >, ‘이상’ 은 >= 로 매핑합니다, (4) branch_type 분포는 금액기준·기간기준·대상예외·서류요건이 고르게 나오도록 합니다. JSON 배열만 출력하세요.{"type":"object","properties":{"doc_id":{"type":"string"},"para_no":{"type":"integer"},"branch_type":{"type":"string","enum":["금액기준","기간기준","대상예외","서류요건"]},"condition":{"type":"string"},"threshold":{"type":["number","null"]},"unit":{"type":["string","null"]},"comparator":{"type":["string","null"],"enum":[">=",">","<=","<","="]},"approver":{"type":["string","null"]}},"required":["doc_id","para_no","branch_type","condition","threshold","unit","comparator","approver"]}| LLM | 지침서 문장을 절차 단계·분기 조건·승인 지점으로 끊는 추출 엔진입니다. 최종 판정이 아니라 문장에서 구조로 옮기는 변환만 맡깁니다 |
| RAG | 지침서가 별첨이나 다른 문서를 참조하는 대목을 찾아 인용 문장으로 붙이는 검색 계층입니다(문단 단위 임베딩 + 인용 문장 존재 검증) |
| Function Calling | 추출한 분기를 에이전트가 부를 툴 시그니처(이름·인자·필수 승인 여부) 초안으로 옮기는 층입니다 |
| Python | docx·pdf 텍스트 레이어 파서와 Markdown 절차서 렌더러, 원문 대조 채점 스크립트를 돌리는 CLI 본체입니다 |
| SQLite | 지침서 문단과 추출 결과를 파일 하나에 담아 개정판을 넣었을 때 바뀐 절차만 뽑아내는 저장소입니다 |
| Docker | 고객사 폐쇄망 배포를 가정해 파서와 모델 호출 설정을 이미지 하나로 묶습니다(3주차) |
✓ pass → 그대로 멈춰도 완결입니다. 더 키우려면 2주차(별첨·연계 절차 잇기와 개정 diff)로 진행합니다.
✓ pass → 여기서 멈춰도 완결입니다. 더 키우려면 3주차(툴 정의로 옮기고 폐쇄망에서 실행)로 진행합니다.
지침서 한 건에서 뽑은 1) 절차 단계 순서, 2) 각 단계의 분기 조건과 원문 인용, 3) 사람이 승인해야 하는 지점, 4) 지침서에 안 적혀 현업에게 물어야 하는 항목. Markdown 절차서로 렌더되기 직전의 구조입니다.
{"type":"object","properties":{"doc_id":{"type":"string"},"doc_title":{"type":"string"},"steps":{"type":"array","items":{"type":"object","properties":{"step_no":{"type":"integer"},"action":{"type":"string","minLength":6},"actor":{"type":"string"},"source_para":{"type":"integer"},"quote":{"type":"string","minLength":10}},"required":["step_no","action","actor","source_para","quote"]},"minItems":1},"branches":{"type":"array","items":{"type":"object","properties":{"step_no":{"type":"integer"},"branch_type":{"type":"string","enum":["금액기준","기간기준","대상예외","서류요건"]},"condition":{"type":"string","minLength":4},"then_action":{"type":"string","minLength":4},"source_para":{"type":"integer"},"quote":{"type":"string","minLength":10},"approver":{"type":["string","null"]}},"required":["step_no","branch_type","condition","then_action","source_para","quote","approver"]}},"human_gates":{"type":"array","items":{"type":"object","properties":{"step_no":{"type":"integer"},"why":{"type":"string","minLength":8},"approver":{"type":"string"}},"required":["step_no","why","approver"]}},"unresolved":{"type":"array","items":{"type":"object","properties":{"source_para":{"type":"integer"},"question":{"type":"string","minLength":8}},"required":["source_para","question"]}}},"required":["doc_id","doc_title","steps","branches","human_gates","unresolved"]}[
{
"doc_id": "doc_p01",
"doc_title": "구매 발주 및 검수 업무 지침",
"steps": [
{
"step_no": 1,
"action": "자재 요청서를 접수하고 발주서를 작성한다",
"actor": "구매 담당자",
"source_para": 11,
"quote": "구매 담당자는 자재 요청서를 접수한 날로부터 3영업일 이내에 발주서를 작성한다."
},
{
"step_no": 2,
"action": "발주서를 발송한다",
"actor": "구매 담당자",
"source_para": 12,
"quote": "발주 금액이 500만원 이상인 경우 팀장 승인을 받은 뒤 발주서를 발송한다."
}
],
"branches": [
{
"step_no": 2,
"branch_type": "금액기준",
"condition": "발주 금액 500만원 이상",
"then_action": "팀장 승인을 받은 뒤 발송",
"source_para": 12,
"quote": "발주 금액이 500만원 이상인 경우 팀장 승인을 받은 뒤 발주서를 발송한다.",
"approver": "팀장"
},
{
"step_no": 2,
"branch_type": "대상예외",
"condition": "긴급 발주로 분류된 건",
"then_action": "금액과 무관하게 본부장 승인",
"source_para": 13,
"quote": "다만 긴급 발주로 분류된 건은 금액과 무관하게 본부장 승인을 받는다.",
"approver": "본부장"
}
],
"human_gates": [
{
"step_no": 2,
"why": "금액 기준을 넘거나 긴급으로 분류된 발주는 발송 전에 사람이 결재해야 합니다",
"approver": "팀장 또는 본부장"
}
],
"unresolved": [
{
"source_para": 24,
"question": "검수 등급별 처리 방법 표가 본문에 없습니다. 등급 구분과 등급별 조치를 어디에서 확인하면 될까요"
}
]
},
{
"doc_id": "doc_c01",
"doc_title": "고객 환불 처리 지침",
"steps": [
{
"step_no": 1,
"action": "환불 요청을 접수하고 주문번호와 수령 여부를 확인한다",
"actor": "상담사",
"source_para": 5,
"quote": "상담사는 환불 요청을 접수하면 주문번호와 수령 여부를 먼저 확인한다."
},
{
"step_no": 2,
"action": "환불 승인 여부를 결정한다",
"actor": "상담사",
"source_para": 7,
"quote": "환불 금액이 30만원을 넘으면 CS 파트장이 승인한다."
}
],
"branches": [
{
"step_no": 2,
"branch_type": "금액기준",
"condition": "환불 금액 30만원 초과",
"then_action": "CS 파트장 승인을 받는다",
"source_para": 7,
"quote": "환불 금액이 30만원을 넘으면 CS 파트장이 승인한다.",
"approver": "CS 파트장"
},
{
"step_no": 2,
"branch_type": "기간기준",
"condition": "결제일로부터 7일 경과",
"then_action": "상담사 단독 처리를 금지한다",
"source_para": 6,
"quote": "결제일로부터 7일이 지난 요청은 상담사가 단독으로 처리하지 않는다.",
"approver": null
},
{
"step_no": 2,
"branch_type": "대상예외",
"condition": "상품 하자가 확인된 건",
"then_action": "금액 기준을 적용하지 않는다",
"source_para": 8,
"quote": "단, 상품 하자가 확인된 건은 금액 기준을 적용하지 않는다.",
"approver": null
}
],
"human_gates": [
{
"step_no": 2,
"why": "30만원을 넘는 환불은 지침이 승인자를 지정하고 있어 자동 처리하지 않습니다",
"approver": "CS 파트장"
}
],
"unresolved": [
{
"source_para": 6,
"question": "결제일로부터 7일이 지난 요청은 누가 처리하는지 지침에 없습니다. 승인 주체를 알려 주실 수 있을까요"
}
]
},
{
"doc_id": "doc_p01",
"doc_title": "구매 발주 및 검수 업무 지침",
"steps": [
{
"step_no": 1,
"action": "자재 요청서를 접수하고 발주서를 작성한다",
"actor": "구매 담당자",
"source_para": 11,
"quote": "구매 담당자는 자재 요청서를 접수한 날로부터 3영업일 이내에 발주서를 작성한다."
}
],
"branches": [
{
"step_no": 1,
"branch_type": "서류요건",
"condition": "자재 요청서에 사양서가 빠진 경우",
"then_action": "요청 부서에 사양서를 받은 뒤 발주한다",
"source_para": 12,
"quote": "사양서가 첨부되지 않은 요청은 발주하지 않는다.",
"approver": null
}
],
"human_gates": [
{
"step_no": 1,
"why": "사양서 누락 여부는 문서만으로 가릴 수 없어 요청 부서 확인이 필요합니다",
"approver": "구매 파트장"
}
],
"unresolved": [
{
"source_para": 41,
"question": "긴급 발주의 승인 주체가 문단에 적혀 있지 않습니다. 누가 승인합니까?"
}
]
}
]자동: (1) JSON Schema parse, (2) 모든 quote 가 해당 source_para 의 sop_paragraphs.text 에 substring 으로 존재하는지 대조, (3) branches 의 숫자·단위·비교기호를 gold_branches 와 완전 일치로 채점(‘이내’→<=, ‘초과’→>, ‘이상’→>=), (4) approver 가 인용 문장에 등장하지 않으면 null 로 강제하고 그 문단을 unresolved 로 내림, (5) step_no 가 branches·human_gates 에서 steps 범위를 벗어나면 반려. 수동: 지침서 2건을 사람이 읽고 절차 단계 누락 여부를 확인합니다. unresolved 항목은 도구가 채우지 않고 현업 확인 질문으로 그대로 남깁니다.
근거: 앵글컴퍼니는 Angle OS로 기업을 AI 네이티브 조직으로 전환합니다