항공 IROPS 승무원 회복을 더 잘 최적화할 AI를 만들었다. 성숙한 CBC 솔버가 이겼고, 나는 주장을 구성에 의한 합법성과 허둥지둥이 아닌 초 단위로 바꿨다.
AirlinesAviationOptimization

항공 승무원 회복에서 솔버를 이기려고 AI를 만들었다. 졌고, 그 패배가 제품이 되었다.

Ashutosh SinghalAshutosh Singhal2026년 7월 5일11 min

이기려고 만든 벤치마크, 그리고 패배

나는 StormCrew 첫 버전을 솔버를 이기기 위해 만들었다. 그게 머릿속 피치의 전부였다. 항공 운항 통제는 수십 년 된 최적화 엔진으로 돌아가니, 더 똑똑한 것을 훈련시킬 수 있다면 말해 볼 만한 이야기가 될 터였다. 몇 주를 쏟았다. 그리고 내 회복 엔진을 CBC와 벤치마크했다. 내가 for-loop을 짜기도 전부터 전장을 거친 성숙한 오픈소스 혼합정수 솔버인데, CBC가 이겼다. 반올림 오차 수준이 아니었다.

두 열의 숫자를 멍하니 바라보며, 자기가 옳다는 걸 증명하려고 설계한 실험이 오히려 틀렸다는 걸 보여줄 때 느끼는 그 특유의 공허함을 느꼈던 게 기억난다. 솔버가 더 빨랐다. 계획이 더 저렴했다. 실행 불가능한 스케줄을 단 한 번도 돌려주지 않았다. 내 똑똑한 버전은 세 가지 모두에서 졌다.

그래서 내가 생각할 수 있는 유일한 정직한 일을 했다. 숫자가 아니라 주장을 바꿨다.

나는 솔버를 이기려고 AI를 만들었다. 솔버가 이겼다. 흥미로운 부분은 그 싸움이 숨기고 있던 모든 것이었다.

그 반전이 StormCrew가 실제로 된 것의 뼈대이고, 내가 처음에 하려던 이야기보다 더 유용한 이야기라고 생각한다. 전체를 직접 실행해 볼 수 있다: veriprajna.com/ko/demos/airline-crew-scheduling-ai, 하지만 무엇이 내 마음을 바꿨는지 차근차근 설명해 보겠다. 그 전환이 핵심이니까.

폭풍이 허브를 묶을 때 실제로 무너지는 것은 무엇인가?

CBC에게 겸허해진 뒤 붕괴 사후 분석들을 다시 읽어 보니, 실패의 거의 어느 것도 "수학이 살짝 최적이 아니었다"가 아니었다. 업계가 부르는 불규칙 운항, 즉 IROPS는 항공사에 대략 연 600억 달러(IATA)의 비용이 든다. 전형적인 재앙인 2022년 12월 사우스웨스트는 대략 12억 달러, 약 16,900편 결항과 대략 200만 명의 승객이 발이 묶였다. 그 날들이 실제로 어떻게 풀려 가는지 추적해 보니, 옵티마이저는 결코 악당이 아니었다.

대신 세 가지가 무너진다. 회복은 너무 느리다: 폭풍이 허브를 묶으면 하류 연쇄의 재배정은 여전히 대체로 4~12시간의 수동 허둥지둥이다 (출처가 있는 벤치마크이지, 내가 지어낸 숫자가 아니다). 또한 너무 위험하다: 모든 재배정은 FAA Part 117의 근무·휴식 한도와 항공사별 노조 CBA를 지켜야 하며, 단 한 건의 위반도 각주가 아니라 컴플라이언스 사건이다. 그리고 너무 불투명하다: 방금 승무원을 잃은 하류 항공편의 연쇄가, 그 항공편들이 이미 결항되기 전까지는 보이지 않는다.

마지막 것이 레거시 도구가 놓치는 부분이고, 내가 데모에 가장 먼저 보여 주게 한 것이다. 가장 바쁜 허브에 폭풍을 주입하면 앱이 피해 반경을 강조한다: 발이 묶인 항공편과, 로테이션을 통해 승무원을 잃는 한 홉 하류 항공편들. 시드된 시나리오에서는 네트워크 전역에서 53편이 위험에 처해 있다.

허브 DEN에 폭풍을 주입한 뒤의 StormCrew 대시보드, 피해 반경으로 호박색으로 강조된 하류 항공편 53편
폭풍을 주입하면 피해 반경이 켜진다: 네트워크 전역 53편이 방금 승무원을 잃었고, 레거시 도구가 결항이 시작된 뒤에야 보는 연쇄다.

시행된 DOT 자동 환불 규칙(2024년 10월) 이후, 3시간 이상 연쇄 지연도 이제 자동 재정 타격이다. 그래서 느리거나, 불법이거나, 눈먼 채로 있는 비용이 도구는 그대로인 채 정확히 올랐다. 그 세 가지 실패 중 어느 것도 더 나은 목적 함수로는 고쳐지지 않는다. 나는 이미 괜찮은 단 한 가지를 최적화하고 있었던 셈이다.

왜 CBC를 이기려다 말고 CBC에 일을 맡기기 시작했을까?

나는 CBC에 다른 일을 줌으로써 패배를 받아들였다. 솔버와 경쟁하는 대신, 감쌌다. 파이프라인은 전부 실제·결정론적·시드 코드다: 합성 항공 네트워크와 승무원 상태, 로테이션 그래프 도달 가능성으로 피해 반경을 계산하는 혼란 주입기, 듀티 생성기, 그다음 엔진으로서의 CBC가 계획을 고르고, 아무것도 하지 않는 경우와의 섀도 비교, 그다음 서명된 증명서.

시드된 폭풍에서 돌리면 생성기는 합법적 회복 듀티 1,762개를 만든다 (그중 52개는 필요한 곳으로 승무원을 옮기는 데드헤드 재배치), 여기에 결항 폴백 53개를 더해 총 후보 열 1,815개가 된다. CBC는 그 결과인 변수 1,815개, 제약 115개의 최소 비용 집합 분할을 OPTIMAL까지 풀고 약 0.11초 만에 계획을 돌려준다. 그 시나리오 결과: 53편 중 52편 재배정(98%), 결항 1, 사용 승무원 34팀 (정규 25, 예비 9).

이진 변수 1,815개, 제약 115개, 솔버 상태 OPTIMAL을 보여 주는 CBC 솔브 단계
화면의 엔진은 CBC다. 숨기지 않고 공개한다: 변수 1,815개·제약 115개 집합 분할을 OPTIMAL까지 풀었다. 나는 솔버를 쓴다. 이긴다고 주장하지 않는다.
항공사의 문제는 솔버가 너무 약하다는 것이 아니었다. 회복이 너무 느리고, 너무 위험하며, 너무 늦을 때까지 보이지 않는다는 것이었다.

그 스크린샷의 정직함에 주목하라. 회복 엔진은 CBC이며, 패널에 이름이 붙어 있다. 지속 가능한 주장은 내 코드가 솔버보다 더 잘 최적화한다는 것이 아니다. 출처가 있는 수동 프로세스가 4~12시간 걸리는 곳에서 계획이 1초도 안 되어 도착한다는 것이고, 앱은 그 간극을 드러내 놓고 측정한다. 범위를 정확히 하고 싶다. 이것은 데모이고, 그 이상인 척 세탁하지 않겠다: 그 정확한 수치는 시드된 합성 네트워크 하나의 결과이지, 열린 세계에 대한 보장이 아니다. 속도 대 수동 주장이 끝까지 살아남는다.

합법성 보장은 코드에 있어야 하며, 모델의 판단에 있어서는 안 된다

이것을 만들어 보고서야 얻은 강한 의견이 있으니, 분명히 말하겠다. 합법성 보장은 모델의 판단에 살 수 없다. 구성상 결정론적 코드에 살아야 한다. 불법 승무원 듀티가 추천되지 않게 막는 방법은 모델이 피하도록 훈련시키는 것도, 목적 함수에 벌점 항을 더하고 옵티마이저가 우회하기를 바라는 것도 아니다. 애초에 불법 듀티를 생성 불가능하게 만드는 것이다.

그래서 제약은 생성 시점에 강제되며, 나중에 점수로 매겨지지 않는다. Part 117은 듀티 기간을 780분, 비행 시간을 480분으로 제한하고, 최소 체류 30분을 요구한다. 샘플 CBA는 듀티를 4세그먼트로 제한한다. 이 모두를 만족하는 듀티만 후보 열이 된다. 이것이 액션 마스킹이다. 불법 배정은 벌점을 받지 않으며, 표현 불가능하다. CBC가 받은 열로 무엇을 하든, 선택적 코파일럿이 계획에 대해 나중에 무엇을 말하든, 어느 쪽도 불법 듀티를 되살릴 수 없다. 애초에 집합에 없었기 때문이다.

그래서 점수 대신 불변식이 생긴다: 불법 배정 0건, 언제나, 단위 테스트됨 (테스트 스위트는 3/3 통과 — 피해 반경이 비어 있지 않은지, 합법 열만 생성되는지, 회복된 계획이 합법 분할인지 확인). 점수는 퇴보할 수 있다. 불변식은 약속할 수 있다.

불법 0건의 합법성 게이트를 보여 주는 회복 결과 패널, 모델이 아니라 열 마스킹으로 코드에서 강제된다고 표시
내가 가장 아끼는 줄: 불법 0건, 모델이 아니라 열 마스킹으로 코드에서 강제. Part 117과 CBA는 모델이 잘 행동해서가 아니라 구성으로 보장된다.

안전 이야기가 "모델이 하지 않도록 배웠다"일 때 "자율 AI 운영" 피치가 더 이상 설득력 없게 느껴지는 이유도 이것이다. 이 빌드 초기에 딱 한 번 모델이 하드 룰을 지키도록 믿어 봤고, 지키지 못한 그 입력 전까지는 괜찮았다. 단 한 건의 위반이 규제 사건인 영역에서 "대개 합법"은 "합법 아님"과 같다. 감독하기보다 가능성을 지워 버리겠다.

한 해 중 최악의 날에는 무슨 일이 일어나는가?

무엇이든 자동 승인하는 버전을 거의 출시할 뻔했고, 시나리오가 막아 줘서 다행이다. 데모를 severe로 전환하면, 사건이 심해 예비가 바닥나고 대략 승무원의 30%만 남는다. CBC는 여전히 완전 합법 계획을 약 0.05초 만에 찾고, 여전히 불법 0건이다. 하지만 그 계획은 53편 중 20편을 결항시키는데, 이는 반경의 38%로, OCC의 15% 자동 승인 임계값을 훨씬 웃돈다.

그 상황에서 옳은 움직임은 영향받는 네트워크의 3분의 1 이상을 결항시키는 계획에 조용히 도장을 찍는 것이 아니다. 그래서 상태가 ESCALATE, 사람 승인 필요로 바뀌고, 사유가 표시된다. 계획은 여전히 계산되고, 여전히 합법이며, 컨트롤러에게 여전히 제시된다 (33편 회복, 반경의 62%). 다만 자동 승인되지는 않는다.

회복이 53편 중 20편(38%)을 결항시켜 15% 임계값을 넘기 때문에 컨트롤러로 ESCALATE하는 severe 시나리오 결과
정직한 난제: 여전히 반경의 38%를 결항시키는 합법 계획은 ESCALATE, 사람 승인 필요로 뒤집힌다. 계획은 보여 주고 표시되며, 고무도장으로 통과되지 않는다.
대부분의 "자율" 피치가 건너뛰는 부분은, 옳은 행동이 행동하지 않고 그날을 사람에게 넘기는 때를 아는 것이다.

그 게이트를 만들며 카테고리 전체에 대한 내 느낌이 바뀌었다. 에스컬레이션은 시스템 실패가 아니다. 나쁜 날에 대한 시스템의 정직함이다. 항상 자신 있는 답을 돌려주는 어드바이저는 데모하기 쉽고 믿기 위험하다. 가끔 "이건 당신 선 위다, 당신이 결정하라"고 말하는 쪽이, 새벽 3시 컨트롤러 옆에 실제로 두고 싶은 것이다.

내가 컨트롤러라면 원했을 산출물

다음날 아침 운항 컨트롤러에게 필요한 것이 무엇인지 계속 물었고, 답은 대시보드가 아니라 기록이었다. 그래서 모든 회복은 서명된 recovery_plan.json으로 봉인된다: 혼란, 승무원·항공편별 선택된 계획 조치, 조치마다 한도와 대조해 확인한 구체적 Part 117 및 CBA 조항, 회복 벽시계 시간, 그리고 절감 수치. 이것은 OCC의 감사 기록으로, 이 회복이 추천된 이유를 담으며, 한 번의 클릭으로 내보낼 수 있다.

상태 RECOVERED, 규제 한도, 합법성 보장이 담긴 서명된 recovery_plan.json을 보여 주는 증명서 단계
모든 추천은 서명된 recovery_plan.json을 내보낸다: 상태, 확인된 Part 117 한도, 액션 마스킹으로 강제된다고 명시된 합법성 보장. 감사 추적이 핵심이다.

선택적 계획 코파일럿도 있으며, 어디에 자리하는지 분명히 하고 싶다. LLM에 대한 얇은 어댑터(기본 Claude, 제공자 교체 가능, 또는 키 없는 로컬 브리지)로, 계획을 쉬운 영어로 설명한다. 키가 없으면 아예 기권하고, 나머지 전부는 오프라인·키리스로 돌아가며, 의사결정 코어 바깥에 산다. 결정론적 마스크, CBC, 에스컬레이션 게이트가 결정한다. 모델은 사후에만 서술한다. 일부러 거기에 두었다. 언어 모델이 어떤 듀티가 합법인지를 좌우하는 순간, 이 빌드 전체를 바쳐 얻은 보장을 잃기 때문이다.

절감액에 대해서도 같은 규율이 적용된다. 정상 시나리오에서 섀도 비교는 회피된 결항 52건과 대략 회피된 DOT 환불 노출 237만 달러를 보여 준다 (승객당 300달러 모델) — 아무것도 하지 않는 경우 대비. 기준선이 피해 반경 전체를 발이 묶이게 하는 것이라 가능한 가장 아첨하는 프레이밍이며, 그 한 시나리오의 예시로 라벨되어 있다. 헤드라인이 아니고, 내 코드가 무엇을 더 잘 최적화한다는 증거는 더더욱 아니다. 그날 CBC에게 그 논쟁에서 졌다. 마케팅 숫자로 슬쩍 되찾지 않겠다.

그렇다면 "증강하되, 대체하지 말라"는 실제로 무엇을 뜻하는가?

예전에는 증강이 소심한 선택, 대담한 것을 못 만들 때 하는 말이라고 생각했다. 지금은 반대다. 여기 구매자는 이미 좋은 솔버 스택(Jeppesen 또는 IBS)을 갖고 있고, 전면 교체·락인·한 해 최악의 날의 설명 없는 추천을 견딜 수 없다. 그 구매자에게 "내 더 똑똑한 모델을 위해 그걸 버려라"고 말하는 것은 대담함이 아니라, 벤치마크로 이미 스스로 반증한 주장이다.

정직하게 제안할 수 있는 것은 그들이 이미 신뢰하는 솔버 주변의 운영 계층이다. 물기 전에 연쇄를 보이게 하라. 불법 수를 단지 억제하지 말고 생성 불가능하게 하라. 시간을 초로 압축하라. 그리고 날이 나빠 자동 승인이 아니라 에스컬레이션이 정답인 때를 알라. 데모의 모든 것 — 네트워크, 승무원, 혼란, 달러 수치 — 은 합성이고 시드되어 있으며, 실제 항공사 데이터는 어디에도 없다. 진짜인 것은 메커니즘이고, 처음부터 끝까지 돌아가는 모습을 veriprajna.com/ko/demos/airline-crew-scheduling-ai에서 볼 수 있다.

설명보다 보는 편이 낫다면, 처음부터 끝까지 돌아가는 전체가 여기 있다.

CBC가 나를 이긴 뒤로 계속 굴리고 있는 질문이 있다. 경쟁하는 솔버가 이미 좋고 구매자가 이미 갖고 있다면, 남겨진 것은 더 나은 답이 아니다. 답과의 더 나은 관계다: 더 빠르고, 증명 가능하게 합법이며, 보이고, 에스컬레이션할 만큼 겸손한. 그렇다면 올해 팔리고 있는 AI 중 얼마나 실제로 어려운 부분을 풀고 있고, 얼마나 애초에 깨지지 않았던 부분을 다시 풀고 있는가?

관련 연구

다른 채널에도 게시됨

확신을 가지고 AI를 구축하세요.

차세대 엔터프라이즈 AI 구축에 깊은 경험을 갖춘 팀과 협업하세요. 신뢰할 수 있는 AI 전략을 설계하고 구축하며 배포할 수 있도록 지원해 드리겠습니다.

Veriprajna 딥테크 컨설팅 은(는) 헬스케어, 금융, 규제 분야를 위한 안전 필수 AI 시스템 구축을 전문으로 합니다. 당사의 아키텍처는 확립된 프로토콜에 따라 검증되며 포괄적인 규정 준수 문서를 갖추고 있습니다.