docs: 깡프로 뉴스 용어 추출 기능 추가 설계 문서
This commit is contained in:
parent
14d92cbbf8
commit
4d6434817d
122
troubleshooting/250114_happybell80_깡프로뉴스_용어추출_기능추가.md
Normal file
122
troubleshooting/250114_happybell80_깡프로뉴스_용어추출_기능추가.md
Normal file
@ -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에서 처리하는 것이 바람직
|
||||||
Loading…
x
Reference in New Issue
Block a user