From ac6d3d7800328fa4f8c135f448ee77530a73c944 Mon Sep 17 00:00:00 2001 From: Claude-51124 Date: Fri, 30 Jan 2026 10:21:55 +0900 Subject: [PATCH] =?UTF-8?q?docs:=20=EC=BB=B4=ED=8D=BC=EB=8B=88=EC=97=91?= =?UTF-8?q?=EC=8A=A4=20=EA=B0=9C=EC=9A=94=C2=B7LIPS=C2=B7=EC=98=A4?= =?UTF-8?q?=EB=8A=98=EC=A0=84=ED=86=B5,=20=EB=8F=99=EB=82=A8=EC=95=84=20?= =?UTF-8?q?=EB=B8=8C=EB=A6=AC=ED=95=91=20=EA=B3=84=ED=9A=8D=C2=B7=ED=8A=B8?= =?UTF-8?q?=EB=9F=AC=EB=B8=94=EC=8A=88=ED=8C=85=20=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Cursor --- .../560_컴퍼니엑스_개요.md | 23 +++++-- ...아_스타트업_뉴스_아침브리핑.md | 62 +++++++++++++------ .../260130_sea_headlines_implementation.md | 26 ++++++++ 3 files changed, 87 insertions(+), 24 deletions(-) create mode 100644 journey/troubleshooting/260130_sea_headlines_implementation.md diff --git a/book/500_business/560_컴퍼니엑스_개요.md b/book/500_business/560_컴퍼니엑스_개요.md index 1be58f6..bc3e8be 100644 --- a/book/500_business/560_컴퍼니엑스_개요.md +++ b/book/500_business/560_컴퍼니엑스_개요.md @@ -1,6 +1,7 @@ # 컴퍼니엑스(Company X) 개요 **작성일**: 2025-12-16 +**수정일**: 2026-01-30 (LIPS·오늘전통 최근 현황 보강) **관련 서비스**: `rb8001`, `skill-news`, `skill-slack`, `skill-rag-file` --- @@ -33,7 +34,7 @@ **투자 현황**: - **총 투자 대상**: 32건 (Seed 32건, Pre-A 2건) - **평균 투자 규모**: 약 8,501만 원 (4,000만 원 ~ 1억 4만 원) -- **주요 투자 분야**: 바이오/의료(9건), 제조(5건), 전자상거래(5건), 헬스케어(3건) +- **역할**: 특정 섹터 집중이 아니라 **스타트업의 시드·프리A 단계 투자·육성·펀딩**을 수행. (과거 건수 분포: 바이오/의료·제조·전자상거래·헬스케어 등 참고용) **운용 펀드**: - X-SIGONG IP 투자조합 제1호 (2020-09, 창업초기/중소벤처) @@ -46,14 +47,28 @@ - **X-GLOBAL PROGRAM**: 글로벌 진출 역량 강화 특화 프로그램 - **오늘전통**: 청년 초기창업지원 판로개척 프로그램 (옐로펀치 공동 운영) +### 2.2 LIPS·오늘전통 최근 현황 (2025–2026 기준) + +**LIPS (Licorn Incubator Program for Small brand)** +- 중소벤처기업부·소상공인시장진흥공단 사업. TIPS를 소상공인 영역에 적용한 기업가형 소상공인(라이콘) 육성 프로그램. +- **2025 LIPSⅡ**: 지원 300개사, 총 300억원. 민간운영사(민간투자사) 22개사 선정. 투자금 최대 3배 매칭, 최대 2억원 한도. +- **LIPSⅠ**: 민간투자연계형 매칭융자, 예산 400억원 규모. +- X-COURSE는 **LIPS 연계** 액셀러레이팅 프로그램으로 운영 중. + +**오늘전통 (전통문화 청년창업 육성지원)** +- 문화체육관광부 산하 **한국공예·디자인문화진흥원** 주관. 전통문화 분야 청년 초기창업 육성지원 사업 브랜드. +- 선정 기업에 **3년간 기업당 평균 1억원** 사업화 지원금, 액셀러레이팅·멘토링·투자유치 지원 제공. +- 컴퍼니엑스는 **옐로펀치와 공동**으로 오늘전통 프로그램(청년 초기창업지원·판로개척)을 운영. +- (예: 2023년 4기 12개사 선정 사례 있음. 최신 기수·선정 결과는 공예진흥원·옐로펀치 공고 참고.) + **조직 규모**: - 임직원 7명 (2025-11 기준) - B2G 공공조달계약 6건 **뉴스 선별 컨텍스트** (이 정보는 동남아 뉴스 등 수집·선별 시 참고용): -- 컴퍼니엑스는 **초기 스타트업 씨드투자·TIPS 선정 지원·후속 투자 유치**가 주 업무 -- **바이오/의료, 제조, 이커머스, 헬스케어** 분야에 집중 투자 -- 동남아 등 **해외 기회 탐색** 시, 위 분야 및 VC·액셀·펀딩·정책·인프라·M&A·진출 관련 뉴스가 도움 됨 +- 컴퍼니엑스는 **스타트업 시드·프리A 투자·육성·펀딩**이 주 업무이며, 특정 섹터 집중은 없음 +- **씨드·프리A·TIPS 선정 지원·후속 투자 유치** 관련 업무 수행 +- 동남아 등 **해외 기회 탐색** 시, VC·액셀·펀딩·정책·인프라·M&A·진출 관련 뉴스가 도움 됨 --- diff --git a/journey/plans/260129_동남아_스타트업_뉴스_아침브리핑.md b/journey/plans/260129_동남아_스타트업_뉴스_아침브리핑.md index 6f58699..3728aae 100644 --- a/journey/plans/260129_동남아_스타트업_뉴스_아침브리핑.md +++ b/journey/plans/260129_동남아_스타트업_뉴스_아침브리핑.md @@ -1,9 +1,11 @@ # 동남아 스타트업 뉴스 아침 브리핑 **작성일**: 2026-01-29 +**수정일**: 2026-01-30 (하이브리드 선별 보강, Phase 1~4 구현 완료) **작성자**: happybell80 **관련**: `rb8001`, `skill-news`, `daily_headlines`, `560_컴퍼니엑스_개요.md` -**이전 아이디어**: `journey/ideas/260125_동남아_스타트업_뉴스.md` +**이전 아이디어**: `journey/ideas/260125_동남아_스타트업_뉴스.md` +**구현 상세**: → troubleshooting/260130_sea_headlines_implementation.md --- @@ -54,24 +56,39 @@ SEA_NEWS_DAYS_BACK=1 **데이터 모델**: `news_models.py:6-26` `NewsArticle` 재사용 -### 3.2 선별 (skill-news) +### 3.2 선별 (skill-news) — 하이브리드: 1차 키워드 → 2차 LLM 적합도 -**신규 파일**: `skill_news/app/services/sea_news_filter.py` +**신규 파일**: `skill_news/app/services/sea_news_filter.py` (1차 키워드 + 2차 LLM 호출), 필요 시 `sea_news_ranker.py` (LLM 전용, 311 원칙 한 파일 500줄 이하) -**필터링 로직**: -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.2.1 1차: 키워드 필터 + +- **키워드 매칭**: 제목/본문에 기회·분야 키워드 **1개 이상 포함** 시 통과 + - 기회 키워드: `funding`, `investment`, `VC`, `accelerator`, `Series A/B`, `M&A`, `expansion`, `policy` + - 분야 키워드: `biotech`, `healthcare`, `medical`, `manufacturing`, `e-commerce` +- **본문 검증**: `companyx_news_collector.py:396-413` `_remove_duplicates` 패턴 참고. 제목/본문 문자열에 키워드 리스트 `in` 검사. +- **후보 수**: 통과한 기사 중 **최대 10건** (다음 단계 LLM 입력). 10건 미만이면 전부 전달. + +#### 3.2.2 2차: LLM 적합도 선정 + +- **입력**: 1차 통과 후보(최대 10건)의 제목·URL(또는 제목만). **컴액 컨텍스트** 문단(아래 참조)을 프롬프트에 포함. +- **컴액 컨텍스트**: `DOCS/book/500_business/560_컴퍼니엑스_개요.md` 2.1·2.2·뉴스 선별 컨텍스트 절 요약. + - skill_news는 DOCS를 직접 읽지 않음. **배포 시** `skill_news/app/data/companyx_context.txt` 또는 환경변수 `SEA_COMPANYX_CONTEXT`로 동기화(311: 민감 정보 하드코딩 금지, 설정은 .env/파일). + - 요약 핵심: 시드·프리A 투자·육성·펀딩, TIPS·LIPS·오늘전통, 해외 기회 탐색 시 VC·액셀·펀딩·M&A·진출 뉴스가 도움 됨. +- **LLM 요구 응답**: 각 기사에 대해 **적합도 0~100**과 **한 줄 이유**. 응답은 JSON 배열 예: `[{"index":0,"score":85,"reason":"..."}, ...]` +- **선정**: 점수 내림차순 정렬 후 **상위 3건** 선택. 동점 시 입력 순서 유지. +- **폴백**: LLM 실패·타임아웃 시 1차 키워드 통과 건을 **매칭 키워드 개수** 기준 정렬해 상위 3건 사용 (graceful degradation). + +#### 3.2.3 데이터·설정 원칙 + +- **컴액 컨텍스트**: 코드에 문단 하드코딩 금지. `companyx_context.txt` 또는 `SEA_COMPANYX_CONTEXT`에서 로드. +- **키워드 리스트**: 환경변수 `SEA_NEWS_OPPORTUNITY_KEYWORDS`(기회), `SEA_NEWS_FIELD_KEYWORDS`(분야) 권장. 기본값은 계획서 키워드. ### 3.3 제목 번역 (LLM) -**구현 위치**: `skill_news/app/services/sea_news_filter.py` +**구현 위치**: `skill_news/app/services/sea_news_filter.py` (또는 `sea_news_ranker.py`에서 2차 호출 후 `sea_news_service.py`에서 번역) **LLM 호출**: Gemini API 사용 (311 원칙: LLM 우선 접근) +- **입력**: 2차 적합도 선정으로 확정된 **3건**의 제목만. - 프롬프트: "Translate the following news title to Korean. Return only the translated title without explanation: {title}" - 3건 배치 처리 (단일 호출로 통합, 311 원칙 섹션 14) @@ -108,9 +125,9 @@ SEA_NEWS_DAYS_BACK=1 | Phase | 필요 작업 | |-------|-----------| | **Phase 1** | **skill-news**: `sea_news_collector.py` 신규 생성. `google_news_collector.py:55-91` 패턴 복사, 키워드·지역(`hl=en&gl=SG`) 변경. `.env`에 `SEA_NEWS_*` 추가. | -| **Phase 2** | **skill-news**: `sea_news_filter.py` + `sea_news_service.py` 신규 생성. 기회 키워드 매칭 + 본문 검증 + LLM 번역(Gemini, 3건 배치) + Slack 포맷. | -| **Phase 3** | **skill-news**: `news_endpoints.py`에 `POST /api/news/sea/headlines` 추가. | -| **Phase 4** | **rb8001**: `skill_commands.py`에 `fetch_sea_headlines()` 추가. `startup_news_skill.py` `run_headlines_job()`에서 동남아 섹션 삽입 로직 추가. | +| **Phase 2** | **skill-news**: `sea_news_filter.py`(1차 키워드 + 2차 LLM 적합도) + `sea_news_service.py` 신규 생성. 1차: 키워드 매칭·본문 검증 → 후보 최대 10건. 2차: 컴액 컨텍스트 + Gemini로 적합도 0~100·이유 JSON → 상위 3건. 폴백: LLM 실패 시 키워드 개수 기준 상위 3건. `app/data/companyx_context.txt` 또는 `SEA_COMPANYX_CONTEXT` 로드. 3건 확정 후 LLM 제목 번역(Gemini) + Slack 포맷. | +| **Phase 3** | **skill-news**: `news_endpoints.py`에 `POST /api/news/sea/headlines` 추가. 요청 body: `{}` 또는 `{"format":"json"}` (naver/startup-headlines와 동일). | +| **Phase 4** | **rb8001**: `skill_commands.py`에 `fetch_sea_headlines()` 추가. `startup_news_skill.py` `run_headlines_job()`에서 동남아 뉴스 호출 + 섹션 삽입 (명언 앞). | | **Phase 5** | **배포**: skill-news 먼저 배포 (`git push`) → rb8001 배포 (`git push`). 순서 중요 (의존성). | --- @@ -123,7 +140,9 @@ SEA_NEWS_DAYS_BACK=1 | 테스트 | 파일 | 내용 | |--------|------|------| | 수집 단위 테스트 | `skill_news/tests/test_sea_news_collector.py` | 키워드 검색, 24시간 필터, NewsArticle 반환 확인 | -| 선별 단위 테스트 | `skill_news/tests/test_sea_news_filter.py` | 기회 키워드 매칭, 본문 검증, LLM 번역 모킹 | +| 1차 키워드 필터 단위 | `skill_news/tests/test_sea_news_filter.py` | 기회·분야 키워드 1개 이상 포함 시 통과, 후보 최대 10건 | +| 2차 LLM 적합도 단위 | `skill_news/tests/test_sea_news_filter.py` 또는 `test_sea_news_ranker.py` | Gemini 모킹, 적합도 JSON 파싱, 상위 3건 반환 확인. 폴백: LLM 실패 시 키워드 개수 기준 3건 | +| 제목 번역 단위 | `skill_news/tests/test_sea_news_filter.py` | 3건 제목 LLM 번역 모킹 | | 포맷 단위 테스트 | `skill_news/tests/test_sea_news_service.py` | `01. ` 형식 확인 | | API 통합 테스트 | `skill_news/tests/test_sea_news_endpoint.py` | `POST /api/news/sea/headlines` 응답 확인 | | 연동 E2E 테스트 | `rb8001/tests/e2e/test_sea_news_headlines.py` | 깡프로 + 동남아 섹션 통합 Slack 메시지 확인 | @@ -134,8 +153,9 @@ SEA_NEWS_DAYS_BACK=1 **conftest.py fixtures**: - `mock_playwright`: Playwright 모킹 -- `mock_gemini`: Gemini API 모킹 -- `sample_sea_articles`: 테스트용 NewsArticle 3건 +- `mock_gemini`: Gemini API 모킹 (적합도 JSON 응답, 제목 번역 응답) +- `sample_sea_articles`: 테스트용 NewsArticle 5~10건 (1차 후보) +- `sample_companyx_context`: 컴액 컨텍스트 요약 문자열 (560 기반) --- @@ -147,7 +167,9 @@ SEA_NEWS_DAYS_BACK=1 |------|----------|------------| | 수집 시작 | INFO | `동남아 뉴스 수집 시작: keywords={keywords}` | | 수집 완료 | INFO | `동남아 뉴스 수집 완료: {count}개` | -| 선별 과정 | DEBUG | `기회 키워드 매칭: {title} → score={score}` | +| 1차 키워드 통과 | DEBUG | `기회 키워드 매칭: {title} → 통과, 후보 {n}건` | +| 2차 LLM 적합도 | INFO | `LLM 적합도 선정 완료: 상위 3건 (scores=...)` | +| 2차 폴백 | WARNING | `LLM 적합도 실패, 키워드 개수 기준 상위 3건 사용` | | 번역 | INFO | `제목 번역 완료: {count}건` | | 실패 | WARNING | `동남아 뉴스 수집 실패 (생략): {error}` | @@ -177,4 +199,4 @@ SEA_NEWS_DAYS_BACK=1 | `rb8001/app/commands/skill_commands.py:223-250` | `fetch_naver_headlines()` 패턴 | | `rb8001/app/services/skills/startup_news_skill.py:11-93` | run_headlines_job 구조 | | `rb8001/app/services/skills/startup_news_skill.py:67-76` | 섹션 삽입 로직 (명언 앞) | -| `DOCS/book/500_business/560_컴퍼니엑스_개요.md` | 컴퍼니엑스 투자 분야 | +| `DOCS/book/500_business/560_컴퍼니엑스_개요.md` | 컴퍼니엑스 컨텍스트(2.1·2.2·뉴스 선별). 2차 LLM 적합도 프롬프트용 요약문 동기화 원본. | diff --git a/journey/troubleshooting/260130_sea_headlines_implementation.md b/journey/troubleshooting/260130_sea_headlines_implementation.md new file mode 100644 index 0000000..071be76 --- /dev/null +++ b/journey/troubleshooting/260130_sea_headlines_implementation.md @@ -0,0 +1,26 @@ +# 동남아 스타트업 뉴스 아침 브리핑 구현 + +**날짜**: 2026-01-30 +**작성자**: happybell80 +**관련 파일**: +- `skill_news/app/services/sea_news_collector.py` +- `skill_news/app/services/sea_news_filter.py` +- `skill_news/app/services/sea_news_service.py` +- `skill_news/app/api/news_endpoints.py` (POST /api/news/sea/headlines) +- `rb8001/app/commands/skill_commands.py` (fetch_sea_headlines) +- `rb8001/app/services/skills/startup_news_skill.py` (동남아 섹션 삽입) + +--- + +## 구현 내용 + +- **Phase 1**: `sea_news_collector.py` — Google News 검색, hl=en&gl=SG, 24시간 필터, NewsArticle 반환. TDD: test_sea_news_collector.py 5건 통과. +- **Phase 2**: `sea_news_filter.py` — 1차 키워드 필터(후보 최대 10건), 2차 LLM 적합도(Gemini), 폴백(키워드 개수), 제목 번역(Gemini). `sea_news_service.py` — format_sea_news_for_slack, load_companyx_context. TDD: test_sea_news_filter.py 5건, test_sea_news_service.py 2건 통과. +- **Phase 3**: POST /api/news/sea/headlines 추가. 요청 body `{}` 또는 `{"format":"json"}`. TDD: test_sea_news_endpoint.py 1건 통과. +- **Phase 4**: rb8001 `fetch_sea_headlines()`, `run_headlines_job()`에서 동남아 섹션 삽입(깡프로 헤드라인 끝 → *동남아 소식* → 01~03). 실패 시 생략(graceful degradation). + +## 교훈 + +- TDD: 테스트 먼저 작성 후 구현으로 Phase 1~3 안정적으로 진행. +- 로컬 테스트 시 LOG_FILE_PATH, ChromaDB/NewsDataManager 초기화 회피를 위해 conftest·패치로 처리. +- 동남아 컨텍스트는 SEA_COMPANYX_CONTEXT 또는 app/data/companyx_context.txt 사용(하드코딩 금지).