13 KiB
Paper Monitor 프로젝트 - 남은 작업 및 검토 TODO
최종 업데이트: 2026-08-15
이 문서는 지금까지 구축한 Synology NAS 기반 논문 자동 모니터링 시스템에서 아직 미정이거나 수행하지 못한 항목, 그리고 운영 전에 변경 또는 추가 검토가 필요한 항목을 정리한 TODO 목록이다.
1. 즉시 처리 권장
[ ] Semantic Scholar 차단 해제 후 재활성화
- 현재 상태: 접근 제한/차단 상태이므로
enabled: false권장 - 차단이 풀린 뒤 다시 활성화
- 재활성화 후 확인
- 2.5초 이상 요청 간격이 실제 적용되는지
- circuit breaker가 429 지속 시 정상 동작하는지
- 한 run에서 과도한 재시도가 발생하지 않는지
- 정상화 후에도 429가 잦으면 검토
- 요청 간격 3~5초로 증가
- 검색 query 수 축소
max_retries추가 축소
[ ] IEEE 접근 차단 해제 여부 확인
- 현재 상태
- 집 인터넷:
developer.ieee.org-> HTTP 403 - 동일 PC + 휴대폰 테더링: HTTP 200 OK
- 현재 공인 IP 또는 해당 회선이 IEEE/Mashery/WAF에서 제한된 가능성이 매우 높음
- 집 인터넷:
- 현재는
IEEE enabled: false유지 - 차단 해제 후에만 다시 활성화
- 재활성화 시 먼저 1개 query만 수동 테스트
- 401 / 403 / 429 / timeout / connection error 발생 시 해당 run의 IEEE 전체 중단 유지
- 동일 run에서 IEEE 자동 retry는 하지 않음
- 요청 간 최소 간격 5초 유지
[ ] IEEE API 승인 상태 확인
- 네트워크 차단 문제와 API 승인 문제는 별개
- IEEE API key가 최종 승인되었는지 확인 후 활성화
- 웹사이트 접속 정상화와 API 승인 상태를 각각 확인
[ ] 노출된 IEEE API key 교체 여부 확인
- 과거 오류 로그에 API key가 query string 형태로 노출된 적이 있음
- 아직 교체하지 않았다면 새 API key 발급/회전 권장
- 현재 수정한 IEEE collector는 향후 오류 로그에서 key가 노출되지 않도록 유지
2. 스케줄러 / 운영 설정
현재 미완료 항목 없음. 완료된 내용은 문서 하단 완료 항목 섹션 참조.
3. 검색 범위 및 수집 정책
[ ] lookback_days: 14 유지 여부 장기 검토
현재:
lookback_days: 14
주 1회 실행에는 안전한 값이며 현재는 유지 권장.
향후 확인:
- 매주 중복 수집량이 지나치게 많으면 10일 정도로 감소 검토
- publication date가 늦게 반영되는 source가 많으면 14일 유지
[ ] Query 목록 재정비
현재 자동차 레이더 관련 다수 query 사용.
검토 필요:
- 중복도가 지나치게 높은 query 제거
- 실제 유용 논문을 거의 만들지 않는 query 제거
- 주요 관심영역별 query 분리
예:
- Automotive radar
- Imaging radar / 4D radar
- FMCW / Waveform
- MIMO / DDMA
- DOA / Wideband DOA / Super-resolution
- Antenna
- Target modeling / Scattering center
- Interference / RF impairment
[ ] Source별 query 목록 분리 검토
IEEE, Semantic Scholar, Crossref에서 동일한 query 세트를 사용하는 대신 source 특성에 맞게 별도 query 목록을 둘지 검토.
예:
sources:
crossref:
queries: [...]
semantic_scholar:
queries: [...]
ieee:
queries: [...]
장점:
- API 호출량 감소
- 불필요한 중복 감소
- IEEE와 Semantic Scholar 차단 가능성 감소
4. Gemini AI 운영 설정
[ ] Gemini 무료 quota 실제 사용량 모니터링
확인 항목:
- full-text 요청 수
- abstract-only 요청 수
- 한 run에서 token 사용량
- quota 초과/429 발생 여부
필요 시:
- full-text 분석 대상 relevance threshold 추가
- 예: rule-based 또는 abstract AI relevance가 높은 논문만 full-text 분석
[ ] Full-text AI 2단계 분석 구조 검토
현재는 OA PDF가 있으면 바로 full-text 분석.
향후 비용 절감 구조 검토:
- 모든 신규 논문 -> title + abstract 분석
- relevance >= 특정 값인 논문만 OA PDF full-text 분석
예:
abstract AI relevance >= 4/5
-> full-text AI
else
-> abstract 결과만 유지
장점:
- Gemini 호출량/토큰 절감
- PDF 다운로드/파싱 횟수 감소
[ ] Gemini 모델명 config 기반 유지
현재 gemini-3.6-flash 사용.
향후 모델 변경 가능성을 고려해 hard-code 최소화.
config.nas.yaml 값만 바꾸면 동작하도록 유지.
[ ] Gemini AFC 경고 정리
현재 정상 동작하지만 아래 경고가 발생했음:
Direct use of automatic function calling (AFC) in Models.generate_content is not recommended...
기능에는 문제가 없으나 향후 Google 권장 API 방식으로 migration 검토.
5. Groq fallback
[ ] Groq API 인증 문제 해결
현재 상태:
- Groq API key를 등록했으나 401
Invalid API Key - 새 key 교체 후에도 인증 문제로 일단 보류
향후:
- Groq Console에서 project/key 상태 재확인
models.list()인증 테스트- 인증 성공 후 Gemini fallback provider로 연결
목표:
Gemini 성공
-> 완료
Gemini quota/timeout/API 오류
-> Groq fallback
Groq도 실패
-> AI 없이 논문 저장
[ ] Groq dependency는 인증 성공 후 정식 추가
현재 Gemini는 정식 dependency 추가 완료.
Groq는 인증 정상화 후 pyproject.toml에 추가.
6. OA / PDF 처리
[ ] Semantic Scholar openAccessPdf 우선 사용 검증
계획:
- Semantic Scholar
openAccessPdf - 없으면 Unpaywall
- 없으면 abstract fallback
Semantic Scholar가 다시 활성화된 뒤 실제 논문에서 pdf_url이 정상 채워지는지 확인 필요.
[ ] Unpaywall 실제 신규 논문 경로 검증
standalone 테스트는 성공했지만 실제 신규 논문 run에서 다음 로그를 아직 충분히 확인하지 못함:
Unpaywall candidates: N / M new papers
Unpaywall resolved: status=... pdf=YES ...
신규 논문 발생 시 확인.
[ ] PDF 다운로드 실패 유형 통계/로그 개선
현재 예외처리는 되어 있음.
향후 구분 로그 검토:
- 403
- 404
- timeout
- HTML 응답
- invalid PDF signature
- max file size 초과
- parse failure
- no extractable text
[ ] 스캔 PDF OCR 지원 여부
현재 pypdf 기반 텍스트 추출.
스캔 이미지 PDF는 No extractable text가 될 수 있음.
현재 권장:
- OCR은 우선 미지원
- abstract fallback
필요성이 커질 경우에만 OCR 기능 추가 검토.
[ ] PDF text 선택적 추출 개선
현재 제한:
- 최대 40 pages
- 최대 약 120,000 chars
- 최대 PDF 25 MB
향후 개선 검토:
- Abstract
- Introduction
- Method
- Results
- Conclusion
섹션을 우선적으로 추출하여 Gemini에 전달.
7. AI 상태 / retry 정책
[ ] 실제 운영 데이터에서 failed -> retry -> done 경로 확인
임시 DB E2E 테스트는 성공함.
실제 운영에서 최초 Gemini/API 오류가 발생했을 때:
ai_status = failed
저장 후 다음 주 실행에서:
retry -> done
되는지 로그 확인.
[ ] skipped 논문 재평가 정책 결정
현재:
PDF 없음 + abstract 없음
-> ai_status = skipped
-> 자동 재시도 안 함
문제:
- 나중에 Semantic Scholar에서 abstract가 추가되거나
- Unpaywall에서 OA PDF가 생길 수 있음
향후 정책 후보:
- skipped 논문을 30일 후 1회 재조회
- metadata가 개선된 경우에만 재분석
- 계속 skipped인 논문은 영구 종료
[ ] AI retry 횟수 제한 추가 검토
현재 failed는 이후 run에서 다시 시도 가능.
향후 DB 필드 추가 검토:
ai_retry_count
ai_last_attempt_at
예:
- 최대 3회 실패 후
permanent_failed - 무한 재시도 방지
8. DB schema / 데이터 관리
[ ] AI provenance 정보 추가 검토
현재 저장:
- relevance
- categories
- summary
- ai_reason
- oa_status
- pdf_url
- ai_analysis_level
- ai_status
추가 검토:
ai_provider
ai_model
ai_processed_at
ai_retry_count
장점:
- 어떤 모델이 만든 요약인지 추적 가능
- 모델 변경 전/후 비교 가능
[ ] DB backup 정책
papers.db는 시스템의 핵심 상태 데이터.
권장:
- Synology Hyper Backup 또는 별도 주기 backup
- 최소 주 1회
papers.db+ config + source code 함께 backup 검토
[ ] 오래된 테스트 데이터 확인
임시 DB는 /tmp에 생성했으므로 container 종료 시 영향 없음.
운영 papers.db에 테스트 논문이 섞여 있지 않은지 한 번 확인 권장.
9. Joplin 출력 개선
[ ] 실제 AI 분석된 신규 논문이 Joplin에 출력되는 것 확인
render standalone 테스트는 성공.
실제 신규 논문에서 확인할 항목:
AI Analysis: Full text
또는
AI Analysis: Abstract only
AI Summary
Why relevant
OA Status
OA PDF
[ ] Joplin note layout 개선 검토
현재:
- New papers 표
- Summaries 상세 항목
향후 가능:
- relevance별 section
- category별 section
- AI Full-text 분석 논문 상단 배치
- Top 5 paper 별도 section
[ ] 같은 날 재실행 시 note replacement 정책 확인
현재 같은 날짜 note를 교체하면서 해당 날짜 발견 논문을 누적하는 구조.
주 1회 운영에서는 큰 문제 없음.
10. Source 추가
[ ] Google Scholar Alert 연동
아직 보류 중.
계획:
Google Scholar Alert
-> Gmail
-> IMAP
-> ScholarGmailCollector
-> paper-monitor
웹 scraping 대신 Google Scholar Alert 메일을 사용하는 방식 권장.
필요:
- Google Scholar Alert 생성
- Gmail App Password
- NAS
.env - Gmail collector 활성화
- sender/subject filter 테스트
[ ] IEEE 복구 후 source 우선순위 재정의
장기 목표 예:
IEEE Xplore
Semantic Scholar
Crossref
Google Scholar Alert
각 source의 역할 중복을 보고 일부 source를 보조용으로 낮출지 검토.
11. 보안
[ ] .env 권한 확인
API key, Gmail password 등이 들어있으므로 NAS에서 접근 권한 최소화.
예:
chmod 600 .env
단, Docker/실행 사용자가 읽을 수 있는지 확인 후 적용.
[ ] 로그에 secret 노출 여부 재점검
특히 확인:
- IEEE API key
- Gemini API key
- Semantic Scholar API key
- Gmail App Password
로그에는 key value를 출력하지 않도록 유지.
[ ] API key rotation 정책
키가 채팅/로그에 노출되었다면 즉시 교체. 장기적으로 필요 시 주기적 rotation 검토.
12. Docker / 유지보수
[ ] dependency 버전 pinning 검토
현재 패키지 버전을 느슨하게 두면 향후 rebuild 시 API가 깨질 수 있음.
특히:
google-genaipypdfrequestsPyYAML
운영 안정화 후 known-good version으로 pinning 검토.
[ ] Docker image rebuild 정책
기억할 규칙:
config.nas.yaml 변경
-> rebuild 불필요
.env 변경
-> rebuild 불필요
Python source 변경
-> rebuild 필요
pyproject.toml 변경
-> rebuild 필요
[ ] 테스트 파일 유지 여부
현재 생성한 테스트 모듈:
test_e2e_ai.pytest_retry_ai.py
향후:
- 유지해서 regression test로 사용할지
- 별도
tests/폴더로 이동할지 결정
현재 운영 권장 설정
현재 접근 제한 상황을 고려하면 당분간 다음 구성이 안전하다.
app:
timezone: Asia/Seoul
lookback_days: 14
max_papers_per_source_per_query: 20
min_relevance: 2
sources:
ieee:
enabled: false
semantic_scholar:
enabled: false
ai:
enabled: true
provider: gemini
api_key_env: GEMINI_API_KEY
model: gemini-3.6-flash
max_papers_per_run: 20
oa:
enabled: true
provider: unpaywall
email_env: UNPAYWALL_EMAIL
스케줄:
매주 월요일 09:00 KST
lookback: 14일
현재 IEEE와 Semantic Scholar가 비활성화되어 있으므로 당분간 Crossref 중심으로 수집되고, DOI가 있는 신규 논문에 대해 Unpaywall OA 검색 및 Gemini 분석이 수행된다.
우선순위 요약
P0 - 운영 전에 확인
- Semantic Scholar
enabled: false - IEEE
enabled: false .envsecret 권한 및 IEEE key rotation 여부 확인
P1 - 접근 복구 후
- Semantic Scholar 재활성화 + 429 상태 확인
- IEEE 웹사이트 403 해제 확인
- IEEE API 승인 상태 확인
- IEEE 1-query 테스트 후 재활성화
P2 - 기능 보강
- Google Scholar Alert + Gmail collector
- Groq 인증 해결 + Gemini fallback
skipped재평가 정책- AI retry count / provider / model / processed_at DB 저장
- PDF section-aware extraction
P3 - 장기 운영
- DB backup
- scheduler timestamp 로그 보관기간/정리 정책(예: 8주)
- dependency version pinning
- query/source 최적화
- Joplin report layout 개선
완료 항목 (2026-08-15 기준)
스케줄러 / 운영
- DSM Task Scheduler 최종 등록 확인
- DSM 월요일 09:00 scheduler 최종 등록/활성화
- DSM에서 등록한 작업 수동 1회 실행 및
RESULT=0확인 - Joplin import / WebDAV sync 정상 동작 확인
- Scheduler 로그를 실행별 개별 파일로 생성하도록 적용
적용 로그 파일명 형식:
scheduler-YYYY-MM-DD_HH-MM-SS.log
Gemini 운영값
max_papers_per_run운영값 확정:20