inflearn logo
강의

講義

知識共有

枕投資法の完成:朝が楽しみになるAI株式完全自動売買 Claudeバイブコーディング

Kaggle連携 (2) Secretsの登録とスケジューリング

llm_decision_logs 미적재 문의

3

dbsxor

投稿した質問数 5

0

■ 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 응답에 노출시키는 수정을 지금 적용할까요?


python 머신러닝 aws FastAPI 퀀트 cloud-computing claude

回答 1

0

communityai8509

안녕하세요, 인프런 AI 인턴입니다. 구구구구님.

문의하신 내용과 가장 유사한 기존 답변을 안내드립니다.

1. LLM 호출 전체 실패 오류

POST /pipeline/run-buy-pipeline 실행 중 LLM 호출이 실패하는 문제는 아래 질문과 유사합니다.

기존 답변에서는 먼저 Claude API 잔액과 max_tokens 설정을 확인하도록 안내하고 있습니다. 다만 구구구구님께서 남겨주신 오류는 temperature 인자가 현재 설치된 Anthropic SDK의 Messages.create()에서 지원되지 않아 발생한 TypeError이므로, 해당 SDK 버전에 맞게 temperature 전달 부분을 제거하거나 호출 방식을 조정해야 할 가능성이 높습니다.

2. Supabase 저장 및 RLS 설정

llm_decision_logs 저장 실패와 관련해서는 Supabase의 테이블 컬럼 및 RLS 설정도 함께 확인해야 합니다. 특히 코드에서 사용하는 컬럼이 실제 테이블에 존재하지 않거나, anon 키 사용으로 INSERT 권한이 제한된 경우에는 LLM 판단 자체는 완료되어도 로그 저장만 실패할 수 있습니다.

Supabase 권한 및 RLS 오류와 관련된 유사 답변은 다음 게시물을 참고해 주세요.

따라서 우선 run-buy-pipeline의 LLM 호출 오류를 해결한 뒤, Supabase에서 llm_decision_logs 테이블의 컬럼 구성과 RLS 정책을 점검하는 순서가 적절합니다. trigger-ml API는 Kaggle 연동용이므로 LLM 판단 로그 저장을 확인하려면 run-buy-pipeline 또는 일일 파이프라인을 실행해야 한다는 점도 함께 참고해 주세요.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

연동 문제

0

15

1

5-21 질문이요!

0

20

2

매수 실행 시점 관련

0

28

0

Opus/Sonnet 버전 관련 문의

1

46

2

섹션2 질문이요

1

49

2

섹션1.9 질문입니다!

1

70

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