Spaces:
Sleeping
Sleeping
Heewon Oh Claude Sonnet 4.5 commited on
Commit ยท
862ca4c
1
Parent(s): cd3a181
feat: align synthesis output with STONKS EOD deep report format
Browse files- RESEARCH_SYNTHESIS_PROMPT: 8-section structure matching STONKS
DEEP_REPORT_TEMPLATE (ํต์ฌ์์ฝ/์ค์ /์ฌ์
์ ๋ต/์๋๋ฆฌ์ค/๋ฆฌ์คํฌ/ํฌ์์๊ฒฌ/
๋ชจ๋ํฐ๋ง/์ฐธ๊ณ ์๋ฃ), emoji headers, checklist risk items
- to_markdown(): conclusion is now the full EOD report โ output directly,
move metadata (confidence/sources/elapsed) to a compact footer line
instead of prepending headers above the report body
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
- vela/prompts/research.py +117 -20
- vela/schemas.py +12 -37
vela/prompts/research.py
CHANGED
|
@@ -36,35 +36,132 @@ RESEARCH_SYSTEM_PROMPT_TEMPLATE = """๋น์ ์ ํ๊ตญ ์ฃผ์ ๋ฆฌ์์น ์์ด์
|
|
| 36 |
# ํฉ์ฑ ํ๋กฌํํธ (์ต์ข
๊ฒฐ๋ก ์์ฑ์ฉ) - v2 Enhanced Scaffolding
|
| 37 |
# =============================================================================
|
| 38 |
|
| 39 |
-
RESEARCH_SYNTHESIS_PROMPT = """[๋ถ์๋ชจ๋:
|
| 40 |
# VELA ํ๊ตญ ์ฃผ์ ์ ๋๋ฆฌ์คํธ
|
| 41 |
|
| 42 |
## ์ ๋ ๊ท์น
|
| 43 |
- ํ๊ตญ์ด๋ง ์ฌ์ฉ (์ค๊ตญ์ด ์ ๋ ๊ธ์ง)
|
| 44 |
-
- ์์ด๋ ๊ณ ์ ๋ช
์ฌ/์ ๋ฌธ์ฉ์ด๋ง (HBM, PER, ROE ๋ฑ)
|
| 45 |
-
- ์ ๊ณต๋ ๋ฐ์ดํฐ๋ง ์ธ์ฉ (๋ ์กฐ ๊ธ์ง)
|
| 46 |
-
- ๋ด์ค ์ธ์ฉ ์ ๋ฐ๋์ [
|
| 47 |
-
|
| 48 |
-
##
|
| 49 |
-
|
| 50 |
-
|
| 51 |
-
|
| 52 |
-
|
| 53 |
-
|
| 54 |
-
|
| 55 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 56 |
|
| 57 |
## ๋ถ์ ๊ธฐ์ค
|
| 58 |
- ๋ฑ๋ฝ๋ฅ ยฑ3%โ: ๊ธ๋ฑ/๊ธ๋ฝ
|
| 59 |
- ์ธ๊ตญ์ธ 1000์ตโ: ๋๊ท๋ชจ ๋งค์ง
|
| 60 |
-
-
|
| 61 |
-
|
| 62 |
-
## ๊ธ์ง ํํ
|
| 63 |
-
- ์ค๊ตญ์ด (็ฎไฝ/็น้ซ)
|
| 64 |
-
- "~๊ฒ ๊ฐ์ต๋๋ค" โ "~๋ก ๋ถ์๋ฉ๋๋ค"
|
| 65 |
-
- ๊ฐ์ ์ ํํ โ ๊ฐ๊ด์ ์์น
|
| 66 |
|
| 67 |
-
์
|
| 68 |
"""
|
| 69 |
|
| 70 |
|
|
|
|
| 36 |
# ํฉ์ฑ ํ๋กฌํํธ (์ต์ข
๊ฒฐ๋ก ์์ฑ์ฉ) - v2 Enhanced Scaffolding
|
| 37 |
# =============================================================================
|
| 38 |
|
| 39 |
+
RESEARCH_SYNTHESIS_PROMPT = """[๋ถ์๋ชจ๋: EOD_DEEP_REPORT]
|
| 40 |
# VELA ํ๊ตญ ์ฃผ์ ์ ๋๋ฆฌ์คํธ
|
| 41 |
|
| 42 |
## ์ ๋ ๊ท์น
|
| 43 |
- ํ๊ตญ์ด๋ง ์ฌ์ฉ (์ค๊ตญ์ด ์ ๋ ๊ธ์ง)
|
| 44 |
+
- ์์ด๋ ๊ณ ์ ๋ช
์ฌ/์ ๋ฌธ์ฉ์ด๋ง (HBM, PER, ROE, CAPEX ๋ฑ)
|
| 45 |
+
- ์ ๊ณต๋ ๋ฐ์ดํฐ๋ง ์ธ์ฉ (๋ ์กฐ ๊ธ์ง) โ ์์น ๋ถํ์ค ์ "N/A" ํ๊ธฐ
|
| 46 |
+
- ๋ด์ค/์์ค ์ธ์ฉ ์ ๋ฐ๋์ [์ ๋ชฉ](URL) ํ์
|
| 47 |
+
|
| 48 |
+
## ์ถ๋ ฅ ํ์ (์๋ ๋งํฌ๋ค์ด ๊ตฌ์กฐ๋ฅผ ๋ฐ๋์ ์ค์)
|
| 49 |
+
|
| 50 |
+
## ๐ ํต์ฌ ์์ฝ (TL;DR)
|
| 51 |
+
|
| 52 |
+
### ์ฃผ์ ์ฌํญ
|
| 53 |
+
- **์ฃผ์ ์ด์**: 2~3๋ฌธ์ฅ์ผ๋ก ์ต๊ทผ ํต์ฌ ์ด์ ์์ฝ
|
| 54 |
+
|
| 55 |
+
### ํฌ์ ํฌ์ธํธ
|
| 56 |
+
- โ
๊ฐ์ 1: ๊ตฌ์ฒด์ ๊ทผ๊ฑฐ
|
| 57 |
+
- โ
๊ฐ์ 2: ๊ตฌ์ฒด์ ๊ทผ๊ฑฐ
|
| 58 |
+
- โ ๏ธ ๋ฆฌ์คํฌ 1: ๊ตฌ์ฒด์ ๊ทผ๊ฑฐ
|
| 59 |
+
- โ ๏ธ ๋ฆฌ์คํฌ 2: ๊ตฌ์ฒด์ ๊ทผ๊ฑฐ
|
| 60 |
+
|
| 61 |
+
---
|
| 62 |
+
|
| 63 |
+
## ๐ ์ค์ ๋ฐ ๋ฐธ๋ฅ์์ด์
|
| 64 |
+
|
| 65 |
+
### ์ฃผ์ ์ฌ๋ฌด ์งํ
|
| 66 |
+
|
| 67 |
+
| ํญ๋ชฉ | ์ต๊ทผ ์ค์ | ์ ๋
๋๋น | ๋น๊ณ |
|
| 68 |
+
|:-----|:---------|:---------|:-----|
|
| 69 |
+
| **๋งค์ถ** | | | |
|
| 70 |
+
| **์์
์ด์ต** | | | |
|
| 71 |
+
| **์์
์ด์ต๋ฅ ** | | | |
|
| 72 |
+
| **PER** | | | |
|
| 73 |
+
| **PBR** | | | |
|
| 74 |
+
|
| 75 |
+
### ์ฆ๊ถ์ฌ ๋ชฉํ๊ฐ
|
| 76 |
+
|
| 77 |
+
| ์ฆ๊ถ์ฌ | ๋ชฉํ๊ฐ | ์๊ฒฌ | ๊ทผ๊ฑฐ |
|
| 78 |
+
|:-------|:-------|:-----|:-----|
|
| 79 |
+
| | | | |
|
| 80 |
+
|
| 81 |
+
---
|
| 82 |
+
|
| 83 |
+
## ๐ ์ค์ ๋ถ์
|
| 84 |
+
|
| 85 |
+
### ์ต๊ทผ ์ค์ ๋ํฅ
|
| 86 |
+
- ๋งค์ถ/์ด์ต ์ฆ๊ฐ ์์ธ ๋ถ์
|
| 87 |
+
|
| 88 |
+
### ํต์ฌ ์ฑ์ฅ ๋์ธ
|
| 89 |
+
- ์ ๊ท ์ฌ์
/์ ํ ๋ชจ๋ฉํ
|
| 90 |
+
- ์์ฅ ์ ์ ์จ ๋ณํ
|
| 91 |
+
|
| 92 |
+
---
|
| 93 |
+
|
| 94 |
+
## โ๏ธ ์ฌ์
์ ๋ต ๋ฐ ๊ฒฝ์๋ ฅ
|
| 95 |
+
|
| 96 |
+
### ์ ๋ต์ ์ด๋์
ํฐ๋ธ
|
| 97 |
+
- CAPEX / ์ฆ์ค ๊ณํ, ํํธ๋์ญ, ๊ธ๋ก๋ฒ ํ์ฅ
|
| 98 |
+
|
| 99 |
+
### ๊ฒฝ์ ์ฐ์
|
| 100 |
+
- ๊ธฐ์ ๋ ฅ, ๋น์ฉ ๊ฒฝ์๋ ฅ, ๊ณ ๊ฐ ๊ด๊ณ
|
| 101 |
+
|
| 102 |
+
---
|
| 103 |
+
|
| 104 |
+
## ๐ฏ ํฌ์ ์๋๋ฆฌ์ค
|
| 105 |
+
|
| 106 |
+
### ๐ ๋๊ด ์๋๋ฆฌ์ค
|
| 107 |
+
- ์ ์ : ํต์ฌ ์กฐ๊ฑด
|
| 108 |
+
- ์ ๋ง: ๋งค์ถยท์ด์ต๋ฅ ๋ฐฉํฅ์ฑ
|
| 109 |
+
|
| 110 |
+
### ๐ ์ค๋ฆฝ ์๋๋ฆฌ์ค
|
| 111 |
+
- ์ ์ : ํต์ฌ ์กฐ๊ฑด
|
| 112 |
+
- ์ ๋ง: ๋งค์ถยท์ด์ต๋ฅ ๋ฐฉํฅ์ฑ
|
| 113 |
+
|
| 114 |
+
### ๐ ๋น๊ด ์๋๋ฆฌ์ค
|
| 115 |
+
- ์ ์ : ํต์ฌ ์กฐ๊ฑด
|
| 116 |
+
- ์ ๋ง: ๋งค์ถยท์ด์ต๋ฅ ๋ฐฉํฅ์ฑ
|
| 117 |
+
|
| 118 |
+
---
|
| 119 |
+
|
| 120 |
+
## โ ๏ธ ๋ฆฌ์คํฌ ์์ธ
|
| 121 |
+
|
| 122 |
+
### ์ฌ์
๋ฆฌ์คํฌ
|
| 123 |
+
- [ ] ๋ฆฌ์คํฌ 1
|
| 124 |
+
- [ ] ๋ฆฌ์คํฌ 2
|
| 125 |
+
|
| 126 |
+
### ์์ฅ ๋ฆฌ์คํฌ
|
| 127 |
+
- [ ] ๋ฆฌ์คํฌ 1
|
| 128 |
+
- [ ] ๋ฆฌ์คํฌ 2
|
| 129 |
+
|
| 130 |
+
---
|
| 131 |
+
|
| 132 |
+
## ๐ก ํฌ์ ์๊ฒฌ
|
| 133 |
+
|
| 134 |
+
### ์ข
ํฉ ํ๋จ
|
| 135 |
+
- **๋จ๊ธฐ ๋ฐฉํฅ์ฑ**: Bullish / Neutral / Bearish
|
| 136 |
+
- **์ค์ฅ๊ธฐ ์ ๋ง**: 1~2๋ฌธ์ฅ
|
| 137 |
+
|
| 138 |
+
### ๋งค์/๋ณด๋ฅ ๊ทผ๊ฑฐ
|
| 139 |
+
- **๊ทผ๊ฑฐ**: ํต์ฌ 1๋ฌธ์ฅ
|
| 140 |
+
|
| 141 |
+
---
|
| 142 |
+
|
| 143 |
+
## ๐ ๋ชจ๋ํฐ๋ง ํฌ์ธํธ
|
| 144 |
+
|
| 145 |
+
### ๋จ๊ธฐ
|
| 146 |
+
- [ ] ์ฒดํฌํฌ์ธํธ 1
|
| 147 |
+
- [ ] ์ฒดํฌํฌ์ธํธ 2
|
| 148 |
+
|
| 149 |
+
### ์ค๊ธฐ
|
| 150 |
+
- [ ] ์ฒดํฌํฌ์ธํธ 1
|
| 151 |
+
|
| 152 |
+
---
|
| 153 |
+
|
| 154 |
+
## ๐ ์ฐธ๊ณ ์๋ฃ
|
| 155 |
+
์์ค ๋ฒํธ์ URL์ [์ ๋ชฉ](URL) ํ์์ผ๋ก ๋์ด
|
| 156 |
+
|
| 157 |
+
---
|
| 158 |
|
| 159 |
## ๋ถ์ ๊ธฐ์ค
|
| 160 |
- ๋ฑ๋ฝ๋ฅ ยฑ3%โ: ๊ธ๋ฑ/๊ธ๋ฝ
|
| 161 |
- ์ธ๊ตญ์ธ 1000์ตโ: ๋๊ท๋ชจ ๋งค์ง
|
| 162 |
+
- ์์น ๋ฏธํ์ธ ์: "N/A" ํ๊ธฐ (๋ ์กฐ ๊ธ์ง)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 163 |
|
| 164 |
+
์ ๊ตฌ์กฐ๋ฅผ ๋ฐ๋์ ์ค์ํ์ฌ ์ ๋ฌธ์ ์ธ EOD ๋ถ์ ๋ฆฌํฌํธ๋ฅผ ์์ฑํ์ธ์.
|
| 165 |
"""
|
| 166 |
|
| 167 |
|
vela/schemas.py
CHANGED
|
@@ -558,43 +558,18 @@ class ResearchResult(BaseModel):
|
|
| 558 |
return self.model_dump_json(indent=indent)
|
| 559 |
|
| 560 |
def to_markdown(self) -> str:
|
| 561 |
-
"""๋งํฌ๋ค์ด ๋ฆฌํฌํธ๋ก ๋ณํ
|
| 562 |
-
|
| 563 |
-
|
| 564 |
-
|
| 565 |
-
|
| 566 |
-
|
| 567 |
-
|
| 568 |
-
|
| 569 |
-
|
| 570 |
-
|
| 571 |
-
|
| 572 |
-
|
| 573 |
-
|
| 574 |
-
# ๊ฒฐ๋ก
|
| 575 |
-
md += "## ๊ฒฐ๋ก \n\n"
|
| 576 |
-
md += self.conclusion + "\n\n"
|
| 577 |
-
|
| 578 |
-
# ์ถ๋ก ๊ณผ์
|
| 579 |
-
md += "## ์ถ๋ก ๊ณผ์ \n\n"
|
| 580 |
-
for step in self.reasoning_trace:
|
| 581 |
-
md += f"### Step {step.step_number}\n"
|
| 582 |
-
md += f"**์ฌ๊ณ **: {step.thought}\n"
|
| 583 |
-
md += f"**์ก์
**: {step.action}"
|
| 584 |
-
if step.query:
|
| 585 |
-
md += f" - `{step.query}`"
|
| 586 |
-
md += f"\n**๊ด์ฐฐ**: {step.observation}\n"
|
| 587 |
-
md += f"**์ ๋ขฐ๋**: {step.confidence:.0%}\n\n"
|
| 588 |
-
|
| 589 |
-
# ์์ค
|
| 590 |
-
md += "## ์ฐธ๊ณ ์๋ฃ\n\n"
|
| 591 |
-
for i, src in enumerate(self.sources, 1):
|
| 592 |
-
md += f"{i}. [{src.title}]({src.url})"
|
| 593 |
-
if src.securities_firm:
|
| 594 |
-
md += f" ({src.securities_firm})"
|
| 595 |
-
if src.date:
|
| 596 |
-
md += f" - {src.date}"
|
| 597 |
-
md += "\n"
|
| 598 |
|
| 599 |
return md
|
| 600 |
|
|
|
|
| 558 |
return self.model_dump_json(indent=indent)
|
| 559 |
|
| 560 |
def to_markdown(self) -> str:
|
| 561 |
+
"""๋งํฌ๋ค์ด ๋ฆฌํฌํธ๋ก ๋ณํ (STONKS EOD ํ์)
|
| 562 |
+
|
| 563 |
+
synthesis ๋จ๊ณ์์ ์ด๋ฏธ EOD ๋ฆฌํฌํธ ๊ตฌ์กฐ๋ก ์์ฑ๋๋ฏ๋ก
|
| 564 |
+
conclusion์ ์ง์ ์ถ๋ ฅํ๊ณ , ๋ฉํ๋ฐ์ดํฐ๋ ํ๋จ์ ์ ํ ํ์์ผ๋ก ํ์.
|
| 565 |
+
"""
|
| 566 |
+
# ๊ฒฐ๋ก ์ด ์ด๋ฏธ EOD ๋ฆฌํฌํธ ํ์ โ ๊ทธ๋๋ก ์ถ๋ ฅ
|
| 567 |
+
md = self.conclusion.strip() + "\n"
|
| 568 |
+
|
| 569 |
+
# ํ๋จ ๋ฉํ๋ฐ์ดํฐ (Gradio accordion์ฉ)
|
| 570 |
+
md += "\n---\n"
|
| 571 |
+
md += f"*์ ๋ขฐ๋: {self.confidence:.0%} ยท ์์ค: {len(self.sources)}๊ฐ ยท "
|
| 572 |
+
md += f"์์: {self.metadata.elapsed_seconds:.0f}์ด*\n"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 573 |
|
| 574 |
return md
|
| 575 |
|