diff --git a/troubleshooting/250114_happybell80_깡프로뉴스_용어추출_기능추가.md b/troubleshooting/250114_happybell80_깡프로뉴스_용어추출_기능추가.md new file mode 100644 index 0000000..a27bd04 --- /dev/null +++ b/troubleshooting/250114_happybell80_깡프로뉴스_용어추출_기능추가.md @@ -0,0 +1,122 @@ +# 깡프로 뉴스 용어 추출 기능 추가 (2025-01-14) + +## 요구사항 +매일 9시 10분 깡프로 뉴스(네이버 스타트업 헤드라인)에 "오늘 알아둘 용어" 섹션 추가 + +### 목표 구조 +``` +오프닝 메시지 +↓ +출처 링크 +↓ +헤드라인 목록 (01-50번) +↓ +오늘 알아둘 용어 (NEW) +↓ +로빙에게 물어보기 CTA (NEW) +↓ +클로징 메시지 +↓ +명언 +``` + +## 현재 상태 분석 + +### 1. 헤드라인 처리 흐름 +- **스케줄 등록**: rb8001 `main.py:206` - 매일 09:10 실행 +- **실행 함수**: `_run_headlines_job(channel_id)` at `main.py:394` +- **수집 경로**: + - rb8001 → skill-news POST `/api/news/naver/startup-headlines` + - skill-news가 Slack 포맷 텍스트 반환 (`format=slack`) + - rb8001이 받은 텍스트 그대로 Slack 전송 + +### 2. 문제점 +- rb8001은 skill-news가 준 포맷 그대로 전송만 함 +- 헤드라인 아이템 목록(`items[]`)을 rb8001이 직접 접근 불가 +- 용어 추출을 위한 LLM 호출 로직 없음 + +## 구현 방안 + +### 방안 1: rb8001에서 처리 (선택) +```python +# main.py:_run_headlines_job() 수정 +async def _run_headlines_job(channel_id: str): + # 1. JSON 포맷으로 헤드라인 수집 + result = await sc.fetch_naver_headlines(fmt="json") # slack → json + items = result.get("items", []) + + # 2. 용어 추출 (환경변수 체크) + extract_terms = os.getenv("HEADLINES_EXTRACT_TERMS", "true").lower() == "true" + if extract_terms and items: + # 헤드라인 제목들 추출 + titles = [item["title"] for item in items] + + # LLM으로 용어 추출 + terms_prompt = f""" + 다음 스타트업 뉴스 헤드라인에서 비즈니스맨이 알아둬야 할 핵심 용어 {os.getenv("HEADLINES_TERMS_COUNT", "5")}개를 추출해줘. + 전문용어, 신조어, 트렌드 키워드 위주로. + + 헤드라인: + {chr(10).join(titles[:20])} # 상위 20개만 + + 응답 형식: 용어1, 용어2, 용어3 + """ + + llm_result = await router._call_internal_llm( + message=terms_prompt, + user_id="system", + task_type="extract", + context={}, + channel="internal" + ) + + terms = llm_result.get("content", "").strip() + + # 3. skill-news에서 slack 포맷 가져오기 + slack_result = await sc.fetch_naver_headlines(fmt="slack") + text = slack_result.get("text", "") + + # 4. 용어 섹션 삽입 (클로징 전에) + if extract_terms and terms: + lines = text.split("\n") + # 클로징 찾기 (빈 줄 2개 다음) + insert_idx = -1 + for i in range(len(lines)-2, 0, -1): + if lines[i] == "" and lines[i-1] == "": + insert_idx = i + break + + if insert_idx > 0: + terms_section = [ + "", + f"*오늘 알아둘 용어*: {terms}", + "", + "궁금한 용어가 있으신가요? *로빙에게 물어보세요!*", + "" + ] + lines[insert_idx:insert_idx] = terms_section + text = "\n".join(lines) + + # 5. Slack 전송 + client.chat_postMessage(channel=channel_id, text=text) +``` + +### 환경변수 추가 +```bash +# rb8001/.env +HEADLINES_EXTRACT_TERMS=true # 용어 추출 기능 활성화 +HEADLINES_TERMS_COUNT=5 # 추출할 용어 개수 +HEADLINES_TERMS_SAMPLE_SIZE=20 # 분석할 헤드라인 개수 +``` + +## 구현 체크리스트 +- [ ] `_run_headlines_job()` 함수 수정 +- [ ] JSON 포맷 먼저 받아 items 확보 +- [ ] LLM 호출로 용어 추출 +- [ ] Slack 텍스트에 용어 섹션 삽입 +- [ ] 환경변수 추가 및 테스트 + +## 교훈 +- skill-news의 slack 포맷은 완성된 텍스트라 수정 어려움 +- rb8001에서 JSON 받아 자체 포맷팅이 더 유연함 +- 향후 모든 포맷팅은 rb8001에서 처리하는 것이 바람직 \ No newline at end of file