출처에는 달력이 있다
공급자가 멀쩡하고 서버도 멀쩡한데 그날 낼 것이 없는 날이 있습니다. 1차 출처의 발행 리듬은 우리 자동화의 가용성 리듬이 됩니다.
초록 근거에 기대어 돌아가는 파이프라인은 자기 코드의 가용성이 아니라 자기가 읽는 출처의 가용성 위에서 돕니다. 그런데 1차 출처는 기계가 아니라 사람의 조직이고, 사람의 조직에는 달력이 있습니다. 학술 저장소는 주말에 쉬고, 기관은 회기 사이에 조용하며, 매체는 휴일을 건너뜁니다. 이 글은 그 달력이 계약서에도 상태 페이지에도 나타나지 않은 채 우리 서비스의 가용성 일정으로 상속된다는 점을 짚고, 근거 기반 시스템을 설계할 때 출처를 '신뢰할 수 있는가'뿐 아니라 '언제 말을 하는가'로도 골라야 한다고 주장합니다.
오늘 새벽 우리 파이프라인에서 있었던 일로 시작하겠습니다. 다섯 갈래로 돌아가는 그라운딩 축 가운데 학술·연구 축이 배정된 날이었고, 그 축에 묶인 피드는 둘이었습니다. 하나는 정상적으로 응답했고 서버도 살아 있었습니다. 다만 그 응답 안에 기사가 하나도 없었습니다. 본문을 열어 보니 이유가 그대로 적혀 있었습니다. 토요일과 일요일은 건너뛴다는 선언이 피드 자체에 명시돼 있었던 것입니다. 나머지 하나는 봇 차단으로 거절했습니다. 그래서 그날 그 축이 확보한 자료는 영이었고, 출처 없는 칼럼은 내지 않는다는 원칙에 따라 그날 그 갈래는 비었습니다. 흥미로운 것은 어떤 것도 고장 나지 않았다는 점입니다. 우리 코드도, 공급자의 서버도, 우리 사이의 관계도 정상이었습니다. 비어 있던 것은 달력이었습니다. 그리고 그 달력은 우리 것이 아니었습니다.
핵심 개념 정의
출처의 발행 달력
1차 출처가 실제로 새 자료를 내놓는 날들의 집합. 학술 저장소의 평일 공개, 기관의 회기와 공표 일정, 매체의 휴간일이 여기 속한다. 가용성 지표와 무관하게 존재하며, 서버가 정상 응답하면서도 내용이 없는 날을 만든다.
달력 상속
근거를 외부에서 가져오는 시스템이 그 출처의 발행 주기를 자기 가용성 주기로 물려받는 현상. 우리가 매일 돌도록 설계해도, 읽는 쪽이 주중에만 말한다면 산출은 주중 리듬을 따른다.
빈 성공
호출이 성공하고 오류도 없는데 결과가 비어 있는 상태. 오류율·지연·상태 코드를 보는 감시 체계는 이것을 정상으로 읽는다. 잡은 초록이고 경보는 조용한데 산출물만 없다.
전략적 관점
가용성은 둘로 갈린다 — 응답하는가와 말할 것이 있는가
운영에서 쓰는 가용성이라는 말은 대개 하나의 뜻입니다. 요청을 보내면 제때 응답이 돌아오는가. 상태 페이지도 계약서의 서비스 수준도 그 뜻으로 쓰입니다. 그런데 근거에 기대는 시스템에는 그 위에 층이 하나 더 있습니다. 응답이 돌아오는 것과 그 응답에 오늘 쓸 것이 들어 있는 것은 다른 사건입니다. 오늘 우리가 받은 응답은 형식적으로 완벽했습니다. 상태 코드는 성공이었고, 문서는 규격에 맞았고, 채널 정보도 제자리에 있었습니다. 다만 항목이 없었고, 없는 이유가 문서 안에 스스로 적혀 있었습니다. 이 구분이 중요한 것은 두 층이 서로 다른 원인으로 망가지고 서로 다른 방법으로 관리되기 때문입니다. 첫째 층은 공급자의 기술적 문제이고 공급자가 고칩니다. 둘째 층은 공급자의 편집 정책이고 고칠 대상이 아닙니다. 학술 저장소가 주말에 쉬는 것은 장애가 아니라 운영 방침이며, 항의해도 바뀌지 않습니다. 그러므로 대비의 방향도 달라야 합니다. 첫째 층은 재시도와 차단기로 다루지만, 둘째 층은 재시도가 무의미합니다. 같은 날 같은 주소를 백 번 눌러도 휴간은 휴간입니다.
출처를 고를 때 우리는 신뢰만 보고 리듬을 안 본다
근거 기반 시스템을 세울 때 출처 목록을 만드는 기준은 거의 언제나 신뢰도 하나입니다. 1차 문서인가, 기관이 직접 낸 것인가, 방법과 데이터를 밝혔는가. 좋은 기준이고 우리도 그 기준으로 목록을 만들었습니다. 그런데 그 목록에 들어간 출처가 각각 언제 말을 하는지는 아무도 적지 않았습니다. 학술 저장소는 평일에만 공개하고, 학회지는 월 단위로 묶어 내고, 감독기구는 회기와 공표 일정에 묶여 있으며, 산업 매체는 휴일에 쉽니다. 이 리듬들은 전부 다르고, 서로 겹치지 않을 수 있습니다. 목록을 신뢰도로만 만들면 어떤 갈래는 매일 말하는 출처들로 채워지고 어떤 갈래는 주중에만 말하는 출처들로만 채워집니다. 후자는 평소에 잘 돌다가 특정 요일에 통째로 비는데, 그 결함은 목록을 만드는 순간에는 보이지 않습니다. 출처 선정 기준에 리듬을 넣는 일은 어렵지 않습니다. 한 갈래 안에 발행 주기가 다른 출처를 섞어 두면 됩니다. 어려운 것은 그 축이 존재한다는 사실을 아는 일이고, 대개 그것은 비어 본 뒤에야 알게 됩니다.
낡은 자료를 쓰는 것은 비는 것보다 나쁠 수 있다
빈 날의 유혹은 분명합니다. 오늘 새 자료가 없으니 어제 것을, 지난주 것을, 쌓여 있는 보관분에서 아무거나 꺼내 쓰자는 것입니다. 기술적으로는 쉽고 겉보기 산출은 채워집니다. 그런데 그 선택의 대가를 실측한 연구가 있습니다. 지식베이스에 낡은 정보가 최신 정보와 함께 있을 때 검색 증강 생성이 어떻게 되는지를 벤치마크로 만들어 본 HoH 연구는 낡은 정보가 두 방향으로 성능을 떨어뜨린다고 보고합니다. 하나는 모델의 주의를 옳은 정보에서 흩어 응답 정확도를 실질적으로 낮춘다는 것이고, 다른 하나는 최신 정보가 함께 있는 경우에도 모델이 해로울 수 있는 출력을 내도록 오도한다는 것입니다. 저자들은 현재의 검색 증강 방식이 검색 단계와 생성 단계 양쪽에서 낡은 정보를 제대로 다루지 못한다고 정리합니다. 이 결과를 운영 언어로 옮기면 이렇습니다. 보관분을 섞어 빈 날을 메우는 것은 산출물의 수를 지키는 대신 산출물의 신뢰를 지불하는 거래이고, 그 지불은 눈에 잘 띄지 않습니다. 빈 칸은 세면 보이지만 흐려진 근거는 세어지지 않기 때문입니다.
신선도는 비용이 있고, 그 비용은 대개 지연으로 나타난다
그렇다면 늘 최신을 쓰면 되지 않느냐는 물음이 따라옵니다. 그 물음에 답한 연구들이 신선도의 가격표를 보여 줍니다. 동적 스트림을 다루는 검색 증강을 연구한 Streaming RAG 논문은 문제를 이렇게 세웁니다. 뉴스와 소셜, 센서와 금융 시장처럼 계속 흘러드는 스트림은 정적인 검색 증강 구조를 흔드는데, 전체 규모의 색인을 유지하면 메모리 비용이 크고, 주기적으로 다시 만들면 그 지연이 데이터 신선도를 무너뜨리며, 단순히 표본만 뽑으면 의미적 포괄성을 잃는다는 것입니다. 세 갈래가 모두 대가를 요구한다는 서술이 핵심입니다. 신선도는 공짜로 얻어지는 성질이 아니라 메모리와 지연과 포괄성 사이에서 사는 것입니다. 그러므로 빈 날에 대한 올바른 대응은 신선도를 무한히 끌어 올리는 것이 아니라, 우리 산출물마다 필요한 신선도의 수준을 따로 정하는 일입니다. 어떤 갈래는 오늘 것이어야 의미가 있고, 어떤 갈래는 이번 분기 것이면 충분합니다. 그 구분이 없으면 모든 갈래가 같은 비용을 치르면서도 정작 필요한 갈래에서 부족해집니다.
시간이 흐르면 모델도 낡는다 — 달력 문제는 층이 둘이다
출처의 달력이 만드는 공백이 바깥의 시간 문제라면, 안쪽에도 같은 계열의 문제가 있습니다. 시간 일반화를 다룬 연구는 언어 모델이 시간 축을 건너뛸 때 무엇이 일어나는지를 잽니다. 새로 생성되는 텍스트와 앞으로 일어날 사건에 대한 예측으로 평가 틀을 짜서 데이터 누출과 주관적 편향을 피하도록 설계한 FreshBench 실험은, 모델들에 유의한 시간 편향이 있고 시간이 지남에 따라 성능이 떨어진다고 보고합니다. 특히 눈길을 끄는 관찰은 처음에 우수한 강력한 모델일수록 미래 방향의 일반화에서 더 빠르게 하락하는 경향을 보였다는 것입니다. 이 두 층을 함께 보아야 그림이 완성됩니다. 바깥에서는 출처가 오늘 말하지 않고, 안쪽에서는 모델이 어제까지의 세계로 굳어 갑니다. 둘 다 우리가 고칠 수 없는 시간의 성질이고, 둘 다 우리 산출물의 품질로 조용히 흘러듭니다. 그래서 근거 기반 시스템의 설계도에는 시간이 명시적인 축으로 들어가야 합니다. 무엇을 언제 읽고, 읽지 못한 날에는 무엇을 하고, 모델이 굳어 가는 속도를 무엇으로 재는지가 한 장에 있어야 합니다.
반론과 재반박
예상 반론 결국 피드를 몇 개 더 넣으라는 이야기 아닌가. 출처 목록을 늘리면 끝나는 일을 달력이니 상속이니 하는 말로 부풀렸다. 게다가 하루 비는 것이 그렇게 큰 문제인가. 빈 날은 다음 날 채우면 되고, 매일 무언가를 내는 것 자체가 목적이 되어서는 안 된다.
재반박 피드를 더 넣는 것은 맞는 조치이고 우리도 그렇게 할 것입니다. 다만 그것은 결론이지 발견이 아닙니다. 발견은 어떤 목록이 왜 부족한지를 판정하는 기준이 신뢰도 하나뿐이었다는 것이고, 그 기준으로는 몇 개를 더 넣어도 같은 요일에 같은 방식으로 빕니다. 리듬을 기준에 넣어야 목록이 고쳐집니다. 하루 비는 것이 큰 문제냐는 물음에는 동의하는 부분이 있습니다. 매일 내는 것 자체는 목적이 아니며, 근거 없이 내는 것보다 비는 편이 낫습니다. 이 글이 문제 삼는 것은 공백 자체가 아니라 공백이 **예측 가능한데도 예측되지 않았다**는 점입니다. 피드 문서에 휴간이 적혀 있었고 축 배정은 결정론이었으니, 이 공백은 며칠 전에 달력에서 읽어 낼 수 있었습니다. 읽지 않았을 뿐입니다.
이 주장이 틀리는 조건
반증 조건 이 글은 하나의 예측으로 요약됩니다 — 출처 목록을 신뢰도만으로 만든 갈래는 그 출처들의 발행 달력이 겹치는 날짜에 체계적으로 비고, 그 공백은 무작위가 아니라 요일과 회기에 붙어 반복된다는 것입니다. 그러니 검사 방법도 하나입니다. 갈래별 결번 날짜를 모아 요일·휴일·회기와 대조했을 때 분포가 고르게 흩어진다면, 즉 결번이 특정 요일에 몰리지 않는다면 이 글의 진단은 틀린 것입니다. 발행 주기가 다른 출처를 한 갈래에 섞어 넣은 뒤에도 같은 요일의 결번율이 내려가지 않는 경우에도 마찬가지 입니다. 반대 방향의 검사도 필요합니다. 빈 날을 보관분으로 메운 갈래에서 인용 검증 통과율과 재탕 유사도가 악화되지 않는다면, 공백을 메우는 대가가 있다는 이 글의 전제가 무너집니다. 세 검사 모두 우리가 이미 매일 기록하는 값으로 할 수 있으므로, 이 주장은 다음 분기의 로그만으로 판정됩니다.
법마디 OS가 그리는 미래
근거를 외부에서 가져오는 시스템이 늘어날수록, 운영의 단위는 요청에서 공급원으로 옮겨 갑니다. 지금까지 우리가 관리해 온 것은 우리 쪽 호출의 성공률이었지만, 앞으로 관리해야 하는 것은 우리가 읽는 세계가 언제 무엇을 말하는가입니다. 그 세계는 서버가 아니라 사람의 조직이고, 사람의 조직은 주말과 휴일과 회기를 가집니다. 이 성질은 기술로 없앨 수 없으므로 설계에 들여올 수밖에 없습니다. 언젠가 근거 기반 시스템의 운영 문서에는 가용성 표 옆에 출처 달력 표가 나란히 놓일 것이라고 봅니다. 어느 출처가 어느 요일에 말하고, 어느 갈래가 어느 공백을 물려받으며, 그 공백에 우리가 무엇을 내기로 되어 있는지가 한 장에 있는 표입니다. 그 표를 가진 조직은 빈 날을 사고가 아니라 일정으로 맞이합니다. 그리고 일정으로 맞이한 공백은 신뢰를 지불하지 않습니다.
전략적 함의
- 출처 목록에 신뢰도와 함께 발행 주기를 적는다. 갈래마다 매일 말하는 출처와 주중에만 말하는 출처가 섞여 있는지 확인하고, 한 갈래가 같은 리듬의 출처로만 채워져 있으면 그 갈래는 그 리듬의 공백을 그대로 물려받는다.
- 빈 성공을 오류와 같은 자리에서 본다. 상태 코드와 지연만 보는 감시는 항목 없는 정상 응답을 초록으로 읽는다. 확보 건수가 영인 사건을 따로 세고, 갈래와 날짜를 함께 남겨 반복되는 자리를 드러낸다.
- 공백을 메우는 규칙을 미리 정한다. 보관분으로 메울 갈래와 비워 둘 갈래를 산출물의 성격에 따라 나누어 두면, 빈 날에 임기응변으로 신뢰를 지불하는 일이 줄어든다.
"고장 난 것이 없는데 낼 것이 없는 날이 있습니다. 그런 날을 사고로 부르는 한, 우리는 매번 같은 자리에서 놀라게 됩니다."