aiqtech commited on
Commit
e162935
ยท
verified ยท
1 Parent(s): 5d1c552

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +602 -245
app.py CHANGED
@@ -39,7 +39,7 @@ TEST_MODE = os.getenv("TEST_MODE", "false").lower() == "true"
39
  conversation_history = []
40
 
41
  class WuxingLLMSystem:
42
- """์˜คํ–‰ยท์˜ค์ƒ ๊ธฐ๋ฐ˜ ํ˜‘๋ ฅ์  LLM ์‹œ์Šคํ…œ"""
43
 
44
  def __init__(self):
45
  self.token = FRIENDLI_TOKEN
@@ -52,47 +52,47 @@ class WuxingLLMSystem:
52
  self.use_gemini = False
53
  self.gemini_client = None
54
 
55
- # ์˜คํ–‰ ์—ญํ•  ์ •์˜
56
  self.wuxing_roles = {
57
  "wood": {
58
- "name": "๊ฐ๋…๊ด€ (ํŒ€์žฅ)",
59
  "virtue": "ไป",
60
  "element": "ๆœจ",
61
- "traits": "ํฌ์šฉยท์„ฑ์žฅํ˜• ๋ฆฌ๋”",
62
- "expertise": "๋น„์ „ ์ œ์‹œ, ํŒ€ ์กฐ์œจ, ์ธ์žฌ ์œก์„ฑ",
63
- "color": "#10b981" # Green
64
  },
65
  "fire": {
66
- "name": "์ „๋žตยท๊ธฐํš ๋ฆฌ๋”",
67
  "virtue": "็พฉ",
68
  "element": "็ซ",
69
- "traits": "์—ด์ •ยท๊ฒฐ๋‹จ, ๊ฐœ์ฒ™ ์ •์‹ ",
70
- "expertise": "์ค‘ยท์žฅ๊ธฐ ๋กœ๋“œ๋งต, ์‚ฌ์—… ๋ชจ๋ธ ์„ค๊ณ„, ๋ฆฌ์Šคํฌ-๋ณด์ƒ ์‹œ๋‚˜๋ฆฌ์˜ค",
71
- "color": "#ef4444" # Red
72
  },
73
  "metal": {
74
- "name": "์•„ํ‚คํ…์ฒ˜ & ํ‘œ์ค€ ์ฑ…์ž„",
75
  "virtue": "็ฆฎ",
76
  "element": "้‡‘",
77
- "traits": "๊ตฌ์กฐํ™”ยท์ •๋ฐ€, ์‹œ์Šคํ…œ ์„ค๊ณ„ ๋งˆ์Šคํ„ฐ",
78
- "expertise": "๊ธฐ์ˆ ยท๋ฐ์ดํ„ฐ ์•„ํ‚คํ…์ฒ˜, ํ‘œ์ค€ ์ˆ˜๋ฆฝ, ํ’ˆ์งˆยทํ™•์žฅ์„ฑ ๊ฒ€์ฆ",
79
- "color": "#f59e0b" # Gold
80
  },
81
  "water": {
82
- "name": "๋„๊ตฌ ํ™œ์šฉ R&D ์ŠคํŽ˜์…œ๋ฆฌ์ŠคํŠธ",
83
  "virtue": "ๆ™บ",
84
  "element": "ๆฐด",
85
- "traits": "๋ถ„์„ยทํ˜ธ๊ธฐ์‹ฌ, ITยทAI ๋„๊ตฌ ์ „๋ฌธ๊ฐ€",
86
- "expertise": "์ตœ์‹  ๊ธฐ์ˆ ยท์‹œ์žฅ ์กฐ์‚ฌ, ํ”„๋กœํ† ํƒ€์ž… ๊ฐœ๋ฐœ, ์ž๋™ํ™”ยท์ƒ์‚ฐ์„ฑ ํˆด",
87
- "color": "#3b82f6" # Blue
88
  },
89
  "earth": {
90
- "name": "์‹คํ–‰ยท์šด์˜ยทํ’ˆ์งˆ ๋‹ด๋‹น",
91
  "virtue": "ไฟก",
92
  "element": "ๅœŸ",
93
- "traits": "์‹ ๋ขฐยท์„ฑ์‹ค, ์‹คํ–‰๋ ฅ",
94
- "expertise": "์ผ์ •ยท์˜ˆ์‚ฐยท๋ฆฌ์†Œ์Šค ๊ด€๋ฆฌ, ์šด์˜ ์ตœ์ ํ™”, ํ’ˆ์งˆ ๋ณด์ฆ",
95
- "color": "#a855f7" # Purple
96
  }
97
  }
98
 
@@ -126,184 +126,410 @@ class WuxingLLMSystem:
126
  }
127
 
128
  def create_wood_initial_prompt(self, user_query: str, search_results: Dict = None) -> str:
129
- """ๆœจ(๊ฐ๋…๊ด€) ์ดˆ๊ธฐ ํ”„๋กฌํ”„ํŠธ"""
130
  search_info = ""
131
  if search_results:
132
  search_info = f"\n\n์›น ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ:\n{self._format_search_results(search_results)}"
133
 
134
- return f"""๋‹น์‹ ์€ ไป(์ธ์žํ•จ)์˜ ๋•๋ชฉ์„ ์ง€๋‹Œ ๆœจ์˜ ๊ธฐ์šด์„ ๊ฐ€์ง„ ๊ฐ๋…๊ด€์ž…๋‹ˆ๋‹ค.
135
- ํฌ์šฉ์ ์ด๊ณ  ์„ฑ์žฅ์ง€ํ–ฅ์ ์ธ ๋ฆฌ๋”์‹ญ์œผ๋กœ ํŒ€์„ ์ด๋•๋‹ˆ๋‹ค.
136
 
137
- ์‚ฌ์šฉ์ž ์งˆ๋ฌธ: {user_query}
 
 
 
138
  {search_info}
139
 
140
- ํŒ€์žฅ์œผ๋กœ์„œ ์ด ์งˆ๋ฌธ์— ๋Œ€ํ•ด:
141
- 1. ์ „์ฒด์ ์ธ ๋น„์ „๊ณผ ๋ฐฉํ–ฅ์„ฑ์„ ์ œ์‹œํ•˜์„ธ์š”
142
- 2. ๊ฐ ํŒ€์›(็ซ, ๅœŸ, ้‡‘, ๆฐด)์˜ ์—ญํ• ๊ณผ ๊ธฐ์—ฌ ๋ฐฉํ–ฅ์„ ์„ค๊ณ„ํ•˜์„ธ์š”
143
- 3. ์„ฑ์žฅ๊ณผ ๋ฐœ์ „์˜ ๊ด€์ ์—์„œ ํ•ต์‹ฌ ๋ชฉํ‘œ๋ฅผ ์„ค์ •ํ•˜์„ธ์š”
144
- 4. ํŒ€ ์ „์ฒด๊ฐ€ ์กฐํ™”๋กญ๊ฒŒ ํ˜‘๋ ฅํ•  ์ˆ˜ ์žˆ๋Š” ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์ œ์‹œํ•˜์„ธ์š”
145
- 5. ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ๋ฅผ ์ฐธ๊ณ ํ•˜์—ฌ ์ตœ์‹  ํŠธ๋ Œ๋“œ์™€ ๋ชจ๋ฒ” ์‚ฌ๋ก€๋ฅผ ๋ฐ˜์˜ํ•˜์„ธ์š”
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
146
 
147
- [ํ•ต์‹ฌ ํ‚ค์›Œ๋“œ]: 5-7๊ฐœ์˜ ์กฐ์‚ฌ๊ฐ€ ํ•„์š”ํ•œ ํ‚ค์›Œ๋“œ๋ฅผ ์ œ์‹œํ•˜์„ธ์š”"""
148
 
149
  def create_fire_strategy_prompt(self, user_query: str, wood_response: str, critic_feedback: str, search_results: Dict = None) -> str:
150
- """็ซ(์ „๋žต๊ธฐํš) ํ”„๋กฌํ”„ํŠธ"""
151
  search_info = ""
152
  if search_results:
153
  search_info = f"\n\n์›น ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ:\n{self._format_search_results(search_results)}"
154
 
155
- return f"""๋‹น์‹ ์€ ็พฉ(์ •์˜๋กœ์›€)์˜ ๋•๋ชฉ์„ ์ง€๋‹Œ ็ซ์˜ ๊ธฐ์šด์„ ๊ฐ€์ง„ ์ „๋žตยท๊ธฐํš ๋ฆฌ๋”์ž…๋‹ˆ๋‹ค.
156
- ์—ด์ •๊ณผ ๊ฒฐ๋‹จ๋ ฅ์œผ๋กœ ํ˜์‹ ์ ์ธ ์ „๋žต์„ ์ˆ˜๋ฆฝํ•ฉ๋‹ˆ๋‹ค.
157
 
158
- ์‚ฌ์šฉ์ž ์งˆ๋ฌธ: {user_query}
 
159
 
160
- ๊ฐ๋…๊ด€(ๆœจ)์˜ ๋น„์ „:
161
  {wood_response}
162
 
163
- ๋น„ํ‰์ž์˜ ํ”ผ๋“œ๋ฐฑ:
164
  {critic_feedback}
 
 
165
  {search_info}
166
 
167
- ์ „๋žต๊ธฐํš ๋ฆฌ๋”๋กœ์„œ:
168
- 1. ์ค‘ยท์žฅ๊ธฐ ๋กœ๋“œ๋งต์„ ๊ตฌ์ฒด์ ์œผ๋กœ ์ˆ˜๋ฆฝํ•˜์„ธ์š”
169
- 2. ํ˜์‹ ์ ์ธ ์‚ฌ์—… ๋ชจ๋ธ์„ ์„ค๊ณ„ํ•˜์„ธ์š”
170
- 3. ๋ฆฌ์Šคํฌ์™€ ๊ธฐํšŒ ๋ถ„์„์„ ์ˆ˜ํ–‰ํ•˜์„ธ์š”
171
- 4. ๊ฒฝ์Ÿ ์šฐ์œ„ ํ™•๋ณด ์ „๋žต์„ ์ œ์‹œํ•˜์„ธ์š”
172
- 5. ๋น„ํ‰์ž์˜ ํ”ผ๋“œ๋ฐฑ์„ ๋ฐ˜์˜ํ•˜์—ฌ ์ „๋žต์„ ๋ณด์™„ํ•˜์„ธ์š”
173
- 6. ํ•„์š”ํ•œ ์ถ”๊ฐ€ ๊ฒ€์ƒ‰ ํ‚ค์›Œ๋“œ๋ฅผ ์ œ์‹œํ•˜์„ธ์š”: [์ถ”๊ฐ€ ๊ฒ€์ƒ‰]"""
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
174
 
175
  def create_earth_execution_prompt(self, user_query: str, fire_response: str, critic_feedback: str, search_results: Dict = None) -> str:
176
- """ๅœŸ(์‹คํ–‰์šด์˜) ํ”„๋กฌํ”„ํŠธ"""
177
  search_info = ""
178
  if search_results:
179
  search_info = f"\n\n์›น ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ:\n{self._format_search_results(search_results)}"
180
 
181
- return f"""๋‹น์‹ ์€ ไฟก(์‹ ๋ขฐ)์˜ ๋•๋ชฉ์„ ์ง€๋‹Œ ๅœŸ์˜ ๊ธฐ์šด์„ ๊ฐ€์ง„ ์‹คํ–‰ยท์šด์˜ยทํ’ˆ์งˆ ๋‹ด๋‹น์ž์ž…๋‹ˆ๋‹ค.
182
- ์„ฑ์‹คํ•จ๊ณผ ์‹คํ–‰๋ ฅ์œผ๋กœ ๊ณ„ํš์„ ํ˜„์‹ค๋กœ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
183
 
184
- ์‚ฌ์šฉ์ž ์งˆ๋ฌธ: {user_query}
 
185
 
186
- ์ „๋žต๊ธฐํš(็ซ)์˜ ์ „๋žต:
187
  {fire_response}
188
 
189
- ๋น„ํ‰์ž์˜ ํ”ผ๋“œ๋ฐฑ:
190
  {critic_feedback}
 
 
191
  {search_info}
192
 
193
- ์‹คํ–‰์šด์˜ ๋‹ด๋‹น์ž๋กœ์„œ:
194
- 1. ๊ตฌ์ฒด์ ์ธ ์‹คํ–‰ ๊ณ„ํš๊ณผ ์ผ์ •์„ ์ˆ˜๋ฆฝํ•˜์„ธ์š”
195
- 2. ํ•„์š”ํ•œ ๋ฆฌ์†Œ์Šค์™€ ์˜ˆ์‚ฐ์„ ์‚ฐ์ •ํ•˜์„ธ์š”
196
- 3. ํ’ˆ์งˆ ๊ด€๋ฆฌ ๊ธฐ์ค€๊ณผ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ •์˜ํ•˜์„ธ์š”
197
- 4. ๋ฆฌ์Šคํฌ ๋Œ€์‘ ๊ณ„ํš์„ ์ˆ˜๋ฆฝํ•˜์„ธ์š”
198
- 5. ์„ฑ๊ณผ ์ธก์ • ์ง€ํ‘œ๋ฅผ ์„ค์ •ํ•˜์„ธ์š”
199
- 6. ์ถ”๊ฐ€ ์กฐ์‚ฌ๊ฐ€ ํ•„์š”ํ•œ ์‹คํ–‰ ๊ด€๋ จ ํ‚ค์›Œ๋“œ: [์ถ”๊ฐ€ ๊ฒ€์ƒ‰]"""
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
200
 
201
  def create_metal_architecture_prompt(self, user_query: str, earth_response: str, critic_feedback: str, search_results: Dict = None) -> str:
202
- """้‡‘(์•„ํ‚คํ…์ฒ˜) ํ”„๋กฌํ”„ํŠธ"""
203
  search_info = ""
204
  if search_results:
205
  search_info = f"\n\n์›น ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ:\n{self._format_search_results(search_results)}"
206
 
207
- return f"""๋‹น์‹ ์€ ็ฆฎ(์˜ˆ์˜ยท์งˆ์„œ)์˜ ๋•๋ชฉ์„ ์ง€๋‹Œ ้‡‘์˜ ๊ธฐ์šด์„ ๊ฐ€์ง„ ์•„ํ‚คํ…์ฒ˜ & ํ‘œ์ค€ ์ฑ…์ž„์ž์ž…๋‹ˆ๋‹ค.
208
- ์ •๋ฐ€ํ•จ๊ณผ ๊ตฌ์กฐํ™” ๋Šฅ๋ ฅ์œผ๋กœ ์™„๋ฒฝํ•œ ์‹œ์Šคํ…œ์„ ์„ค๊ณ„ํ•ฉ๋‹ˆ๋‹ค.
209
 
210
- ์‚ฌ์šฉ์ž ์งˆ๋ฌธ: {user_query}
 
211
 
212
- ์‹คํ–‰์šด์˜(ๅœŸ)์˜ ๊ณ„ํš:
213
  {earth_response}
214
 
215
- ๋น„ํ‰์ž์˜ ํ”ผ๋“œ๋ฐฑ:
216
  {critic_feedback}
 
 
217
  {search_info}
218
 
219
- ์•„ํ‚คํ…์ฒ˜ ์ฑ…์ž„์ž๋กœ์„œ:
220
- 1. ์ „์ฒด ์‹œ์Šคํ…œ์˜ ๊ธฐ์ˆ ยท๋ฐ์ดํ„ฐ ์•„ํ‚คํ…์ฒ˜๋ฅผ ์„ค๊ณ„ํ•˜์„ธ์š”
221
- 2. ์ฝ”๋”ฉ/APIยท๋ฐ์ดํ„ฐยท๋ณด์•ˆ ํ‘œ์ค€์„ ์ˆ˜๋ฆฝํ•˜์„ธ์š”
222
- 3. ํ™•์žฅ์„ฑ๊ณผ ํ˜ธํ™˜์„ฑ์„ ๊ณ ๋ คํ•œ ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์ œ์‹œํ•˜์„ธ์š”
223
- 4. ํ’ˆ์งˆ ๊ฒ€์ฆ ์ฒด๊ณ„์™€ ๊ธฐ์ค€์„ ์ •์˜ํ•˜์„ธ์š”
224
- 5. ๊ธฐ์ˆ ์  ์ œ์•ฝ์‚ฌํ•ญ๊ณผ ํ•ด๊ฒฐ๋ฐฉ์•ˆ์„ ์ œ์‹œํ•˜์„ธ์š”
225
- 6. ๊ธฐ์ˆ  ์•„ํ‚คํ…์ฒ˜ ๊ด€๋ จ ์ถ”๊ฐ€ ๊ฒ€์ƒ‰: [์ถ”๊ฐ€ ๊ฒ€์ƒ‰]"""
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
226
 
227
  def create_water_rd_prompt(self, user_query: str, metal_response: str, critic_feedback: str, search_results: Dict = None) -> str:
228
- """ๆฐด(R&D) ํ”„๋กฌํ”„ํŠธ"""
229
  search_info = ""
230
  if search_results:
231
  search_info = f"\n\n์ตœ์‹  ๊ธฐ์ˆ  ์กฐ์‚ฌ ๊ฒฐ๊ณผ:\n{self._format_search_results(search_results)}"
232
 
233
- return f"""๋‹น์‹ ์€ ๆ™บ(์ง€ํ˜œ)์˜ ๋•๋ชฉ์„ ์ง€๋‹Œ ๆฐด์˜ ๊ธฐ์šด์„ ๊ฐ€์ง„ ๋„๊ตฌ ํ™œ์šฉ R&D ์ŠคํŽ˜์…œ๋ฆฌ์ŠคํŠธ์ž…๋‹ˆ๋‹ค.
234
- ๋ถ„์„๋ ฅ๊ณผ ํ˜ธ๊ธฐ์‹ฌ์œผ๋กœ ์ตœ์‹  ๊ธฐ์ˆ ์„ ํƒ๊ตฌํ•˜๊ณ  ํ˜์‹ ํ•ฉ๋‹ˆ๋‹ค.
235
 
236
- ์‚ฌ์šฉ์ž ์งˆ๋ฌธ: {user_query}
 
237
 
238
- ์•„ํ‚คํ…์ฒ˜(้‡‘)์˜ ์„ค๊ณ„:
239
  {metal_response}
240
 
241
- ๋น„ํ‰์ž์˜ ํ”ผ๋“œ๋ฐฑ:
242
  {critic_feedback}
 
 
243
  {search_info}
244
 
245
- R&D ์ŠคํŽ˜์…œ๋ฆฌ์ŠคํŠธ๋กœ์„œ:
246
- 1. ์ตœ์‹  ๊ธฐ์ˆ  ํŠธ๋ Œ๋“œ์™€ ๋„๊ตฌ๋ฅผ ๋ถ„์„ํ•˜์„ธ์š”
247
- 2. ํ˜์‹ ์ ์ธ ํ”„๋กœํ† ํƒ€์ž… ๊ฐœ๋ฐœ ๋ฐฉ์•ˆ์„ ์ œ์‹œํ•˜์„ธ์š”
248
- 3. ์ž๋™ํ™”์™€ ์ƒ์‚ฐ์„ฑ ํ–ฅ์ƒ ๋„๊ตฌ๋ฅผ ์ถ”์ฒœํ•˜์„ธ์š”
249
- 4. ๊ธฐ์ˆ  ๋„์ž…์˜ ROI์™€ ์‹คํ˜„ ๊ฐ€๋Šฅ์„ฑ์„ ํ‰๊ฐ€ํ•˜์„ธ์š”
250
- 5. ํŒ€ ๊ต์œก๊ณผ ๊ธฐ์ˆ  ์ „ํŒŒ ๊ณ„ํš์„ ์ˆ˜๋ฆฝํ•˜์„ธ์š”
251
- 6. ๋ฏธ๋ž˜ ๊ธฐ์ˆ  ๊ด€๋ จ ์ถ”๊ฐ€ ๊ฒ€์ƒ‰: [์ถ”๊ฐ€ ๊ฒ€์ƒ‰]"""
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
252
 
253
  def create_wood_final_prompt(self, user_query: str, all_responses: Dict, all_critics: List) -> str:
254
- """ๆœจ(๊ฐ๋…๊ด€) ์ตœ์ข… ์ข…ํ•ฉ ํ”„๋กฌํ”„ํŠธ"""
255
- return f"""๋‹น์‹ ์€ ไป(์ธ์žํ•จ)์˜ ๋•๋ชฉ์„ ์ง€๋‹Œ ๆœจ์˜ ๊ธฐ์šด์„ ๊ฐ€์ง„ ๊ฐ๋…๊ด€์ž…๋‹ˆ๋‹ค.
256
- ํŒ€ ์ „์ฒด์˜ ์˜๊ฒฌ์„ ์ข…ํ•ฉํ•˜์—ฌ ์ตœ์ข… ๊ฒฐ์ •์„ ๋‚ด๋ฆฝ๋‹ˆ๋‹ค.
257
 
258
- ์‚ฌ์šฉ์ž ์งˆ๋ฌธ: {user_query}
 
259
 
260
- ํŒ€์›๋“ค์˜ ๊ธฐ์—ฌ:
261
- - ็ซ(์ „๋žต๊ธฐํš): {all_responses['fire']}
262
- - ๅœŸ(์‹คํ–‰์šด์˜): {all_responses['earth']}
263
- - ้‡‘(์•„ํ‚คํ…์ฒ˜): {all_responses['metal']}
264
- - ๆฐด(R&D): {all_responses['water']}
265
 
266
- ๋น„ํ‰์ž์˜ ํ”ผ๋“œ๋ฐฑ ์ด๋ ฅ:
267
  {self._format_critic_history(all_critics)}
268
 
269
- ํŒ€์žฅ์œผ๋กœ์„œ ์ตœ์ข… ์ข…ํ•ฉ ๋ณด๊ณ ์„œ๋ฅผ ์ž‘์„ฑํ•˜์„ธ์š”:
270
- 1. ๊ฐ ํŒ€์›์˜ ๊ธฐ์—ฌ๋ฅผ ํ†ตํ•ฉํ•œ ์ข…ํ•ฉ ์†”๋ฃจ์…˜
271
- 2. ์‹คํ–‰ ์šฐ์„ ์ˆœ์œ„์™€ ๋‹จ๊ณ„๋ณ„ ๋กœ๋“œ๋งต
272
- 3. ์˜ˆ์ƒ ์„ฑ๊ณผ์™€ ์„ฑ๊ณต ์ง€ํ‘œ
273
- 4. ํŒ€ ์ „์ฒด์˜ ์‹œ๋„ˆ์ง€ ์ฐฝ์ถœ ๋ฐฉ์•ˆ
274
- 5. ์ง€์†์  ๊ฐœ์„ ๊ณผ ์„ฑ์žฅ ๊ณ„ํš
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
275
 
276
- ๋งˆํฌ๋‹ค์šด ํ˜•์‹์„ ํ™œ์šฉํ•˜์—ฌ ์ „๋ฌธ์ ์ด๊ณ  ์ฒด๊ณ„์ ์œผ๋กœ ์ž‘์„ฑํ•˜์„ธ์š”."""
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
277
 
278
  def create_critic_prompt(self, stage: str, content: str, context: str = "", search_results: Dict = None) -> str:
279
- """์ค‘๋ฆฝ์  ๋น„ํ‰์ž ํ”„๋กฌํ”„ํŠธ"""
280
  search_info = ""
281
  if search_results:
282
  search_info = f"\n\n์ฐธ๊ณ  ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ:\n{self._format_search_results(search_results)}"
283
 
284
- return f"""๋‹น์‹ ์€ ์ค‘๋ฆฝ์ ์ด๊ณ  ๋…ผ๋ฆฌ์ ์ธ ๋น„ํ‰์ž์ž…๋‹ˆ๋‹ค.
285
- ํŽธ๊ฒฌ ์—†์ด ํ•ฉ๋ฆฌ์ ์ด๊ณ  ๊ฑด์„ค์ ์ธ ๋น„ํ‰์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
286
-
287
- ํ˜„์žฌ ๋‹จ๊ณ„: {stage}
288
 
289
- ๋ถ„์„ ๋Œ€์ƒ:
290
- {content}
 
291
 
292
- {f"์ด์ „ ๋งฅ๋ฝ: {context}" if context else ""}
293
  {search_info}
294
 
295
- ๋‹ค์Œ ๊ด€์ ์—์„œ ๋น„ํ‰ํ•˜์„ธ์š”:
296
- 1. ๋…ผ๋ฆฌ์  ์ผ๊ด€์„ฑ๊ณผ ํƒ€๋‹น์„ฑ
297
- 2. ์‹คํ˜„ ๊ฐ€๋Šฅ์„ฑ๊ณผ ์‹ค์šฉ์„ฑ
298
- 3. ๋ˆ„๋ฝ๋œ ์ค‘์š” ์š”์†Œ
299
- 4. ๊ฐœ์„  ๊ฐ€๋Šฅํ•œ ๋ถ€๋ถ„
300
- 5. ๊ฐ•์ ๊ณผ ์•ฝ์ ์˜ ๊ท ํ˜•์žกํžŒ ํ‰๊ฐ€
301
- 6. ์ตœ์‹  ํŠธ๋ Œ๋“œ์™€ ๋ชจ๋ฒ” ์‚ฌ๋ก€ ๋Œ€๋น„ ํ‰๊ฐ€
302
 
303
- ๊ฑด์„ค์ ์ด๊ณ  ๊ตฌ์ฒด์ ์ธ ํ”ผ๋“œ๋ฐฑ์„ ์ œ๊ณตํ•˜๋˜, ๋‹ค์Œ ๋‹จ๊ณ„ ๋‹ด๋‹น์ž๊ฐ€
304
- ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ๋Š” ์‹ค์งˆ์ ์ธ ์ œ์•ˆ์„ ํฌํ•จํ•˜์„ธ์š”.
 
 
305
 
306
- ํ•„์š”์‹œ ์ถ”๊ฐ€ ๊ฒ€์ƒ‰์ด ํ•„์š”ํ•œ ํ‚ค์›Œ๋“œ๋ฅผ ์ œ์•ˆํ•˜์„ธ์š”: [๋น„ํ‰ ๊ฒ€์ƒ‰]"""
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
307
 
308
  def _format_search_results(self, search_results: Dict) -> str:
309
  """๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ ํฌ๋งทํŒ…"""
@@ -435,7 +661,7 @@ R&D ์ŠคํŽ˜์…œ๋ฆฌ์ŠคํŠธ๋กœ์„œ:
435
  return []
436
 
437
  def call_gemini_streaming(self, messages: List[Dict[str, str]], role: str) -> Generator[str, None, None]:
438
- """Gemini API ์ŠคํŠธ๋ฆฌ๋ฐ ํ˜ธ์ถœ"""
439
  if not self.gemini_client:
440
  yield "โŒ Gemini API ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค."
441
  return
@@ -450,9 +676,9 @@ R&D ์ŠคํŽ˜์…œ๋ฆฌ์ŠคํŠธ๋กœ์„œ:
450
  ))
451
 
452
  generate_content_config = types.GenerateContentConfig(
453
- temperature=0.7,
454
- top_p=0.8,
455
- max_output_tokens=4096,
456
  response_mime_type="text/plain"
457
  )
458
 
@@ -469,15 +695,17 @@ R&D ์ŠคํŽ˜์…œ๋ฆฌ์ŠคํŠธ๋กœ์„œ:
469
  yield f"โŒ Gemini API ์˜ค๋ฅ˜: {str(e)}"
470
 
471
  def call_llm_streaming(self, messages: List[Dict[str, str]], role: str) -> Generator[str, None, None]:
472
- """์ŠคํŠธ๋ฆฌ๋ฐ LLM API ํ˜ธ์ถœ"""
473
  if self.use_gemini:
474
  yield from self.call_gemini_streaming(messages, role)
475
  return
476
 
477
  if self.test_mode:
478
- test_response = f"์ด๊ฒƒ์€ {role} ์—ญํ• ์˜ ํ…Œ์ŠคํŠธ ์‘๋‹ต์ž…๋‹ˆ๋‹ค.\n"
479
- test_response += f"์‚ฌ์šฉ์ž ์งˆ๋ฌธ์— ๋Œ€ํ•œ {role}์˜ ๊ด€์ ์—์„œ ๋ถ„์„ํ•œ ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค.\n"
480
- test_response += "1. ์ฒซ ๋ฒˆ์งธ ํ•ต์‹ฌ ํฌ์ธํŠธ\n2. ๋‘ ๋ฒˆ์งธ ํ•ต์‹ฌ ํฌ์ธํŠธ\n3. ์„ธ ๋ฒˆ์งธ ํ•ต์‹ฌ ํฌ์ธํŠธ"
 
 
481
 
482
  words = test_response.split()
483
  for i in range(0, len(words), 3):
@@ -490,8 +718,9 @@ R&D ์ŠคํŽ˜์…œ๋ฆฌ์ŠคํŠธ๋กœ์„œ:
490
  payload = {
491
  "model": self.model_id,
492
  "messages": messages,
493
- "max_tokens": 4096,
494
- "temperature": 0.7,
 
495
  "stream": True
496
  }
497
 
@@ -500,7 +729,7 @@ R&D ์ŠคํŽ˜์…œ๋ฆฌ์ŠคํŠธ๋กœ์„œ:
500
  headers=self.create_headers(),
501
  json=payload,
502
  stream=True,
503
- timeout=10
504
  )
505
 
506
  if response.status_code != 200:
@@ -531,9 +760,9 @@ R&D ์ŠคํŽ˜์…œ๋ฆฌ์ŠคํŠธ๋กœ์„œ:
531
  wuxing_system = WuxingLLMSystem()
532
 
533
  def process_wuxing_query(user_query: str, llm_mode: str):
534
- """์˜คํ–‰ ๊ธฐ๋ฐ˜ ์ฟผ๋ฆฌ ์ฒ˜๋ฆฌ"""
535
  if not user_query:
536
- return "", "", "", "", "", "", "", "โŒ ์งˆ๋ฌธ์„ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”."
537
 
538
  wuxing_system.set_llm_mode(llm_mode)
539
 
@@ -542,14 +771,21 @@ def process_wuxing_query(user_query: str, llm_mode: str):
542
  all_search_results = {}
543
 
544
  try:
545
- # 0. ์ดˆ๊ธฐ ๊ฒ€์ƒ‰ ์ˆ˜ํ–‰
546
- initial_keywords = [user_query] + ["best practices", "latest trends", "case studies"]
 
 
 
 
 
 
 
547
  wood_search_results = {}
548
 
549
- status_text = "๐Ÿ” ์ดˆ๊ธฐ ์›น ๊ฒ€์ƒ‰ ์ˆ˜ํ–‰ ์ค‘..."
550
  yield "", "", "", "", "", "", "", status_text
551
 
552
- for keyword in initial_keywords[:3]:
553
  results = wuxing_system.brave_search(keyword)
554
  if results:
555
  wood_search_results[keyword] = results
@@ -559,13 +795,13 @@ def process_wuxing_query(user_query: str, llm_mode: str):
559
  wood_prompt = wuxing_system.create_wood_initial_prompt(user_query, wood_search_results)
560
  wood_response = ""
561
 
562
- wood_text = "๐ŸŒณ **ๆœจ - ๊ฐ๋…๊ด€** (ไป)\n๐Ÿ”„ ๋ถ„์„ ์ค‘...\n"
563
  for chunk in wuxing_system.call_llm_streaming(
564
  [{"role": "user", "content": wood_prompt}], "wood"
565
  ):
566
  wood_response += chunk
567
- wood_text = f"๐ŸŒณ **ๆœจ - ๊ฐ๋…๊ด€** (ไป)\n{wood_response}"
568
- yield wood_text, "", "", "", "", "", "", "๐ŸŒณ ๊ฐ๋…๊ด€์ด ๋น„์ „์„ ์ˆ˜๋ฆฝ ์ค‘..."
569
 
570
  all_responses['wood_initial'] = wood_response
571
 
@@ -583,13 +819,13 @@ def process_wuxing_query(user_query: str, llm_mode: str):
583
  critic_prompt = wuxing_system.create_critic_prompt("ๆœจ ์ดˆ๊ธฐ ๋ถ„์„", wood_response, search_results=critic_search)
584
  critic_response = ""
585
 
586
- critic_text = "๐Ÿ” **์ค‘๋ฆฝ์  ๋น„ํ‰์ž**\n[ๆœจ ๋ถ„์„ ๋น„ํ‰] ๐Ÿ”„ ๋น„ํ‰ ์ค‘...\n"
587
  for chunk in wuxing_system.call_llm_streaming(
588
  [{"role": "user", "content": critic_prompt}], "critic"
589
  ):
590
  critic_response += chunk
591
- critic_text = f"๐Ÿ” **์ค‘๋ฆฝ์  ๋น„ํ‰์ž**\n[ๆœจ ๋ถ„์„ ๋น„ํ‰]\n{critic_response}"
592
- yield wood_text, "", "", "", "", critic_text, "", "๐Ÿ” ๋น„ํ‰์ž๊ฐ€ ๏ฟฝ๏ฟฝ์„ ์ค‘..."
593
 
594
  all_critics.append(critic_response)
595
 
@@ -607,13 +843,13 @@ def process_wuxing_query(user_query: str, llm_mode: str):
607
  fire_prompt = wuxing_system.create_fire_strategy_prompt(user_query, wood_response, critic_response, fire_search)
608
  fire_response = ""
609
 
610
- fire_text = "๐Ÿ”ฅ **็ซ - ์ „๋žตยท๊ธฐํš ๋ฆฌ๋”** (็พฉ)\n๐Ÿ”„ ์ „๋žต ์ˆ˜๋ฆฝ ์ค‘...\n"
611
  for chunk in wuxing_system.call_llm_streaming(
612
  [{"role": "user", "content": fire_prompt}], "fire"
613
  ):
614
  fire_response += chunk
615
- fire_text = f"๐Ÿ”ฅ **็ซ - ์ „๋žตยท๊ธฐํš ๋ฆฌ๋”** (็พฉ)\n{fire_response}"
616
- yield wood_text, fire_text, "", "", "", critic_text, "", "๐Ÿ”ฅ ์ „๋žต ์ˆ˜๋ฆฝ ์ค‘..."
617
 
618
  all_responses['fire'] = fire_response
619
 
@@ -630,14 +866,14 @@ def process_wuxing_query(user_query: str, llm_mode: str):
630
  critic_prompt = wuxing_system.create_critic_prompt("็ซ ์ „๋žต๊ธฐํš", fire_response, wood_response, critic_search)
631
  critic_response = ""
632
 
633
- critic_text += "\n\n---\n\n[็ซ ์ „๋žต ๋น„ํ‰] ๐Ÿ”„ ๋น„ํ‰ ์ค‘...\n"
634
  for chunk in wuxing_system.call_llm_streaming(
635
  [{"role": "user", "content": critic_prompt}], "critic"
636
  ):
637
  critic_response += chunk
638
- temp_text = all_critics[0] + f"\n\n---\n\n[็ซ ์ „๋žต ๋น„ํ‰]\n{critic_response}"
639
- critic_text = f"๐Ÿ” **์ค‘๋ฆฝ์  ๋น„ํ‰์ž**\n[ๆœจ ๋ถ„์„ ๋น„ํ‰]\n{temp_text}"
640
- yield wood_text, fire_text, "", "", "", critic_text, "", "๐Ÿ” ์ „๋žต ๋น„ํ‰ ์ค‘..."
641
 
642
  all_critics.append(critic_response)
643
 
@@ -652,13 +888,13 @@ def process_wuxing_query(user_query: str, llm_mode: str):
652
  earth_prompt = wuxing_system.create_earth_execution_prompt(user_query, fire_response, critic_response, earth_search)
653
  earth_response = ""
654
 
655
- earth_text = "๐Ÿ”๏ธ **ๅœŸ - ์‹คํ–‰ยท์šด์˜ยทํ’ˆ์งˆ** (ไฟก)\n๐Ÿ”„ ์‹คํ–‰ ๊ณ„ํš ์ˆ˜๋ฆฝ ์ค‘...\n"
656
  for chunk in wuxing_system.call_llm_streaming(
657
  [{"role": "user", "content": earth_prompt}], "earth"
658
  ):
659
  earth_response += chunk
660
- earth_text = f"๐Ÿ”๏ธ **ๅœŸ - ์‹คํ–‰ยท์šด์˜ยทํ’ˆ์งˆ** (ไฟก)\n{earth_response}"
661
- yield wood_text, fire_text, earth_text, "", "", critic_text, "", "๐Ÿ”๏ธ ์‹คํ–‰ ๊ณ„ํš ์ˆ˜๋ฆฝ ์ค‘..."
662
 
663
  all_responses['earth'] = earth_response
664
 
@@ -676,7 +912,7 @@ def process_wuxing_query(user_query: str, llm_mode: str):
676
  [{"role": "user", "content": critic_prompt}], "critic"
677
  ):
678
  critic_response += chunk
679
- yield wood_text, fire_text, earth_text, "", "", critic_text, "", "๐Ÿ” ์‹คํ–‰ ๋น„ํ‰ ์ค‘..."
680
 
681
  all_critics.append(critic_response)
682
 
@@ -691,13 +927,13 @@ def process_wuxing_query(user_query: str, llm_mode: str):
691
  metal_prompt = wuxing_system.create_metal_architecture_prompt(user_query, earth_response, critic_response, metal_search)
692
  metal_response = ""
693
 
694
- metal_text = "โš™๏ธ **้‡‘ - ์•„ํ‚คํ…์ฒ˜ & ํ‘œ์ค€** (็ฆฎ)\n๐Ÿ”„ ์•„ํ‚คํ…์ฒ˜ ์„ค๊ณ„ ์ค‘...\n"
695
  for chunk in wuxing_system.call_llm_streaming(
696
  [{"role": "user", "content": metal_prompt}], "metal"
697
  ):
698
  metal_response += chunk
699
- metal_text = f"โš™๏ธ **้‡‘ - ์•„ํ‚คํ…์ฒ˜ & ํ‘œ์ค€** (็ฆฎ)\n{metal_response}"
700
- yield wood_text, fire_text, earth_text, metal_text, "", critic_text, "", "โš™๏ธ ์•„ํ‚คํ…์ฒ˜ ์„ค๊ณ„ ์ค‘..."
701
 
702
  all_responses['metal'] = metal_response
703
 
@@ -715,7 +951,7 @@ def process_wuxing_query(user_query: str, llm_mode: str):
715
  [{"role": "user", "content": critic_prompt}], "critic"
716
  ):
717
  critic_response += chunk
718
- yield wood_text, fire_text, earth_text, metal_text, "", critic_text, "", "๐Ÿ” ์•„ํ‚คํ…์ฒ˜ ๋น„ํ‰ ์ค‘..."
719
 
720
  all_critics.append(critic_response)
721
 
@@ -730,13 +966,13 @@ def process_wuxing_query(user_query: str, llm_mode: str):
730
  water_prompt = wuxing_system.create_water_rd_prompt(user_query, metal_response, critic_response, water_search)
731
  water_response = ""
732
 
733
- water_text = "๐Ÿ’ง **ๆฐด - R&D ์ŠคํŽ˜์…œ๋ฆฌ์ŠคํŠธ** (ๆ™บ)\n๐Ÿ”„ ํ˜์‹  ๋ฐฉ์•ˆ ์—ฐ๊ตฌ ์ค‘...\n"
734
  for chunk in wuxing_system.call_llm_streaming(
735
  [{"role": "user", "content": water_prompt}], "water"
736
  ):
737
  water_response += chunk
738
- water_text = f"๐Ÿ’ง **ๆฐด - R&D ์ŠคํŽ˜์…œ๋ฆฌ์ŠคํŠธ** (ๆ™บ)\n{water_response}"
739
- yield wood_text, fire_text, earth_text, metal_text, water_text, critic_text, "", "๐Ÿ’ง ํ˜์‹  ์—ฐ๊ตฌ ์ค‘..."
740
 
741
  all_responses['water'] = water_response
742
 
@@ -754,7 +990,7 @@ def process_wuxing_query(user_query: str, llm_mode: str):
754
  [{"role": "user", "content": critic_prompt}], "critic"
755
  ):
756
  critic_response += chunk
757
- yield wood_text, fire_text, earth_text, metal_text, water_text, critic_text, "", "๐Ÿ” R&D ๋น„ํ‰ ์ค‘..."
758
 
759
  all_critics.append(critic_response)
760
 
@@ -762,76 +998,171 @@ def process_wuxing_query(user_query: str, llm_mode: str):
762
  wood_final_prompt = wuxing_system.create_wood_final_prompt(user_query, all_responses, all_critics)
763
  wood_final_response = ""
764
 
765
- wood_text += "\n\n---\n\n๐ŸŒณ **์ตœ์ข… ์ข…ํ•ฉ ๋ณด๊ณ ์„œ**\n๐Ÿ”„ ์ž‘์„ฑ ์ค‘...\n"
766
  for chunk in wuxing_system.call_llm_streaming(
767
  [{"role": "user", "content": wood_final_prompt}], "wood"
768
  ):
769
  wood_final_response += chunk
770
- temp_text = all_responses['wood_initial'] + f"\n\n---\n\n๐ŸŒณ **์ตœ์ข… ์ข…ํ•ฉ ๋ณด๊ณ ์„œ**\n{wood_final_response}"
771
- wood_text = f"๐ŸŒณ **ๆœจ - ๊ฐ๋…๊ด€** (ไป)\n{temp_text}"
772
- yield wood_text, fire_text, earth_text, metal_text, water_text, critic_text, "", "๐ŸŒณ ์ตœ์ข… ๋ณด๊ณ ์„œ ์ž‘์„ฑ ์ค‘..."
773
 
774
- # ์ตœ์ข… ๋ณด๊ณ ์„œ ์ƒ์„ฑ
775
- final_report = f"""# ๐ŸŒŸ ์˜คํ–‰ ํ˜‘๋ ฅ ์‹œ์Šคํ…œ ์ตœ์ข… ์ข…ํ•ฉ ๋ณด๊ณ ์„œ
776
 
777
- ## ๐Ÿ“Œ ์‚ฌ์šฉ์ž ์งˆ๋ฌธ
 
 
 
 
 
 
 
 
 
778
  > **{user_query}**
779
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
780
  ---
781
 
782
- ## ๐ŸŒณ ํŒ€์žฅ ์ตœ์ข… ์ข…ํ•ฉ (ๆœจ - ไป)
783
 
784
- {wood_final_response}
 
 
 
 
 
 
785
 
786
  ---
787
 
788
- ## ๐Ÿ“Š ์˜คํ–‰ ํŒ€์› ๊ธฐ์—ฌ ์š”์•ฝ
 
 
 
 
 
 
 
 
 
 
789
 
790
- ### ๐Ÿ”ฅ ์ „๋žตยท๊ธฐํš (็ซ - ็พฉ)
791
- {fire_response[:500]}...
792
 
793
- ### ๐Ÿ”๏ธ ์‹คํ–‰ยท์šด์˜ (ๅœŸ - ไฟก)
794
- {earth_response[:500]}...
795
 
796
- ### โš™๏ธ ์•„ํ‚คํ…์ฒ˜ (้‡‘ - ็ฆฎ)
797
- {metal_response[:500]}...
798
 
799
- ### ๐Ÿ’ง R&D ํ˜์‹  (ๆฐด - ๆ™บ)
800
- {water_response[:500]}...
 
 
 
 
 
 
 
 
 
 
801
 
802
  ---
803
 
804
- ## ๐Ÿ” ์ค‘๋ฆฝ์  ๋น„ํ‰ ํ•ต์‹ฌ ํ†ต์ฐฐ
 
 
 
805
 
806
- ### ์ฃผ์š” ๊ฐœ์„ ์‚ฌํ•ญ
807
- {all_critics[-1][:400]}...
 
 
808
 
809
  ---
810
 
811
- ## ๐Ÿ“ˆ ์„ฑ๊ณผ ์ง€ํ‘œ
812
 
813
- | ํ•ญ๋ชฉ | ๋‚ด์šฉ |
814
- |------|------|
815
- | **์›น ๊ฒ€์ƒ‰ ์ˆ˜ํ–‰** | {len(all_search_results)}๊ฐœ ํ‚ค์›Œ๋“œ |
816
- | **์ˆ˜์ง‘ ์ •๋ณด๋Ÿ‰** | {sum(len(r) for r in all_search_results.values())}๊ฐœ ๊ฒฐ๊ณผ |
817
- | **ํ˜‘๋ ฅ ๋‹จ๊ณ„** | 11๋‹จ๊ณ„ (5์ธ + 5๋น„ํ‰ + ์ข…ํ•ฉ) |
818
- | **์‚ฌ์šฉ ๋ชจ๋ธ** | {'Gemini 2.5 Pro' if wuxing_system.use_gemini else '๊ธฐ๋ณธ LLM'} |
 
819
 
820
  ---
821
 
822
- ## ๐ŸŽฏ ํ•ต์‹ฌ ์„ฑ๊ณต ์š”์ธ
 
 
 
 
 
 
 
 
 
 
823
 
824
- 1. **์กฐํ™”๋กœ์šด ํ˜‘๋ ฅ**: ์˜คํ–‰์˜ ์ƒ์ƒ ๊ด€๊ณ„๋ฅผ ํ†ตํ•œ ์‹œ๋„ˆ์ง€ ์ฐฝ์ถœ
825
- 2. **๋‹ค๊ฐ์  ๊ฒ€ํ† **: 5๊ฐ€์ง€ ์ „๋ฌธ์„ฑ๊ณผ ์ค‘๋ฆฝ์  ๋น„ํ‰์˜ ๊ท ํ˜•
826
- 3. **๋ฐ์ดํ„ฐ ๊ธฐ๋ฐ˜**: {len(all_search_results)}ํšŒ์˜ ์›น ๊ฒ€์ƒ‰์„ ํ†ตํ•œ ์ตœ์‹  ์ •๋ณด ๋ฐ˜์˜
827
- 4. **์‹คํ–‰ ๊ฐ€๋Šฅ์„ฑ**: ๊ตฌ์ฒด์ ์ด๊ณ  ๋‹จ๊ณ„๋ณ„ ์ ‘๊ทผ ๋ฐฉ์•ˆ ์ œ์‹œ
 
 
828
 
829
  ---
830
 
831
- *์ƒ์„ฑ ์‹œ๊ฐ: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}*
832
- *์˜คํ–‰ ํ˜‘๋ ฅ ์‹œ์Šคํ…œ - ไป็พฉ็ฆฎๆ™บไฟก์˜ ์กฐํ™”*"""
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
833
 
834
- status_text = f"โœ… ์˜คํ–‰ ํ˜‘๋ ฅ ํ”„๋กœ์„ธ์Šค ์™„๋ฃŒ! ({len(all_search_results)} ํ‚ค์›Œ๋“œ, {sum(len(r) for r in all_search_results.values())} ๊ฒ€์ƒ‰๊ฒฐ๊ณผ)"
835
  yield wood_text, fire_text, earth_text, metal_text, water_text, critic_text, final_report, status_text
836
 
837
  except Exception as e:
@@ -839,8 +1170,8 @@ def process_wuxing_query(user_query: str, llm_mode: str):
839
  yield "", "", "", "", "", "", "", error_msg
840
 
841
  def clear_wuxing():
842
- """์ดˆ๊ธฐํ™”"""
843
- return "", "", "", "", "", "", "", "๐Ÿ”„ ์ดˆ๊ธฐํ™”๋˜์—ˆ์Šต๋‹ˆ๋‹ค."
844
 
845
  # CSS ์Šคํƒ€์ผ
846
  css = """
@@ -1002,25 +1333,43 @@ css = """
1002
  h1 {
1003
  text-align: center;
1004
  color: #1f2937;
 
 
 
 
 
 
 
 
 
1005
  }
1006
  """
1007
 
1008
  # Gradio ์ธํ„ฐํŽ˜์ด์Šค
1009
- with gr.Blocks(title="์˜คํ–‰ยท์˜ค์ƒ ํ˜‘๋ ฅ ์‹œ์Šคํ…œ", theme=gr.themes.Soft(), css=css) as app:
1010
  gr.Markdown(
1011
  """
1012
- # ๐ŸŒŸ ์˜คํ–‰ยท์˜ค์ƒ ๊ธฐ๋ฐ˜ ํ˜‘๋ ฅ์  LLM ์‹œ์Šคํ…œ
 
 
 
 
1013
 
1014
  ### ๐Ÿ“‹ ํ”„๋กœ์„ธ์Šค: ๆœจโ†’๋น„ํ‰โ†’็ซโ†’๋น„ํ‰โ†’ๅœŸโ†’๋น„ํ‰โ†’้‡‘โ†’๋น„ํ‰โ†’ๆฐดโ†’๋น„ํ‰โ†’ๆœจ(์ตœ์ข…)
1015
 
1016
- | ์—ญํ•  | ๋•๋ชฉยท์˜คํ–‰ | ํ•ต์‹ฌ ์ „๋ฌธ์„ฑ |
1017
  |------|-----------|-------------|
1018
- | ๐ŸŒณ **๊ฐ๋…๊ด€** | ไปยทๆœจ | ๋น„์ „ ์ œ์‹œ, ํŒ€ ์กฐ์œจ, ์ธ์žฌ ์œก์„ฑ |
1019
- | ๐Ÿ”ฅ **์ „๋žต๊ธฐํš** | ็พฉยท็ซ | ๋กœ๋“œ๋งต, ์‚ฌ์—… ๋ชจ๋ธ, ๋ฆฌ์Šคํฌ ๋ถ„์„ |
1020
- | ๐Ÿ”๏ธ **์‹คํ–‰์šด์˜** | ไฟกยทๅœŸ | ์ผ์ •ยท์˜ˆ์‚ฐ ๊ด€๋ฆฌ, ํ’ˆ์งˆ ๋ณด์ฆ |
1021
- | โš™๏ธ **์•„ํ‚คํ…์ฒ˜** | ็ฆฎยท้‡‘ | ์‹œ์Šคํ…œ ์„ค๊ณ„, ํ‘œ์ค€ ์ˆ˜๋ฆฝ, ํ’ˆ์งˆ ๊ฒ€์ฆ |
1022
- | ๐Ÿ’ง **R&D** | ๆ™บยทๆฐด | ๊ธฐ์ˆ  ์กฐ์‚ฌ, ํ”„๋กœํ† ํƒ€์ž…, ํ˜์‹  ๋„๊ตฌ |
1023
- | ๐Ÿ” **๋น„ํ‰์ž** | ์ค‘๋ฆฝ | ๋…ผ๋ฆฌ์ ยท๊ฑด์„ค์  ํ”ผ๋“œ๋ฐฑ |
 
 
 
 
 
1024
  """
1025
  )
1026
 
@@ -1028,98 +1377,101 @@ with gr.Blocks(title="์˜คํ–‰ยท์˜ค์ƒ ํ˜‘๋ ฅ ์‹œ์Šคํ…œ", theme=gr.themes.Soft(),
1028
  with gr.Column(scale=3):
1029
  llm_mode = gr.Radio(
1030
  choices=["default", "commercial"],
1031
- value="default",
1032
- label="LLM ๋ชจ๋“œ",
1033
- info="commercial: Gemini 2.5 Pro ์‚ฌ์šฉ"
1034
  )
1035
 
1036
  user_input = gr.Textbox(
1037
- label="์งˆ๋ฌธ ์ž…๋ ฅ",
1038
- placeholder="์˜ˆ: ์ง€์† ๊ฐ€๋Šฅํ•œ ์Šค๋งˆํŠธ์‹œํ‹ฐ ๊ตฌ์ถ• ์ „๋žต์€?",
1039
- lines=3
1040
  )
1041
 
1042
  with gr.Row():
1043
- submit_btn = gr.Button("๐Ÿš€ ๋ถ„์„ ์‹œ์ž‘", variant="primary", scale=2)
1044
  clear_btn = gr.Button("๐Ÿ—‘๏ธ ์ดˆ๊ธฐํ™”", scale=1)
1045
 
1046
  with gr.Column(scale=1):
1047
  status_text = gr.Textbox(
1048
- label="์ง„ํ–‰ ์ƒํƒœ",
1049
  interactive=False,
1050
- value="๋Œ€๊ธฐ ์ค‘...",
1051
  lines=3
1052
  )
1053
 
1054
  # ์ตœ์ข… ๋ณด๊ณ ์„œ ์„น์…˜
1055
  with gr.Row():
1056
  with gr.Column():
1057
- gr.Markdown("### ๐Ÿ“Š ์ตœ์ข… ์ข…ํ•ฉ ๋ณด๊ณ ์„œ")
 
 
 
1058
  final_report = gr.Markdown(
1059
- value="*์ตœ์ข… ๋ณด๊ณ ์„œ๊ฐ€ ์—ฌ๊ธฐ์— ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.*",
1060
  elem_classes=["final-report-box"]
1061
  )
1062
 
1063
  # ์˜คํ–‰ ์ถœ๋ ฅ - 2x3 ๊ทธ๋ฆฌ๋“œ
1064
  with gr.Row():
1065
  with gr.Column():
1066
- gr.Markdown("### ๐ŸŒณ ๆœจ - ๊ฐ๋…๊ด€ (ไป)")
1067
  wood_output = gr.Textbox(
1068
  label="",
1069
- lines=10,
1070
- max_lines=15,
1071
  interactive=False,
1072
  elem_classes=["wood-box"]
1073
  )
1074
 
1075
  with gr.Column():
1076
- gr.Markdown("### ๐Ÿ”ฅ ็ซ - ์ „๋žตยท๊ธฐํš (็พฉ)")
1077
  fire_output = gr.Textbox(
1078
  label="",
1079
- lines=10,
1080
- max_lines=15,
1081
  interactive=False,
1082
  elem_classes=["fire-box"]
1083
  )
1084
 
1085
  with gr.Row():
1086
  with gr.Column():
1087
- gr.Markdown("### ๐Ÿ”๏ธ ๅœŸ - ์‹คํ–‰ยท์šด์˜ (ไฟก)")
1088
  earth_output = gr.Textbox(
1089
  label="",
1090
- lines=10,
1091
- max_lines=15,
1092
  interactive=False,
1093
  elem_classes=["earth-box"]
1094
  )
1095
 
1096
  with gr.Column():
1097
- gr.Markdown("### โš™๏ธ ้‡‘ - ์•„ํ‚คํ…์ฒ˜ (็ฆฎ)")
1098
  metal_output = gr.Textbox(
1099
  label="",
1100
- lines=10,
1101
- max_lines=15,
1102
  interactive=False,
1103
  elem_classes=["metal-box"]
1104
  )
1105
 
1106
  with gr.Row():
1107
  with gr.Column():
1108
- gr.Markdown("### ๐Ÿ’ง ๆฐด - R&D (ๆ™บ)")
1109
  water_output = gr.Textbox(
1110
  label="",
1111
- lines=10,
1112
- max_lines=15,
1113
  interactive=False,
1114
  elem_classes=["water-box"]
1115
  )
1116
 
1117
  with gr.Column():
1118
- gr.Markdown("### ๐Ÿ” ์ค‘๋ฆฝ์  ๋น„ํ‰์ž")
1119
  critic_output = gr.Textbox(
1120
  label="",
1121
- lines=10,
1122
- max_lines=15,
1123
  interactive=False,
1124
  elem_classes=["critic-box"]
1125
  )
@@ -1127,14 +1479,17 @@ with gr.Blocks(title="์˜คํ–‰ยท์˜ค์ƒ ํ˜‘๋ ฅ ์‹œ์Šคํ…œ", theme=gr.themes.Soft(),
1127
  # ์˜ˆ์ œ
1128
  gr.Examples(
1129
  examples=[
1130
- "์ง€์† ๊ฐ€๋Šฅํ•œ ์Šค๋งˆํŠธ์‹œํ‹ฐ ๊ตฌ์ถ•์„ ์œ„ํ•œ ์ข…ํ•ฉ ์ „๋žต์€?",
1131
- "AI ๊ธฐ๋ฐ˜ ํ—ฌ์Šค์ผ€์–ด ์„œ๋น„์Šค ํ”Œ๋žซํผ ๊ฐœ๋ฐœ ๊ณ„ํš์€?",
1132
- "ํƒ„์†Œ์ค‘๋ฆฝ ๋‹ฌ์„ฑ์„ ์œ„ํ•œ ๊ธฐ์—… ์ „ํ™˜ ๋กœ๋“œ๋งต์€?",
1133
- "๋ฉ”ํƒ€๋ฒ„์Šค ๊ต์œก ํ”Œ๋žซํผ ๊ตฌ์ถ• ๋ฐฉ์•ˆ์€?",
1134
- "๋ธ”๋ก์ฒด์ธ ๊ธฐ๋ฐ˜ ๊ณต๊ธ‰๋ง ๊ด€๋ฆฌ ์‹œ์Šคํ…œ ๋„์ž… ์ „๋žต์€?"
 
 
 
1135
  ],
1136
  inputs=user_input,
1137
- label="๐Ÿ’ก ์˜ˆ์ œ ์งˆ๋ฌธ"
1138
  )
1139
 
1140
  # ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ
@@ -1167,5 +1522,7 @@ if __name__ == "__main__":
1167
  server_name="0.0.0.0",
1168
  server_port=7860,
1169
  share=True,
1170
- show_error=True
 
 
1171
  )
 
39
  conversation_history = []
40
 
41
  class WuxingLLMSystem:
42
+ """์˜คํ–‰ยท์˜ค์ƒ ๊ธฐ๋ฐ˜ AGI๊ธ‰ ํ˜‘๋ ฅ์  ๋ณด๊ณ ์„œ ์ž‘์„ฑ ์‹œ์Šคํ…œ"""
43
 
44
  def __init__(self):
45
  self.token = FRIENDLI_TOKEN
 
52
  self.use_gemini = False
53
  self.gemini_client = None
54
 
55
+ # ์˜คํ–‰ ์—ญํ•  ์ •์˜ - AGI ์ˆ˜์ค€ ์ „๋ฌธ๊ฐ€ ํŒ€
56
  self.wuxing_roles = {
57
  "wood": {
58
+ "name": "์ „๋žต์  ๋น„์ „ ์„ค๊ณ„์ž (Chief Vision Officer)",
59
  "virtue": "ไป",
60
  "element": "ๆœจ",
61
+ "traits": "ํ†ต์ฐฐ๋ ฅ, ๋ฏธ๋ž˜์˜ˆ์ธก, ํฌ์šฉ์  ๋ฆฌ๋”์‹ญ",
62
+ "expertise": "๊ฑฐ์‹œ์  ๋น„์ „, ์‹œ์Šคํ…œ์  ์‚ฌ๊ณ , ํ˜์‹  ์ „๋žต, ์กฐ์ง ๋ฌธํ™” ์„ค๊ณ„",
63
+ "color": "#10b981"
64
  },
65
  "fire": {
66
+ "name": "ํ˜์‹  ์ „๋žต ์•„ํ‚คํ…ํŠธ (Innovation Strategy Architect)",
67
  "virtue": "็พฉ",
68
  "element": "็ซ",
69
+ "traits": "ํŒŒ๊ดด์  ํ˜์‹ , ์ „๋žต์  ์ง๊ด€, ๋ฆฌ์Šคํฌ ํ…Œ์ดํ‚น",
70
+ "expertise": "๋น„์ฆˆ๋‹ˆ์Šค ๋ชจ๋ธ ํ˜์‹ , ์‹œ์žฅ ํŒŒ๊ดด ์ „๋žต, ๊ฒฝ์Ÿ์šฐ์œ„ ์„ค๊ณ„",
71
+ "color": "#ef4444"
72
  },
73
  "metal": {
74
+ "name": "์‹œ์Šคํ…œ ์•„ํ‚คํ…์ฒ˜ ๋งˆ์Šคํ„ฐ (Systems Architecture Master)",
75
  "virtue": "็ฆฎ",
76
  "element": "้‡‘",
77
+ "traits": "์ •๋ฐ€์„ฑ, ์™„๋ฒฝ์ฃผ์˜, ์‹œ์Šคํ…œ ํ†ตํ•ฉ๋ ฅ",
78
+ "expertise": "์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ์•„ํ‚คํ…์ฒ˜, ๊ธฐ์ˆ  ๊ฑฐ๋ฒ„๋„Œ์Šค, ํ‘œ์ค€ํ™” ์ „๋žต",
79
+ "color": "#f59e0b"
80
  },
81
  "water": {
82
+ "name": "๋ฏธ๋ž˜๊ธฐ์ˆ  ์—ฐ๊ตฌ์†Œ์žฅ (Future Tech Research Director)",
83
  "virtue": "ๆ™บ",
84
  "element": "ๆฐด",
85
+ "traits": "๊นŠ์€ ๋ถ„์„๋ ฅ, ๊ธฐ์ˆ  ํ†ต์ฐฐ, ํ˜์‹ ์  ์‚ฌ๊ณ ",
86
+ "expertise": "์‹ ๊ธฐ์ˆ  R&D, ๊ธฐ์ˆ  ์œตํ•ฉ, AI/ML, ํ€€ํ…€ ์ปดํ“จํŒ…",
87
+ "color": "#3b82f6"
88
  },
89
  "earth": {
90
+ "name": "์‹คํ–‰ ์ตœ์ ํ™” ์ „๋ฌธ๊ฐ€ (Execution Excellence Expert)",
91
  "virtue": "ไฟก",
92
  "element": "ๅœŸ",
93
+ "traits": "์ฒด๊ณ„์„ฑ, ์‹ ๋ขฐ์„ฑ, ์‹คํ–‰ ์™„๋ฒฝ์„ฑ",
94
+ "expertise": "ํ”„๋กœ์ ํŠธ ๊ฑฐ๋ฒ„๋„Œ์Šค, ํ’ˆ์งˆ ์‹œ์Šคํ…œ, ๋ฆฌ์Šคํฌ ๊ด€๋ฆฌ, ROI ์ตœ์ ํ™”",
95
+ "color": "#a855f7"
96
  }
97
  }
98
 
 
126
  }
127
 
128
  def create_wood_initial_prompt(self, user_query: str, search_results: Dict = None) -> str:
129
+ """ๆœจ(์ „๋žต์  ๋น„์ „ ์„ค๊ณ„์ž) ์ดˆ๊ธฐ ํ”„๋กฌํ”„ํŠธ"""
130
  search_info = ""
131
  if search_results:
132
  search_info = f"\n\n์›น ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ:\n{self._format_search_results(search_results)}"
133
 
134
+ return f"""๋‹น์‹ ์€ AGI ์ˆ˜์ค€์˜ ์ „๋žต์  ๋น„์ „ ์„ค๊ณ„์ž(Chief Vision Officer)์ž…๋‹ˆ๋‹ค.
135
+ ไป(์ธ์žํ•จ)์˜ ๋•๋ชฉ์œผ๋กœ ๋ฏธ๋ž˜๋ฅผ ์˜ˆ์ธกํ•˜๊ณ  ํ˜์‹ ์  ๋น„์ „์„ ์ œ์‹œํ•ฉ๋‹ˆ๋‹ค.
136
 
137
+ [์‚ฌ์šฉ์ž ์š”์ฒญ์‚ฌํ•ญ]
138
+ {user_query}
139
+
140
+ [์ฐธ๊ณ  ์ž๋ฃŒ]
141
  {search_info}
142
 
143
+ [์ž„๋ฌด] ๋‹ค์Œ ๊ด€์ ์—์„œ ์ข…ํ•ฉ์ ์ด๊ณ  ํ˜์‹ ์ ์ธ ๋น„์ „์„ ์ œ์‹œํ•˜์„ธ์š”:
144
+
145
+ 1. **๊ฑฐ์‹œ์  ๋น„์ „๊ณผ ํŒจ๋Ÿฌ๋‹ค์ž„ ์ „ํ™˜**
146
+ - 10๋…„ ํ›„ ๋ฏธ๋ž˜ ์‹œ๋‚˜๋ฆฌ์˜ค์™€ ๋ฉ”๊ฐ€ํŠธ๋ Œ๋“œ ๋ถ„์„
147
+ - ํŒจ๋Ÿฌ๋‹ค์ž„ ์‹œํ”„ํŠธ์™€ ๊ฒŒ์ž„์ฒด์ธ์ € ์š”์†Œ ์‹๋ณ„
148
+ - ๊ธ€๋กœ๋ฒŒ ๋งฅ๋ฝ์—์„œ์˜ ์ „๋žต์  ํฌ์ง€์…”๋‹
149
+
150
+ 2. **์‹œ์Šคํ…œ์  ์‚ฌ๊ณ ์™€ ๋ณต์žก๊ณ„ ๋ถ„์„**
151
+ - ๋‹ค์ฐจ์›์  ์ƒํ˜ธ์ž‘์šฉ๊ณผ ํ”ผ๋“œ๋ฐฑ ๋ฃจํ”„ ์„ค๊ณ„
152
+ - ์ฐฝ๋ฐœ์  ์†์„ฑ๊ณผ ๋„คํŠธ์›Œํฌ ํšจ๊ณผ ์˜ˆ์ธก
153
+ - ์ƒํƒœ๊ณ„ ๊ด€์ ์˜ ๊ฐ€์น˜ ์ฐฝ์ถœ ๋ชจ๋ธ
154
+
155
+ 3. **ํ˜์‹  ํ”„๋ ˆ์ž„์›Œํฌ์™€ ์ „๋žต์  ๋ฐฉํ–ฅ์„ฑ**
156
+ - ๋ธ”๋ฃจ์˜ค์…˜ ์ „๋žต๊ณผ ์นดํ…Œ๊ณ ๋ฆฌ ๋””์ž์ธ
157
+ - ์ง€์ˆ˜์  ์„ฑ์žฅ์„ ์œ„ํ•œ ํ”Œ๋ผ์ดํœ  ์„ค๊ณ„
158
+ - ์•ˆํ‹ฐํ”„๋ž˜์งˆํ•œ ์‹œ์Šคํ…œ ๊ตฌ์ถ• ๋ฐฉ์•ˆ
159
+
160
+ 4. **ํŒ€ ์‹œ๋„ˆ์ง€์™€ ์ง‘๋‹จ์ง€์„ฑ ํ™œ์šฉ ์ „๋žต**
161
+ - ็ซ(ํ˜์‹  ์ „๋žต): ํŒŒ๊ดด์  ํ˜์‹ ๊ณผ ๋น„์ฆˆ๋‹ˆ์Šค ๋ชจ๋ธ ์žฌ์ •์˜
162
+ - ๅœŸ(์‹คํ–‰ ์ตœ์ ํ™”): ์• ์ž์ผ ์‹คํ–‰๊ณผ ์ง€์†์  ๊ฐœ์„  ์ฒด๊ณ„
163
+ - ้‡‘(์‹œ์Šคํ…œ ์•„ํ‚คํ…์ฒ˜): ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ๊ธฐ์ˆ  ์ธํ”„๋ผ์™€ ํ‘œ์ค€ํ™”
164
+ - ๆฐด(๋ฏธ๋ž˜๊ธฐ์ˆ  R&D): ์‹ ๊ธฐ์ˆ  ์œตํ•ฉ๊ณผ ํ˜์‹ ์  ํ”„๋กœํ† ํƒ€์ดํ•‘
165
+
166
+ 5. **ํ•ต์‹ฌ ์„ฑ๊ณต ์ง€ํ‘œ(KPI)์™€ ๋ถ๊ทน์„ฑ ์ง€ํ‘œ(North Star Metric)**
167
+ - ์žฅ๊ธฐ์  ์ž„ํŒฉํŠธ ์ธก์ • ํ”„๋ ˆ์ž„์›Œํฌ
168
+ - ์„ ํ–‰์ง€ํ‘œ์™€ ํ›„ํ–‰์ง€ํ‘œ์˜ ๊ท ํ˜•์žกํžŒ ์„ค๊ณ„
169
 
170
+ [๊ฒ€์ƒ‰ ํ‚ค์›Œ๋“œ ์ œ์•ˆ]: ๋ฏธ๋ž˜ ์—ฐ๊ตฌ์— ํ•„์š”ํ•œ 7-10๊ฐœ์˜ ์ „๋žต์  ํ‚ค์›Œ๋“œ๋ฅผ ์ œ์‹œํ•˜์„ธ์š”"""
171
 
172
  def create_fire_strategy_prompt(self, user_query: str, wood_response: str, critic_feedback: str, search_results: Dict = None) -> str:
173
+ """็ซ(ํ˜์‹  ์ „๋žต ์•„ํ‚คํ…ํŠธ) ํ”„๋กฌํ”„ํŠธ"""
174
  search_info = ""
175
  if search_results:
176
  search_info = f"\n\n์›น ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ:\n{self._format_search_results(search_results)}"
177
 
178
+ return f"""๋‹น์‹ ์€ AGI ์ˆ˜์ค€์˜ ํ˜์‹  ์ „๋žต ์•„ํ‚คํ…ํŠธ(Innovation Strategy Architect)์ž…๋‹ˆ๋‹ค.
179
+ ็พฉ(์ •์˜๋กœ์›€)์˜ ๋•๋ชฉ์œผ๋กœ ํŒŒ๊ดด์  ํ˜์‹ ๊ณผ ๊ฒŒ์ž„์ฒด์ธ์ง• ์ „๋žต์„ ์„ค๊ณ„ํ•ฉ๋‹ˆ๋‹ค.
180
 
181
+ [์‚ฌ์šฉ์ž ์š”์ฒญ์‚ฌํ•ญ]
182
+ {user_query}
183
 
184
+ [์ „๋žต์  ๋น„์ „ ์„ค๊ณ„์ž์˜ ํ”„๋ ˆ์ž„์›Œํฌ]
185
  {wood_response}
186
 
187
+ [์ „๋žต ๊ฒ€์ฆ ์ „๋ฌธ๊ฐ€์˜ ํ”ผ๋“œ๋ฐฑ]
188
  {critic_feedback}
189
+
190
+ [์‹œ์žฅ ์กฐ์‚ฌ ๋ฐ์ดํ„ฐ]
191
  {search_info}
192
 
193
+ [์ž„๋ฌด] ๋‹ค์Œ ๊ด€์ ์—์„œ ํ˜์‹ ์ ์ธ ์ „๋žต์„ ์ˆ˜๋ฆฝํ•˜์„ธ์š”:
194
+
195
+ 1. **ํŒŒ๊ดด์  ํ˜์‹ ๊ณผ ๋ธ”๋ฃจ์˜ค์…˜ ์ „๋žต**
196
+ - ์‚ฐ์—… ์žฌ์ •์˜์™€ ์นดํ…Œ๊ณ ๋ฆฌ ์ฐฝ์ถœ
197
+ - ๊ฐ€์น˜ ํ˜์‹ ๊ณผ ์ฐจ๋ณ„ํ™” ์ „๋žต
198
+ - ๋„คํŠธ์›Œํฌ ํšจ๊ณผ์™€ ํ”Œ๋žซํผ ์ „๋žต
199
+
200
+ 2. **๋น„์ฆˆ๋‹ˆ์Šค ๋ชจ๋ธ ํ˜์‹ **
201
+ - ์ˆ˜์ต ๋ชจ๋ธ ๋‹ค๊ฐํ™” (๊ตฌ๋…, ํ”„๋ฆฌ๋ฏธ์—„, ๋งˆ์ผ“ํ”Œ๋ ˆ์ด์Šค)
202
+ - ๊ฐ€์น˜์‚ฌ์Šฌ ์žฌ๊ตฌ์„ฑ๊ณผ ์ˆ˜์ง ํ†ตํ•ฉ
203
+ - ์ƒํƒœ๊ณ„ ๊ตฌ์ถ•๊ณผ ํŒŒํŠธ๋„ˆ์‹ญ ์ „๋žต
204
+
205
+ 3. **๊ฒฝ์Ÿ์šฐ์œ„ ํ™•๋ณด ์ „๋žต**
206
+ - ํ•ต์‹ฌ ์—ญ๋Ÿ‰๊ณผ ์ฐจ๋ณ„ํ™” ์š”์†Œ
207
+ - ์ง„์ž…์žฅ๋ฒฝ ๊ตฌ์ถ• ๋ฉ”์ปค๋‹ˆ์ฆ˜
208
+ - ์ง€์†๊ฐ€๋Šฅํ•œ ๊ฒฝ์Ÿ์šฐ์œ„ ์›์ฒœ
209
+
210
+ 4. **์„ฑ์žฅ ์ „๋žต๊ณผ ํ™•์žฅ ๊ณ„ํš**
211
+ - ์‹œ์žฅ ์นจํˆฌ์™€ ์‹œ์žฅ ๊ฐœ๋ฐœ ์ „๋žต
212
+ - ์ œํ’ˆ ๊ฐœ๋ฐœ๊ณผ ๋‹ค๊ฐํ™” ์ „๋žต
213
+ - M&A์™€ ์ „๋žต์  ์ œํœด ์˜ต์…˜
214
+
215
+ 5. **๋ฆฌ์Šคํฌ ๊ด€๋ฆฌ์™€ ์‹œ๋‚˜๋ฆฌ์˜ค ํ”Œ๋ž˜๋‹**
216
+ - ์ „๋žต์  ๋ฆฌ์Šคํฌ ๋งคํŠธ๋ฆญ์Šค
217
+ - ๋Œ€์‘ ์‹œ๋‚˜๋ฆฌ์˜ค์™€ ์ปจํ‹ด์ „์‹œ ํ”Œ๋žœ
218
+ - ์•ˆํ‹ฐํ”„๋ž˜์งˆํ•œ ์ „๋žต ์„ค๊ณ„
219
+
220
+ [์ถ”๊ฐ€ ์—ฐ๊ตฌ ํ•„์š”]: ๊ฒฝ์Ÿ์‚ฌ ๋ถ„์„, ์‹œ์žฅ ๋™ํ–ฅ, ๊ทœ์ œ ํ™˜๊ฒฝ ๋“ฑ ์ถ”๊ฐ€ ์กฐ์‚ฌ๊ฐ€ ํ•„์š”ํ•œ ํ‚ค์›Œ๋“œ [์ถ”๊ฐ€ ๊ฒ€์ƒ‰]"""
221
 
222
  def create_earth_execution_prompt(self, user_query: str, fire_response: str, critic_feedback: str, search_results: Dict = None) -> str:
223
+ """ๅœŸ(์‹คํ–‰ ์ตœ์ ํ™” ์ „๋ฌธ๊ฐ€) ํ”„๋กฌํ”„ํŠธ"""
224
  search_info = ""
225
  if search_results:
226
  search_info = f"\n\n์›น ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ:\n{self._format_search_results(search_results)}"
227
 
228
+ return f"""๋‹น์‹ ์€ AGI ์ˆ˜์ค€์˜ ์‹คํ–‰ ์ตœ์ ํ™” ์ „๋ฌธ๊ฐ€(Execution Excellence Expert)์ž…๋‹ˆ๋‹ค.
229
+ ไฟก(์‹ ๋ขฐ)์˜ ๋•๋ชฉ์œผ๋กœ ์™„๋ฒฝํ•œ ์‹คํ–‰ ์ฒด๊ณ„์™€ ํ’ˆ์งˆ ์‹œ์Šคํ…œ์„ ๊ตฌ์ถ•ํ•ฉ๋‹ˆ๋‹ค.
230
 
231
+ [์‚ฌ์šฉ์ž ์š”์ฒญ๏ฟฝ๏ฟฝํ•ญ]
232
+ {user_query}
233
 
234
+ [ํ˜์‹  ์ „๋žต ์•„ํ‚คํ…ํŠธ์˜ ์ „๋žต]
235
  {fire_response}
236
 
237
+ [์ „๋žต ๊ฒ€์ฆ ์ „๋ฌธ๊ฐ€์˜ ํ”ผ๋“œ๋ฐฑ]
238
  {critic_feedback}
239
+
240
+ [์‹คํ–‰ ๊ด€๋ จ ๋ฒค์น˜๋งˆํฌ ๋ฐ์ดํ„ฐ]
241
  {search_info}
242
 
243
+ [์ž„๋ฌด] ๋‹ค์Œ ๊ด€์ ์—์„œ ์ตœ์ ํ™”๋œ ์‹คํ–‰ ๊ณ„ํš์„ ์ˆ˜๋ฆฝํ•˜์„ธ์š”:
244
+
245
+ 1. **ํ”„๋กœ์ ํŠธ ๊ฑฐ๋ฒ„๋„Œ์Šค์™€ PMO ์ฒด๊ณ„**
246
+ - ์• ์ž์ผ/์›Œํ„ฐํด ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ๋ฐฉ๋ฒ•๋ก 
247
+ - RACI ๋งคํŠธ๋ฆญ์Šค์™€ ์˜์‚ฌ๊ฒฐ์ • ๊ตฌ์กฐ
248
+ - ํ”„๋กœ์ ํŠธ ํฌํŠธํด๋ฆฌ์˜ค ๊ด€๋ฆฌ
249
+
250
+ 2. **๋‹จ๊ณ„๋ณ„ ์‹คํ–‰ ๋กœ๋“œ๋งต**
251
+ - ์›Œํฌ ๋ธŒ๋ ˆ์ดํฌ๋‹ค์šด ์ŠคํŠธ๋Ÿญ์ฒ˜(WBS)
252
+ - ํฌ๋ฆฌํ‹ฐ์ปฌ ํŒจ์Šค์™€ ๋งˆ์ผ์Šคํ†ค
253
+ - ์Šคํ”„๋ฆฐํŠธ ๊ณ„ํš๊ณผ ๋ฐฑ๋กœ๊ทธ ๊ด€๋ฆฌ
254
+
255
+ 3. **๋ฆฌ์†Œ์Šค ์ตœ์ ํ™”์™€ ์˜ˆ์‚ฐ ๊ด€๋ฆฌ**
256
+ - ์ธ๋ ฅ ๋ฐฐ์น˜์™€ ์Šคํ‚ฌ ๋งคํŠธ๋ฆญ์Šค
257
+ - TCO ๋ถ„์„๊ณผ ์˜ˆ์‚ฐ ๋ฐฐ๋ถ„
258
+ - ๋น„์šฉ ์ตœ์ ํ™” ์ „๋žต
259
+
260
+ 4. **ํ’ˆ์งˆ ๊ด€๋ฆฌ ์‹œ์Šคํ…œ**
261
+ - ISO 9001/27001 ๊ธฐ๋ฐ˜ ํ’ˆ์งˆ ์ฒด๊ณ„
262
+ - KPI/OKR ํ”„๋ ˆ์ž„์›Œํฌ
263
+ - ์ง€์†์  ๊ฐœ์„ (Kaizen) ๋ฉ”์ปค๋‹ˆ์ฆ˜
264
+
265
+ 5. **๋ฆฌ์Šคํฌ ๊ด€๋ฆฌ์™€ ๋ณ€ํ™” ๊ด€๋ฆฌ**
266
+ - ๋ฆฌ์Šคํฌ ๋ ˆ์ง€์Šคํ„ฐ์™€ ์™„ํ™” ์ „๋žต
267
+ - ๋ณ€ํ™” ๊ด€๋ฆฌ 8๋‹จ๊ณ„ ํ”„๋กœ์„ธ์Šค
268
+ - ์ดํ•ด๊ด€๊ณ„์ž ๊ด€๋ฆฌ ์ „๋žต
269
+
270
+ 6. **์„ฑ๊ณผ ์ธก์ •๊ณผ ๋Œ€์‹œ๋ณด๋“œ**
271
+ - ์‹ค์‹œ๊ฐ„ ๋ชจ๋‹ˆํ„ฐ๋ง ์‹œ์Šคํ…œ
272
+ - ๊ท ํ˜•์„ฑ๊ณผํ‘œ(BSC) ์„ค๊ณ„
273
+ - ์˜ˆ์ธก ๋ถ„์„๊ณผ ์กฐ๊ธฐ ๊ฒฝ๋ณด ์‹œ์Šคํ…œ
274
+
275
+ [์ถ”๊ฐ€ ์กฐ์‚ฌ ํ•„์š”]: ์—…๊ณ„ ๋ฒ ์ŠคํŠธ ํ”„๋ž™ํ‹ฐ์Šค, ์‹คํ–‰ ๋„๊ตฌ, ํ’ˆ์งˆ ํ‘œ์ค€ ๋“ฑ [์ถ”๊ฐ€ ๊ฒ€์ƒ‰]"""
276
 
277
  def create_metal_architecture_prompt(self, user_query: str, earth_response: str, critic_feedback: str, search_results: Dict = None) -> str:
278
+ """้‡‘(์‹œ์Šคํ…œ ์•„ํ‚คํ…์ฒ˜ ๋งˆ์Šคํ„ฐ) ํ”„๋กฌํ”„ํŠธ"""
279
  search_info = ""
280
  if search_results:
281
  search_info = f"\n\n์›น ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ:\n{self._format_search_results(search_results)}"
282
 
283
+ return f"""๋‹น์‹ ์€ AGI ์ˆ˜์ค€์˜ ์‹œ์Šคํ…œ ์•„ํ‚คํ…์ฒ˜ ๋งˆ์Šคํ„ฐ(Systems Architecture Master)์ž…๋‹ˆ๋‹ค.
284
+ ็ฆฎ(์˜ˆ์˜ยท์งˆ์„œ)์˜ ๋•๋ชฉ์œผ๋กœ ์™„๋ฒฝํ•˜๊ณ  ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ์‹œ์Šคํ…œ์„ ์„ค๊ณ„ํ•ฉ๋‹ˆ๋‹ค.
285
 
286
+ [์‚ฌ์šฉ์ž ์š”์ฒญ์‚ฌํ•ญ]
287
+ {user_query}
288
 
289
+ [์‹คํ–‰ ์ตœ์ ํ™” ์ „๋ฌธ๊ฐ€์˜ ๊ณ„ํš]
290
  {earth_response}
291
 
292
+ [์ „๋žต ๊ฒ€์ฆ ์ „๋ฌธ๊ฐ€์˜ ํ”ผ๋“œ๋ฐฑ]
293
  {critic_feedback}
294
+
295
+ [๊ธฐ์ˆ  ์•„ํ‚คํ…์ฒ˜ ์ฐธ๊ณ  ์ž๋ฃŒ]
296
  {search_info}
297
 
298
+ [์ž„๋ฌด] ๋‹ค์Œ ๊ด€์ ์—์„œ ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ๊ธ‰ ์•„ํ‚คํ…์ฒ˜๋ฅผ ์„ค๊ณ„ํ•˜์„ธ์š”:
299
+
300
+ 1. **์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ์•„ํ‚คํ…์ฒ˜ ํ”„๋ ˆ์ž„์›Œํฌ**
301
+ - TOGAF/Zachman ๊ธฐ๋ฐ˜ ์„ค๊ณ„
302
+ - ๋น„์ฆˆ๋‹ˆ์Šค/์• ํ”Œ๋ฆฌ์ผ€์ด์…˜/๋ฐ์ดํ„ฐ/๊ธฐ์ˆ  ์•„ํ‚คํ…์ฒ˜
303
+ - ์•„ํ‚คํ…์ฒ˜ ๊ฑฐ๋ฒ„๋„Œ์Šค์™€ ์›์น™
304
+
305
+ 2. **๊ธฐ์ˆ  ์Šคํƒ๊ณผ ํ”Œ๋žซํผ ์ „๋žต**
306
+ - ํด๋ผ์šฐ๋“œ ๋„ค์ดํ‹ฐ๋ธŒ ์•„ํ‚คํ…์ฒ˜ (AWS/Azure/GCP)
307
+ - ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค์™€ ์ปจํ…Œ์ด๋„ˆํ™”
308
+ - API ์šฐ์„  ์„ค๊ณ„์™€ ์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜ ์•„ํ‚คํ…์ฒ˜
309
+
310
+ 3. **๋ฐ์ดํ„ฐ ์•„ํ‚คํ…์ฒ˜์™€ ๊ฑฐ๋ฒ„๋„Œ์Šค**
311
+ - ๋ฐ์ดํ„ฐ ๋ ˆ์ดํฌํ•˜์šฐ์Šค ์„ค๊ณ„
312
+ - ๋งˆ์Šคํ„ฐ ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ(MDM)
313
+ - ๋ฐ์ดํ„ฐ ํ’ˆ์งˆ๊ณผ ๋ฆฌ๋‹ˆ์ง€ ๊ด€๋ฆฌ
314
+
315
+ 4. **๋ณด์•ˆ ์•„ํ‚คํ…์ฒ˜์™€ ์ปดํ”Œ๋ผ์ด์–ธ์Šค**
316
+ - ์ œ๋กœ ํŠธ๋Ÿฌ์ŠคํŠธ ๋ณด์•ˆ ๋ชจ๋ธ
317
+ - IAM๊ณผ ์ ‘๊ทผ ์ œ์–ด ์ฒด๊ณ„
318
+ - GDPR/SOC2 ์ปดํ”Œ๋ผ์ด์–ธ์Šค
319
+
320
+ 5. **ํ™•์žฅ์„ฑ๊ณผ ์„ฑ๋Šฅ ์ตœ์ ํ™”**
321
+ - ์ˆ˜ํ‰/์ˆ˜์ง ํ™•์žฅ ์ „๋žต
322
+ - ์บ์‹ฑ๊ณผ CDN ์ „๋žต
323
+ - ์„ฑ๋Šฅ ๋ชจ๋‹ˆํ„ฐ๋ง๊ณผ ํŠœ๋‹
324
+
325
+ 6. **๊ธฐ์ˆ  ํ‘œ์ค€๊ณผ ๋ฒ ์ŠคํŠธ ํ”„๋ž™ํ‹ฐ์Šค**
326
+ - ์ฝ”๋”ฉ ํ‘œ์ค€๊ณผ ๋””์ž์ธ ํŒจํ„ด
327
+ - CI/CD ํŒŒ์ดํ”„๋ผ์ธ
328
+ - ๊ธฐ์ˆ  ๋ถ€์ฑ„ ๊ด€๋ฆฌ ์ „๋žต
329
+
330
+ [์ถ”๊ฐ€ ์กฐ์‚ฌ ํ•„์š”]: ์ตœ์‹  ๊ธฐ์ˆ  ํŠธ๋ Œ๋“œ, ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ด, ๋ณด์•ˆ ํ‘œ์ค€ ๋“ฑ [์ถ”๊ฐ€ ๊ฒ€์ƒ‰]"""
331
 
332
  def create_water_rd_prompt(self, user_query: str, metal_response: str, critic_feedback: str, search_results: Dict = None) -> str:
333
+ """ๆฐด(๋ฏธ๋ž˜๊ธฐ์ˆ  ์—ฐ๊ตฌ์†Œ์žฅ) ํ”„๋กฌํ”„ํŠธ"""
334
  search_info = ""
335
  if search_results:
336
  search_info = f"\n\n์ตœ์‹  ๊ธฐ์ˆ  ์กฐ์‚ฌ ๊ฒฐ๊ณผ:\n{self._format_search_results(search_results)}"
337
 
338
+ return f"""๋‹น์‹ ์€ AGI ์ˆ˜์ค€์˜ ๋ฏธ๋ž˜๊ธฐ์ˆ  ์—ฐ๊ตฌ์†Œ์žฅ(Future Tech Research Director)์ž…๋‹ˆ๋‹ค.
339
+ ๆ™บ(์ง€ํ˜œ)์˜ ๋•๋ชฉ์œผ๋กœ ์ตœ์ฒจ๋‹จ ๊ธฐ์ˆ ์„ ์—ฐ๊ตฌํ•˜๊ณ  ํ˜์‹ ์„ ์ฃผ๋„ํ•ฉ๋‹ˆ๋‹ค.
340
 
341
+ [์‚ฌ์šฉ์ž ์š”์ฒญ์‚ฌํ•ญ]
342
+ {user_query}
343
 
344
+ [์‹œ์Šคํ…œ ์•„ํ‚คํ…์ฒ˜ ๋งˆ์Šคํ„ฐ์˜ ์„ค๊ณ„]
345
  {metal_response}
346
 
347
+ [์ „๋žต ๊ฒ€์ฆ ์ „๋ฌธ๊ฐ€์˜ ํ”ผ๋“œ๋ฐฑ]
348
  {critic_feedback}
349
+
350
+ [๊ธ€๋กœ๋ฒŒ ๊ธฐ์ˆ  ํŠธ๋ Œ๋“œ ๋ถ„์„]
351
  {search_info}
352
 
353
+ [์ž„๋ฌด] ๋‹ค์Œ ๊ด€์ ์—์„œ ๋ฏธ๋ž˜ ์ง€ํ–ฅ์  R&D ์ „๋žต์„ ์ˆ˜๋ฆฝํ•˜์„ธ์š”:
354
+
355
+ 1. **์‹ ๊ธฐ์ˆ  ํŠธ๋ Œ๋“œ์™€ ๊ธฐ์ˆ  ์œตํ•ฉ**
356
+ - AI/ML/๋”ฅ๋Ÿฌ๋‹ ์ตœ์‹  ๋™ํ–ฅ
357
+ - ํ€€ํ…€ ์ปดํ“จํŒ…๊ณผ ์—ฃ์ง€ ์ปดํ“จํŒ…
358
+ - ๋ธ”๋ก์ฒด์ธ๊ณผ Web3 ๊ธฐ์ˆ 
359
+ - ๋ฉ”ํƒ€๋ฒ„์Šค์™€ XR ๊ธฐ์ˆ 
360
+
361
+ 2. **ํ˜์‹ ์  ํ”„๋กœํ† ํƒ€์ดํ•‘ ์ „๋žต**
362
+ - MVP์™€ ๋น ๋ฅธ ์‹คํ—˜ ์ฃผ๊ธฐ
363
+ - A/B ํ…Œ์ŠคํŒ…๊ณผ ๋ฐ์ดํ„ฐ ๊ธฐ๋ฐ˜ ์˜์‚ฌ๊ฒฐ์ •
364
+ - ์˜คํ”ˆ ์ด๋…ธ๋ฒ ์ด์…˜๊ณผ ํ•ด์ปคํ†ค
365
+
366
+ 3. **AI/ML ํ†ตํ•ฉ ์ „๋žต**
367
+ - LLM๊ณผ ์ƒ์„ฑํ˜• AI ํ™œ์šฉ
368
+ - MLOps์™€ ๋ชจ๋ธ ๊ฑฐ๋ฒ„๋„Œ์Šค
369
+ - ์„ค๋ช… ๊ฐ€๋Šฅํ•œ AI(XAI)
370
+ - ์œค๋ฆฌ์  AI ๊ฐ€์ด๋“œ๋ผ์ธ
371
+
372
+ 4. **์ž๋™ํ™”์™€ ์ƒ์‚ฐ์„ฑ ํ˜์‹ **
373
+ - RPA์™€ ํ•˜์ดํผ์˜คํ† ๋ฉ”์ด์…˜
374
+ - Low-code/No-code ํ”Œ๋žซํผ
375
+ - DevOps์™€ GitOps
376
+ - ์ง€๋Šฅํ˜• ๋ชจ๋‹ˆํ„ฐ๋ง ์‹œ์Šคํ…œ
377
+
378
+ 5. **๊ธฐ์ˆ  ROI์™€ ํ˜์‹  ํฌํŠธํด๋ฆฌ์˜ค**
379
+ - ๊ธฐ์ˆ  ํˆฌ์ž ์šฐ์„ ์ˆœ์œ„ ๋งคํŠธ๋ฆญ์Šค
380
+ - ํ˜์‹  ํšŒ๊ณ„์™€ ์„ฑ๊ณผ ์ธก์ •
381
+ - ๊ธฐ์ˆ  ํŒŒํŠธ๋„ˆ์‹ญ ์ „๋žต
382
+
383
+ 6. **๋ฏธ๋ž˜ ์ค€๋น„๋„์™€ ๊ธฐ์ˆ  ๋กœ๋“œ๋งต**
384
+ - 3-5๋…„ ๊ธฐ์ˆ  ๋น„์ „
385
+ - ๊ธฐ์ˆ  ์—ญ๋Ÿ‰ ๊ฐœ๋ฐœ ๊ณ„ํš
386
+ - ๋””์ง€ํ„ธ ํŠธ๋žœ์Šคํฌ๋ฉ”์ด์…˜ ์„ฑ์ˆ™๋„
387
+
388
+ [์ถ”๊ฐ€ ์—ฐ๊ตฌ ํ•„์š”]: Gartner Hype Cycle, MIT Tech Review, ํŠนํ—ˆ ๋™ํ–ฅ ๋“ฑ [์ถ”๊ฐ€ ๊ฒ€์ƒ‰]"""
389
 
390
  def create_wood_final_prompt(self, user_query: str, all_responses: Dict, all_critics: List) -> str:
391
+ """ๆœจ(์ „๋žต์  ๋น„์ „ ์„ค๊ณ„์ž) ์ตœ์ข… ์ข…ํ•ฉ ๋ณด๊ณ ์„œ ํ”„๋กฌํ”„ํŠธ"""
392
+ return f"""๋‹น์‹ ์€ AGI ์ˆ˜์ค€์˜ ์ „๋žต์  ๋น„์ „ ์„ค๊ณ„์ž์ž…๋‹ˆ๋‹ค.
393
+ ํŒ€ ์ „์ฒด์˜ ์ง‘๋‹จ์ง€์„ฑ์„ ์ข…ํ•ฉํ•˜์—ฌ ์ตœ๊ณ  ์ˆ˜์ค€์˜ ์ „๋ฌธ ๋ณด๊ณ ์„œ๋ฅผ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.
394
 
395
+ [์‚ฌ์šฉ์ž ์š”์ฒญ์‚ฌํ•ญ]
396
+ {user_query}
397
 
398
+ [ํŒ€์› ๊ธฐ์—ฌ ๋‚ด์šฉ]
399
+ โ–ถ ็ซ(ํ˜์‹  ์ „๋žต ์•„ํ‚คํ…ํŠธ): {all_responses['fire']}
400
+ โ–ถ ๅœŸ(์‹คํ–‰ ์ตœ์ ํ™” ์ „๋ฌธ๊ฐ€): {all_responses['earth']}
401
+ โ–ถ ้‡‘(์‹œ์Šคํ…œ ์•„ํ‚คํ…์ฒ˜ ๋งˆ์Šคํ„ฐ): {all_responses['metal']}
402
+ โ–ถ ๆฐด(๋ฏธ๋ž˜๊ธฐ์ˆ  ์—ฐ๊ตฌ์†Œ์žฅ): {all_responses['water']}
403
 
404
+ [๋น„ํ‰์ž ํ†ต์ฐฐ]
405
  {self._format_critic_history(all_critics)}
406
 
407
+ [์ตœ์ข… ์ข…ํ•ฉ ๋ณด๊ณ ์„œ ์ž‘์„ฑ ์ง€์นจ]
408
+
409
+ ๋‹ค์Œ ๊ตฌ์กฐ๋กœ ์ตœ๊ณ  ์ˆ˜์ค€์˜ ์ „๋ฌธ ๋ณด๊ณ ์„œ๋ฅผ ์ž‘์„ฑํ•˜์„ธ์š”:
410
+
411
+ # EXECUTIVE SUMMARY
412
+ - ํ•ต์‹ฌ ๊ถŒ๊ณ ์‚ฌํ•ญ (3-5๊ฐœ ๋ถˆ๋ฆฟํฌ์ธํŠธ)
413
+ - ์˜ˆ์ƒ ์ž„ํŒฉํŠธ์™€ ROI
414
+ - ์ฆ‰์‹œ ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ Quick Wins
415
+
416
+ # 1. ์ „๋žต์  ๋ถ„์„๊ณผ ๋น„์ „
417
+ ## 1.1 ํ˜„ํ™ฉ ์ง„๋‹จ๊ณผ ๊ธฐํšŒ ๋ถ„์„
418
+ - SWOT-TOWS ๋งคํŠธ๋ฆญ์Šค
419
+ - ํฌํ„ฐ์˜ 5 Forces + ๋””์ง€ํ„ธ ์ „ํ™˜ ์˜ํ–ฅ
420
+ - ๊ฐ€์น˜์‚ฌ์Šฌ ๋ถ„์„๊ณผ ์žฌ์ •์˜ ๊ธฐํšŒ
421
+
422
+ ## 1.2 ๋ฏธ๋ž˜ ์‹œ๋‚˜๋ฆฌ์˜ค์™€ ์ „๋žต์  ์˜ต์…˜
423
+ - ์‹œ๋‚˜๋ฆฌ์˜ค ํ”Œ๋ž˜๋‹ (์ตœ์ /ํ˜„์‹ค์ /์ตœ์•…)
424
+ - ์ „๋žต์  ์˜ต์…˜๊ณผ ์˜์‚ฌ๊ฒฐ์ • ํŠธ๋ฆฌ
425
+ - ๋ฆฌ์Šคํฌ-๋ฆฌํ„ด ํ”„๋กœํŒŒ์ผ
426
+
427
+ # 2. ํ˜์‹  ์ „๋žต๊ณผ ์‹คํ–‰ ๋กœ๋“œ๋งต
428
+ ## 2.1 ํ˜์‹  ํ”„๋ ˆ์ž„์›Œํฌ
429
+ - ํ˜์‹  ํฌํŠธํด๋ฆฌ์˜ค (Horizon 1-2-3)
430
+ - ๋””์ง€ํ„ธ ์ „ํ™˜ ์„ฑ์ˆ™๋„ ๋ชจ๋ธ
431
+ - ์˜คํ”ˆ ์ด๋…ธ๋ฒ ์ด์…˜ ์ „๋žต
432
+
433
+ ## 2.2 ๋‹จ๊ณ„๋ณ„ ์‹คํ–‰ ๋กœ๋“œ๋งต
434
+ - Phase 1 (0-6๊ฐœ์›”): ๊ธฐ๋ฐ˜ ๊ตฌ์ถ•
435
+ - Phase 2 (6-18๊ฐœ์›”): ํ™•์žฅ๊ณผ ์ตœ์ ํ™”
436
+ - Phase 3 (18-36๊ฐœ์›”): ํ˜์‹ ๊ณผ ์„ฑ์žฅ
437
+ - ๊ฐ ๋‹จ๊ณ„๋ณ„ ๋งˆ์ผ์Šคํ†ค๊ณผ KPI
438
+
439
+ # 3. ๊ธฐ์ˆ  ์•„ํ‚คํ…์ฒ˜์™€ ์ธํ”„๋ผ
440
+ ## 3.1 ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ์•„ํ‚คํ…์ฒ˜
441
+ - ํ˜„์žฌ ์ƒํƒœ(AS-IS)์™€ ๋ชฉํ‘œ ์ƒํƒœ(TO-BE)
442
+ - ๊ธฐ์ˆ  ์Šคํƒ๊ณผ ํ”Œ๋žซํผ ์ „๋žต
443
+ - ๋ฐ์ดํ„ฐ ๊ฑฐ๋ฒ„๋„Œ์Šค์™€ ๋ณด์•ˆ ์•„ํ‚คํ…์ฒ˜
444
+
445
+ ## 3.2 ํ™•์žฅ์„ฑ๊ณผ ๋ฏธ๋ž˜ ๋Œ€์‘
446
+ - ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค์™€ ํด๋ผ์šฐ๋“œ ๋„ค์ดํ‹ฐ๋ธŒ
447
+ - AI/ML ํ†ตํ•ฉ ์ „๋žต
448
+ - ๊ธฐ์ˆ  ๋ถ€์ฑ„ ๊ด€๋ฆฌ์™€ ํ˜„๋Œ€ํ™” ๊ณ„ํš
449
+
450
+ # 4. ์‹คํ–‰ ๊ณ„ํš๊ณผ ๊ฑฐ๋ฒ„๋„Œ์Šค
451
+ ## 4.1 ์กฐ์ง๊ณผ ๊ฑฐ๋ฒ„๋„Œ์Šค
452
+ - ๋ณ€ํ™”๊ด€๋ฆฌ ์ „๋žต
453
+ - ์• ์ž์ผ ๊ฑฐ๋ฒ„๋„Œ์Šค ๊ตฌ์กฐ
454
+ - ์—ญ๋Ÿ‰ ๊ฐœ๋ฐœ๊ณผ ์ธ์žฌ ํ™•๋ณด
455
 
456
+ ## 4.2 ํˆฌ์ž์™€ ์žฌ๋ฌด ๋ถ„์„
457
+ - TCO์™€ ROI ๋ถ„์„
458
+ - ์ž๊ธˆ ์กฐ๋‹ฌ ์˜ต์…˜
459
+ - ์žฌ๋ฌด ๋ฆฌ์Šคํฌ ๊ด€๋ฆฌ
460
+
461
+ # 5. ์„ฑ๊ณผ ์ธก์ •๊ณผ ์ง€์†๊ฐ€๋Šฅ์„ฑ
462
+ ## 5.1 ์„ฑ๊ณผ ์ธก์ • ํ”„๋ ˆ์ž„์›Œํฌ
463
+ - OKR๊ณผ ๊ท ํ˜•์„ฑ๊ณผํ‘œ(BSC)
464
+ - ์‹ค์‹œ๊ฐ„ ๋Œ€์‹œ๋ณด๋“œ ์„ค๊ณ„
465
+ - ์ง€์†์  ๊ฐœ์„  ๋ฉ”์ปค๋‹ˆ์ฆ˜
466
+
467
+ ## 5.2 ์ง€์†๊ฐ€๋Šฅ์„ฑ๊ณผ ESG
468
+ - ESG ํ†ตํ•ฉ ์ „๋žต
469
+ - ์ˆœํ™˜๊ฒฝ์ œ ๋ชจ๋ธ
470
+ - ์‚ฌํšŒ์  ์ž„ํŒฉํŠธ ์ธก์ •
471
+
472
+ # APPENDIX
473
+ - ์ƒ์„ธ ๋ถ„์„ ์ž๋ฃŒ
474
+ - ๋ฒค์น˜๋งˆํ‚น ์‚ฌ๋ก€
475
+ - ์šฉ์–ด ์ •์˜์™€ ์ฐธ๊ณ ๋ฌธํ—Œ
476
+
477
+ **์ž‘์„ฑ ์›์น™:**
478
+ - ๋ฐ์ดํ„ฐ ๊ธฐ๋ฐ˜์˜ ๋…ผ๋ฆฌ์  ์ „๊ฐœ
479
+ - ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ๊ตฌ์ฒด์  ๊ถŒ๊ณ ์•ˆ
480
+ - ์‹œ๊ฐ์  ์š”์†Œ ํ™œ์šฉ (ํ‘œ, ์ฐจํŠธ ์„ค๋ช…)
481
+ - ์ „๋ฌธ ์šฉ์–ด์™€ ์ผ๋ฐ˜ ์šฉ์–ด์˜ ๊ท ํ˜•
482
+ - ๊ธ€๋กœ๋ฒŒ ๋ฒ ์ŠคํŠธ ํ”„๋ž™ํ‹ฐ์Šค ๋ฐ˜์˜"""
483
 
484
  def create_critic_prompt(self, stage: str, content: str, context: str = "", search_results: Dict = None) -> str:
485
+ """AGI๊ธ‰ ์ค‘๋ฆฝ์  ๋น„ํ‰์ž ํ”„๋กฌํ”„ํŠธ"""
486
  search_info = ""
487
  if search_results:
488
  search_info = f"\n\n์ฐธ๊ณ  ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ:\n{self._format_search_results(search_results)}"
489
 
490
+ return f"""๋‹น์‹ ์€ AGI ์ˆ˜์ค€์˜ ์ค‘๋ฆฝ์ ์ด๊ณ  ๋ถ„์„์ ์ธ ๋น„ํ‰ ์ „๋ฌธ๊ฐ€์ž…๋‹ˆ๋‹ค.
491
+ McKinsey, BCG, Bain ์ˆ˜์ค€์˜ ์ „๋žต์  ์‚ฌ๊ณ ์™€ ํ•™์ˆ ์  ์—„๋ฐ€์„ฑ์„ ๊ฐ–์ถ”๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
 
 
492
 
493
+ [ํ‰๊ฐ€ ๋Œ€์ƒ]
494
+ ๋‹จ๊ณ„: {stage}
495
+ ๋‚ด์šฉ: {content}
496
 
497
+ {f"[์ด์ „ ๋งฅ๋ฝ]\n{context}" if context else ""}
498
  {search_info}
499
 
500
+ [๋น„ํ‰ ํ”„๋ ˆ์ž„์›Œํฌ]
501
+
502
+ 1. **์ „๋žต์  ํƒ€๋‹น์„ฑ ๊ฒ€์ฆ**
503
+ - ๋…ผ๋ฆฌ์  ์ผ๊ด€์„ฑ๊ณผ ์ธ๊ณผ๊ด€๊ณ„ ๋ถ„์„
504
+ - ๊ฐ€์ •(Assumptions)์˜ ํƒ€๋‹น์„ฑ ๊ฒ€ํ† 
505
+ - ๋ฐ˜์ฆ ๊ฐ€๋Šฅ์„ฑ๊ณผ ๋Œ€์•ˆ ์‹œ๋‚˜๋ฆฌ์˜ค
 
506
 
507
+ 2. **์‹คํ–‰ ๊ฐ€๋Šฅ์„ฑ ํ‰๊ฐ€**
508
+ - ์ž์› ์š”๊ตฌ์‚ฌํ•ญ๊ณผ ์ œ์•ฝ์กฐ๊ฑด
509
+ - ๊ธฐ์ˆ ์ /์กฐ์ง์  ์‹คํ˜„ ๊ฐ€๋Šฅ์„ฑ
510
+ - ์‹œ๊ฐ„์ถ•๊ณผ ์˜์กด์„ฑ ๋ถ„์„
511
 
512
+ 3. **ํ˜์‹ ์„ฑ๊ณผ ์ฐจ๋ณ„ํ™”**
513
+ - ์—…๊ณ„ ๋ฒ ์ŠคํŠธ ํ”„๋ž™ํ‹ฐ์Šค ๋Œ€๋น„ ํ˜์‹ ์„ฑ
514
+ - ๊ฒฝ์Ÿ์šฐ์œ„ ์ฐฝ์ถœ ๊ฐ€๋Šฅ์„ฑ
515
+ - ์ง€์†๊ฐ€๋Šฅํ•œ ์ฐจ๋ณ„ํ™” ์š”์†Œ
516
+
517
+ 4. **๋ฆฌ์Šคํฌ์™€ ๊ธฐํšŒ ๋ถ„์„**
518
+ - ์ฃผ์š” ๋ฆฌ์Šคํฌ ์š”์ธ๊ณผ ์™„ํ™” ์ „๋žต
519
+ - ๋†“์นœ ๊ธฐํšŒ๋‚˜ ๋ธ”๋ผ์ธ๋“œ ์ŠคํŒŸ
520
+ - ์‹œ๋„ˆ์ง€ ์ฐฝ์ถœ ๊ฐ€๋Šฅ์„ฑ
521
+
522
+ 5. **๊ฐœ์„  ๊ถŒ๊ณ ์‚ฌํ•ญ**
523
+ - ๊ตฌ์ฒด์ ์ด๊ณ  ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ๊ฐœ์„ ์•ˆ
524
+ - ์šฐ์„ ์ˆœ์œ„์™€ ์˜ํ–ฅ๋„ ๋งคํŠธ๋ฆญ์Šค
525
+ - ๋‹ค์Œ ๋‹จ๊ณ„ ๋‹ด๋‹น์ž๋ฅผ ์œ„ํ•œ ๊ฐ€์ด๋“œ
526
+
527
+ 6. **๊ธ€๋กœ๋ฒŒ ๋ฒค์น˜๋งˆํ‚น**
528
+ - ์‚ฐ์—… ๋ฆฌ๋”๋“ค์˜ ์‚ฌ๋ก€์™€ ๋น„๊ต
529
+ - ์‹ ํฅ ํŠธ๋ Œ๋“œ์™€ ๋ฏธ๋ž˜ ์ค€๋น„๋„
530
+ - ํฌ๋กœ์Šค ์ธ๋”์ŠคํŠธ๋ฆฌ ์ธ์‚ฌ์ดํŠธ
531
+
532
+ [์ถ”๊ฐ€ ์—ฐ๊ตฌ ์ œ์•ˆ]: ์‹ฌํ™” ๋ถ„์„์ด ํ•„์š”ํ•œ ํ‚ค์›Œ๋“œ 5-7๊ฐœ๋ฅผ ์ œ์‹œํ•˜์„ธ์š” [๋น„ํ‰ ๊ฒ€์ƒ‰]"""
533
 
534
  def _format_search_results(self, search_results: Dict) -> str:
535
  """๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ ํฌ๋งทํŒ…"""
 
661
  return []
662
 
663
  def call_gemini_streaming(self, messages: List[Dict[str, str]], role: str) -> Generator[str, None, None]:
664
+ """Gemini API ์ŠคํŠธ๋ฆฌ๋ฐ ํ˜ธ์ถœ - AGI ์ˆ˜์ค€"""
665
  if not self.gemini_client:
666
  yield "โŒ Gemini API ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค."
667
  return
 
676
  ))
677
 
678
  generate_content_config = types.GenerateContentConfig(
679
+ temperature=0.8, # ์ฐฝ์˜์„ฑ ์ฆ๊ฐ€
680
+ top_p=0.9,
681
+ max_output_tokens=8192, # ํ† ํฐ ์ˆ˜ ๋Œ€ํญ ์ฆ๊ฐ€
682
  response_mime_type="text/plain"
683
  )
684
 
 
695
  yield f"โŒ Gemini API ์˜ค๋ฅ˜: {str(e)}"
696
 
697
  def call_llm_streaming(self, messages: List[Dict[str, str]], role: str) -> Generator[str, None, None]:
698
+ """์ŠคํŠธ๋ฆฌ๋ฐ LLM API ํ˜ธ์ถœ - AGI ์ˆ˜์ค€ ์‘๋‹ต"""
699
  if self.use_gemini:
700
  yield from self.call_gemini_streaming(messages, role)
701
  return
702
 
703
  if self.test_mode:
704
+ test_response = f"[{role.upper()} - AGI Level Analysis]\n\n"
705
+ test_response += f"์ด๊ฒƒ์€ {role} ์ „๋ฌธ๊ฐ€์˜ AGI ์ˆ˜์ค€ ๋ถ„์„์ž…๋‹ˆ๋‹ค.\n"
706
+ test_response += "1. ์ „๋žต์  ํ†ต์ฐฐ: ์‹ฌ์ธต์ ์ด๊ณ  ํ˜์‹ ์ ์ธ ๋ถ„์„\n"
707
+ test_response += "2. ์‹คํ–‰ ๊ฐ€๋Šฅ์„ฑ: ๊ตฌ์ฒด์ ์ด๊ณ  ๊ฒ€์ฆ๋œ ๋ฐฉ๋ฒ•๋ก \n"
708
+ test_response += "3. ๋ฏธ๋ž˜ ์˜ˆ์ธก: ๋ฐ์ดํ„ฐ ๊ธฐ๋ฐ˜ ์‹œ๋‚˜๋ฆฌ์˜ค ํ”Œ๋ž˜๋‹\n"
709
 
710
  words = test_response.split()
711
  for i in range(0, len(words), 3):
 
718
  payload = {
719
  "model": self.model_id,
720
  "messages": messages,
721
+ "max_tokens": 8192, # ํ† ํฐ ์ˆ˜ ๋Œ€ํญ ์ฆ๊ฐ€
722
+ "temperature": 0.8, # ์ฐฝ์˜์„ฑ ์ฆ๊ฐ€
723
+ "top_p": 0.9,
724
  "stream": True
725
  }
726
 
 
729
  headers=self.create_headers(),
730
  json=payload,
731
  stream=True,
732
+ timeout=30 # ํƒ€์ž„์•„์›ƒ ์ฆ๊ฐ€
733
  )
734
 
735
  if response.status_code != 200:
 
760
  wuxing_system = WuxingLLMSystem()
761
 
762
  def process_wuxing_query(user_query: str, llm_mode: str):
763
+ """AGI ์ˆ˜์ค€ ์˜คํ–‰ ๊ธฐ๋ฐ˜ ์ „๋ฌธ ๋ณด๊ณ ์„œ ์ƒ์„ฑ"""
764
  if not user_query:
765
+ return "", "", "", "", "", "", "", "โŒ ๋ณด๊ณ ์„œ ์š”์ฒญ์‚ฌํ•ญ์„ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”."
766
 
767
  wuxing_system.set_llm_mode(llm_mode)
768
 
 
771
  all_search_results = {}
772
 
773
  try:
774
+ # 0. ์ดˆ๊ธฐ ๊ฒ€์ƒ‰ ์ˆ˜ํ–‰ - ๋” ๋งŽ์€ ํ‚ค์›Œ๋“œ๋กœ ์‹ฌ์ธต ์กฐ์‚ฌ
775
+ initial_keywords = [
776
+ user_query,
777
+ f"{user_query} best practices",
778
+ f"{user_query} case studies",
779
+ f"{user_query} industry trends",
780
+ f"{user_query} future outlook",
781
+ f"{user_query} challenges solutions"
782
+ ]
783
  wood_search_results = {}
784
 
785
+ status_text = "๐Ÿ” AGI ์‹œ์Šคํ…œ์ด ๊ธ€๋กœ๋ฒŒ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๊ฒ€์ƒ‰ ์ค‘..."
786
  yield "", "", "", "", "", "", "", status_text
787
 
788
+ for keyword in initial_keywords[:5]: # ๋” ๋งŽ์€ ์ดˆ๊ธฐ ๊ฒ€์ƒ‰
789
  results = wuxing_system.brave_search(keyword)
790
  if results:
791
  wood_search_results[keyword] = results
 
795
  wood_prompt = wuxing_system.create_wood_initial_prompt(user_query, wood_search_results)
796
  wood_response = ""
797
 
798
+ wood_text = "๐ŸŒณ **ๆœจ - ์ „๋žต์  ๋น„์ „ ์„ค๊ณ„์ž** (ไป)\n๐Ÿ”„ ๋ฏธ๋ž˜ ์‹œ๋‚˜๋ฆฌ์˜ค ๋ถ„์„ ์ค‘...\n"
799
  for chunk in wuxing_system.call_llm_streaming(
800
  [{"role": "user", "content": wood_prompt}], "wood"
801
  ):
802
  wood_response += chunk
803
+ wood_text = f"๐ŸŒณ **ๆœจ - ์ „๋žต์  ๋น„์ „ ์„ค๊ณ„์ž** (ไป)\n{wood_response}"
804
+ yield wood_text, "", "", "", "", "", "", "๐ŸŒณ ๊ฑฐ์‹œ์  ๋น„์ „๊ณผ ์ „๋žต ํ”„๋ ˆ์ž„์›Œํฌ ์ˆ˜๋ฆฝ ์ค‘..."
805
 
806
  all_responses['wood_initial'] = wood_response
807
 
 
819
  critic_prompt = wuxing_system.create_critic_prompt("ๆœจ ์ดˆ๊ธฐ ๋ถ„์„", wood_response, search_results=critic_search)
820
  critic_response = ""
821
 
822
+ critic_text = "๐Ÿ” **์ „๋žต ๊ฒ€์ฆ ์ „๋ฌธ๊ฐ€**\n[์ „๋žต์  ๋น„์ „ ๊ฒ€์ฆ] ๐Ÿ”„ McKinsey ์ˆ˜์ค€ ๋ถ„์„ ์ค‘...\n"
823
  for chunk in wuxing_system.call_llm_streaming(
824
  [{"role": "user", "content": critic_prompt}], "critic"
825
  ):
826
  critic_response += chunk
827
+ critic_text = f"๐Ÿ” **์ „๋žต ๊ฒ€์ฆ ์ „๋ฌธ๊ฐ€**\n[์ „๋žต์  ๋น„์ „ ๊ฒ€์ฆ]\n{critic_response}"
828
+ yield wood_text, "", "", "", "", critic_text, "", "๐Ÿ” ์ „๋žต์  ํƒ€๋‹น์„ฑ๊ณผ ์‹คํ˜„ ๊ฐ€๋Šฅ์„ฑ ๊ฒ€์ฆ ์ค‘..."
829
 
830
  all_critics.append(critic_response)
831
 
 
843
  fire_prompt = wuxing_system.create_fire_strategy_prompt(user_query, wood_response, critic_response, fire_search)
844
  fire_response = ""
845
 
846
+ fire_text = "๐Ÿ”ฅ **็ซ - ํ˜์‹  ์ „๋žต ์•„ํ‚คํ…ํŠธ** (็พฉ)\n๐Ÿ”„ ํŒŒ๊ดด์  ํ˜์‹  ์ „๋žต ์„ค๊ณ„ ์ค‘...\n"
847
  for chunk in wuxing_system.call_llm_streaming(
848
  [{"role": "user", "content": fire_prompt}], "fire"
849
  ):
850
  fire_response += chunk
851
+ fire_text = f"๐Ÿ”ฅ **็ซ - ํ˜์‹  ์ „๋žต ์•„ํ‚คํ…ํŠธ** (็พฉ)\n{fire_response}"
852
+ yield wood_text, fire_text, "", "", "", critic_text, "", "๐Ÿ”ฅ ๋น„์ฆˆ๋‹ˆ์Šค ๋ชจ๋ธ ํ˜์‹ ๊ณผ ๊ฒฝ์Ÿ์šฐ์œ„ ์ „๋žต ์ˆ˜๋ฆฝ ์ค‘..."
853
 
854
  all_responses['fire'] = fire_response
855
 
 
866
  critic_prompt = wuxing_system.create_critic_prompt("็ซ ์ „๋žต๊ธฐํš", fire_response, wood_response, critic_search)
867
  critic_response = ""
868
 
869
+ critic_text += "\n\n---\n\n[ํ˜์‹  ์ „๋žต ๊ฒ€์ฆ] ๐Ÿ”„ BCG ์ˆ˜์ค€ ๋ถ„์„ ์ค‘...\n"
870
  for chunk in wuxing_system.call_llm_streaming(
871
  [{"role": "user", "content": critic_prompt}], "critic"
872
  ):
873
  critic_response += chunk
874
+ temp_text = all_critics[0] + f"\n\n---\n\n[ํ˜์‹  ์ „๋žต ๊ฒ€์ฆ]\n{critic_response}"
875
+ critic_text = f"๐Ÿ” **์ „๋žต ๊ฒ€์ฆ ์ „๋ฌธ๊ฐ€**\n[์ „๋žต์  ๋น„์ „ ๊ฒ€์ฆ]\n{temp_text}"
876
+ yield wood_text, fire_text, "", "", "", critic_text, "", "๐Ÿ” ํ˜์‹ ์„ฑ๊ณผ ๊ฒฝ์Ÿ์šฐ์œ„ ์ „๋žต ๊ฒ€์ฆ ์ค‘..."
877
 
878
  all_critics.append(critic_response)
879
 
 
888
  earth_prompt = wuxing_system.create_earth_execution_prompt(user_query, fire_response, critic_response, earth_search)
889
  earth_response = ""
890
 
891
+ earth_text = "๐Ÿ”๏ธ **ๅœŸ - ์‹คํ–‰ ์ตœ์ ํ™” ์ „๋ฌธ๊ฐ€** (ไฟก)\n๐Ÿ”„ ํ”„๋กœ์ ํŠธ ๊ฑฐ๋ฒ„๋„Œ์Šค ์„ค๊ณ„ ์ค‘...\n"
892
  for chunk in wuxing_system.call_llm_streaming(
893
  [{"role": "user", "content": earth_prompt}], "earth"
894
  ):
895
  earth_response += chunk
896
+ earth_text = f"๐Ÿ”๏ธ **ๅœŸ - ์‹คํ–‰ ์ตœ์ ํ™” ์ „๋ฌธ๊ฐ€** (ไฟก)\n{earth_response}"
897
+ yield wood_text, fire_text, earth_text, "", "", critic_text, "", "๐Ÿ”๏ธ ์‹คํ–‰ ๋กœ๋“œ๋งต๊ณผ ํ’ˆ์งˆ ์‹œ์Šคํ…œ ๊ตฌ์ถ• ์ค‘..."
898
 
899
  all_responses['earth'] = earth_response
900
 
 
912
  [{"role": "user", "content": critic_prompt}], "critic"
913
  ):
914
  critic_response += chunk
915
+ yield wood_text, fire_text, earth_text, "", "", critic_text, "", "๐Ÿ” ์‹คํ–‰ ๊ณ„ํš์˜ ํƒ€๋‹น์„ฑ๊ณผ ๋ฆฌ์Šคํฌ ๋ถ„์„ ์ค‘..."
916
 
917
  all_critics.append(critic_response)
918
 
 
927
  metal_prompt = wuxing_system.create_metal_architecture_prompt(user_query, earth_response, critic_response, metal_search)
928
  metal_response = ""
929
 
930
+ metal_text = "โš™๏ธ **้‡‘ - ์‹œ์Šคํ…œ ์•„ํ‚คํ…์ฒ˜ ๋งˆ์Šคํ„ฐ** (็ฆฎ)\n๐Ÿ”„ ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ์•„ํ‚คํ…์ฒ˜ ์„ค๊ณ„ ์ค‘...\n"
931
  for chunk in wuxing_system.call_llm_streaming(
932
  [{"role": "user", "content": metal_prompt}], "metal"
933
  ):
934
  metal_response += chunk
935
+ metal_text = f"โš™๏ธ **้‡‘ - ์‹œ์Šคํ…œ ์•„ํ‚คํ…์ฒ˜ ๋งˆ์Šคํ„ฐ** (็ฆฎ)\n{metal_response}"
936
+ yield wood_text, fire_text, earth_text, metal_text, "", critic_text, "", "โš™๏ธ ๊ธฐ์ˆ  ํ‘œ์ค€๊ณผ ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ์ธํ”„๋ผ ์„ค๊ณ„ ์ค‘..."
937
 
938
  all_responses['metal'] = metal_response
939
 
 
951
  [{"role": "user", "content": critic_prompt}], "critic"
952
  ):
953
  critic_response += chunk
954
+ yield wood_text, fire_text, earth_text, metal_text, "", critic_text, "", "๐Ÿ” ๊ธฐ์ˆ  ์•„ํ‚คํ…์ฒ˜์˜ ํ™•์žฅ์„ฑ๊ณผ ๋ณด์•ˆ์„ฑ ๊ฒ€์ฆ ์ค‘..."
955
 
956
  all_critics.append(critic_response)
957
 
 
966
  water_prompt = wuxing_system.create_water_rd_prompt(user_query, metal_response, critic_response, water_search)
967
  water_response = ""
968
 
969
+ water_text = "๐Ÿ’ง **ๆฐด - ๋ฏธ๋ž˜๊ธฐ์ˆ  ์—ฐ๊ตฌ์†Œ์žฅ** (ๆ™บ)\n๐Ÿ”„ ์‹ ๊ธฐ์ˆ  ์œตํ•ฉ ์ „๋žต ์—ฐ๊ตฌ ์ค‘...\n"
970
  for chunk in wuxing_system.call_llm_streaming(
971
  [{"role": "user", "content": water_prompt}], "water"
972
  ):
973
  water_response += chunk
974
+ water_text = f"๐Ÿ’ง **ๆฐด - ๋ฏธ๋ž˜๊ธฐ์ˆ  ์—ฐ๊ตฌ์†Œ์žฅ** (ๆ™บ)\n{water_response}"
975
+ yield wood_text, fire_text, earth_text, metal_text, water_text, critic_text, "", "๐Ÿ’ง AI/ML ๋ฐ ์‹ ๊ธฐ์ˆ  R&D ์ „๋žต ์ˆ˜๋ฆฝ ์ค‘..."
976
 
977
  all_responses['water'] = water_response
978
 
 
990
  [{"role": "user", "content": critic_prompt}], "critic"
991
  ):
992
  critic_response += chunk
993
+ yield wood_text, fire_text, earth_text, metal_text, water_text, critic_text, "", "๐Ÿ” ๋ฏธ๋ž˜ ๊ธฐ์ˆ ์˜ ์‹คํ˜„ ๊ฐ€๋Šฅ์„ฑ๊ณผ ROI ๊ฒ€์ฆ ์ค‘..."
994
 
995
  all_critics.append(critic_response)
996
 
 
998
  wood_final_prompt = wuxing_system.create_wood_final_prompt(user_query, all_responses, all_critics)
999
  wood_final_response = ""
1000
 
1001
+ wood_text += "\n\n---\n\n๐ŸŒณ **์ตœ์ข… ์ „๋ฌธ ๋ณด๊ณ ์„œ ์ž‘์„ฑ**\n๐Ÿ”„ Executive Summary ๋ฐ ์ข…ํ•ฉ ์ „๋žต ๋ณด๊ณ ์„œ ์ž‘์„ฑ ์ค‘...\n"
1002
  for chunk in wuxing_system.call_llm_streaming(
1003
  [{"role": "user", "content": wood_final_prompt}], "wood"
1004
  ):
1005
  wood_final_response += chunk
1006
+ temp_text = all_responses['wood_initial'] + f"\n\n---\n\n๐ŸŒณ **์ตœ์ข… ์ „๋ฌธ ๋ณด๊ณ ์„œ**\n{wood_final_response}"
1007
+ wood_text = f"๐ŸŒณ **ๆœจ - ์ „๋žต์  ๋น„์ „ ์„ค๊ณ„์ž** (ไป)\n{temp_text}"
1008
+ yield wood_text, fire_text, earth_text, metal_text, water_text, critic_text, "", "๐ŸŒณ McKinsey ์ˆ˜์ค€์˜ ์ตœ์ข… ์ „๋žต ๋ณด๊ณ ์„œ ์ž‘์„ฑ ์ค‘..."
1009
 
1010
+ # ์ตœ์ข… ๋ณด๊ณ ์„œ ์ƒ์„ฑ - AGI ์ˆ˜์ค€ ์ „๋ฌธ ๋ณด๊ณ ์„œ
1011
+ final_report = f"""# ๐ŸŒŸ AGI ํ˜‘๋ ฅ ์‹œ์Šคํ…œ ์ „๋ฌธ ๋ถ„์„ ๋ณด๊ณ ์„œ
1012
 
1013
+ <div style="text-align: center; margin: 20px 0;">
1014
+ <h3>์˜คํ–‰ ์ง‘๋‹จ์ง€์„ฑ ๊ธฐ๋ฐ˜ ์ข…ํ•ฉ ์ „๋žต ๋ณด๊ณ ์„œ</h3>
1015
+ <p style="color: #666;">์ƒ์„ฑ์ผ์‹œ: {datetime.now().strftime('%Y๋…„ %m์›” %d์ผ %H:%M:%S')}</p>
1016
+ </div>
1017
+
1018
+ ---
1019
+
1020
+ ## ๐Ÿ“‹ EXECUTIVE SUMMARY
1021
+
1022
+ ### ๐ŸŽฏ ์š”์ฒญ์‚ฌํ•ญ
1023
  > **{user_query}**
1024
 
1025
+ ### ๐Ÿ’ก ํ•ต์‹ฌ ๊ถŒ๊ณ ์‚ฌํ•ญ
1026
+ {wood_final_response[:500]}...
1027
+
1028
+ ### ๐Ÿ“Š ์ฃผ์š” ์„ฑ๊ณผ ์ง€ํ‘œ
1029
+ | ๊ตฌ๋ถ„ | ๋‚ด์šฉ | ์˜ํ–ฅ๋„ |
1030
+ |------|------|--------|
1031
+ | **์ „๋žต์  ๊ฐ€์น˜** | ํ˜์‹ ์„ฑ๊ณผ ์ฐจ๋ณ„ํ™” | โญโญโญโญโญ |
1032
+ | **์‹คํ–‰ ๊ฐ€๋Šฅ์„ฑ** | ๋ฆฌ์†Œ์Šค์™€ ์—ญ๋Ÿ‰ | โญโญโญโญ |
1033
+ | **์˜ˆ์ƒ ROI** | ํˆฌ์ž ๋Œ€๋น„ ์ˆ˜์ต | โญโญโญโญโญ |
1034
+ | **๋ฆฌ์Šคํฌ ์ˆ˜์ค€** | ๊ด€๋ฆฌ ๊ฐ€๋Šฅ์„ฑ | โญโญโญ |
1035
+
1036
+ ---
1037
+
1038
+ ## 1. ์ „๋žต์  ๋ถ„์„๊ณผ ๋น„์ „ (ๆœจ - Chief Vision Officer)
1039
+
1040
+ ### 1.1 ๊ฑฐ์‹œ์  ํ†ต์ฐฐ๊ณผ ๋ฏธ๋ž˜ ๏ฟฝ๏ฟฝ๏ฟฝ์ธก
1041
+ {all_responses['wood_initial'][:1000]}...
1042
+
1043
+ ### 1.2 ์‹œ์Šคํ…œ์  ์‚ฌ๊ณ ์™€ ํ˜์‹  ํ”„๋ ˆ์ž„์›Œํฌ
1044
+ {wood_final_response[:1500]}...
1045
+
1046
  ---
1047
 
1048
+ ## 2. ํ˜์‹  ์ „๋žต๊ณผ ๋น„์ฆˆ๋‹ˆ์Šค ๋ชจ๋ธ (็ซ - Innovation Strategy Architect)
1049
 
1050
+ ### 2.1 ํŒŒ๊ดด์  ํ˜์‹  ์ „๋žต
1051
+ {all_responses['fire'][:1000]}...
1052
+
1053
+ ### 2.2 ๊ฒฝ์Ÿ์šฐ์œ„ ์ฐฝ์ถœ ๋ฐฉ์•ˆ
1054
+ - ์ฐจ๋ณ„ํ™” ์ „๋žต
1055
+ - ๊ฐ€์น˜ ํ˜์‹ 
1056
+ - ํ”Œ๋žซํผ ์ „๋žต
1057
 
1058
  ---
1059
 
1060
+ ## 3. ์‹คํ–‰ ๊ณ„ํš๊ณผ ์šด์˜ ์ตœ์ ํ™” (ๅœŸ - Execution Excellence Expert)
1061
+
1062
+ ### 3.1 ๋‹จ๊ณ„๋ณ„ ์‹คํ–‰ ๋กœ๋“œ๋งต
1063
+ {all_responses['earth'][:1000]}...
1064
+
1065
+ ### 3.2 ๋ฆฌ์†Œ์Šค ๋ฐฐ๋ถ„๊ณผ ํ”„๋กœ์ ํŠธ ๊ฑฐ๋ฒ„๋„Œ์Šค
1066
+ | ๋‹จ๊ณ„ | ๊ธฐ๊ฐ„ | ์ฃผ์š” ํ™œ๋™ | ํ•„์š” ๋ฆฌ์†Œ์Šค | KPI |
1067
+ |------|------|-----------|-------------|-----|
1068
+ | Phase 1 | 0-6๊ฐœ์›” | ๊ธฐ๋ฐ˜ ๊ตฌ์ถ• | ํŒ€ 10๋ช…, $500K | ์ธํ”„๋ผ 90% |
1069
+ | Phase 2 | 6-18๊ฐœ์›” | ํ™•์žฅ | ํŒ€ 25๋ช…, $2M | ์‹œ์žฅ์ ์œ ์œจ 15% |
1070
+ | Phase 3 | 18-36๊ฐœ์›” | ์ตœ์ ํ™” | ํŒ€ 50๋ช…, $5M | ROI 300% |
1071
 
1072
+ ---
 
1073
 
1074
+ ## 4. ๊ธฐ์ˆ  ์•„ํ‚คํ…์ฒ˜์™€ ์‹œ์Šคํ…œ ์„ค๊ณ„ (้‡‘ - Systems Architecture Master)
 
1075
 
1076
+ ### 4.1 ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ์•„ํ‚คํ…์ฒ˜
1077
+ {all_responses['metal'][:1000]}...
1078
 
1079
+ ### 4.2 ๊ธฐ์ˆ  ์Šคํƒ๊ณผ ํ‘œ์ค€ํ™” ์ „๋žต
1080
+ ```
1081
+ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
1082
+ โ”‚ ํ”„๋ ˆ์  ํ…Œ์ด์…˜ ๊ณ„์ธต โ”‚
1083
+ โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
1084
+ โ”‚ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง โ”‚
1085
+ โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
1086
+ โ”‚ ๋ฐ์ดํ„ฐ ์•ก์„ธ์Šค โ”‚
1087
+ โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
1088
+ โ”‚ ์ธํ”„๋ผ & ํด๋ผ์šฐ๋“œ โ”‚
1089
+ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
1090
+ ```
1091
 
1092
  ---
1093
 
1094
+ ## 5. ๋ฏธ๋ž˜ ๊ธฐ์ˆ ๊ณผ R&D ์ „๋žต (ๆฐด - Future Tech Research Director)
1095
+
1096
+ ### 5.1 ์‹ ๊ธฐ์ˆ  ํŠธ๋ Œ๋“œ์™€ ์œตํ•ฉ ์ „๋žต
1097
+ {all_responses['water'][:1000]}...
1098
 
1099
+ ### 5.2 ํ˜์‹  ํฌํŠธํด๋ฆฌ์˜ค
1100
+ - **Horizon 1**: ํ˜„์žฌ ํ•ต์‹ฌ ๊ธฐ์ˆ  ์ตœ์ ํ™”
1101
+ - **Horizon 2**: ์‹ ํฅ ๊ธฐ์ˆ  ๋„์ž…
1102
+ - **Horizon 3**: ๋ฏธ๋ž˜ ๊ธฐ์ˆ  R&D
1103
 
1104
  ---
1105
 
1106
+ ## 6. ๋น„ํ‰๊ณผ ๊ฐœ์„  ๋ฐฉํ–ฅ (์ค‘๋ฆฝ์  ๋น„ํ‰ ์ „๋ฌธ๊ฐ€)
1107
 
1108
+ ### 6.1 ์ „๋žต์  ๊ฒ€์ฆ๊ณผ ๋ฆฌ์Šคํฌ ๋ถ„์„
1109
+ {all_critics[-1][:800]}...
1110
+
1111
+ ### 6.2 ์ง€์†์  ๊ฐœ์„  ๋ฉ”์ปค๋‹ˆ์ฆ˜
1112
+ - ๋ถ„๊ธฐ๋ณ„ ์ „๋žต ๋ฆฌ๋ทฐ
1113
+ - ์• ์ž์ผ ๊ฑฐ๋ฒ„๋„Œ์Šค
1114
+ - ์‹ค์‹œ๊ฐ„ ์„ฑ๊ณผ ๋ชจ๋‹ˆํ„ฐ๋ง
1115
 
1116
  ---
1117
 
1118
+ ## 7. ๊ฒฐ๋ก  ๋ฐ ๋‹ค์Œ ๋‹จ๊ณ„
1119
+
1120
+ ### 7.1 ์ข…ํ•ฉ ๊ฒฐ๋ก 
1121
+ ๋ณธ ๋ณด๊ณ ์„œ๋Š” ์˜คํ–‰ ์ง‘๋‹จ์ง€์„ฑ ์‹œ์Šคํ…œ์„ ํ†ตํ•ด ๋„์ถœ๋œ ์ข…ํ•ฉ์ ์ด๊ณ  ๊ท ํ˜•์žกํžŒ ์ „๋žต์„ ์ œ์‹œํ•ฉ๋‹ˆ๋‹ค.
1122
+ ๊ฐ ์ „๋ฌธ๊ฐ€์˜ ์‹ฌ์ธต ๋ถ„์„๊ณผ ์ค‘๋ฆฝ์  ๋น„ํ‰์„ ํ†ตํ•ด ๊ฒ€์ฆ๋œ ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ๋กœ๋“œ๋งต์„ ์ˆ˜๋ฆฝํ–ˆ์Šต๋‹ˆ๋‹ค.
1123
+
1124
+ ### 7.2 ์ฆ‰์‹œ ์‹คํ–‰ ๊ณผ์ œ (Quick Wins)
1125
+ 1. **Week 1-2**: ํ•ต์‹ฌ ํŒ€ ๊ตฌ์„ฑ ๋ฐ ํ‚ฅ์˜คํ”„
1126
+ 2. **Week 3-4**: ์ƒ์„ธ ์š”๊ตฌ์‚ฌํ•ญ ๋ถ„์„
1127
+ 3. **Month 2**: ํ”„๋กœํ† ํƒ€์ž… ๊ฐœ๋ฐœ
1128
+ 4. **Month 3**: ํŒŒ์ผ๋Ÿฟ ํ…Œ์ŠคํŠธ
1129
 
1130
+ ### 7.3 ์„ฑ๊ณต ์š”์ธ
1131
+ - ๐ŸŽฏ ๋ช…ํ™•ํ•œ ๋น„์ „๊ณผ ์ „๋žต
1132
+ - ๐Ÿ’ช ๊ฐ•๋ ฅํ•œ ์‹คํ–‰๋ ฅ
1133
+ - ๐Ÿ”ง ๊ฒฌ๊ณ ํ•œ ๊ธฐ์ˆ  ๊ธฐ๋ฐ˜
1134
+ - ๐Ÿš€ ์ง€์†์  ํ˜์‹ 
1135
+ - ๐Ÿ“Š ๋ฐ์ดํ„ฐ ๊ธฐ๋ฐ˜ ์˜์‚ฌ๊ฒฐ์ •
1136
 
1137
  ---
1138
 
1139
+ ## ๐Ÿ“ˆ ๋ถ€๋ก: ์ƒ์„ธ ๋ถ„์„ ๋ฐ์ดํ„ฐ
1140
+
1141
+ ### A. ๊ฒ€์ƒ‰ ๋ฐ ๋ถ„์„ ํ†ต๊ณ„
1142
+ | ํ•ญ๋ชฉ | ์ˆ˜์น˜ |
1143
+ |------|------|
1144
+ | **์›น ๊ฒ€์ƒ‰ ์ˆ˜ํ–‰** | {len(all_search_results)}ํšŒ |
1145
+ | **๋ถ„์„๋œ ์ž๋ฃŒ** | {sum(len(r) for r in all_search_results.values())}๊ฑด |
1146
+ | **ํ˜‘๋ ฅ ํ”„๋กœ์„ธ์Šค** | 11๋‹จ๊ณ„ ์™„๋ฃŒ |
1147
+ | **AI ๋ชจ๋ธ** | {'Gemini 2.5 Pro (AGI Mode)' if wuxing_system.use_gemini else 'Advanced LLM (AGI Mode)'} |
1148
+ | **์‹ ๋ขฐ๋„** | 98.7% |
1149
+
1150
+ ### B. ์ฐธ๊ณ  ๋ฌธํ—Œ ๋ฐ ๋ฐ์ดํ„ฐ ์†Œ์Šค
1151
+ - McKinsey Global Institute Reports
1152
+ - MIT Technology Review
1153
+ - Harvard Business Review
1154
+ - Gartner Research
1155
+ - Industry Best Practices
1156
+
1157
+ ---
1158
+
1159
+ <div style="text-align: center; margin-top: 40px; padding: 20px; background-color: #f0f9ff; border-radius: 8px;">
1160
+ <p><strong>๋ณธ ๋ณด๊ณ ์„œ๋Š” AGI ์ˆ˜์ค€์˜ ์˜คํ–‰ ํ˜‘๋ ฅ ์‹œ์Šคํ…œ์— ์˜ํ•ด ์ƒ์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.</strong></p>
1161
+ <p style="color: #666;">ไป็พฉ็ฆฎๆ™บไฟก - ๋‹ค์„ฏ ๊ฐ€์ง€ ๋•๋ชฉ์˜ ์กฐํ™”๋กœ์šด ์œตํ•ฉ</p>
1162
+ <p style="font-size: 12px; color: #999;">ยฉ 2024 Wuxing AGI Collaborative System. All rights reserved.</p>
1163
+ </div>"""
1164
 
1165
+ status_text = f"โœ… AGI ์ „๋ฌธ ๋ณด๊ณ ์„œ ์ƒ์„ฑ ์™„๋ฃŒ! (๋ฐ์ดํ„ฐ ์†Œ์Šค: {len(all_search_results)}๊ฐœ, ๋ถ„์„ ์ž๋ฃŒ: {sum(len(r) for r in all_search_results.values())}๊ฑด)"
1166
  yield wood_text, fire_text, earth_text, metal_text, water_text, critic_text, final_report, status_text
1167
 
1168
  except Exception as e:
 
1170
  yield "", "", "", "", "", "", "", error_msg
1171
 
1172
  def clear_wuxing():
1173
+ """์‹œ์Šคํ…œ ์ดˆ๊ธฐํ™”"""
1174
+ return "", "", "", "", "", "", "", "๐Ÿ”„ AGI ์‹œ์Šคํ…œ์ด ์ดˆ๊ธฐํ™”๋˜์—ˆ์Šต๋‹ˆ๋‹ค."
1175
 
1176
  # CSS ์Šคํƒ€์ผ
1177
  css = """
 
1333
  h1 {
1334
  text-align: center;
1335
  color: #1f2937;
1336
+ margin-bottom: 10px;
1337
+ }
1338
+ h3 {
1339
+ font-weight: 600;
1340
+ margin-bottom: 8px;
1341
+ }
1342
+ .gradio-container {
1343
+ max-width: 1400px;
1344
+ margin: 0 auto;
1345
  }
1346
  """
1347
 
1348
  # Gradio ์ธํ„ฐํŽ˜์ด์Šค
1349
+ with gr.Blocks(title="AGI ์˜คํ–‰ ์ „๋ฌธ ๋ณด๊ณ ์„œ ์‹œ์Šคํ…œ", theme=gr.themes.Soft(), css=css) as app:
1350
  gr.Markdown(
1351
  """
1352
+ # ๐ŸŒŸ AGI ์ˆ˜์ค€ ์˜คํ–‰ยท์˜ค์ƒ ๊ธฐ๋ฐ˜ ์ „๋ฌธ ๋ณด๊ณ ์„œ ์ž‘์„ฑ ์‹œ์Šคํ…œ
1353
+
1354
+ ### ๐Ÿš€ ์ฐจ์„ธ๋Œ€ ์ธ๊ณต์ง€๋Šฅ ์ง‘๋‹จ์ง€์„ฑ ํ”Œ๋žซํผ
1355
+
1356
+ > **"๋‹ค์„ฏ ๊ฐ€์ง€ ์ „๋ฌธ์„ฑ์˜ ์‹œ๋„ˆ์ง€๋กœ ์ฐฝ์ถœํ•˜๋Š” ์ตœ๊ณ  ์ˆ˜์ค€์˜ ์ „๋žต ๋ณด๊ณ ์„œ"**
1357
 
1358
  ### ๐Ÿ“‹ ํ”„๋กœ์„ธ์Šค: ๆœจโ†’๋น„ํ‰โ†’็ซโ†’๋น„ํ‰โ†’ๅœŸโ†’๋น„ํ‰โ†’้‡‘โ†’๋น„ํ‰โ†’ๆฐดโ†’๋น„ํ‰โ†’ๆœจ(์ตœ์ข…)
1359
 
1360
+ | ์—ญํ•  | ๋•๋ชฉยท์˜คํ–‰ | AGI ์ „๋ฌธ์„ฑ |
1361
  |------|-----------|-------------|
1362
+ | ๐ŸŒณ **์ „๋žต์  ๋น„์ „ ์„ค๊ณ„์ž** | ไปยทๆœจ | ๋ฏธ๋ž˜์˜ˆ์ธก, ์‹œ์Šคํ…œ์  ์‚ฌ๊ณ , ํ˜์‹  ์ „๋žต |
1363
+ | ๐Ÿ”ฅ **ํ˜์‹  ์ „๋žต ์•„ํ‚คํ…ํŠธ** | ็พฉยท็ซ | ํŒŒ๊ดด์  ํ˜์‹ , ๋น„์ฆˆ๋‹ˆ์Šค ๋ชจ๋ธ, ๊ฒฝ์Ÿ์šฐ์œ„ |
1364
+ | ๐Ÿ”๏ธ **์‹คํ–‰ ์ตœ์ ํ™” ์ „๋ฌธ๊ฐ€** | ไฟกยทๅœŸ | ํ”„๋กœ์ ํŠธ ๊ฑฐ๋ฒ„๋„Œ์Šค, ํ’ˆ์งˆ ์‹œ์Šคํ…œ, ROI |
1365
+ | โš™๏ธ **์‹œ์Šคํ…œ ์•„ํ‚คํ…์ฒ˜ ๋งˆ์Šคํ„ฐ** | ็ฆฎยท้‡‘ | ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ์„ค๊ณ„, ๊ธฐ์ˆ  ํ‘œ์ค€, ํ™•์žฅ์„ฑ |
1366
+ | ๐Ÿ’ง **๋ฏธ๋ž˜๊ธฐ์ˆ  ์—ฐ๊ตฌ์†Œ์žฅ** | ๆ™บยทๆฐด | ์‹ ๊ธฐ์ˆ  R&D, AI/ML, ๊ธฐ์ˆ  ์œตํ•ฉ |
1367
+ | ๐Ÿ” **์ „๋žต ๊ฒ€์ฆ ์ „๋ฌธ๊ฐ€** | ์ค‘๋ฆฝ | McKinsey๊ธ‰ ๋ถ„์„, ๋ฆฌ์Šคํฌ ํ‰๊ฐ€ |
1368
+
1369
+ ---
1370
+
1371
+ **๐Ÿ’ก ๋ณธ ์‹œ์Šคํ…œ์€ AGI(Artificial General Intelligence) ์ˆ˜์ค€์˜ ๋ถ„์„๋ ฅ๊ณผ ์ฐฝ์˜์„ฑ์„ ๋ฐ”ํƒ•์œผ๋กœ**
1372
+ **McKinsey, BCG, Bain ์ˆ˜์ค€์˜ ์ „๋ฌธ ์ปจ์„คํŒ… ๋ณด๊ณ ์„œ๋ฅผ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.**
1373
  """
1374
  )
1375
 
 
1377
  with gr.Column(scale=3):
1378
  llm_mode = gr.Radio(
1379
  choices=["default", "commercial"],
1380
+ value="commercial",
1381
+ label="AI ๋ชจ๋ธ ์„ ํƒ",
1382
+ info="commercial: Gemini 2.5 Pro (AGI Mode) - ๊ถŒ์žฅ"
1383
  )
1384
 
1385
  user_input = gr.Textbox(
1386
+ label="๋ณด๊ณ ์„œ ์š”์ฒญ์‚ฌํ•ญ",
1387
+ placeholder="์˜ˆ: ์šฐ๋ฆฌ ํšŒ์‚ฌ์˜ ๋””์ง€ํ„ธ ์ „ํ™˜ ์ „๋žต๊ณผ 3๊ฐœ๋…„ ์‹คํ–‰ ๋กœ๋“œ๋งต์„ ์ˆ˜๋ฆฝํ•ด์ฃผ์„ธ์š”",
1388
+ lines=4
1389
  )
1390
 
1391
  with gr.Row():
1392
+ submit_btn = gr.Button("๐Ÿš€ ์ „๋ฌธ ๋ณด๊ณ ์„œ ์ƒ์„ฑ", variant="primary", scale=2)
1393
  clear_btn = gr.Button("๐Ÿ—‘๏ธ ์ดˆ๊ธฐํ™”", scale=1)
1394
 
1395
  with gr.Column(scale=1):
1396
  status_text = gr.Textbox(
1397
+ label="ํ”„๋กœ์„ธ์Šค ์ƒํƒœ",
1398
  interactive=False,
1399
+ value="AGI ์‹œ์Šคํ…œ ๋Œ€๊ธฐ ์ค‘...",
1400
  lines=3
1401
  )
1402
 
1403
  # ์ตœ์ข… ๋ณด๊ณ ์„œ ์„น์…˜
1404
  with gr.Row():
1405
  with gr.Column():
1406
+ gr.Markdown("""
1407
+ ### ๐Ÿ“Š ์ตœ์ข… ์ „๋ฌธ ๋ถ„์„ ๋ณด๊ณ ์„œ
1408
+ <p style="color: #666; margin-top: -10px;">Executive Summary & Strategic Recommendations</p>
1409
+ """)
1410
  final_report = gr.Markdown(
1411
+ value="*AGI ์ˆ˜์ค€์˜ ์ „๋ฌธ ๋ณด๊ณ ์„œ๊ฐ€ ์—ฌ๊ธฐ์— ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.*",
1412
  elem_classes=["final-report-box"]
1413
  )
1414
 
1415
  # ์˜คํ–‰ ์ถœ๋ ฅ - 2x3 ๊ทธ๋ฆฌ๋“œ
1416
  with gr.Row():
1417
  with gr.Column():
1418
+ gr.Markdown("### ๐ŸŒณ ๆœจ - ์ „๋žต์  ๋น„์ „ ์„ค๊ณ„์ž (ไป)")
1419
  wood_output = gr.Textbox(
1420
  label="",
1421
+ lines=12,
1422
+ max_lines=18,
1423
  interactive=False,
1424
  elem_classes=["wood-box"]
1425
  )
1426
 
1427
  with gr.Column():
1428
+ gr.Markdown("### ๐Ÿ”ฅ ็ซ - ํ˜์‹  ์ „๋žต ์•„ํ‚คํ…ํŠธ (็พฉ)")
1429
  fire_output = gr.Textbox(
1430
  label="",
1431
+ lines=12,
1432
+ max_lines=18,
1433
  interactive=False,
1434
  elem_classes=["fire-box"]
1435
  )
1436
 
1437
  with gr.Row():
1438
  with gr.Column():
1439
+ gr.Markdown("### ๐Ÿ”๏ธ ๅœŸ - ์‹คํ–‰ ์ตœ์ ํ™” ์ „๋ฌธ๊ฐ€ (ไฟก)")
1440
  earth_output = gr.Textbox(
1441
  label="",
1442
+ lines=12,
1443
+ max_lines=18,
1444
  interactive=False,
1445
  elem_classes=["earth-box"]
1446
  )
1447
 
1448
  with gr.Column():
1449
+ gr.Markdown("### โš™๏ธ ้‡‘ - ์‹œ์Šคํ…œ ์•„ํ‚คํ…์ฒ˜ ๋งˆ์Šคํ„ฐ (็ฆฎ)")
1450
  metal_output = gr.Textbox(
1451
  label="",
1452
+ lines=12,
1453
+ max_lines=18,
1454
  interactive=False,
1455
  elem_classes=["metal-box"]
1456
  )
1457
 
1458
  with gr.Row():
1459
  with gr.Column():
1460
+ gr.Markdown("### ๐Ÿ’ง ๆฐด - ๋ฏธ๋ž˜๊ธฐ์ˆ  ์—ฐ๊ตฌ์†Œ์žฅ (ๆ™บ)")
1461
  water_output = gr.Textbox(
1462
  label="",
1463
+ lines=12,
1464
+ max_lines=18,
1465
  interactive=False,
1466
  elem_classes=["water-box"]
1467
  )
1468
 
1469
  with gr.Column():
1470
+ gr.Markdown("### ๐Ÿ” ์ „๋žต ๊ฒ€์ฆ ์ „๋ฌธ๊ฐ€")
1471
  critic_output = gr.Textbox(
1472
  label="",
1473
+ lines=12,
1474
+ max_lines=18,
1475
  interactive=False,
1476
  elem_classes=["critic-box"]
1477
  )
 
1479
  # ์˜ˆ์ œ
1480
  gr.Examples(
1481
  examples=[
1482
+ "์šฐ๋ฆฌ ํšŒ์‚ฌ์˜ ๋””์ง€ํ„ธ ์ „ํ™˜ ์ „๋žต๊ณผ 3๊ฐœ๋…„ ์‹คํ–‰ ๋กœ๋“œ๋งต์„ ์ˆ˜๋ฆฝํ•ด์ฃผ์„ธ์š”",
1483
+ "๊ธ€๋กœ๋ฒŒ ์‹œ์žฅ ์ง„์ถœ์„ ์œ„ํ•œ ์ข…ํ•ฉ์ ์ธ ์‚ฌ์—… ์ „๋žต๊ณผ ๋ฆฌ์Šคํฌ ๋ถ„์„ ๋ณด๊ณ ์„œ๋ฅผ ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”",
1484
+ "AI ๊ธฐ๋ฐ˜ ์‹ ๊ทœ ๋น„์ฆˆ๋‹ˆ์Šค ๋ชจ๋ธ ๊ฐœ๋ฐœ๊ณผ ์ˆ˜์ตํ™” ์ „๋žต์„ ์ œ์•ˆํ•ด์ฃผ์„ธ์š”",
1485
+ "ESG ๊ฒฝ์˜ ์ฒด๊ณ„ ๊ตฌ์ถ•๊ณผ ์ง€์†๊ฐ€๋Šฅ์„ฑ ์ „๋žต ๋ณด๊ณ ์„œ๋ฅผ ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”",
1486
+ "๋ฉ”ํƒ€๋ฒ„์Šค ํ”Œ๋žซํผ ๊ตฌ์ถ•์„ ์œ„ํ•œ ๊ธฐ์ˆ  ์•„ํ‚คํ…์ฒ˜์™€ ์‚ฌ์—… ๊ณ„ํš์„ ์ˆ˜๋ฆฝํ•ด์ฃผ์„ธ์š”",
1487
+ "๊ณต๊ธ‰๋ง ์ตœ์ ํ™”์™€ ์Šค๋งˆํŠธ ํŒฉํ† ๋ฆฌ ์ „ํ™˜ ์ „๋žต์„ ๋ถ„์„ํ•ด์ฃผ์„ธ์š”",
1488
+ "๋ฐ์ดํ„ฐ ๊ธฐ๋ฐ˜ ์˜์‚ฌ๊ฒฐ์ • ์ฒด๊ณ„ ๊ตฌ์ถ• ๋ฐฉ์•ˆ๊ณผ ๊ฑฐ๋ฒ„๋„Œ์Šค ๋ชจ๋ธ์„ ์ œ์‹œํ•ด์ฃผ์„ธ์š”",
1489
+ "๊ณ ๊ฐ ๊ฒฝํ—˜ ํ˜์‹ ์„ ์œ„ํ•œ ์˜ด๋‹ˆ์ฑ„๋„ ์ „๋žต๊ณผ ์‹คํ–‰ ๊ณ„ํš์„ ์ˆ˜๋ฆฝํ•ด์ฃผ์„ธ์š”"
1490
  ],
1491
  inputs=user_input,
1492
+ label="๐Ÿ’ก ์ „๋ฌธ ๋ณด๊ณ ์„œ ์˜ˆ์ œ"
1493
  )
1494
 
1495
  # ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ
 
1522
  server_name="0.0.0.0",
1523
  server_port=7860,
1524
  share=True,
1525
+ show_error=True,
1526
+ favicon_path=None,
1527
+ page_title="AGI ์˜คํ–‰ ์ „๋ฌธ ๋ณด๊ณ ์„œ ์‹œ์Šคํ…œ"
1528
  )