LLMOps 17
HITL을 단순 수동 개입이 아닌 Control Layer로 보기
사람이 중간에 확인하면 다 HITL이라고 생각하기 쉽다.
근거 · 교안 p48-p51
1장: HITL, 단순 개입을 넘어선 ‘제어 계층’
솔라의 노트 위에는 어지럽게 그린 상자들이 화살표로 이어져 있었다. 사용자의 요청이 들어가고, AI 모델이 무언가를 생성하고, 결과물이 짠하고 나오는 단순한 흐름. 솔라는 그중 AI 모델과 최종 결과물 사이에 작은 상자 하나를 더 그려 넣고는 펜을 빙빙 돌렸다. 상자 안에는 ‘사람?’이라고 적혀 있었다.
며칠 전 스터디 자료에서 본 한 문장이 머릿속을 떠나지 않았다. “HITL은 LLM 시스템의 의사결정을 통제하기 위한 Control Layer다.” 문장은 명쾌했지만, 막상 그림으로 옮기려니 막막했다. 사람이 중간에 확인하는 거면 다 HITL(Human-in-the-Loop) 아닌가? 그런데 왜 이렇게 거창하게 ‘의사결정 통제’니, ‘제어 계층’이니 하는 말을 쓰는 거지? 솔라의 펜이 ‘사람?’이라고 적힌 상자 주위를 불안하게 맴돌았다.
“그 상자, 역할이 뭔지 정해졌어?”
소파에 앉아 책을 읽던 루나가 조용히 물었다. 솔라는 기다렸다는 듯이 노트를 들어 보였다.
“언니, 이거 봐봐. AI가 만든 결과물을 사람이 한 번 검토하고 내보내는 거. 이게 HITL이잖아? 근데 이게 왜 ‘Control Layer’라는 거야? 그냥 사람이 중간에 확인하는 거, 그 이상도 이하도 아닌 것 같은데. ‘통제’라고 하니까 뭔가 엄청난 역할 같잖아.”
솔라의 목소리에는 ‘단어가 너무 과하다’는 뉘앙스가 섞여 있었다. 루나는 책을 덮고 솔라의 옆으로 다가와 노트를 들여다보았다. 복잡한 설명 대신, 루나는 솔라의 펜을 빌려 ‘사람?’이라고 적힌 상자 옆에 새로운 상자를 하나 더 그렸다.
“두 가지 역할을 한번 비교해보자. 솔라 네가 지금 생각하는 ‘사람’과 내가 생각하는 ‘Control Layer’로서의 사람. 둘 다 AI 뉴스 기사 초안을 작성하는 시스템에 있다고 가정하는 거야.”
루나는 첫 번째 상자를 가리켰다.
“시나리오 A. 이 상자 속 사람은 ‘교정자’야. AI가 기사 초안을 다 쓰면, 이 교정자는 오탈자나 명백한 문법 오류만 수정해서 발행 버튼을 눌러. 기사의 논조나 사실관계가 이상해도 그걸 바꿀 권한은 없어. 그냥 문장만 다듬는 역할이야.”
솔라는 고개를 끄덕였다. 딱 자기가 생각하던 역할이었다. 최종 결과물의 품질을 살짝 높여주는 검수 단계.
루나는 이번엔 새로 그린 두 번째 상자를 톡톡 쳤다.
“시나리오 B. 이 상자 속 사람은 ‘콘텐츠 전략가’야. 이 사람은 시스템이 특정 조건을 만족할 때만 호출돼. 예를 들어, AI가 생성한 기사의 신뢰도 점수가 80점 미만이거나, 미리 정해 둔 ‘민감 키워드 목록’에 있는 단어가 포함됐을 때. 호출된 전략가는 그냥 오탈자만 보지 않아.”
루나는 잠시 말을 멈추고 솔라의 눈을 바라보았다.
“이 사람은 세 가지 선택을 할 수 있어. 첫째, 기사를 승인해서 발행한다. 둘째, 기사를 반려하며 AI에게 구체적인 피드백을 보낸다. ‘이 부분은 너무 선정적이니 톤을 낮춰서 다시 써줘’ 라거나, ‘주요 인물의 발언이 빠졌으니 추가해줘’ 처럼 말이야. 셋째, 아예 자기가 직접 기사를 수정하거나 새로 쓸 수도 있지. 이 사람은 AI의 작업을 계속 진행시킬지, 중단시킬지, 아니면 방향을 바꿀지 결정하는 거야.”
솔라는 두 개의 상자를 번갈아 보았다. 처음에는 비슷해 보였던 두 ‘사람’의 역할이 전혀 다르게 느껴지기 시작했다. 한 명은 이미 끝난 길을 깨끗하게 포장만 하는 사람이었고, 다른 한 명은 갈림길에서 어느 길로 가야 할지 깃발을 흔드는 사람이었다.
“아….”
탄식이 터져 나왔다.
“교정자는 그냥 AI가 만든 결과물을 고치는 거네. 행동을 바꾸는 게 아니라… 결과물 자체를 살짝 손보는 수준. 근데 전략가는 AI의 ‘결정’에 개입하는 거구나. ‘이대로는 안 돼, 돌아가!’라고 말할 수 있는 사람이니까.”
“바로 그거야.”
루나가 말했다. “A의 교정자는 시스템의 ‘외부’에서 결과물을 다듬을 뿐이지만, B의 전략가는 시스템의 ‘내부’에서 의사결정 흐름을 바꾸지. 시스템이 스스로 판단하기 어려운 지점에서 인간의 판단력을 빌려 길을 정하는 것. 그래서 ‘Control Layer’, 즉 제어 계층이라고 부르는 거야. 단순한 점검이 아니라, 시스템의 의사결정을 통제하는 구조적인 역할이니까.”
솔라는 다시 스터디 자료의 문장을 떠올렸다. ‘HITL은 LLM 시스템의 의사결정을 통제하기 위한 Control Layer다.’ 이제야 문장이 입체적으로 보였다. HITL의 ‘사람’은 단순히 시스템의 실수를 줍는 사람이 아니었다. 시스템이 멈춰 서서 물어봐야 하는, 더 높은 권한을 가진 의사결정자였다.
솔라는 ‘사람?’이라고 적었던 첫 번째 상자를 지우고, 그 자리에 ‘교정자 (단순 확인)’이라고 적었다. 그리고 루나가 그려준 두 번째 상자에는 ‘전략가 (의사결정 통제)’라고 썼다. 명확한 차이가 눈에 들어왔다.
그런데 문득 새로운 질문이 떠올랐다.
“알겠어. 확실히 ‘통제’라는 말이 어울리네. 그런데 B 시나리오에서도 전략가는 ‘신뢰도 점수가 낮을 때’나 ‘민감 키워드가 있을 때’처럼 뭔가 문제가 될 만한 상황에서만 움직이잖아. 결국 문제가 생겼을 때 사람이 나서는 것 같은데… 이건 그냥 문제가 터지면 수습하는 거랑 뭐가 다른 거지?”
2장: 시스템 ‘구성요소’로서의 Proactive Control
솔라의 질문이 거실의 공기를 가르자, 루나는 대답 대신 솔라의 노트를 가져가 새 페이지를 펼쳤다. 그리고는 페이지를 반으로 나누어 왼쪽과 오른쪽에 각각 간단한 그림을 그리기 시작했다. 왼편에는 활활 타오르는 건물 그림을, 오른편에는 천장에 작은 장치가 달린 평범한 방 그림을 그렸다. 두 그림은 명백한 대조를 이루었다.
루나는 아무 말 없이 왼쪽의 불타는 건물 그림 옆에 외부에서 달려오는 소방차를 그려 넣었다. 화살표는 ‘외부’에서 ‘사고 현장’을 향했다. 반면, 오른쪽 그림에는 천장의 작은 장치에서 물이 뿜어져 나오는 모습을 추가했다. 이 그림에는 외부에서 들어오는 것이 아무것도 없었다. 모든 일이 방 안에서 일어나고 있었다.
“솔라 네가 말한 ‘문제가 터지면 수습하는 것’은 왼쪽 상황에 가까워.”
루나가 불타는 건물을 가리키며 말했다.
“화재라는, 예상치 못했거나 막지 못한 문제가 발생했어. 그러자 시스템 ‘외부’에 있던 소방관이 출동해서 문제를 해결하지. 이건 사후 대응, 즉 Reactive(반응적) 개입이야. 소방관은 건물의 일부가 아니야. 비상시에 호출되는 외부 전문가이지.”
솔라는 고개를 끄덕였다. 명확했다. 문제가 터지고, 외부에서 누군가 와서 해결한다.
“그럼 HITL은 오른쪽이야.”
루나는 천장의 스프링클러가 작동하는 그림을 톡톡 쳤다.
“이 건물은 설계될 때부터 ‘화재 가능성’을 예측했어. 그리고 ‘온도가 특정 수준 이상으로 올라가면’이라는 조건을 시스템에 미리 심어뒀지. 스프링클러는 그 조건이 만족될 때 작동하는, 건물 자체에 내장된 ‘구성요소(Component)’야. 화재를 ‘진압’하는 게 아니라, 설계된 규칙에 따라 ‘제어’하는 거지. 이건 사전 제어, 즉 Proactive(능동적) Control이야.”
솔라의 눈이 커졌다. ‘문제가 생겼을 때’라는 모호한 표현이 두 갈래로 찢어지는 순간이었다. 하나는 예측하지 못한 사고가 터진 ‘후’의 이야기였고, 다른 하나는 예측된 위험 신호가 감지된 ‘때’의 이야기였다.
“아…! ‘신뢰도 점수가 낮을 때’라는 건, 화재 경보 같은 거구나. 진짜 불이 나서 다 타버리기 전에 울리는 경보. 우리는 불이 날 걸 미리 예상하고, ‘이런 신호가 보이면 일단 사람을 불러!’라는 규칙을 시스템 안에 넣어둔 거네.”
“바로 그거야. 핵심은 ‘미리 정의’하는 것에 있어.”
루나는 솔라가 지난 장에서 그렸던 시스템 다이어그램을 가리켰다. ‘전략가(의사결정 통제)’라고 적힌 상자는 여전히 전체 흐름도 바깥쪽에 어정쩡하게 놓여 있었다.
“그럼 이제 그 ‘전략가’는 어디에 있어야 할까? 시스템 외부에서 호출되는 소방관일까, 아니면 시스템 내부에 설치된 스프링클러일까?”
솔라는 펜을 들었다. 잠시의 망설임도 없이 ‘전략가’라고 적었던 상자를 지웠다. 그리고는 AI 모델과 최종 결과물 사이, 시스템 흐름도 ‘안’에 새로운 상자를 그려 넣었다. 그 상자 안에는 ‘Human Review Component’라고 적었다. 그리고 그 상자로 들어오는 화살표 위에 작은 글씨로 조건을 달았다. ‘IF 신뢰도 < 80% or 민감 키워드 포함’.
새로운 그림 속에서 ‘사람’은 더 이상 외부의 구원투수가 아니었다. 시스템의 예측 가능한 불안정성을 제어하기 위해 처음부터 설계에 포함된, 어엿한 하나의 부품(Component)이었다. 시스템은 이제 인간의 개입 없이는 불완전한 존재였다.
“이제 알겠어. HITL의 사람은 시스템 밖에 있는 감시자가 아니라, 시스템을 완성하는 구성요소 중 하나였네. ‘문제가 생길 만한 지점’을 미리 정해두고, 그 지점에서만 딱 작동하는 자동화된 부품처럼.”
솔라는 자신의 노트를 보며 만족스럽게 중얼거렸다. 스터디 자료의 문장이 다시 떠올랐다. ‘단순 개입: 문제가 생기면 사람이 개입 (Reactive). HITL: 문제 발생 가능 지점을 미리 정의 (Proactive Control).’ 이제 ‘미리 정의’라는 말의 무게가 다르게 느껴졌다. 그건 단순한 계획을 넘어선, 시스템의 뼈대를 만드는 설계 행위였다.
개념이 명확해지자, 솔라는 한 걸음 더 나아갔다.
“좋아. 그럼 AI 시스템을 만들 때, 이 ‘Human Review Component’를 하나의 체크포인트처럼 딱 박아두면 되겠네. AI가 초안을 생성한 직후, 발행하기 직전에 말이야. 가장 위험한 단계에 안전장치를 하나 두는 거지.”
3장: HITL: 전체 운영 사이클을 관통하는 정책
솔라의 노트 위에는 이제 제법 그럴듯한 AI 시스템 흐름도가 자리 잡고 있었다. ‘사용자 요청 → AI 모델 → Human Review Component → 최종 결과물’. 특히 솔라는 AI 모델과 최종 결과물 사이에 자신의 손으로 그려 넣은 ‘Human Review Component’ 상자가 마음에 들었다. 시스템 외부의 소방관이 아니라, 건물 내부에 처음부터 설치된 스프링클러. 가장 위험한 단계에서 시스템을 안전하게 제어하는 핵심적인 부품처럼 보였다. 솔라는 만족스러운 미소를 지으며 펜을 내려놓았다.
루나는 소파에서 일어나 솔라의 노트 앞에 섰다. 칭찬 대신, 그녀는 흐름도에서 ‘Human Review Component’ 상자를 손가락으로 가리켰다.
“좋아. 이 구성요소가 ‘반려’ 결정을 내렸다고 해보자. AI가 만든 뉴스 기사 초안이 너무 선정적이라서. 그럼 그 다음은 어떻게 되지?”
“음… 당연히 발행은 안 되고, AI에게 다시 쓰라는 피드백을 보내야지.”
솔라는 자신 있게 대답했다. 하지만 루나의 질문은 거기서 끝나지 않았다.
“그 다음 날에도 AI가 또 선정적인 초안을 만들어서 이 구성요소가 또 반려했어. 그 다음 날도, 또 그 다음 날도. 일주일 내내 같은 이유로 기사가 반려되고 있다면?”
“그건… 리뷰하는 사람이 계속 바쁘다는 뜻이겠지.” 솔라가 대답했지만, 어딘가 개운치 않았다. 뭔가 더 근본적인 문제가 있는 것 같았다.
“리뷰어는 바쁘겠지만, 진짜 문제는 그게 아니지 않을까? 스프링클러가 매일 같은 장소에서 울린다면, 우리는 ‘스프링클러가 열심히 일하네’라고 할까, 아니면 ‘왜 저기서 계속 불이 나려고 하지?’라고 물을까?”
루나의 비유에 솔라는 말문이 막혔다. 자신의 흐름도는 AI가 잘못된 결과물을 만들면 사람이 막아내는, 완벽한 방어 시스템처럼 보였다. 하지만 매일 같은 실수를 반복하는 AI와 그걸 막기 위해 매일 똑같이 자원을 소모하는 사람의 모습은 전혀 효율적이지도, 똑똑해 보이지도 않았다. ‘Human Review Component’라는 멋진 이름의 상자는 그저 반복되는 문제 앞에 놓인 임시방편적인 ‘검문소’에 불과했다.
“단순한 체크포인트가 아니라는 거구나…”
“바로 그거야.”
루나는 솔라의 펜을 들어 ‘Human Review Component’에서 나온 ‘반려’ 화살표를 잡았다. 그 화살표는 AI 모델로 되돌아가고 있었다. 루나는 그 화살표를 지우는 대신, 전혀 다른 곳으로 향하는 새로운 화살표를 그리기 시작했다. 그 화살표는 시스템 흐름도 전체를 커다랗게 감싸며, 흐름도의 가장 시작점, ‘사용자 요청’보다 더 앞선 지점을 향했다. 마치 뱀이 자기 꼬리를 무는 것처럼, 거대한 순환 고리가 만들어졌다.
루나는 그 새로운 화살표 끝에 작은 상자를 하나 그리고 ‘운영 정책’이라고 적었다.
“HITL은 특정 단계가 아니야. 하나의 ‘운영 정책’이자, 전체 시스템을 감싸는 순환 고리(Loop)에 가까워.”
루나는 새로 그린 순환 고리를 따라 손가락을 움직이며 설명했다.
“첫째, ‘개입 조건 정의’. 이건 우리가 이미 이야기했던 ‘신뢰도 80% 미만’ 같은 규칙이지. 이 정책에서 모든 게 시작돼. 둘째, ‘실행 중단 및 검토’. 이게 솔라 네가 만든 ‘Human Review Component’의 역할이야. 조건이 만족되면 시스템이 멈추고 사람에게 판단을 넘기지. 셋째, ‘의사결정’. 사람은 결과를 보고 승인, 반려, 수정 등의 결정을 내려. 여기까지는 우리 흐름도에 있었어.”
루나의 손가락이 결정적인 차이를 만드는 지점에 멈췄다. 바로 ‘반려’ 결정 이후, 거대한 고리를 따라 ‘운영 정책’ 상자로 되돌아가는 새로운 화살표였다.
“그리고 가장 중요한 넷째, ‘개선 방향 결정’. 만약 일주일 동안 ‘선정적인 표현’ 때문에 10번의 반려가 있었다는 기록이 남는다면, 이 데이터는 ‘운영 정책’으로 다시 돌아가야 해. ‘AI가 선정적인 표현을 쓰지 않도록 프롬프트를 수정해야 한다’ 혹은 ‘선정성 판단 기준 자체를 더 강화해야 한다’는 식으로, 시스템의 근본적인 규칙을 바꾸는 데 쓰이는 거지. 이게 바로 HITL의 핵심이야. 단순 개입이 아니라, 스스로를 개선하는 학습 루프를 만드는 것.”
솔라는 자신의 노트를 내려다보았다. 처음 그렸던 직선적인 흐름도는 이제 거대한 순환 고리의 일부가 되어 있었다. ‘Human Review Component’는 더 이상 외로운 검문소가 아니었다. 시스템 전체를 더 나은 방향으로 이끌어 가는 피드백을 만들어내는 심장과도 같았다. 문제가 생길 때마다 임시로 막는 것이 아니라, 문제가 왜 생기는지를 파악하고 다시는 같은 문제가 생기지 않도록 시스템 자체를 진화시키는 과정.
솔라는 스터디 자료의 한 문장을 떠올렸다. ‘HITL은 특정 단계가 아니라 전체 운영 사이클을 관통하는 정책이다.’ 이제야 그 문장의 진짜 의미가 보였다. 체크포인트가 아니라, 전체를 아우르는 살아있는 정책.
“알겠다… HITL은 소방관도, 스프링클러도 아니었네. 건물의 모든 데이터를 분석해서 화재 위험 자체를 줄이는 방법을 찾아내는 ‘건물 안전 관리 시스템’ 같은 거였어.”
솔라는 펜을 들었다. 루나가 그려준 커다란 순환 고리를 지우는 대신, 그 안을 자신의 언어로 채워 넣기 시작했다. 그녀는 노트의 새 페이지를 펼치고 제목을 달았다.
<AI 뉴스 기사 시스템: HITL 운영 정책 초안>
- 개입 조건: AI 생성 기사의 신뢰도 점수가 80% 미만이거나, 사내 민감 키워드 목록의 단어가 1개 이상 포함될 경우, 자동 발행을 중단하고 즉시 ‘인간 검토’ 큐로 전달한다.
- 검토 및 의사결정: 콘텐츠 전략가는 해당 기사를 검토하고 ‘승인’, ‘수정 후 승인’, ‘반려’ 중 하나를 결정한다. ‘반려’ 시에는 명확한 사유(예: 사실관계 오류, 선정적 표현, 어조 부적절)를 태그로 선택해야 한다.
- 데이터 기록: 모든 검토 결정과 반려 사유는 시스템에 자동으로 기록된다.
- 정책 개선 루프:
- 동일한 반려 사유가 주 5회 이상 누적될 경우, 해당 주제에 대한 프롬프트 엔지니어링 개선 과제를 생성한다.
- 월 1회, 전체 반려 데이터를 분석하여 ‘개입 조건(민감 키워드 등)’ 자체를 업데이트할지 검토한다.
펜을 내려놓은 솔라의 얼굴에 자신감이 어렸다. 더 이상 HITL은 모호한 개념이 아니었다. 시스템의 신뢰도를 높이고, 예측 불가능성을 제어하며, 장기적으로 시스템을 성장시키는 구체적인 설계도였다. 그 설계도의 중심에는 ‘사람’이 있었다. 문제를 막는 사람이 아니라, 시스템이 나아갈 방향을 결정하는 정책 설계자로서의 사람이.