From 5a0a73934e4dd2d8265bf454bf179adb621f9205 Mon Sep 17 00:00:00 2001 From: EunseoJun Date: Mon, 28 Jul 2025 11:22:38 +0900 Subject: [PATCH] =?UTF-8?q?[Fix]LLM=20=EB=8D=A7=EC=85=88=20=EC=98=A4?= =?UTF-8?q?=EB=A5=98=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- routes/gemini.js | 19 +++++++++++++++---- routes/ranking.js | 3 ++- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/routes/gemini.js b/routes/gemini.js index b896dfb..49dbf3a 100644 --- a/routes/gemini.js +++ b/routes/gemini.js @@ -7,7 +7,6 @@ const genAI = new GoogleGenerativeAI(process.env.GENERATIVE_AI_API_KEY); router.post("/grade", async (req, res) => { try { - // 프론트에서 prompt(프롬프트), user_answer(유저 답변) 둘 다 받기! const { prompt, user_answer } = req.body; if (!prompt || !user_answer) { @@ -16,10 +15,8 @@ router.post("/grade", async (req, res) => { .json({ error: "prompt와 user_answer 모두 필요합니다." }); } - // 최신 모델명 사용! const model = genAI.getGenerativeModel({ model: "gemini-1.5-flash" }); - // prompt를 해당 위치에 동적으로 삽입! const fullPrompt = ` 너는 투자 교육 서비스의 채점자야. 아래 사용자 답변이 얼마나 구체적이고 정확한지를 기준별로 100점 만점 채점해줘. 차트 기술적 분석에 비중을 두고 채점해줘. @@ -52,7 +49,21 @@ router.post("/grade", async (req, res) => { const result = await model.generateContent(fullPrompt); const text = result.response.text(); - res.json({ result: text }); + // JSON 파싱 + const parsed = JSON.parse(text); + + // score 재계산 + const { breakdown } = parsed; + const calcScore = + (breakdown.logic || 0) + + (breakdown.technical || 0) + + (breakdown.macroEconomy || 0) + + (breakdown.marketIssues || 0) + + (breakdown.quantEvidence || 0); + + parsed.score = calcScore; + + res.json({ result: parsed }); } catch (e) { console.error(e); res.status(500).json({ error: "채점 실패" }); diff --git a/routes/ranking.js b/routes/ranking.js index 7b0c512..192f61d 100644 --- a/routes/ranking.js +++ b/routes/ranking.js @@ -95,8 +95,9 @@ router.post("/day", async (req, res) => { continue; // 5. 점수 계산 - const dailyScore = + const rawScore = 100 - (Math.abs(predObj.close - priceObj.close) / priceObj.close) * 100; + const dailyScore = Math.max(0, Math.round(rawScore)); await RealScore.findOneAndUpdate( { user_stock_id: pred.user_stock_id, date: yesterDay }, { $set: { score: Math.round(dailyScore) } },