docs: skill_news 중복 뉴스 문제 분석 및 개선 방안
- 뉴스 수집 시퀀스 다이어그램 추가 - latest API가 새 수집 없이 오래된 DB 조회만 하는 문제 발견 - 환경변수 더미값(keyword1,keyword2) 문제 지적 - ChromaDB 67개 뉴스 분석 (8/12~9/1) - 중복 방지는 정상 작동, 새 뉴스 미수집이 근본 원인 - 개선 제안: 환경변수 설정, latest API 개선, 시간 기반 필터링
This commit is contained in:
parent
259b733708
commit
d8ff7168e0
203
troubleshooting/250901_claude_skill_news_duplicate_issue.md
Normal file
203
troubleshooting/250901_claude_skill_news_duplicate_issue.md
Normal file
@ -0,0 +1,203 @@
|
||||
# News Skill 동작 시퀀스 및 문제 분석
|
||||
|
||||
**작성일**: 2025-09-01
|
||||
**작성자**: Claude
|
||||
**상태**: 🔍 분석 완료
|
||||
|
||||
## 1. News Skill 개요
|
||||
|
||||
### 시스템 정보
|
||||
- **서비스명**: robeing-skill-news
|
||||
- **포트**: 8505
|
||||
- **컨테이너**: skill_news-skill-news
|
||||
- **데이터 저장**: ChromaDB (/app/data/chroma)
|
||||
|
||||
### 현재 설정
|
||||
```bash
|
||||
NEWS_KEYWORDS=keyword1,keyword2 # 더미값
|
||||
NEWS_SEARCH_DAYS=7
|
||||
MAX_NEWS_ITEMS=20
|
||||
NEWS_SERVICE_PORT=8505
|
||||
```
|
||||
|
||||
## 2. 뉴스 수집 시퀀스
|
||||
|
||||
### 2.1 API 호출 흐름
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant User
|
||||
participant API as /api/news/search
|
||||
participant Collector as GoogleNewsCollector
|
||||
participant Manager as NewsDataManager
|
||||
participant ChromaDB
|
||||
participant GoogleNews
|
||||
|
||||
User->>API: POST {"keywords": ["AI"], "max_items": 5}
|
||||
API->>Collector: search_news(keywords, max_items)
|
||||
|
||||
loop 각 키워드별
|
||||
Collector->>GoogleNews: Playwright 브라우저 자동화
|
||||
GoogleNews-->>Collector: HTML 파싱 결과
|
||||
Collector->>Collector: NewsArticle 객체 생성
|
||||
end
|
||||
|
||||
Collector->>Manager: save_articles(articles)
|
||||
|
||||
loop 각 기사별
|
||||
Manager->>ChromaDB: check_duplicate(article)
|
||||
alt 중복 아님
|
||||
Manager->>ChromaDB: collection.add(article)
|
||||
Manager-->>API: saved_count++
|
||||
else 중복
|
||||
Manager-->>API: skip
|
||||
end
|
||||
end
|
||||
|
||||
API-->>User: {"success": true, "count": N, "articles": [...]}
|
||||
```
|
||||
|
||||
### 2.2 Latest API 문제점
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant User
|
||||
participant API as /api/news/latest
|
||||
participant Manager as NewsDataManager
|
||||
participant ChromaDB
|
||||
|
||||
User->>API: GET /api/news/latest?limit=5
|
||||
API->>Manager: get_articles_by_status("collected", 5)
|
||||
Manager->>ChromaDB: collection.get(where={"status": "collected"})
|
||||
ChromaDB-->>Manager: 기존 저장된 뉴스
|
||||
Manager-->>API: 오래된 뉴스 반환
|
||||
API-->>User: 8월 12일 뉴스 (20일 전)
|
||||
```
|
||||
|
||||
## 3. 발견된 문제점
|
||||
|
||||
### 3.1 뉴스 중복 메커니즘
|
||||
1. **정상 동작하는 중복 방지**
|
||||
- URL과 제목 기반 중복 체크 (news_data_manager.py:71-86)
|
||||
- 한 번 저장된 뉴스는 재저장 안 됨
|
||||
|
||||
2. **문제: 새로운 뉴스 없음**
|
||||
- Google News가 같은 결과 반복 제공
|
||||
- 일반적 키워드일수록 ("AI", "기술") 변화 없음
|
||||
|
||||
### 3.2 Latest API 구조적 문제
|
||||
```python
|
||||
# news_endpoints.py:104-131
|
||||
@router.get("/latest")
|
||||
async def get_latest_news():
|
||||
# 새로운 수집 없이 DB 조회만!
|
||||
articles = news_manager.get_articles_by_status("collected", limit)
|
||||
return articles # 오래된 뉴스 반환
|
||||
```
|
||||
|
||||
### 3.3 환경변수 미설정
|
||||
- `NEWS_KEYWORDS=keyword1,keyword2` (의미 없는 더미값)
|
||||
- happybell80이 실제 키워드 설정 안 함
|
||||
- 사용자별 맞춤 키워드 없음
|
||||
|
||||
## 4. 키워드 처리 과정
|
||||
|
||||
### 4.1 키워드 로드 (google_news_collector.py:26-30)
|
||||
```python
|
||||
def __post_init__(self):
|
||||
if self.search_terms is None:
|
||||
keywords = os.getenv('NEWS_KEYWORDS', 'keyword1,keyword2')
|
||||
self.search_terms = [kw.strip() for kw in keywords.split(',')]
|
||||
```
|
||||
|
||||
### 4.2 검색 URL 생성 (google_news_collector.py:99-100)
|
||||
```python
|
||||
encoded_term = search_term.replace('"', '%22').replace(' ', '%20')
|
||||
url = f"{self.base_url}?q={encoded_term}%20when%3A{self.config.days_back}d&hl=ko&gl=KR"
|
||||
```
|
||||
|
||||
## 5. 데이터 저장 구조
|
||||
|
||||
### 5.1 ChromaDB 현황
|
||||
- 총 67개 뉴스 저장
|
||||
- 가장 오래된: 2025-08-12
|
||||
- 가장 최근: 2025-09-01
|
||||
- 중복 0개 (URL, 제목 모두 고유)
|
||||
|
||||
### 5.2 시간대별 분포
|
||||
- 08-12: 10개 (AI 관련)
|
||||
- 08-23: 5개 (AI 관련)
|
||||
- 08-24: 1개
|
||||
- 08-26: 5개 (삼성전자)
|
||||
- 08-27: 12개 (드라마, IT)
|
||||
- 08-28: 3개
|
||||
- 08-29: 5개
|
||||
- 08-30: 6개
|
||||
- 08-31: 2개
|
||||
- 09-01: 18개 (최신 기술, 오늘 날짜)
|
||||
|
||||
## 6. 테스트 결과
|
||||
|
||||
### 6.1 중복 테스트
|
||||
```bash
|
||||
# 첫 검색
|
||||
POST /api/news/search {"keywords": ["최신 기술 뉴스"]}
|
||||
→ 5개 수집 성공
|
||||
|
||||
# 재검색 (동일 키워드)
|
||||
POST /api/news/search {"keywords": ["최신 기술 뉴스"]}
|
||||
→ 0개 (중복 체크로 차단) ✓
|
||||
```
|
||||
|
||||
### 6.2 날짜별 테스트
|
||||
```bash
|
||||
# 오늘 날짜 검색
|
||||
POST /api/news/search {"keywords": ["2025년 9월 1일 뉴스"]}
|
||||
→ 3개 수집 성공
|
||||
|
||||
# 재검색
|
||||
POST /api/news/search {"keywords": ["2025년 9월 1일 뉴스"]}
|
||||
→ 0개 (이미 저장됨) ✓
|
||||
```
|
||||
|
||||
## 7. 개선 제안
|
||||
|
||||
### 7.1 긴급
|
||||
1. **환경변수 설정**
|
||||
```bash
|
||||
NEWS_KEYWORDS=AI,로봇,자율주행,반도체,스타트업
|
||||
```
|
||||
|
||||
2. **Latest API 개선**
|
||||
- 새로운 뉴스 수집 후 반환
|
||||
- 시간 기반 필터링 추가
|
||||
|
||||
### 7.2 중요
|
||||
1. **오래된 뉴스 삭제**
|
||||
- 7일 이상 된 뉴스 자동 삭제
|
||||
- 또는 시간별 우선순위 부여
|
||||
|
||||
2. **사용자별 키워드**
|
||||
- user_id별 선호 키워드 저장
|
||||
- 맞춤형 뉴스 제공
|
||||
|
||||
### 7.3 선택
|
||||
1. **다양한 뉴스 소스**
|
||||
- Google News 외 추가 소스
|
||||
- RSS 피드 통합
|
||||
|
||||
2. **캐싱 전략**
|
||||
- Redis 도입 검토
|
||||
- TTL 기반 캐시 관리
|
||||
|
||||
## 8. 결론
|
||||
|
||||
**핵심 문제**:
|
||||
1. `/latest`는 새 수집 없이 오래된 DB 조회만 수행
|
||||
2. 환경변수가 더미값 (`keyword1,keyword2`)
|
||||
3. 시간 기반 필터링/삭제 로직 없음
|
||||
|
||||
**중복은 정상 작동**하나, **새로운 뉴스를 가져오지 못하는 것**이 근본 원인.
|
||||
|
||||
---
|
||||
*이 문서는 rb8001과 skill_news 통합 과정에서 발견된 문제를 분석한 것입니다.*
|
||||
Loading…
x
Reference in New Issue
Block a user