공부/인공지능

매주 월요일 아침, 논문이 온다.

TechToast 2026. 8. 11. 11:33

지난 편 끝에서, 논문은 매주 월요일 아침에 모여 한국어 요약으로 만들어져 텔레그램으로 온다고 했다. 그 이야기다. 메일이 지금 일어나는 일을 남긴다면, 논문은 앞으로 할 일을 정하는 재료인데, 그 재료는 들어오는 것만으로는 부족하고 읽혀야 했다. 하루에 읽을 수 있는 논문은 한정되어 있고, 쏟아지는 논문은 그보다 많으니, 이 자동화는 읽기를 대신하지 않기로 했고, 대신 고르는 일을 맡기로 했다. 메일 편에서는 받는이를 기준으로 갈랐는데, 논문은 어떤 기준으로 갈랐는지가 이 편의 중심이다. 무엇을 골랐는지, 하나씩 보자.

매주 월요일 아침에 온다

첫 버전은 맥의 launchd 가 매주 월요일 아홉 시에 깨우는 작업이었다. 논문은 세 곳에서 걷는데, arXiv 에서는 영상처리와 컴퓨터비전 두 카테고리를, PubMed 에서는 의료영상 인공지능을, HuggingFace 에서는 일일 논문 목록을 본다. 세 곳에서 걷힌 논문은 의료 쪽 키워드와 인공지능 키워드를 둘 다 가진 것만 남는데, 필터는 그렇게 짰다. 둘 중 하나만 가진 논문은 의료만의 논문이거나 인공지능만의 논문이라, 여기에는 해당이 없다. 살아남은 논문은 톱저널이 먼저 오도록 줄을 서는데, Radiology 나 MedIA 같은 저널들의 목록이 우선순위를 정한다. 며칠치를 볼지, 최대 몇 편까지 담을지는 환경 변수로 두었고, 변수를 바꾸면 같은 스크립트가 다른 범위를 본다.

 

그다음은 서버의 모델이 할 일이었다. 모델은 그 줄을 받아 한국어 주간 리캡을 쓰는데, 핵심 세 편을 꼽고, 주제별로 묶고, 그 주의 흐름을 요약한다. 결과는 논문리캡 폴더에 날짜가 붙은 파일로 남고, 텔레그램으로 알림이 갔다. 첫 검증에서는 열여덟 편이 모여 발송까지 정상으로 끝났는데, 기록에는 가느다란 흠집 하나가 적혀 있을 뿐이었다. 리캡에 한자나 영어가 섞여 보이는 일이 가끔 있어서, 프롬프트를 더 조일 수 있겠다는 메모였다.

 

매일로 옮기다

7월 초, 나는 이걸 매일로 바꾸기로 했다. 슬랙의 논문 채널에, 원문 PDF 를 붙여서. 주간 리캡은 한 주치를 한 번에 보여주고, 매일 버전은 그날의 논문을 그날 아침에 보여준다. 맥은 잠들면 멈추니, 매일 작업은 맥이 아닌 서버에 뒀고, 서버의 크론이 아침 여덟 시에 깨운다. 매일 작업은 주간 리캡의 스크립트를 서버로 이식해 만든 것이라, 걷는 곳과 거르는 기준은 그대로였다. 바뀐 것은 셋이었다. 주기는, 보내는 곳은, 하루에 고르는 편수는.

 

매일 버전은 지난 이틀치를 모으는데, 세 곳을 다 뒤지면 같은 논문이 이름을 달고 여러 번 걸리기도 해서, 중복을 지우는 일이 늘 앞에 있다. 중복이 지워지면 톱저널부터 줄을 세우고, 모델이 핵심 한 편을 고른다. 고르는 방식이 재밌는데, 모델이 리뷰에 SELECT: N 이라는 표시를 박으면, 그 번호의 논문이 그날의 논문이 된다. 목록에서 고르는 일을 모델에게 시키는 셈인데, 그 한 표시가 선택과 리뷰를 한 번에 끝낸다. 리뷰는 한 줄 요약과 배경, 방법, 결과, 의의, 한계의 여섯 칸으로 쓰이고, 원문은 arXiv 논문이면 바로 내려받고, DOI 가 있는 논문은 Unpaywall 로 오픈액세스인지 확인해서, Elsevier 같은 페이월 뒤의 저널은 링크만 남긴다. 리뷰는 연구 맥락 폴더에 그날의 논문이라는 이름의 노트로 먼저 남는데, 이 노트는 브레인에 색인되는 대상이라, 한 번 들어간 리뷰는 검색으로 다시 꺼낼 수 있다. 지난 편에서 알림을 가장 좁은 문으로만 통과시키기로 했다는 얘기를 했는데, 논문도 같은 결이었다. 아무리 많이 쏟아져도, 보여지는 것은 한 편이다.

 

한자 사건

매일 버전의 검증에는 한자 비율을 재는 값이 붙어 있었는데, 그 검사가 어느 날 62~79%라는 숫자를 뱉었다. 리뷰의 대부분이 한자라는 판정이었다. 한자를 치우는 마지막 단계가 있었는데, 그 단계가 지운 것은 한글이었다. 리뷰는 텅 비었다. 공백과 영문과 마침표만 남는, 빈 리뷰가 되었다.

 

원인을 파 보니, 모델의 잘못이 아니었다. 한자를 찾는 정규식은 한자 글자들을 소스에 리터럴로 적어 두는 방식이었는데, 그 리터럴이 전송되는 동안 조용히 손상되어, 원래 잡아야 할 한자뿐 아니라 한글 음절까지 매치하고 있었다. 검사는 한글을 한자로 오탐했다. 치우는 단계는 그 '한자'들을 지우느라 한글까지 다 지워 버린 것이다. 기록에는 손상이 의심되는 길이 두 개 적혀 있는데, 하나는 ssh 로 파이썬 한 줄을 보낼 때 따옴표가 겹치는 길이고, 다른 하나는 편집 도구가 CJK 글자를 변형시키는 길이다. 어느 길이었는지는 끝내 특정하지 못했다. 다만 어느 쪽이든 결론은 같았다. 소스에 한자 글자를 두지 않으면, 손상될 리터럴 자체가 없다. 모델은 처음부터 완벽한 한국어를 쓰고 있었다. 브레인 질의도, 아침 브리핑도 같은 모델인데, 그쪽은 처음부터 깨끗했다. 모델은 의심받았다. 범인은 따로 있었다.

 

해법은 소스에서 한자 글자를 없애는 것이었다. 문자를 직접 적는 대신, 코드포인트로 판정한다. 한자 영역은 확장과 통합과 호환, 세 구간으로 나뉘는데, 그 구간들을 숫자로 적는 것이다.

 

_HANJA_RANGES = ((0x3400, 0x4dbf), (0x4e00, 0x9fff), (0xf900, 0xfaff))
_is_hanja = lambda ch: any(a <= ord(ch) <= b for a, b in _HANJA_RANGES)

 

숫자는 전송되어도 변하지 않는다. 글자는 어떤 도구를 지나느냐에 따라 조용히 다른 글자가 되지만, 숫자는 어디를 지나도 숫자다. 한글을 넣어 재보니 오탐이 0건이었고, 한자는 3건 모두 걸렸다. 그 뒤로 건조 실행의 한자 비율은 0.0000 이었다. 돌아보면 이 사건의 아픈 점은, 62~79%라는 숫자가 정확해 보였다는 것이다. 숫자가 정확해 보일수록, 그 숫자를 만든 도구를 의심하는 일을 미룬다. 한자가 섞였다는 판정 자체가 오진이었는데, 그 오진을 만든 것은 재는 도구였다. 모델이 의심받는 동안, 검사는 조용히 틀리고 있었다. 기록에 남은 순서는 오탐 판정, 그 판정에 따른 삭제, 그리고 빈 리뷰다.

 

슬랙은 마크다운을 모른다

채널로 보내는 일에도 함정이 있었다. 슬랙은 표준 마크다운이 아니라 mrkdwn 이라는 자기 문법만 받는데, 헤더도 볼드도 링크도 그대로 날것으로 보인다. 제목 앞의 샵 기호부터, 별표 두 개부터, 대괄호와 괄호부터 그대로다. 그래서 게시 직전에 변환 함수가 하나 들어갔고, 링크는 주소와 이름을 묶는 꼴로, 헤더는 굵은 글씨로, 불릿은 불릿 글자로 바뀐다. 그 변환은 논문 리캡에만 붙지 않았다. 슬랙으로 글을 보내는 공용 도우미에도 같은 로직이 들어가, 다른 자동화가 보내는 글도 같은 길을 지나간다.

 

여기서 함정이 두 개 나왔다. 하나는 파이썬의 치환 문자열에 불릿 글자를 직접 쓰면 이스케이프 오류가 나는 것이라, 코드포인트로 넣어야 했다. 다른 하나는 한국어라서 겪는 것이었다. 슬랙의 굵은 글씨는 양쪽에 경계가 있어야만 렌더가 되는데, 한국어는 굵게 할 단어에 조사가 바로 이어지면 별표가 그대로 노출된다. 헤더는 줄의 끝에 있어서 경계 걱정이 없는데, 볼드는 문장 중간에 들어가니 문제가 된다. 그래서 볼드 변환을 두 번 나눠서, 경계가 안전한 곳만 굵게 바꾸고, 조사가 붙은 곳은 마커만 지우는 식으로 했다.

 

여기까지 만들고 건조 실행으로 검증했다. 건조 실행은 실제로는 게시하지 않고 흐름만 확인하는 모드인데, 그 결과 리뷰는 깨끗한 한국어였고, 한자 비율은 0.0000 이었다. 남은 일도 두 개였는데, 둘 다 코드가 아니라 손이 필요한 일이었다. 하나는 봇을 채널에 초대하는 일이라, 안 하면 게시가 실패한다. 다른 하나는 PDF 첨부인데, 봇에 파일 업로드 권한이 없어서, 업로드 코드는 넣어 두고 권한이 없으면 원문 링크로 빠지게 해 두었다. 그래서 PDF 가 있는 날은 본문에 원문 링크가 달리고, 권한이 생기면 같은 자리에 첨부가 붙는 구조다. 권한을 더하는 일은 내 손이 필요한 채로 남았다. 정말로 모델이 한자를 섞기 시작하면, 출력을 구조적으로 막는 방법도 남겨 뒀다. 글자를 뽑을 때 한자를 후보에서 아예 빼는 방식인데, 그건 나중의 일로 미뤘다.

 

그 작업은 서버의 크론으로 올라가, 매일 아침 여덟 시에 논문 한 편을 골라 채널에 남긴다. 주간 리캡이 매일이 되고, 요약이 여섯 칸이 되고, 원문이 붙는 동안, 부딪힌 일들은 전부 수집이 아니라 고르고, 검증하고, 보여주는 쪽에서 났다. 무엇을 보여줄지 고르는 일, 그것이 자동화가 하는 일의 대부분이라는 지난 편의 결론이, 논문에서도 그대로였다. 입력은 이제 들어올 만큼 들어온다. 다음 문제는, 채우는 것이 아니라 쓰는 것이었다.

'공부 > 인공지능' 카테고리의 다른 글

단체 메일은 조용히.  (0) 2026.08.06
전사가 깨진 이유.  (0) 2026.08.05
소리가 줄어드는 녹음.  (0) 2026.08.05
끊기지 않는 유입.  (0) 2026.08.03
위키가 영어로 쓰여 있었다 — 4,382개 중 482개  (1) 2026.08.02