DOCS/troubleshooting/250914_happybell80_깡프로뉴스_용어추출_기능추가.md

4.2 KiB

깡프로 뉴스 용어 추출 기능 추가 (2025-09-14)

요구사항

매일 9시 10분 깡프로 뉴스(네이버 스타트업 헤드라인)에 "오늘 알아둘 용어" 섹션 추가

목표 구조

오프닝 메시지
↓
출처 링크
↓
헤드라인 목록 (01-50번)
↓
오늘 알아둘 용어 (NEW)
↓
로빙에게 물어보기 CTA (NEW)
↓
클로징 메시지
↓
명언

현재 상태 분석

1. 헤드라인 처리 흐름 (파일 경로)

  1. rb8001/main.py:206 - APScheduler 스케줄 등록
  2. rb8001/main.py:394 - _run_headlines_job() 실행
  3. rb8001/app/commands/skill_commands.py:220 - fetch_naver_headlines() 호출
  4. skill_news/app/api/news_endpoints.py:46 - POST /naver/startup-headlines
  5. skill_news/app/services/naver_startup_news_service.py:360 - fetch_headlines()
  6. skill_news/app/services/naver_startup_news_service.py:300 - format_startup_news_for_slack()
  7. skill_news/app/data/slack_messages.md - 템플릿 로드
  8. rb8001/main.py:427 - WebClient.chat_postMessage() 전송

2. 문제점 (구조적)

  • main.py 과부하: 스케줄/실행/전송 모두 담당 (732줄)
  • 역할 혼재: skill-news가 데이터 수집+Slack 포맷팅까지 담당
  • 응집도 낮음: 하나의 기능이 8개 파일에 분산
  • 왕복 낭비: rb8001→skill-news(포맷)→rb8001(전송)
  • 용어 추출 불가: 완성된 텍스트라 중간 삽입 어려움

구현 방안

방안 1: rb8001에서 처리 (선택)

# 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)

환경변수 추가

# 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에서 처리하는 것이 바람직