virtual-insanity
← 리포트 목록

아침 브리핑 품질 개선 — 로그 제거·모델 상향·프롬프트 축소

2026-04-15 fix [morning-briefing, telegram, hermes, quality-fix]

결론

해리 피드백 3가지를 모두 반영했다.

  • Telegram 본문에 섞이던 실행 로그 제거 완료.
  • ollama/qwen2.5:3b 기본 사용을 중단하고 openai-codex/gpt-5.4 → github-copilot/gpt-4o-mini 순서로 상향했다.
  • LLM이 실패해도 이상한 3B 출력 대신 짧은 한국어 deterministic fallback을 보내게 했다.
  • 프롬프트는 2,500자 이내·한국어 전용·6개 섹션으로 단순화했다.
  • launchd kickstart로 1회 라이브 재발송 성공: message_id=2353.

확인한 기존 문제

1. 실행 로그가 본문에 섞임

근거 파일: /private/tmp/claude-501/.../bt3dup5gb.output

[2026-04-15 16:55:56] === 모닝 브리핑 시작: 2026-04-15 (수) ===
[2026-04-15 16:55:56] 데이터 수집 시작: 2026-04-15
[2026-04-15 16:55:56] 수집 완료: {"indicators_count": 87, "anomalies_count": 32, "hypotheses_count": 6, "experiments_count": 0, "ideas_count": 20, "sector_news_count": 0}
[2026-04-15 16:55:56] LLM 호출: 프롬프트 10758자
[2026-04-15 16:58:03] 브리핑 생성 완료: 7893자 (모델: ollama/qwen2.5:3b)

원인: - shared.log.make_logger()가 stdout에 로그를 찍음. - morning_briefing.py --dry-run도 stdout에 본문을 찍음. - telegram_briefing_wrapper.py가 stdout 전체를 <pre>로 감싸서 발송함.

2. 모델이 작음

기존 로그:

[2026-04-15 16:58:03] 브리핑 생성 완료: 7893자 (모델: ollama/qwen2.5:3b)

문제: - openai-codex/gpt-5.4가 Codex token refresh 401로 실패. - OpenRouter key 없음. - ollama/qwen2.5:3b가 성공하면서 낮은 품질 출력이 그대로 채택됨.

3. 섹션 반복·영어/번역투

기존 출력 일부:

#### 네이버 시스템

---

**1. 주요 경제 동향 및 활성 가설 분석**

- **주요 경제 동향**: 
  - WTI 원유 가격이 한 달간 -7.3% 급락하며, 지정학적 위험(GPR 304)과 디센트크랙(-12.5%) 및 히팅오일(-9.3%)의 동반 붕괴로 인해 원유 가격 하락이 주요 요인으로 분석된다.
  - 반도체 산업에서, SOX 지수는 한 달간 +18% 상승하며, z-score가 2.28로 과열 상태를 보이고 있다.

- **활성 가설 분석**:
  - [S50_에너지] 교차 연결: 에너지 전환과 관련 인프라 투자 수혜에 대한 재해석 가능성이 제기된다.
  - [S10_반도체기술] Lumotive의 Optical breakthrough가 AI반도체 수요 지속성 vs 피크아웃 리스크 판단과 연결될 수 있다.
  - [S30_산업재방산] 이란 전쟁 충돌로 IEA가 4억 배럴 유량 방출이 발생할 경우, 미국 약세와 함께 한국의 방산 산업에 긍정적인 영향을 미칠 수 있다.
  - [S60_금융] 금리 인상과 보유세 상승이 동시에 가속화될 경우, 은행 주택담보대출 수익 증가 예측과 반대되는 경로를 형성할 것.

- **최근 발견**:
  - IBM 메인프레임 시대의 중앙집중형 전산 구조에서 분산·수평적 아키텍처로의 전환에 따른 확장성 향상 및 단일장애점(SPOF) 감소.
  - Netflix의 binge drop 기능으로 TV 시청 경험을 개선하는 등 디테일한 사용자 경험 제공이 중요해진 추세.

- **실험 판정**:
  - 최근 7일 동안의 활성 가설은 아직 확인되지 않았다.

---

**2. 다음 주 경제 캘린더**

- **17일 한국은행 기준금리 결정**: 한국은행이 발표하는 기준 금리를 통해 국내 금융 시장의 움직임을 예측할 수 있다.
- **17일 ECB 금리 결정**: 유럽중앙 bank(ECB)의 금리 결정도 주요 경제 동향 중 하나이며, 이는 글로벌 금융 시장에 큰 영향을 미칠 수 있다.

---

**3. 결론**

주요 경제 동향은 원유 가격 하락과 반도체 산업의 성장세를 중심으로 진행되고 있으며, 이를 바탕으로 활성 가설들이 제기되었다. 다음 주에는 한국은행 기준금리 결정이 예정되어 있으므로 이에 대한 주시가 필요하다.

---

**4. 참고 자료**

- [S50_에너지] 교차 연결: 재해석 가능
- [S10_반도체기술] Lumotive의 Optical breakthrough: 추가 검증 필요
- [S30_산업재방산] 이란 전쟁 충돌 유량 방출 시기: 긍정적 영향 가능성
- [S60_금융] 금리 인상과 보유세 상승 동시 가속화: 은행 주택담보대출 수익 예측 반대

---

**5. 활성 가설 검토**

- **[S50_에너지]** 에너지 전환 관련 중소형 기업의 자금 조달 비용 하락 가능성
- **[S10_반도체기술]** AI반도체 수요 피크아웃 경계에서 미래에셋 윤재홍 ETF의 편입 비중 변화 가능성
- **[S30_산업재방산]** 이란 전쟁 충돌 유량 방출 시기: 한국 방산 산업에 긍정적 영향 가능성
- **[S60_금융]** 은행 주택담보대출 수익 증가 예측과 반대의 경로 형성 가능

---

**6. 활성 가설 검토 방법**

- [S50_에너지] 에너지 전환 관련 중소형 기업들의 자금 조달 비용 하락 가능성: 실제 투자 프로젝트와 유관 기업들의 움직임을 모니터링하여 확인할 수 있다.
- [S10_반도체기술] AI반도체 수요 피크아웃 경계에서 미래에셋 윤재홍 ETF의 편입 비중 변화 가능성: ETF의 구성과 주식 시장 움직임을 통해 추적할 수 있다.
- [S30_산업재방산] 이란 전쟁 충돌 유량 방출 시기: IEA와 관련

문제: - “네이버 시스템” 같은 무의미 헤더. - 활성 가설이 5/6/7번 섹션에 반복. - 영어 원문 제목과 어색한 번역체가 섞임.

수정 내역

morning_briefing.py

파일: /Users/ron/.hermes/workspace/scripts/pipeline/morning_briefing.py

핵심 변경: - contextlib.redirect_stdout(sys.stderr)로 생성 중 로그를 stderr로 분리. - stdout에는 최종 브리핑 본문만 출력. - 기본 모델 체인을 아래로 변경: - openai-codex/gpt-5.4 - github-copilot/gpt-4o-mini - 작은 로컬 qwen2.5:3b는 기본 체인에서 제외. - 환경변수로 모델 체인 조정 가능: - MORNING_BRIEFING_MODEL_CHAIN - MORNING_BRIEFING_MAX_TOKENS - MORNING_BRIEFING_TEMPERATURE - 프롬프트를 “한국어 전용 / 2,500자 이내 / 6개 섹션 / 반복 금지”로 재작성. - LLM 실패 시 generate_compact_korean_briefing()으로 짧고 안정적인 한국어 브리핑 생성. - _postprocess_briefing_text()로 로그 패턴, 무의미 헤더, 중복 섹션, 긴 영문 토큰 제거.

주요 함수 위치:

64:  _morning_model_chain()
725: build_llm_messages()
903: generate_compact_korean_briefing()
1115: _postprocess_briefing_text()

telegram_briefing_wrapper.py

파일: /Users/ron/.hermes/workspace/scripts/pipeline/telegram_briefing_wrapper.py

핵심 변경: - wrapper에서 로그 라인 필터링 추가. - <pre> 전체 감싸기 제거. 일반 Telegram 텍스트로 읽히게 변경. - 유동성/채권/일정 중복 header 제거. morning_briefing.py 본문 중심으로 발송. - LLM 실패는 fallback으로 처리되므로 해리 메시지에는 내부 실패 로그를 노출하지 않음. - weekly 시장 조회 실패 문구도 영어 티커 나열 대신 한국어 문장으로 축약.

주요 함수 위치:

152: _clean_briefing_body()
170: _stderr_signal()
188: build_morning_message()
219: _weekly_market_lines()

검증

구문/런트 검증

python3 -m py_compile morning_briefing.py                 OK
python3 -m py_compile telegram_briefing_wrapper.py        OK
bash -n morning_briefing_wrapper.sh                       OK
bash -n weekly_briefing_wrapper.sh                        OK
plutil -lint morning-briefing-telegram.plist              OK
plutil -lint weekly-briefing-telegram.plist               OK

dry-run 품질 체크

자동 체크:

no_timestamp_logs=True
no_pre_block=True
no_qwen=True
no_duplicate_hypothesis_header=True
has_korean_sections=True

샘플 첫 20줄:

<b>🌅 아침 투자 브리핑</b>
<i>2026-04-15 17:15 KST / LLM</i>

# 🌅 아침 투자 브리핑 — 2026-04-15 (수)

## 1. 오늘 한 줄
- 유가 하락과 금 강세가 동시에 보이는 만큼, 성장주 반등보다 매크로 위험 신호를 먼저 확인해야 합니다.

## 2. 시장 온도
- 미국 대형주 6951.24 (+0.9%)
- 나스닥 23558.09 (+1.6%)
- 변동성지수 18.46 (-3.5%)
- 미국 10년금리 4.26 (-0.9%)
- 달러지수 98.14 (-0.2%)
- 원달러 1471.88 (-0.7%)
- 서부텍사스유 91.87 (-7.3%)
- 금 4857.9 (+2.4%)
- 이상치: 변동성지수 공포지수 19.12→18.46 (-3.45%) 급락 / 달러인덱스 통계값=-2.11, 20일 이동평균(99.47) 대비 하락 이탈 / 통계값=2.51, 20일 이동평균(1.16) 대비 상승 이탈

## 3. 유동성·매크로
- 국면: 유동성 축소 — 흡수 국면 순유동성 $+5.95T 전주 $-0.1B 연준자산 $+6.69T 전주 $0.0B 역레포 $+0.3B 전주 $+0.1B 재무부계정 $+0.75T 전주 $0.0B 지급준비금 $+3.12T 전주 $0.0B 재무부계정 증가 또는 연준 자산 감소로 시장에서 자금이 회수되고 있음. → 단기 위험자산 비중 축소. 연준 정책 전환 시점 주시
- 매크로는 회복 국면(확신도 57%), 포지셔닝은 적극. 에너지 복합체 전면 급락이 핵심 변화. 지정학위험 304 극단에도 시장은 수요 약화 반영. 산업금속(구리 통계값=2.41, 벌크운임 통계값=2.46) 강세 지속으로 에너지 대비 비에너지 이분화 구조 심화. 달러 약세 가속(달러지수 통계값=-2.11)은 글로벌 유동성 완화 방향

## 4. 해리 체크포인트

LLM 라우팅 검증

라이브 kickstart 당시 LLM 로그:

[
  {
    "ts": "2026-04-15T17:16:10.717362+09:00",
    "model": "openai-codex/gpt-5.4",
    "caller": "llm_chat_direct",
    "error": "HTTP Error 500: Internal Server Error | {\"error\": {\"message\": \"Internal server error: Codex token refresh failed with status 401.\", \"type\": \"server_error\", \"param\": null, \"code\": null}}",
    "latency_ms": 345,
    "response_chars": 0
  },
  {
    "ts": "2026-04-15T17:16:19.031854+09:00",
    "model": "github-copilot/gpt-4o-mini",
    "caller": "llm_chat_direct",
    "error": null,
    "latency_ms": 8313,
    "response_chars": 608
  }
]

해석: - Codex gpt-5.4는 현재 gateway token refresh 401로 실패. - 그 다음 github-copilot/gpt-4o-mini가 성공. - 더 이상 ollama/qwen2.5:3b로 떨어지지 않는다.

라이브 발송 결과

명령:

launchctl kickstart -k gui/501/com.openclaw.morning-briefing-telegram

결과 로그:

[briefing_wrapper] kind=morning chars=2925 meta={"morning_briefing_ok": true, "stderr_tail": ""}
[SECTOR_TRACE] send_sector(report) caller=telegram_briefing_wrapper.py text='<b>🌅 아침 투자 브리핑 · Telegram</b>\n<i>2026-04-15 16:49 KST / source=morning_briefing.'
[briefing_wrapper] send_result={"ok": true, "message_ids": [2352], "error": null, "chat_id": -1003522748967, "topic_id": 8, "transport": "telegram_api"}
[briefing_wrapper] kind=morning chars=665 meta={"morning_briefing_ok": true, "stderr_signal": ""}
[SECTOR_TRACE] send_sector(report) caller=telegram_briefing_wrapper.py text='<b>🌅 아침 투자 브리핑</b>\n<i>2026-04-15 17:16 KST / LLM</i>\n\n# 🌅 아침 투자 브리핑 — 2026-04-15'
[briefing_wrapper] send_result={"ok": true, "message_ids": [2353], "error": null, "chat_id": -1003522748967, "topic_id": 8, "transport": "telegram_api"}

결과: - 재실행 성공 - message_id=2353 - topic_id=8 report 토픽 - last exit code=0

weekly 점검

weekly wrapper도 같은 Telegram wrapper 파일을 통과하므로 함께 점검했다.

수정: - 시세 조회 실패 시 S&P500/NASDAQ/DOW 영어 에러를 그대로 노출하지 않음. - 한국어 문장으로 축약: “시장: 현재 실행 환경에서 시세 조회 실패 — 다음 정기 실행에서 재시도”

샘플:

[briefing_wrapper] kind=weekly chars=360 meta={"done": 18, "queued": 5, "avg_kpi": "N/A", "discoveries": 0}
<b>📅 주간 운영·시장 리포트 · Telegram</b>
<i>2026-04-08 ~ 2026-04-15 / source=weekly-telegram-wrapper</i>

<b>운영</b>
완료 작업 18건 / 현재 대기 5건 / 에이전트 평균 KPI N/A점

<b>시장</b>
시장: 현재 실행 환경에서 시세 조회 실패 — 다음 정기 실행에서 재시도

<b>파이프라인 발견</b>
이번 주 발견 0건

<b>유동성</b>
연준 순유동성 $+5.95T (전주 $-0.1B) / 국면: 유동성 축소 — 흡수 국면 / 단기 위험자산 비중 축소. 연준 정책 전환 시점 주시.

<b>최근 일간 리포트</b>
일간 리포트: 데일리 마켓 인텔리전스

남은 리스크

  • openai-codex/gpt-5.4는 여전히 Hermes gateway token refresh 401로 실패한다. 현재는 github-copilot/gpt-4o-mini가 성공해 품질을 보완한다.
  • Codex sandbox 내부에서는 외부 DNS가 막혀 LLM/Telegram 직접 호출이 실패하지만, launchd 환경에서는 실제 발송 성공을 확인했다.
  • 실제 Telegram 메시지 전문은 Bot API로 사후 조회할 수 없어, 보고서에는 dry-run 샘플과 launchd 발송 로그/message_id를 함께 기록했다.

자체평가

  • 정확성: 4.7/5 — 해리 지적 3개 원인 모두 제거/완화. 라이브 message_id 확인.
  • 완성도: 4.6/5 — fallback까지 안정화. 단, gpt-5.4 token refresh 문제는 별도 인증 이슈.
  • 검증: 4.6/5 — py_compile, bash -n, plutil, dry-run, launchd kickstart, message_id 확인 완료.
  • 최소 변경: 4.5/5 — TTS/plist는 유지, 품질 문제 파일 2개만 수정.

종합: 4.6/5