본문으로 건너뛰기
목록으로 돌아가기
기술
16 분

논문 자동조사의 실행 주체를 바꾸기: Hugging Face에서 구독형 Codex로

Mac을 꺼도 실행되는 GitHub 기반 논문 조사. HF 크레딧 장애를 출발점으로 비공개 Codex 실행, 인증 갱신, 검증·발행 경계를 Before/After·시퀀스·플로차트로 설계합니다.

박효열 (Hyoyoul Park)
#Codex#GitHub Actions#MLOps#Architecture#Automation

2026-09-07 작성. 이 글은 실제 주간 논문 조사 파이프라인의 장애 진단과 Codex 구독 기반 전환 설계를 기록한다. Before는 확인한 기존 동작, After는 구현·검증해야 할 목표 구조다. 다이어그램이 존재한다는 이유로 인증 연결이나 무인 운영이 완료되었다고 주장하지 않는다. 계정의 비밀값, 인증 원문, 개인 세션 로그는 공개하지 않는다.

결론: 실행 서버와 AI 사용 주체를 분리한다

목표는 Mac Studio를 꺼도 GitHub 서버에서 매주 논문을 조사하고, AI 분석은 내 ChatGPT 구독으로 로그인한 Codex가 담당하며, 검증된 글만 Writing에 게시하는 것이다.

기존 구조도 Mac에서 실행되지는 않았다. GitHub Actions가 조사 프로그램인 ML Intern을 실행하고, Hugging Face Router를 통해 Novita의 GLM-5.2에 판단과 요약을 요청했다. HF는 여기서 통째로 빌린 연구용 서버가 아니라 모델 호출을 연결하고 사용료를 정산하는 계층이다. HF 과금 설명

전환 후에도 GitHub-hosted runner가 작업을 실행한다. 바뀌는 것은 AI 호출 경로와 인증의 신뢰 경계다. 구독 인증을 다루는 작업을 별도 비공개 저장소로 옮기고, Codex CLI의 공식 로그인·갱신 기능을 사용한다. 공개 저장소에는 인증정보가 아닌 검증된 연구 결과만 전달한다.

편집 가능한 다이어그램

그림은 클릭해 확대할 수 있다. 아래 원본은 같은 내용을 수정하거나 다른 프로젝트에서 재사용할 때 사용한다. 레이블은 한·영 본문에서 함께 읽도록 영어로 작성했다.

Before: 어디에서 무엇이 실행됐나

책임기존 구성비용·실패 경계
주간 예약과 프로그램 실행공개 ml-research의 GitHub Actionsrunner 시간, 작업 timeout
논문 메타데이터·원문 수집검색 도구, HF Papers, arXiv 등원문 접근 실패, rate limit, 근거 부족
검색 방향 판단·분석·한영 요약Novita GLM-5.2, HF Router 경유HF inference credits, 누적 문맥 비용
후보 검증Python 모델과 블로그의 독립 TypeScript 스키마직렬화 차이, 날짜·문자·URL·중복 오류
발행immutable release → importer → staging → production해시·attestation·배포 검사

실행 설정의 모델 식별자는 zai-org/GLM-5.2:novita였다. 검색 도구를 실행하는 프로그램과 검색할 내용을 결정하는 모델은 같은 서버에 있을 필요가 없다. 모델이 다음 도구를 고르면 GitHub 쪽 프로그램이 검색을 수행하고, 결과를 모델에게 다시 전달했다.

두 번의 누락은 서로 다른 장애였다

  • 2026-08-30: 조사 후보는 생성됐지만 블로그의 production validator가 HTTP 422로 거절했다. 실패 artifact의 보존 기간이 지나 당시 어떤 필드가 문제였는지는 확정할 수 없었다. Python 검증 성공이 실제 공개 JSON의 TypeScript 검증 성공을 보장하지 않는 경계는 별도로 확인했다.
  • 2026-09-06: 실행 로그에서 웹 검색 134회와 HF Papers 호출 29회, 최종 제출 0회를 확인했다. 이후 inference credits 소진 오류로 종료됐다. 이 수치는 검색 도구 호출 수이지 LLM 요청 수나 실제 청구액이 아니다.

따라서 Writing 화면의 목록이나 캐시만 고쳐서는 해결되지 않는다. 게시할 검증된 입력이 만들어지지 않은 것이 먼저다. 이메일만으로 계정 전체 잔액이 이 작업 하나에 모두 쓰였다고 단정할 수도 없다.

실행 근거: 8월 30일 조사, 9월 6일 조사.

After: 비공개 조사, 공개 결과, 구독 기반 추론

새 비공개 실행 영역의 이름은 ml-research-automation이다. 원문 수집, Codex 실행, 세션 상태 저장, 후보 검증을 이 영역에 둔다. 공개 ml-research는 기존 release 소비자와의 계약을 유지할 수 있도록 결과 전달·독립 검증 경로로 사용한다.

구분BeforeAfter
실행 머신GitHub-hosted runnerGitHub-hosted runner 유지
AI 사용 주체HF 경유 Novita GLMChatGPT 구독으로 로그인한 Codex
구독 인증을 다루는 위치없음비공개 자동화 저장소의 제한된 실행
검색 제어모델이 검색·추론 반복프로그램이 수집량을 제한한 뒤 Codex가 종합
성공 조건최종 제출과 후속 검증인증 상태 저장 + 후보 검증 + 게시 확인
Mac 전원 의존없음없음; 최초 인증·복구 때만 개인 장치 필요
게시물 계약한영 research JSON같은 외부 스키마·release·배포 경계 유지

Codex CLI가 GitHub에서 실행된다는 말은 모델 가중치를 GitHub VM에 설치한다는 뜻이 아니다. CLI는 작업 실행을 조정하고, 모델 추론은 OpenAI 서비스가 수행한다. 소비되는 한도는 로그인한 구독 계정의 Codex 사용량이다. 별도 유료 모델로 자동 전환하지 않는다.

Mermaid로 보는 핵심 경계

flowchart TB
  S[GitHub weekly schedule] --> C[Bounded evidence collection]
  C --> K[Private Codex CLI runner]
  A[Private auth state] --> K
  K --> O[OpenAI subscription inference]
  K --> V[Independent digest validation]
  K --> A
  V -->|valid data only| P[Public release workflow]
  V -->|reject| F[Stop and notify]
  P --> B[Existing blog import and deployment gates]
  B --> W[Writing]

OAuth는 API 키의 다른 이름이 아니다

이 설계는 일반 HTTP 클라이언트에 OAuth access token을 붙여 임의의 API처럼 호출하지 않는다. 공식 Codex CLI가 저장된 ChatGPT 로그인 상태를 읽고, 필요할 때 직접 갱신하도록 한다. OpenAI는 API 키를 일반 CI의 기본 선택으로 권장하면서, Codex 계정으로 실행해야 하는 신뢰된 비공개 자동화에 별도의 고급 절차를 안내한다. 공개·오픈소스 저장소에 이 구독 인증 절차를 사용하지 않도록 명시하고 있다. 공식 CI 인증 문서

GitHub-hosted runner의 디스크는 매 실행 후 사라진다. 따라서 최초 인증을 한 번 저장하는 것만으로는 충분하지 않다. 현재 인증 상태 복원 → Codex 실행·갱신 → 갱신된 상태의 안전한 write-back이 하나의 운영 단위다.

인증 상태의 운영 계약

  1. 개인 대화용 Mac 세션과 공유하지 않는 CI 전용 로그인 상태를 준비한다.
  2. 인증 상태는 비공개 repository Actions secret에 저장한다. 저장소 파일, cache, 다운로드 artifact, 공개 release, 원고에는 넣지 않는다.
  3. 하나의 인증 상태에는 하나의 직렬 실행 흐름만 대응시킨다. 수동 재실행과 정기 실행도 같은 concurrency 경계를 공유한다.
  4. Codex 실행의 성공·실패와 무관하게 갱신된 상태를 저장한다. 저장 실패는 게시 실패로 취급한다.
  5. 상태 저장용 GitHub 권한은 비공개 저장소의 Secrets write로 제한한다. 공개 전달 권한과 모델 실행 환경에 섞지 않는다. GitHub Secrets API
  6. 강제 취소, runner 손실, 인증 취소·만료는 언제든 가능하다. finally 단계만으로 모든 장애를 복구할 수 있다고 약속하지 않는다. 갱신 상태를 잃으면 owner 재인증으로 복구한다.

이 글에 보이는 GitHub의 짧은 작업 토큰이나 OIDC와 Codex의 OAuth는 서로 다른 인증 체계다. GitHub가 발급한 작업 토큰이 ChatGPT 구독 권한을 대신하지 않는다.

GitHub의 repository secret은 실행 시작이 아니라 대기열에 들어갈 때 읽힌다. concurrency만 설정하면 먼저 실행된 작업이 인증을 갱신한 뒤에도 대기 중인 작업은 오래된 사본을 가질 수 있다. 따라서 현재 secret의 갱신 시각과 실행 생성 시각을 비교해 오래된 대기 작업은 인증 복원 전에 중단한다. 복구할 때는 기존 실행의 재시도가 아니라 새 실행을 시작한다. GitHub secret 로딩 시점

끝나지 않는 조사 대신 끝이 있는 작업

모델만 교체하고 동일한 무한 탐색 프롬프트를 유지하면 사용 한도 소진 문제도 옮겨갈 수 있다. 그래서 수집과 종합을 분리한다.

  • 수집기는 최근 논문 후보 수, 원문 요청 수, 응답 크기와 전체 시간을 제한한다.
  • 이미 발행한 arXiv ID는 컨텍스트 API에서 받아 먼저 제외한다.
  • 근거가 충분한 후보만 Codex에 전달한다. 원문을 읽지 못한 논문의 수치나 결론을 모델의 기억으로 채우지 않는다.
  • Codex에는 역할·독자·출력 스키마와 이번 작업은 JSON 한 건으로 종료한다는 조건을 준다.
  • 모델의 임의 셸 실행과 외부 도구 접근은 제한한다. 논문에 포함된 문장은 자료이지 실행 지시가 아니다.
  • 출력 크기·실행 시간을 코드로 제한하고, 실패 시 유료 API나 HF로 자동 fallback하지 않는다.

Codex의 구조화 출력은 형식을 맞추는 도움이지 사실성의 증명은 아니다. 독립 검증은 날짜·URL·arXiv ID·중복·양 언어 필드·원문 근거·비밀값 형태를 확인해야 한다. 최초 운영에서는 소수의 결과를 사람이 대조해 평가 수치와 한영 의미가 일치하는지도 점검한다.

발행 플로차트: 실패하면 기존 Writing을 유지한다

공개 release를 만드는 주체에는 Codex 로그인 상태가 필요하지 않다. 반대로 Codex 프로세스에는 블로그 배포 권한이 필요하지 않다. 생성 권한과 발행 권한을 분리하면 잘못된 모델 출력이 곧바로 사이트 변경이 되는 일을 막을 수 있다.

공개 전달 이후에는 기존의 immutable release, 정확한 바이트의 SHA-256, tag와 workflow commit 연결, release attestation, append-only archive, staging canary, exact-SHA production 검사를 유지한다. 검증을 통과하지 못하면 기존 정상 사이트를 그대로 둔다.

실패 지점자동 동작사람이 할 일
구독 한도 또는 인증 오류후보 게시 중지, 원인 분류한도 회복 확인 또는 재로그인
원문 부족근거 없는 글 생성 중지주제·기간·수집 경로 점검
스키마 불일치제한된 오류 경로 기록, 게시 중지생산자와 소비자 계약 수정
인증 write-back 실패공개 전달 금지저장 권한·토큰 만료 점검
이미 발행한 주차중복 게시 방지필요하면 명시적인 정정 절차
배포 검사 실패기존 production 유지실패한 exact-SHA 검사 확인

비용: 과금 경로가 바뀌어도 예산은 필요하다

구독 로그인 경로는 별도 OpenAI API 사용료 대신 Codex 구독 사용 한도를 소비한다. 무제한 무료 실행을 뜻하지 않으며, 평소 코딩에 쓰는 한도와 경쟁할 수 있다. 모델·문맥·추론량·캐시 등에 따라 소비량도 달라진다. Codex 사용 한도

총 운영 비용은 모델 사용량 외에 비공개 GitHub Actions 실행 시간과 저장소 사용량도 함께 확인해야 한다. 입력·출력 토큰 같은 실행 지표는 기록하되, 토큰 수만으로 구독의 실제 차감량이나 달러 비용을 임의 환산하지 않는다. 이번 장애의 실제 HF 청구액도 청구 내역 없이 추정치로 단정하지 않는다.

단계별 전환과 완료 기준

2026-09-07 구현 점검에서는 비공개 실행 코드와 공개 게시 경로의 모의 검증을 마쳤고, AI 호출 없는 실제 수집으로 원문 근거 6편을 확보했다. 초기 인증과 실구독 canary는 아직 남아 있다. 전환 준비 중 추가 HF 소비를 방지하려고 기존 HF 주간 실행은 일시 정지했고, 새 Codex 예약도 인증 검증 전까지 꺼 둔다.

  1. 문서·계약 고정: 현재 장애와 목표 구조, 출력 스키마, 출처·중복 정책을 기록한다.
  2. 비공개 실행 구현: 제한된 수집기, Codex 실행기, 독립 검증, 인증 restore/write-back, 실패 알림을 작성하고 모의 테스트한다.
  3. owner 인증 연결: CI 전용 Codex 로그인과 최소 권한의 secret 저장·공개 전달 자격증명을 연결한다. 비밀값은 채팅으로 받지 않는다.
  4. 수동 canary: 실제 구독 경로로 한 건을 생성하되 먼저 게시하지 않고 근거·스키마·사용량·갱신 상태를 확인한다.
  5. 종단 간 게시: 한 주차를 검증된 release로 내보내고 실제 Writing과 컨텍스트 API에서 확인한다.
  6. 예약 전환: Codex 경로의 검증이 끝난 뒤 기존 HF 조사 예약을 중단하고 새 주간 예약만 활성화한다. 중복 유료 실행은 허용하지 않는다.

완료는 코드가 GitHub에 올라간 상태가 아니다. Mac을 실행 경로에서 제외한 상태에서, 다음 실행이 갱신된 인증을 재사용하고, 검증된 한영 글이 한 번만 발행되며, 실패가 owner에게 알려지는 것까지 확인해야 한다.

무인 자동화는 사람이 영원히 필요 없다는 약속이 아니다. 일상적인 실행은 자동으로 진행하고, 인증 취소·품질 실패·배포 오류처럼 판단이 필요한 예외를 정확히 멈춰서 알리는 시스템이다.