
나는 계속 모델을 고치려 했다. 문제는 조명이었다.
이 빌드에서 화이트보드에 처음 적은 숫자는 97퍼센트였다. 두 번째는 14였다.
둘 다 같은 모델을 설명한다. 우리 연구의 스탬핑 사례에서, 실험실에서 97% 정확도로 검증된 비전 모델이 분당 40스트로크로 돌아가는 200톤 프로그레시브 다이 프레스에 올라가면 양품의 14%를 오거부하기 시작한다. 모델 내부는 아무것도 바뀌지 않았다. 입력이 바뀌었다: 스트로크 각도에 따라 달라지는 천장 베이 라이트 글레어, 차가운 다이보다 따뜻한 다이에서 다르게 고이는 윤활유, 프레스가 열평형에 이르기 전 매 교대 초반 50개 부품. 라인의 물리가 이미지를 모델이 검증된 분포 밖으로 밀어냈고, 어떤 정확도에서도 그 바깥에서는 어떤 모델도 신뢰할 수 없다.
나는 이 프로젝트의 마지막 구간을 그 문장을 진지하게 받아들이는 데모를 만드는 데 썼다. 이름은 Inspection Trust Gate이고, 부품마다 어떻게 결정하는지 veriprajna.com/ko/demos/edge-ai-manufacturing-inspection에서 볼 수 있다. 더 나은 결함 모델이 아니다. 비전 모델과 PLC 리젝트 액추에이터 사이의 런타임 계층이며, 그 유일한 역할은 모든 부품마다 모델의 판정이 작동해도 안전한지를 결정하는 것이다.
다음은 검사 AI에 대한 내 생각을 바꾼 세 순간을 관통하는 빌드 스토리다: 스크립트된 06:00의 드리프트 이벤트, 믿기를 거부한 벤치마크 숫자, 그리고 거의 삭제할 뻔한 규칙.
해결책은 더 나은 모델이 아니다
나는 그 문장에 저항하는 데 너무 오래 걸렸다. 검출기가 이상 동작을 보이면, 빌더로서의 내 본능은 재학습하고, 백본을 업그레이드하고, 더 많은 레이블을 사라 한다. 연구는 계속 협조를 거부했다. 바로 쓰는 AOI 시스템은 양품의 5~15%를 오거부하고, 잘 튜닝된 것은 2% 아래로 내리며, 우리 솔루션 페이지는 이를 "모델 아키텍처 문제가 아니라 보정과 데이터 문제"라고 부른다. 같은 연구는 시스템 통합 프로젝트의 84%가 실패하거나 부분 실패하며, 전형적인 검사 배포에서 통합 작업이 프로젝트 일정의 60%이고 모델 학습은 15%라고 보고한다. 내가 계속 다시 읽은 문장: "하드웨어는 발주서다."
그래서 나는 약간 이단적으로 느껴지는 일을 했다: 데모의 결함 모델을 일부러 평범하게 만들었다. 알려진 양품 텍스처까지의 kNN 거리, PatchCore-lite 대용이며, MVTec AD metal_nut 홀드아웃 테스트 스플릿(실제 제조 부품의 실제 사진, 공개 레이블)에서 깨끗한 양품과 결함품을 가르는 AUROC 0.845를 기록한다. 나는 그 숫자를 숨기지 않으며 팔지도 않는다. 프로덕션에서 그 슬롯에는 고정 인터페이스 뒤에 NVIDIA Metropolis 파이프라인, Cognex 시스템, 커스텀 모델이 들어간다. 제품은 엔진이 아니라 엔진 주변의 계층이다.
그 계층은 어떤 정확도 지표도 답하지 못하는 질문에서 시작한다: 이 이미지가 모델이 검증된 캡처 조건 안에 있는가? 데모의 EnvelopeDetector는 물리 신호 공간(노출, 대비, 다이나믹 레인지, 포커스 프록시, 고주파 디테일, 열 색 캐스트, 채도, 글레어 비율)에서 Mahalanobis 거리를 계산하며, 220장의 알려진 양품 학습 이미지만으로 피팅한다. 부품이 그 검증된 엔벨로프 바깥에 떨어지면, 게이트는 모델이 아무리 자신 있어도 모델 출력을 완전히 신뢰하기를 멈춘다.
완벽한 모델조차 검증된 엔벨로프 안의 입력에서만 유효하다.
전체 빌드가 매달린 문장이 바로 그것이다. 드리프트는 모델 실패가 아니라 입력 실패이며, 입력 실패는 정확도 대시보드에 절대 나타나지 않는다. 스크랩 빈에 나타난다.
06:00에는 무슨 일이 일어나는가?
전체 데모에서 내가 가장 신뢰하는 순간은 타임스탬프다. 앱은 "Line 3 - metal_nut press" 스테이션에서 결정론적으로 스크립트된 교대를 재생하며, 실제 MVTec AD metal_nut 사진을 전체 파이프라인으로 스트리밍한다. 중간에 마커가 화면을 가로지른다: "SHIFT CHANGE 06:00 - cold dies, bay lights on." 그다음 글레어, 디포커스, 열 캐스트로 오염된 양품 12개가 도착한다. 그것이 무엇인지 정확히 말하고 싶다: 사진은 진짜이고, 드리프트는 그에 적용된 정직한 이미지 오염이며, 앱도 그렇게 라벨링한다. 나는 촬영할 스탬핑 라인이 없었고, 있는 척하는 것은 요점 전체를 망칠 것이다.
다음에 일어나는 일이 데모가 존재하는 이유다. 엔벨로프 모니터가 빨개진다. 게이트는 각 드리프트된 부품을 검증된 엔벨로프 바깥으로 읽고 모델의 판정이 액추에이터에 닿지 못하게 한다. 판정 뒤에 판정이 HOLD로 돌아오며, 사람을 위한 에스컬레이션 큐로 라우팅되고, 옆 패널은 같은 이미지로 엔벨로프 검사가 없는 순진한 AOI가 했을 일을 보여준다: REJECT.

큐가 채워지는 것을 처음 보았을 때, 홀드된 부품을 클릭하며 모호한 "이상 감지" 변명을 기대했다. 대신 엔벨로프 모니터는 브리치 신호를 신호별로 분해했는데, 임베딩이 아니라 물리 측정으로 만들었기 때문이고, 물리 측정은 스스로를 설명할 수 있다. 한 드리프트 부품에서 밝기는 검증된 피팅에서 7.6 시그마 떨어져 있고 제곱 Mahalanobis 거리의 87.1%를 차지한다. 그건 모델이 감정을 느끼는 것이 아니다. 그건 계기 판독이다.

드리프트 단계가 끝날 때 스코어보드는 극명하다. 순진한 베이스라인은 양품 12개를 자동 스크랩했다. Trust Gate가 자동 스크랩한 것은 0이며, 전부 검토를 위해 홀드했다. 같은 이미지, 같은 대용 결함 모델, 같은 결함 점수 임계값. 유일한 차이는 한쪽 경로가 출력을 신뢰하기 전에 입력을 확인했다는 것이다.
순진한 베이스라인과 게이트는 같은 부품과 같은 모델을 보았다. 유일한 차이는 작동을 허용할 권한이었을 뿐이다.

그 달러 수치에 대해, 데모가 보통 거짓말을 시작하는 지점이기 때문이다: 패널은 측정된 순진한 오거부율을 전체 교대로 외삽한다(분당 40스트로크 × 8시간은 19,200개 부품) 스크랩 부품당 $2.42. $2.42는 출처가 있는 자릿수 규모로, 8.7% 스크랩 폐기 감소가 연 $94K와 제품 38,800kg를 절감한 공개된 쿠키 제조사 사례에 앵커되어 있다. 고객 숫자가 아니며, 카운터는 나타나는 모든 곳에서 투영으로 라벨링된다. 나는 오거부를 측정했고, 달러를 투영했으며, UI는 어느 쪽이 어느 쪽인지 말한다.
내 드리프트 이야기를 믿기 전에 한 가지 더 확인했다: 드리프트 단계에 주입된 결함 부품은 여전히 잡히거나 에스컬레이션되며, 절대 자동 통과되지 않는다. 전체 홀드아웃 스플릿에서 그 수치는 93 of 93이다. 혼돈 속에 불량품이 새면 양품을 홀드하는 것은 무가치하다.
내 엔벨로프 검사가 자기 숙제를 채점하고 있었나?
내가 가장 불신한 벤치마크 숫자는 내 최고의 숫자였다. 벤치 스크립트를 처음 돌렸을 때, 엔벨로프 검출기는 드리프트된 이미지와 깨끗한 이미지를 사실상 완벽하게 분리했다. 즉각적인 반응은 자랑이 아니었다. 의심이었다. 시험의 양측을 내가 만들었기 때문이다: 글레어, 디포커스, 열 캐스트 오염을 내가 썼고, 검출기가 보는 물리 신호도 내가 골랐다. 물론 글레어 검출기는 글레어를 잡는다. 제대로 된 리뷰어라면 순환논증이라 부를 것이고, 그게 맞다.
그래서 나는 한 드리프트 패밀리를 완전히 제외했다. 검출기는 언더익스포저에 대해 튜닝된 적도 없고, 개발 중에도 본 적이 없다. 그런 다음 bench.py를 다시 돌렸다(가장 최근은 2026-07-17) — MVTec AD metal_nut 홀드아웃 테스트 스플릿: 양품 22개, 결함 93개, 학습 피팅은 양품 이미지 220장만. 홀드아웃 언더익스포즈 패밀리에서 엔벨로프 검출기는 AUROC 1.000을 기록했다. 그게 논지를 지탱하는 숫자다. 내가 설계한 적 없는 실패 모드에서 얻었기 때문이다. 스크립트는 측정된 숫자가 주장을 실제로 뒷받침할 때만 "THESIS HOLDS"를 출력한다. 마케팅이 측정에서 드리프트하지 못하도록 그렇게 썼다.
벤치마크의 나머지는 정확한 범위를 받을 자격이 있으니, 내게 유리하게 반올림하지 않고 그대로 적는다. 드리프트된 양품에서 엔벨로프 없는 순진한 베이스라인은 드리프트 패밀리별로 95.5~100%를 오거부한다(글레어 100%, 디포커스 100%, 열 캐스트 100%, 언더익스포즈 95.5%, 평균 98.9%). Trust Gate는 그중 0.0%를 오거부하며, 전부 검토를 위해 홀드한다. 그리고 정직한 주의: 오염은 전강도이므로 베이스라인의 붕괴는 거의 전면적이며 설계상 그렇다. 내가 방어할 주장은 방향이다 깨끗하게 검증된 모델은 입력이 엔벨로프를 떠나면 붕괴한다는 것 — 특정 퍼센트가 아니다. 이들은 합성 드리프트 아래 연구 벤치마크의 측정이다. 오픈월드 보장이 아니며, 이를 프로덕션 성능으로 인용하는 사람은 오용하는 것이고, 나도 포함이다.
거의 삭제할 뻔한 규칙
이 빌드에서 내가 한 가장 어려운 정직함의 선택은 거의 작동하지 않는 규칙에 관한 것이었다. 초기에 기하 존 규칙을 추가했다: 이상을 거친 8×8 그리드에 국소화하고, 기능 존 안의 결함과 외관 가장자리의 흠집을 다르게 취급한다. 실제 계측처럼 들린다. 그런 다음 측정했고, 측정은 겸손했다. 로컬 거칠기 프록시는 홀드아웃 결함 93개 중 33개, 약 35%에서 이상을 국소화한다. 게이트 결과를 바꾸는 것은 정확히 93개 중 1개뿐이다. 그리고 자동 리젝트 18개 중 0개는 실제 국소화된 이상에 의해 뒷받침된다. 아무것도 국소화되지 않으면 센트로이드가 그리드 중심으로 폴백하고, 기본값으로 존 안으로 읽힌다.
나는 세 가지 선택지 앞에 앉았다. 규칙을 삭제하고 시도한 적 없는 척하기. 유지하고 UI가 내가 갖지 못한 정밀 계측을 암시하게 두기. 또는 유지하고 인터페이스가 고백하게 만들기. 나는 고백을 골랐다. 데모의 히어로 결함이 자동 리젝트될 때(part test-flip-264, MVTec flip 클래스의 실제 거친 구조 결함), 기하 드릴인은 이 부품에서 아무것도 국소화되지 않았고 리젝트가 텍스처 신뢰도에만 의존한다고 솔직히 말한다.

규칙은 정확히 한 번 제값을 하며, 나는 연출하지 않고 앱이 증명하게 했다. 시작 시 데모는 홀드아웃 결함 93개 전체를 검색해, 그렇지 않으면 자신 있는 부품에서 기능 존 바깥에 진정으로 국소화된 이상이 있는 부품을 찾는다. 출시된 스플릿에서 그 검색은 test-flip-251을 찾고, 센트로이드는 행 2, 열 6이며, 게이트는 액추에이터를 발사하는 대신 HOLD로 라우팅한다. 데이터가 바뀌어 자격 있는 부품이 없으면 그 비트는 그냥 나타나지 않는다. 나는 규칙의 시그마 임계값을 5겹 교차검증으로 A/B 테스트하기도 했다. 피팅된 값은 수동 설정 2.5보다 개선이 없어 2.5를 유지하고, 부정적 결과를 리포지토리에 "shipped": false로 기록했다. 프로덕션 참여에서는 이 규칙이 픽셀 정확, CAD 기반 계측으로 대체된다. 데모에서는 정직한 대용이며, UI는 모든 부품에서 그렇게 말한다.
스스로를 과장하는 신뢰 계층은 용어상 모순이다.
그 문장이 디자인 규칙이 되었다. 제품의 전체 약속이 모델을 언제 신뢰하지 않을지 아는 것이라면, 동시에 가장 약한 구성 요소에 대해 허세를 부릴 수 없다.
에이전트는 조언하고, 코드가 결정한다
내가 위임하기를 거부하는 결정은 금속을 움직이는 결정이다. 게이트 자체는 평범한 결정론적 코드이며, 어떤 LLM 밖에도, 비전 모델 밖에도 있다. 임계값은 손짓이 아니라 데모 자체 데이터에서 피팅된다: 보정된 신뢰도 척도에서 0.948 미만은 자동 통과, 1.30 초과는 자동 리젝트, 그 사이와 엔벨로프 밖 전부는 HOLD. 하드 750ms 스트로크 윈도우 예산으로 실행되며, 출시된 감사 로그에서 결정은 수십 밀리초에 착지한다: test-good-288은 37.7ms에 자동 통과, test-good-289는 24.4ms, test-flip-264의 리젝트 액추에이터 로그는 "REJECT actuated in 25ms (budget 750ms)."
무엇이 작동하는지 솔직히 말해야 한다: 아직은 아무것도. Allen-Bradley ControlLogix 리젝트 액추에이터로의 EtherNet/IP 경로는 시뮬레이터이며 정확히 무엇을 했을지를 로그하고, MES 싱크는 썼을 추적성 라인을 쓰는 스텁이다. 둘 다 앱에서 스텁으로 라벨링된다. 실제 어댑터처럼 생긴 이유는 OT 현실(Siemens와 Allen-Bradley가 섞인 공장, 밀리초로 측정되는 리젝트 윈도우)이 실제 제품 표면이기 때문이지만, 라이브 라인을 암시하는 데모는 스스로의 신뢰 테스트를 실패할 것이다.
시스템에는 에이전트가 있고, 나는 의도적으로 경계를 두었다. 부품이 에스컬레이션 큐에 쌓이면 Drift Triage 페어가 작동한다: 진단 에이전트가 홀드된 부품들에 걸친 순위화된 물리 신호 편차를 읽고 권장 조치와 함께 근본 원인 가설을 제안하고, 비평 에이전트가 그 가설을 수치 증거와 대조해, 인용된 신호가 실제로 지배적 편차가 아니면 "수동 조사"로 강등한다. Pydantic AI 위에 구축되고 프로바이더 교체가 가능하며, API 키가 없으면 전체가 결정론적 템플릿 트리아지로 저하되어 데모가 완전 오프라인으로 돌아간다. 에이전트가 설계상 할 수 없는 것은 액추에이터를 건드리는 일이다. 그들이 말할 때쯤 게이트는 이미 결정했다.
에이전트는 조언하고, 코드가 결정한다.
그 결정마다 영수증이 남는다. 각 부품은 JSONL 리니지 레코드를 쓴다: 부품 id, 스테이션, 모델 id metalnut-defect-knn 버전 v7, 데이터셋 해시 ae95b5b533c8, 결함 신뢰도, OOD 점수, 물리 신호, 발사된 게이트 규칙, 750ms 예산 대비 지연, 작동 및 MES 로그 라인, 순진한 베이스라인이 했을 일, 그리고 위험 태그 high-risk:quality-gate (EU AI Act Annex III, eff. 2026-08-02). 한 번의 클릭으로 교대를 inspection_audit.jsonl로 내보낸다.

여기서 규제 시계가 중요하다. EU AI Act의 고위험 의무는 2026년 8월 2일에 완전히 적용되고, 안전 중요 품질 결정은 Annex III에 있으며, 가장 심각한 금지 관행 위반의 최대 벌금은 €35M 또는 전 세계 매출의 7%에 달한다. 말을 조심하고 싶다. 바로 조심한 말이 중요한 지점이기 때문이다: 데모는 EU AI Act 인증이 아니며, 어떤 데모도 그럴 수 없다. 보여주는 것은 EU AI Act 대비 리니지, 고위험 적합성 파일에 넣을 수 있는 증거로 설계된 결정별 기록이며, 사고 후 재구성이 아니라 라인 속도로 생성된다.
다음 모델 업그레이드에서 무엇이 살아남는가?
이 데모를 만들며 내가 계속 자신에게 던진 질문은 데모 제작자에게 잔인했다: 고객의 다음 결함 모델이 내 대용보다 극적으로 나아지면, 이 중 무엇이라도 여전히 중요한가? 이제 나는 그게 정확히 거꾸로라고 생각한다. Deloitte는 제조에서 에이전트형 AI 도입이 2026년에 6%에서 24%로 오른다고 예측하며(Deloitte), 이는 더 많은 모델과 더 많은 자율성이 더 많은 액추에이터에 도착함을 뜻한다. 그 모든 모델에는 검증된 엔벨로프가 있을 것이고, 프레스 라인의 물리(글레어, 차가운 다이, 열평형)는 계속 입력을 밖으로 밀어낼 것이다. 완벽한 모델도 그것에 대해 아무것도 바꾸지 못한다. 게이트가 막는 실패는 입력 실패이며, 그것이 섬기는 감사 의무는 모델링이 아니라 법적 의무다. 드리프트 게이팅, 출처 증명, 거버넌스된 작동은 어떤 모델 정확도에서도 성립한다. 그 속성이 다른 모델이 아니라 이 계층이야말로 만들 가치가 있다고 나를 설득했고, 스크립트된 교대 시연은 veriprajna.com/ko/demos/edge-ai-manufacturing-inspection에서 그 주장을 부품마다 입증하는 모습을 보여 주려는 나의 시도다.
읽는 설명보다 보는 쪽을 원한다면, 여기 창업자 컷이 처음부터 끝까지 있다.
그래서 당신의 라인에 있는 어떤 검사 모델에 대해서든, 97%짜리 포함해, 내가 던지는 질문은 "얼마나 정확한가?"가 아니다. 방금 카메라를 지난 부품에 대해, 그 이미지가 모델이 검증된 엔벨로프 안에 있었는지 아는가? 부품마다, 밀리초 단위로, 감사자에게 넘길 수 있는 기록으로 답할 수 없다면, 정확도 문제가 있다고 생각하지 않는다. 엔벨로프 문제가 있다고 생각하며, 당신의 라인에 어느 쪽인지 진심으로 알고 싶다.


