plans: 동남아 뉴스 계획 보강 - 코드 참조/테스트/교훈 추가
- 수집/선별/포맷 상세 구현 방안 (파일명:줄번호 참조) - 테스트 계획 (315 원칙: pytest, conftest.py fixtures) - 트러블슈팅 교훈 반영 (본문 검증, OOM 방지, 토큰 분리)
This commit is contained in:
parent
53c799b737
commit
33c52f800a
@ -34,28 +34,116 @@
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 3. 수집·선별
|
## 3. 수집·선별 상세
|
||||||
|
|
||||||
- **수집**: skill-news `GoogleNewsCollector`(또는 동등한 Google 뉴스 수집) 재사용. 키워드 예: `Singapore startup`, `Malaysia startup`, `Indonesia startup`, `SEA startup` / 지역·언어 `hl=en&gl=SG`(또는 MY, ID) 등. **최근 24시간** 이내 배포된 기사만 수집(수집 시점 기준 역산).
|
### 3.1 수집 (skill-news)
|
||||||
- **선별**: 수집 결과 중 **컴퍼니엑스 투자 분야**(바이오/의료, 헬스케어, 제조, 이커머스) 및 **기회 탐색용**(VC·액셀·펀딩·진출·M&A·정책·인프라) 키워드로 필터링. 무관한 일반 뉴스는 제외. 상위 3건만 사용. 컨텍스트 참조: `560_컴퍼니엑스_개요.md` 섹션 2.1.
|
|
||||||
- **저장**: 중복·이미 전송 이력 제외용 데이터는 skill-news 기존 패턴(`sea_news_posting.json`) 사용.
|
**신규 파일**: `skill_news/app/services/sea_news_collector.py`
|
||||||
|
|
||||||
|
**구현 방식**: `google_news_collector.py:55-91` 패턴 재사용
|
||||||
|
- Playwright로 Google News 검색
|
||||||
|
- URL 파라미터: `q={keyword}%20when%3A1d&hl=en&gl=SG` (24시간 필터)
|
||||||
|
- 키워드: `Singapore startup funding`, `Malaysia startup investment`, `Indonesia startup VC`, `SEA biotech healthcare`
|
||||||
|
|
||||||
|
**환경변수** (`.env`):
|
||||||
|
```
|
||||||
|
SEA_NEWS_KEYWORDS=Singapore startup funding,Malaysia startup investment,Indonesia startup VC,SEA biotech healthcare
|
||||||
|
SEA_NEWS_REGION=SG
|
||||||
|
SEA_NEWS_DAYS_BACK=1
|
||||||
|
```
|
||||||
|
|
||||||
|
**데이터 모델**: `news_models.py:6-26` `NewsArticle` 재사용
|
||||||
|
|
||||||
|
### 3.2 선별 (skill-news)
|
||||||
|
|
||||||
|
**신규 파일**: `skill_news/app/services/sea_news_filter.py`
|
||||||
|
|
||||||
|
**필터링 로직**:
|
||||||
|
1. **키워드 매칭**: 제목/본문에 기회 탐색 키워드 포함 여부 확인
|
||||||
|
- 기회 키워드: `funding`, `investment`, `VC`, `accelerator`, `Series A/B`, `M&A`, `expansion`, `policy`
|
||||||
|
- 분야 키워드: `biotech`, `healthcare`, `medical`, `manufacturing`, `e-commerce`
|
||||||
|
2. **본문 검증**: `companyx_news_collector.py:396-413` `_remove_duplicates` 패턴 참고
|
||||||
|
- 트러블슈팅 교훈: 검색어 부분 매칭만으로 무관 기사 수집 문제 (`250916_claude_companyx_wrong_news.md`)
|
||||||
|
- 본문 검증 로직 필수
|
||||||
|
3. **상위 3건 선정**: 기회 키워드 매칭 점수 기준 정렬
|
||||||
|
|
||||||
|
### 3.3 제목 번역 (LLM)
|
||||||
|
|
||||||
|
**구현 위치**: `skill_news/app/services/sea_news_filter.py`
|
||||||
|
|
||||||
|
**LLM 호출**: Gemini API 사용 (311 원칙: LLM 우선 접근)
|
||||||
|
- 프롬프트: "Translate the following news title to Korean. Return only the translated title without explanation: {title}"
|
||||||
|
- 3건 배치 처리 (단일 호출로 통합, 311 원칙 섹션 14)
|
||||||
|
|
||||||
|
### 3.4 포맷 (skill-news)
|
||||||
|
|
||||||
|
**신규 함수**: `skill_news/app/services/sea_news_service.py` `format_sea_news_for_slack()`
|
||||||
|
|
||||||
|
**참조**: `naver_startup_news_service.py:333-343` 포맷 로직
|
||||||
|
```python
|
||||||
|
lines = ["", "", "*동남아 소식*", ""]
|
||||||
|
for i, article in enumerate(articles[:3], 1):
|
||||||
|
lines.append(f"{i:02d}. <{article.url}|{article.title_ko}>")
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3.5 중복 제거 및 이력 관리
|
||||||
|
|
||||||
|
**파일**: `skill_news/data/sea_news_posting.json`
|
||||||
|
|
||||||
|
**참조**: `companyx_news_collector.py:396-413` 중복 제거 패턴
|
||||||
|
- URL + 제목 기준 중복 확인
|
||||||
|
- 전송 이력 저장 (날짜, URL, 제목)
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 4. Phase 및 필요 작업
|
## 4. Phase 및 필요 작업
|
||||||
|
|
||||||
| Phase | 내용 | 필요 작업 |
|
| Phase | 필요 작업 |
|
||||||
|-------|------|------------|
|
|-------|-----------|
|
||||||
| **Phase 1** | 동남아 뉴스 수집 | skill-news에 동남아 전용 수집 모듈/컬렉터 추가. 키워드·지역 설정(`hl`, `gl`) 환경변수 또는 config로 관리. **24시간** 이내 기사만 수집하도록 필터 적용. |
|
| **Phase 1** | `skill_news/app/services/sea_news_collector.py` 신규 생성. `google_news_collector.py:55-91` 패턴 복사 후 키워드·지역 파라미터 변경. 환경변수 `.env`에 `SEA_NEWS_*` 추가. |
|
||||||
| **Phase 2** | 3건 선별 및 포맷 | 수집 결과 **컴퍼니엑스 투자 분야**(바이오/의료, 헬스케어, 제조, 이커머스) + **기회 탐색 키워드**(VC·펀딩·액셀·진출·M&A·정책·인프라)로 필터링. 상위 3건 선정 후 제목 한국어 번역(LLM 사용), **출판사/신문사 미기재**, `01. <url\|제목>` 형태로 포맷. |
|
| **Phase 2** | `skill_news/app/services/sea_news_filter.py` 신규 생성. 기회 키워드 매칭 + 본문 검증 + LLM 제목 번역(Gemini, 3건 배치). `sea_news_service.py`에 `format_sea_news_for_slack()` 추가. |
|
||||||
| **Phase 3** | daily_headlines 연동 | `run_headlines_job`(또는 동등 진입점)에서 깡프로 Slack 텍스트 생성 후, **동남아 소식** 섹션을 삽입. 삽입 위치(깡프로 끝~클로징~명언 사이) 명확히 정의. |
|
| **Phase 3** | `rb8001/app/services/skills/startup_news_skill.py:11-93` `run_headlines_job` 수정. 깡프로 텍스트 생성 후 동남아 섹션 삽입. 삽입 위치: 명언(`>` 시작) 앞 2줄. `startup_news_skill.py:37-52` 키워드 섹션 삽입 로직 참고. |
|
||||||
| **Phase 4** | 스케줄·채널 | 기존 daily_headlines 스케줄·채널 그대로 사용. 동남아 수집 실패 시 동남아 섹션만 생략하고 깡프로만 전송. |
|
| **Phase 4** | 기존 daily_headlines 스케줄 유지(09:10). 동남아 수집 실패 시 `try-except`로 동남아 섹션만 생략, 깡프로만 전송. |
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 5. 참고
|
## 5. 테스트 계획
|
||||||
|
|
||||||
- `DOCS/book/500_business/560_컴퍼니엑스_개요.md`: 컴퍼니엑스 역할·뉴스 수집 맥락.
|
**315 원칙 준수**: pytest 자동 테스트, conftest.py fixtures 사용
|
||||||
- `skill_news/app/services/naver_startup_news_service.py`: 깡프로 포맷·헤드라인 추출.
|
|
||||||
- `rb8001/app/services/skills/startup_news_skill.py`: daily_headlines 실행·Slack 전송.
|
| 테스트 | 파일 | 내용 |
|
||||||
- `rb8001/app/scheduler/jobs/daily_headlines.py`, `db_loader`: 스케줄 등록.
|
|--------|------|------|
|
||||||
|
| 수집 단위 테스트 | `skill_news/tests/test_sea_news_collector.py` | 키워드 검색, 24시간 필터, NewsArticle 반환 확인 |
|
||||||
|
| 선별 단위 테스트 | `skill_news/tests/test_sea_news_filter.py` | 기회 키워드 매칭, 본문 검증, LLM 번역 모킹 |
|
||||||
|
| 포맷 단위 테스트 | `skill_news/tests/test_sea_news_service.py` | `01. <url\|제목>` 형식 확인 |
|
||||||
|
| 연동 E2E 테스트 | `rb8001/tests/e2e/test_sea_news_headlines.py` | 깡프로 + 동남아 섹션 통합 Slack 메시지 확인 |
|
||||||
|
|
||||||
|
**conftest.py fixtures**:
|
||||||
|
- `mock_playwright`: Playwright 모킹
|
||||||
|
- `mock_gemini`: Gemini API 모킹
|
||||||
|
- `sample_sea_articles`: 테스트용 NewsArticle 3건
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 6. 주의사항 (트러블슈팅 교훈)
|
||||||
|
|
||||||
|
| 교훈 | 출처 | 적용 |
|
||||||
|
|------|------|------|
|
||||||
|
| 검색어 부분 매칭 → 무관 기사 수집 | `250916_claude_companyx_wrong_news.md` | 본문 검증 로직 필수 |
|
||||||
|
| OOM → 리소스 경합 | `250908_headline_failure_memory_error.md` | 깡프로(09:10) 이후 동남아 수집 (동일 job 내 순차 처리) |
|
||||||
|
| 좀비 프로세스 | `250904_admin_skill-news_zombie_process_gitea_actions.md` | docker-compose.yml `init: true` 확인 |
|
||||||
|
| 워크스페이스별 토큰 분리 | `250909_slack_briefing_failure.md` | `COMPANYX_SLACK_BOT_TOKEN` 사용 확인 |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 7. 참고 파일
|
||||||
|
|
||||||
|
| 파일 | 참조 내용 |
|
||||||
|
|------|----------|
|
||||||
|
| `skill_news/app/services/google_news_collector.py:55-91` | 뉴스 검색 패턴 |
|
||||||
|
| `skill_news/app/services/google_news_collector.py:100` | URL 파라미터 (when:Nd) |
|
||||||
|
| `skill_news/app/services/companyx_news_collector.py:396-413` | 중복 제거 패턴 |
|
||||||
|
| `skill_news/app/services/naver_startup_news_service.py:333-343` | Slack 포맷 (`01. <url\|제목>`) |
|
||||||
|
| `rb8001/app/services/skills/startup_news_skill.py:11-93` | run_headlines_job 구조 |
|
||||||
|
| `rb8001/app/services/skills/startup_news_skill.py:37-52` | 섹션 삽입 로직 (명언 앞) |
|
||||||
|
| `DOCS/book/500_business/560_컴퍼니엑스_개요.md` | 컴퍼니엑스 투자 분야 |
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user