llm_decision_logs 미적재 문의
1
5 asked
■ 1. 통합 파이프라인 → POST /pipeline/run-buy-pipeline 을 실행 시 아래와 같이 LLM 호출 전체 실패가 뜹니다.
{
"message": "통합 파이프라인 완료 - BUY 0개 / HOLD 1개",
"steps": {
"1_technical_analysis": {
"message": "25개의 추천 데이터가 생성되었습니다",
"count": 25,
"elapsed_sec": 60.9
},
"1.5_earnings_calendar": {
"message": "저장할 실적 일정이 없습니다",
"count": 0
},
"2_sentiment_analysis": {
"message": "10개의 티커(추천 주식: 10개, 보유 주식: 0개)를 분석했습니다",
"count": 10,
"elapsed_sec": 97.8
},
"3_candidate_extraction": {
"message": "1개의 매수 추천 주식을 찾았습니다 (v2 (z-score))",
"count": 1,
"elapsed_sec": 1
},
"4_llm_review": {
"buy_count": 0,
"hold_count": 1,
"elapsed_sec": 51.3
}
},
"candidates_before_llm": 1,
"candidates_after_llm": 0,
"held": 1,
"results": [],
"held_results": [
{
"ticker": "ADBE",
"stock_name": "어도비",
"accuracy": 87.6874,
"rise_probability": 10.1176571624871,
"last_price": 266.510009765625,
"predicted_price": 293.474578857422,
"recommendation": "STRONG BUY",
"analysis": "어도비 is expected to rise by about 10.12%. Consider buying or holding.",
"sentiment_score": 0.0197778333333333,
"article_count": 6,
"sentiment_date": "2026-09-09 00:11:55",
"technical_date": "2026-09-06",
"sma20": 277.896499633789,
"sma50": 260.969197692871,
"golden_cross": true,
"rsi": 49.811422658345,
"macd": 3.41914308274363,
"signal": 6.66046215382312,
"macd_buy_signal": false,
"technical_recommended": false,
"volume_ratio": 1.6,
"adx": 24.58,
"earnings_date": null,
"earnings_estimate": null,
"days_to_earnings": null,
"composite_score": 0.6117,
"v2_factors": {
"z_rise": 1.29,
"z_tech": -0.231,
"z_macd": -1.375,
"z_sma": 1.408,
"z_rsi": -0.727,
"z_sent": -1.365,
"z_vol": 1.401,
"z_adx": 1.397
},
"vix_value": 14.5299997329712,
"scoring_version": "v2"
}
],
"llm_reasoning": "LLM 호출 전체 실패 (Opus 3회 + Sonnet 3회): Messages.create() got an unexpected keyword argument 'temperature'",
"total_elapsed_sec": 211
}
■ 1.1 그리고 이 부분을 클로드에게 물어보니 아래와 같은 답변을 받았습니다.
app/services/llm_review_service.py:181 의 create_kwargs["temperature"] = 0 입니다.
이 프로젝트에 설치된 SDK는 anthropic 1.2.0 인데, 1.x 메이저 업그레이드에서 temperature / top_p / top_k 가 Messages.create() 시그니처에서 완전히 삭제됐습니다. 실제 설치본 확인 결과:
max_tokens, messages, model, cache_control, container, inference_geo, metadata,
output_config, service_tier, stop_sequences, stream, system, thinking,
tool_choice, tools, user_profile_id, extra_headers, extra_query, extra_body, timeout
temperature 가 없습니다. 그래서 API 요청이 나가기도 전에 파이썬 레벨에서 TypeError: Messages.create() got an unexpected keyword argument 'temperature' 가 터집니다. 서버 400 에러가 아니라 SDK 호출 자체가 실패한 것이라, 재시도해도 100% 같은 결과입니다.
코드의 전제가 어긋난 부분:
# temperature 파라미터를 받지 않는 모델 (Opus 4.7부터 sampling 파라미터 제거됨)
MODELS_WITHOUT_TEMPERATURE = {"claude-opus-4-8"}
"모델별로 다르다"는 전제로 Opus만 제외했지만, SDK 1.x에서는 모델과 무관하게 어떤 모델에도 temperature를 넘길 수 없습니다. 그래서 폴백 모델 claude-sonnet-4-6 차례에서 매번 터졌습니다.
Opus 3회는 왜 실패했나 (추정)
최종 메시지의 에러는 last_error 한 개만 찍히는데, Sonnet의 TypeError가 Opus 쪽 에러를 덮어썼습니다. 다만 4_llm_review 의 elapsed_sec: 51.3 이 단서입니다 — 재시도 대기는 5+15+30 = 50초이고, 이건 한 모델만 3회 재시도(sleep 포함)를 돌았다는 뜻입니다. 즉 Opus는 sleep 없이 break 되는 경로 — json.JSONDecodeError(191행) 또는 529/429/503 이외의 APIStatusError(246행) — 로 1회만에 빠져나갔고, 50초는 Sonnet의 TypeError 3회입니다. Opus의 실제 에러는 콘솔 stdout(LLM API 에러 ... 또는 LLM 응답 JSON 파싱 실패 ...)에만 남아 있으니 그 줄을 확인해야 확정됩니다.
수정 방향
1. temperature 분기 전체 삭제 (MODELS_WITHOUT_TEMPERATURE 상수 포함). 결정성이 필요하면 프롬프트/output_config로 제어합니다.
2. TypeError 같은 비재시도성 예외는 50초 sleep 후 재시도하지stdout(LLM API 에러 ... 또는 LLM 응답 JSON 파싱 실패 ...)에만 남아 있으니 그 줄을 확인해야 확정됩니다.
수정 방향
1. temperature 분기 전체 삭제 (MODELS_WITHOUT_TEMPERATURE 상수 포함). 결정성이 필요하면 프롬프트/output_config로 제어합니다.
2. TypeError 같은 비재시도성 예외는 50초 sleep 후 재시도하지 말고 즉시 다음 모델/중단으로 보내기.
3. last_error 를 모델별로 모아서 실패 사유에 함께 남기기 (지금은 Opus 원인이 통째로 유실됩니다).
4. 모델 ID도 현행 세대(claude-opus-5 / 폴백 claude-sonnet-5)로 올리는 걸 권합니다.
수정 적용해 드릴까요? 1·2·3번은 바로 반영 가능하고, 4번은 원하시면 같이 하겠습니다.
■ 2. llm_decision_logs 미적재 문의 (캐글 연동은 되었음)
(a) /pipeline/kaggle/trigger-ml 은 원래 이 테이블을 안 건드립니다
pipeline.py:298 의 kaggle_trigger_ml() 은 kaggle kernels push → status 폴링만 합니다. review_buy_candidates() 를 호출하는 경로가 아예 없어요. llm_decision_logs 에 쓰는 건 /pipeline/run-buy-pipeline 과 스케줄러의 일일 파이프라인뿐입니다. trigger-ml 을 아무리 돌려도 이 테이블은 안 채워집니다.
(b) run-buy-pipeline 을 돌려도 저장이 실패하고 있습니다 — 컬럼 누락
Supabase에 직접 조회해서 확인했습니다(읽기만 했고 쓰기는 안 했습니다):
┌──────────────────────────────────────────┬────────────┐
│ 컬럼 │ 상태 │
├──────────────────────────────────────────┼────────────┤
│ decision_date, ticker, stock_name, │ │
│ decision, reason, market_analysis, │ OK │
│ composite_score, rise_probability, rsi, │ │
│ adx, vix_value, created_at, updated_at │ │
├──────────────────────────────────────────┼────────────┤
│ │ ❌ 42703 │
│ earnings_date │ column │
│ │ does not │
│ │ exist │
├──────────────────────────────────────────┼────────────┤
│ days_to_earnings │ ❌ 42703 │
├──────────────────────────────────────────┼────────────┤
│ earnings_estimate │ ❌ 42703 │
└──────────────────────────────────────────┴────────────┘
llm_review_service.py:24 의 upsert 페이로드에는 이 세 컬럼이 들어갑니다. 컬럼이 없으니 매번 요청이 거부되고, savellm_decision_logs 는 전체를 try/except Exception 으로 감싸 LLM 판단 로그 저장 실패: 만 출력하고 넘어갑니다(llm_review_service.py:41). 그래서 API 응답은 정상으로 보이는데 테이블만 계속 비어 있는 겁니다. 현재 행 수는 0개입니다.
같은 원인으로 earnings_calendar 테이블 자체도 없습니다(PGRST205). 어제 실행 결과의 1.5_earnings_calendar: "저장할 실적 일정이 없습니다" 도 이것 때문입니다.
원인은 sql/create_earnings_calendar.sql 을 Supabase에서 실행하지 않은 것입니다. 파일은 리포에 있는데 DB에 적용이 안 됐어요. Supabase SQL Editor에서 그 파일을 통째로 실행하면 테이블 생성 + 컬럼 3개 추가가 한 번에 됩니다.
한 가지 더: .env 의 SUPABASE_KEY 는 anon 역할입니다. 조회는 되는 걸 확인했지만 INSERT는 RLS에 막힐 수 있으니, 컬럼 추가 후에도 안 들어가면 sql/errorfix.sql 의 ALTER TABLE llm_decision_logs DISABLE ROW LEVEL SECURITY 를 확인하세요.
---
정리하면 이 순서로 풀립니다:
1. Supabase에서 sql/create_earnings_calendar.sql 실행 → 컬럼/테이블 생성 (이건 직접 하셔야 합니다)
2. llm_review_service.py 의 temperature 제거 → LLM 호출 자체가 성공해야 BUY/HOLD 판정이 저장됨
3. /pipeline/run-buy-pipeline 실행 (trigger-ml 아님)
2번과, 로그 저장 실패가 조용히 묻히지 않게 API 응답에 노출시키는 수정을 지금 적용할까요?
Answer 0
연동 문제
0
15
1
5-21 질문이요!
0
20
2
매수 실행 시점 관련
0
28
0
Opus/Sonnet 버전 관련 문의
1
46
2
섹션2 질문이요
1
49
2
섹션1.9 질문입니다!
1
69
3
Kaggle 노트북(predict.ipynb) 관련
1
54
2
git bash .env
1
54
1
알파벤티지 sleep(5) 관련 문의
1
70
2
실전 계좌에서 운영하고 계신 분 계신가요?
1
70
2
클로드
1
59
2
pip install -r requirements.txt
0
65
2
명령 프롬프트
0
59
2
slack 알림 연동 강의 관련
1
80
2
supabase_key 관련
1
89
3
python run.py 실행시 에러 문제
1
101
2
커서창
1
69
2
cursor 환경
1
73
2
개발 환경 준비와 프로젝트 구조 강의 관련
1
64
2
저장 공간
1
69
2
colab 코드 실행시 error
1
62
2
llm_decision_logs 저장 실패(실적 컬럼 불일치)를 어떻게 해결할까요?
2
97
4
kaggle notebook에 service key 설정이 누락된 것 같습니다
1
76
2
주말에 실행할 경우 update_economic_data_in_background에 로직 변경 필요성
1
61
1

