557 lines
13 KiB
Markdown
557 lines
13 KiB
Markdown
# 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` 유지 여부 장기 검토
|
|
현재:
|
|
```yaml
|
|
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 목록을 둘지 검토.
|
|
|
|
예:
|
|
```yaml
|
|
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 분석.
|
|
|
|
향후 비용 절감 구조 검토:
|
|
1. 모든 신규 논문 -> title + abstract 분석
|
|
2. relevance >= 특정 값인 논문만 OA PDF full-text 분석
|
|
|
|
예:
|
|
```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 경고 정리
|
|
현재 정상 동작하지만 아래 경고가 발생했음:
|
|
|
|
```text
|
|
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로 연결
|
|
|
|
목표:
|
|
```text
|
|
Gemini 성공
|
|
-> 완료
|
|
|
|
Gemini quota/timeout/API 오류
|
|
-> Groq fallback
|
|
|
|
Groq도 실패
|
|
-> AI 없이 논문 저장
|
|
```
|
|
|
|
### [ ] Groq dependency는 인증 성공 후 정식 추가
|
|
현재 Gemini는 정식 dependency 추가 완료.
|
|
Groq는 인증 정상화 후 `pyproject.toml`에 추가.
|
|
|
|
---
|
|
|
|
## 6. OA / PDF 처리
|
|
|
|
### [ ] Semantic Scholar `openAccessPdf` 우선 사용 검증
|
|
계획:
|
|
1. Semantic Scholar `openAccessPdf`
|
|
2. 없으면 Unpaywall
|
|
3. 없으면 abstract fallback
|
|
|
|
Semantic Scholar가 다시 활성화된 뒤 실제 논문에서 `pdf_url`이 정상 채워지는지 확인 필요.
|
|
|
|
### [ ] Unpaywall 실제 신규 논문 경로 검증
|
|
standalone 테스트는 성공했지만 실제 신규 논문 run에서 다음 로그를 아직 충분히 확인하지 못함:
|
|
|
|
```text
|
|
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 오류가 발생했을 때:
|
|
```text
|
|
ai_status = failed
|
|
```
|
|
저장 후 다음 주 실행에서:
|
|
```text
|
|
retry -> done
|
|
```
|
|
되는지 로그 확인.
|
|
|
|
### [ ] `skipped` 논문 재평가 정책 결정
|
|
현재:
|
|
```text
|
|
PDF 없음 + abstract 없음
|
|
-> ai_status = skipped
|
|
-> 자동 재시도 안 함
|
|
```
|
|
|
|
문제:
|
|
- 나중에 Semantic Scholar에서 abstract가 추가되거나
|
|
- Unpaywall에서 OA PDF가 생길 수 있음
|
|
|
|
향후 정책 후보:
|
|
- skipped 논문을 30일 후 1회 재조회
|
|
- metadata가 개선된 경우에만 재분석
|
|
- 계속 skipped인 논문은 영구 종료
|
|
|
|
### [ ] AI retry 횟수 제한 추가 검토
|
|
현재 `failed`는 이후 run에서 다시 시도 가능.
|
|
|
|
향후 DB 필드 추가 검토:
|
|
```text
|
|
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
|
|
|
|
추가 검토:
|
|
```text
|
|
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 테스트는 성공.
|
|
|
|
실제 신규 논문에서 확인할 항목:
|
|
```text
|
|
AI Analysis: Full text
|
|
또는
|
|
AI Analysis: Abstract only
|
|
|
|
AI Summary
|
|
Why relevant
|
|
OA Status
|
|
OA PDF
|
|
```
|
|
|
|
### [ ] Joplin note layout 개선 검토
|
|
현재:
|
|
1. New papers 표
|
|
2. Summaries 상세 항목
|
|
|
|
향후 가능:
|
|
- relevance별 section
|
|
- category별 section
|
|
- AI Full-text 분석 논문 상단 배치
|
|
- Top 5 paper 별도 section
|
|
|
|
### [ ] 같은 날 재실행 시 note replacement 정책 확인
|
|
현재 같은 날짜 note를 교체하면서 해당 날짜 발견 논문을 누적하는 구조.
|
|
|
|
주 1회 운영에서는 큰 문제 없음.
|
|
|
|
---
|
|
|
|
## 10. Source 추가
|
|
|
|
### [ ] Google Scholar Alert 연동
|
|
아직 보류 중.
|
|
|
|
계획:
|
|
```text
|
|
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 우선순위 재정의
|
|
장기 목표 예:
|
|
```text
|
|
IEEE Xplore
|
|
Semantic Scholar
|
|
Crossref
|
|
Google Scholar Alert
|
|
```
|
|
|
|
각 source의 역할 중복을 보고 일부 source를 보조용으로 낮출지 검토.
|
|
|
|
---
|
|
|
|
## 11. 보안
|
|
|
|
### [ ] `.env` 권한 확인
|
|
API key, Gmail password 등이 들어있으므로 NAS에서 접근 권한 최소화.
|
|
|
|
예:
|
|
```sh
|
|
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-genai`
|
|
- `pypdf`
|
|
- `requests`
|
|
- `PyYAML`
|
|
|
|
운영 안정화 후 known-good version으로 pinning 검토.
|
|
|
|
### [ ] Docker image rebuild 정책
|
|
기억할 규칙:
|
|
|
|
```text
|
|
config.nas.yaml 변경
|
|
-> rebuild 불필요
|
|
|
|
.env 변경
|
|
-> rebuild 불필요
|
|
|
|
Python source 변경
|
|
-> rebuild 필요
|
|
|
|
pyproject.toml 변경
|
|
-> rebuild 필요
|
|
```
|
|
|
|
### [ ] 테스트 파일 유지 여부
|
|
현재 생성한 테스트 모듈:
|
|
- `test_e2e_ai.py`
|
|
- `test_retry_ai.py`
|
|
|
|
향후:
|
|
- 유지해서 regression test로 사용할지
|
|
- 별도 `tests/` 폴더로 이동할지 결정
|
|
|
|
---
|
|
|
|
# 현재 운영 권장 설정
|
|
|
|
현재 접근 제한 상황을 고려하면 당분간 다음 구성이 안전하다.
|
|
|
|
```yaml
|
|
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
|
|
```
|
|
|
|
스케줄:
|
|
|
|
```text
|
|
매주 월요일 09:00 KST
|
|
lookback: 14일
|
|
```
|
|
|
|
현재 IEEE와 Semantic Scholar가 비활성화되어 있으므로 당분간 Crossref 중심으로 수집되고, DOI가 있는 신규 논문에 대해 Unpaywall OA 검색 및 Gemini 분석이 수행된다.
|
|
|
|
---
|
|
|
|
# 우선순위 요약
|
|
|
|
## P0 - 운영 전에 확인
|
|
- [ ] Semantic Scholar `enabled: false`
|
|
- [ ] IEEE `enabled: false`
|
|
- [ ] `.env` secret 권한 및 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 기준)
|
|
|
|
## 스케줄러 / 운영
|
|
- [x] DSM Task Scheduler 최종 등록 확인
|
|
- [x] DSM 월요일 09:00 scheduler 최종 등록/활성화
|
|
- [x] DSM에서 등록한 작업 수동 1회 실행 및 `RESULT=0` 확인
|
|
- [x] Joplin import / WebDAV sync 정상 동작 확인
|
|
- [x] Scheduler 로그를 실행별 개별 파일로 생성하도록 적용
|
|
|
|
적용 로그 파일명 형식:
|
|
```text
|
|
scheduler-YYYY-MM-DD_HH-MM-SS.log
|
|
```
|
|
|
|
## Gemini 운영값
|
|
- [x] `max_papers_per_run` 운영값 확정: `20`
|