오믈렛
경력근거: 산업 문제(라우팅, 스케줄링, 최적화 등)를 해결하기 위한 Agentic AI 아키텍처 설계
※ 실제 산출물이 아닌 AI 예측 시안입니다.
오믈렛은 AI 에이전트와 최적화 알고리즘으로 간호사 스케줄·AGV/AMR 제어·물류 경로 같은 복잡한 운영 비효율을 푸는 Operational Intelligence Platform 입니다. 이 도구는 오믈렛이 다루는 자원·제약 구조가 있어야 의미가 생기고, 단순 배정이 아니라 제약 위반을 점검하는 형태가 됩니다.
공고가 복잡한 비효율을 AI 에이전트와 최적화 알고리즘으로 푸는 Operational Intelligence Platform 이라 밝힌다. 스케줄·배정 제안 도구가 그 최적화의 진입점이다.
'산업 문제(라우팅, 스케줄링, 최적화 등)를 해결하기 위한 Agentic AI 아키텍처 설계'. 스케줄이 그 산업 문제의 한 갈래입니다.
'고객의 본질적인 문제를 파악하여 기술적 해법을 함께 제시합니다'. 제약을 먼저 세우는 일이 그 파악의 첫 단계입니다.
운영 스케줄·배정 제안 도구입니다. 인력·자원과 제약을 받아 스케줄·배정 초안, 제약 위반 점검, 그 근거를 냅니다.
오믈렛 AI Product Engineer 와 현장 운영 담당입니다.
인력·자원과 제약 메타만으로도 스케줄·배정의 1차안을 만들고 위반을 점검할 수 있고, 운영자는 그 초안을 보고 확정하면 됩니다.
인력·자원과 제약(가용 시간·필수 인원·금지 조합)을 넣으면 작은 규모 스케줄·배정 초안, 위반 점검, 그 근거를 내는 웹 도구입니다. 대규모 최적화 솔버는 빼고 소규모 인스턴스에 규칙·탐욕적 배정으로 시작한다(대규모 솔버·실시간 제어는 빠진 20% 기술이라 W3로 분리).
1주차 배정안을 제약 규칙과 대조해 위반을 재고, 사람 운영자 정답과 비교해 만족도·공정성 기준을 보정한 v2.
소규모 휴리스틱을 솔버 기반 최적화로 바꿔 비용·공정성 목표 가중치를 조절하고, 더 큰 인스턴스를 푸는 확장판입니다.
자원·제약 한 세트를 넣으면 스케줄·배정안과 제약 위반 점검, 그 근거가 한 화면에 나오는 걸 시연합니다.
배정이 입력 제약을 위반하지 않고 근거가 실제 제약·자원을 인용했는지 규칙·judge 로 검사해 제약 위반 0건을 보여줍니다. 단, 정답·데이터를 작성자가 만든 합성 기준이라 성능 검증이 아니라 데모 조건 동작입니다.
결측 자원·과제약·모순 제약을 일부러 섞은 인스턴스 30종을 넣어도 출력 JSON 형식이 안 깨지고 '해없음·확인필요'로 알리는 걸 시연합니다.
배정안과 사람 정답의 일치도를 Cohen's κ(두 채점자가 우연 이상으로 얼마나 일치하는지 -1~1 점수, 높을수록 일치)로 2주차에 보고합니다. 합성 기준 추정이라 실제와 다를 수 있습니다.
위 수치는 더미데이터 자가채점이며, 실제 배정 품질은 오믈렛 실 운영 제약과 실 운영자 판단이 있어야 측정 가능합니다. 이 포트폴리오는 그 검증을 바로 돌릴 수 있는 상태까지 만듭니다.
수치는 합성 데이터 자가채점이라 성능 증명이 아닙니다. 면접에서 데모 동작과 실검증 준비 상태로 솔직히 설명합니다.
정답을 작성자가 만들었으니 잘 맞는 것이 당연합니다. 결측 자원·과제약·모순 제약을 더미에 일부러 섞어 쉬운 문제만 푸는 함정을 피합니다.
작은 인스턴스에서 잘 되도 큰 규모에선 시간·품질이 무너질 수 있습니다. 실데이터 도입 단계에서 솔버 성능을 실 규모로 검증하는 과제로 분리합니다.
실제 도입 시 합성 정답이 실 운영자 판단으로 바뀌고 제약·목표도 도메인마다 달라집니다. 제약 enum 과 목표 가중치를 실 운영으로 다시 맞추는 일을 도입 과제로 둡니다.
① 인라인 샘플 · ② seed.json 다운로드 · ③ 증강 프롬프트. 세 층 모두 동일한 schema 에서 파생.
스케줄·배정 인스턴스의 자원과 제약. 배정의 입력.
| slot_id | resource_raw | resource_id | avail | skills | max_hours | forbidden_with |
|---|---|---|---|---|---|---|
| R01 | 간호사 김 | nurse_kim | ["mon_am","tue_am"] | ["icu"] | 40 | [] |
| R02 | 간호사김 | nurse_kim | ["mon_am"] | ["icu"] | 40 | [] |
| R03 | 간호사 이 | nurse_lee | ["mon_pm","wed_pm"] | ["er"] | 36 | ["nurse_kim"] |
| R04 | 신규인력 | — | [] | [] | — | [] |
| R05 | 간호사 박 | nurse_park | ["mon_am","mon_pm","tue_am","tue_pm"] | ["icu","er"] | 52 | [] |
다음 Zod 스키마를 따르는 자원·제약 행을 더 생성하라: {"type":"object","properties":{"slot_id":{"type":"string"},"resource_raw":{"type":"string"},"resource_id":{"type":["string","null"]},"avail":{"type":"array","items":{"type":"string"}},"skills":{"type":"array","items":{"type":"string"}},"max_hours":{"type":["number","null"]},"forbidden_with":{"type":"array","items":{"type":"string"}}},"required":["slot_id","resource_raw","resource_id","avail","skills","max_hours","forbidden_with"]}. 쉬운 데이터만 만들지 말 것 — 다음 하드 케이스를 의도적으로 섞어라: avail·skills 가 빈 배열이고 max_hours 가 null 인 정보 부족, resource_id 가 null 인 미등록 신규 인력(orphan), 같은 인력 표기 흔들림(resource_raw 다름·resource_id 동일), max_hours 0(가용 없음) 경계값, forbidden_with 가 서로를 가리키는 모순·과한 금지 조합. 추가로 형식 깨뜨리기 시도 3건(타입이 어긋난 행)을 별도 표시해 파서 가드 테스트에 쓴다.{"type":"object","properties":{"slot_id":{"type":"string"},"resource_raw":{"type":"string"},"resource_id":{"type":["string","null"]},"avail":{"type":"array","items":{"type":"string"}},"skills":{"type":"array","items":{"type":"string"}},"max_hours":{"type":["number","null"]},"forbidden_with":{"type":"array","items":{"type":"string"}}},"required":["slot_id","resource_raw","resource_id","avail","skills","max_hours","forbidden_with"]}| 배정 엔진(Python) | 제약 파싱·탐욕적/솔버 배정·위반 점검·LLM 근거 호출을 묶는 런타임. |
| 웹 검토 화면 | 운영자가 스케줄·배정과 위반·근거를 보고 고치는 인터페이스. |
| 제약·결과 저장소 | 자원·제약·배정 결과·위반 이력을 저장해 비교·보정에 다시 쓴다. |
| LLM | 배정 결과에 사람이 읽을 근거 설명과 위반 사유를 생성한다. |
| Claude | 제약·목표를 해석하고 배정 근거를 설명하는 주 모델로 쓴다. |
✓ pass → 여기서 멈춰도 운영 보조 도구로 완결입니다. 더 키우려면 2주차에서 위반을 잡고 정답과 비교해 보정합니다.
✓ pass → 신뢰가 붙으면 3주차에서 솔버·목표 가중치로 더 큰 인스턴스로 넓힙니다.
스케줄 인스턴스 한 슬롯에 대한 배정과 제약 점검.
{"type":"object","properties":{"slot_id":{"type":"string"},"assigned_shifts":{"type":"array","items":{"type":"string"}},"violations":{"type":"array","items":{"type":"string","enum":["over_hours","forbidden_pair","skill_missing","no_avail"]}},"status":{"type":"string","enum":["ok","partial","infeasible","review"]},"evidence":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string","enum":["avail","skills","max_hours","forbidden_with"]},"note":{"type":"string"}},"required":["field","note"]},"minItems":1},"hedge":{"type":"string"}},"required":["slot_id","assigned_shifts","violations","status","evidence","hedge"]}[
{
"slot_id": "R05",
"assigned_shifts": [
"mon_am",
"tue_am"
],
"violations": [],
"status": "ok",
"evidence": [
{
"field": "avail",
"note": "월·화 오전 가용"
},
{
"field": "skills",
"note": "icu·er 보유로 배정 가능"
}
],
"hedge": "배정은 합성 제약 기준 추정이라 실 운영과 다를 수 있다."
},
{
"slot_id": "R04",
"assigned_shifts": [],
"violations": [
"no_avail",
"skill_missing"
],
"status": "review",
"evidence": [
{
"field": "avail",
"note": "가용·스킬 정보가 비어 배정 불가, 확인필요"
}
],
"hedge": "정보 부족이라 보류. 합성 기준."
},
{
"slot_id": "R08",
"assigned_shifts": [],
"violations": [
"over_hours"
],
"status": "infeasible",
"evidence": [
{
"field": "max_hours",
"note": "max_hours 0 이라 배정 불가"
}
],
"hedge": "가용 시간 0 경계값이라 해없음. 합성 기준."
}
]violations·status enum, assigned_shifts 가 입력 avail 부분집합인지, evidence min(1)은 Zod 와 조인으로 자동 검증한다. over_hours·forbidden_pair·skill_missing 위반은 규칙/솔버로 자동 검증하고, 배정 근거 의미·hedge 의 합성 기준 표기는 judge 와 수동 spot-check 로 검증한다.