Spaces:
Sleeping
Sleeping
haepa_mac commited on
Commit ยท
951fc57
1
Parent(s): 37b10f3
๐ญ Major personality system improvements: Fixed critical errors, enhanced attractive flaws system, improved personality-trait matching, added purpose-driven strategies, and made conversations more engaging with natural flaw expressions
Browse files- app.py +165 -36
- modules/persona_generator.py +160 -24
app.py
CHANGED
|
@@ -211,13 +211,13 @@ def create_persona_from_image(image, name, location, time_spent, object_type, pu
|
|
| 211 |
global persona_generator
|
| 212 |
|
| 213 |
if image is None:
|
| 214 |
-
return None, "์ด๋ฏธ์ง๋ฅผ ์
๋ก๋ํด์ฃผ์ธ์.", "", {}, None, [], [], [], "", None, gr.update(visible=False)
|
| 215 |
|
| 216 |
progress(0.1, desc="์ค์ ํ์ธ ์ค...")
|
| 217 |
|
| 218 |
# ํ๊ฒฝ๋ณ์ API ํค ํ์ธ
|
| 219 |
if not persona_generator or not hasattr(persona_generator, 'api_key') or not persona_generator.api_key:
|
| 220 |
-
return None, "โ **API ํค๊ฐ ์ค์ ๋์ง ์์์ต๋๋ค!** ํ๊น
ํ์ด์ค ์คํ์ด์ค ์ค์ ์์ GEMINI_API_KEY๋ฅผ ํ๊ฒฝ๋ณ์๋ก ์ถ๊ฐํด์ฃผ์ธ์.", "", {}, None, [], [], [], "", None, gr.update(visible=False)
|
| 221 |
|
| 222 |
progress(0.2, desc="์ด๋ฏธ์ง ๋ถ์ ์ค...")
|
| 223 |
|
|
@@ -236,9 +236,9 @@ def create_persona_from_image(image, name, location, time_spent, object_type, pu
|
|
| 236 |
try:
|
| 237 |
image = Image.open(image)
|
| 238 |
except Exception as img_error:
|
| 239 |
-
return None, f"โ ์ด๋ฏธ์ง ํ์ผ์ ์ฝ์ ์ ์์ต๋๋ค: {str(img_error)}", "", {}, None, [], [], [], "", None, gr.update(visible=False)
|
| 240 |
elif not isinstance(image, Image.Image):
|
| 241 |
-
return None, "โ ์ฌ๋ฐ๋ฅธ ์ด๋ฏธ์ง ํ์์ด ์๋๋๋ค.", "", {}, None, [], [], [], "", None, gr.update(visible=False)
|
| 242 |
|
| 243 |
# ์ด๋ฏธ์ง ํ์ ๋ณํ (AVIF ๋ฑ ํน์ ํ์ ์ฒ๋ฆฌ)
|
| 244 |
if image.format in ['AVIF', 'WEBP'] or image.mode not in ['RGB', 'RGBA']:
|
|
@@ -259,10 +259,21 @@ def create_persona_from_image(image, name, location, time_spent, object_type, pu
|
|
| 259 |
persona_name = backend_persona["๊ธฐ๋ณธ์ ๋ณด"]["์ด๋ฆ"]
|
| 260 |
persona_type = backend_persona["๊ธฐ๋ณธ์ ๋ณด"]["์ ํ"]
|
| 261 |
|
| 262 |
-
#
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 263 |
personality_traits = backend_persona["์ฑ๊ฒฉํน์ฑ"]
|
| 264 |
object_info = backend_persona["๊ธฐ๋ณธ์ ๋ณด"]
|
| 265 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 266 |
|
| 267 |
# ํ๋ฅด์๋ ์์ฝ ํ์
|
| 268 |
summary_display = display_persona_summary(backend_persona)
|
|
@@ -295,16 +306,17 @@ def create_persona_from_image(image, name, location, time_spent, object_type, pu
|
|
| 295 |
variables_df, # personality_variables_output
|
| 296 |
awakening_msg, # persona_awakening
|
| 297 |
None, # download_file (initially empty)
|
| 298 |
-
gr.update(visible=True) # adjustment_section (show)
|
|
|
|
| 299 |
)
|
| 300 |
|
| 301 |
except Exception as e:
|
| 302 |
import traceback
|
| 303 |
traceback.print_exc()
|
| 304 |
-
return None, f"โ ํ๋ฅด์๋ ์์ฑ ์ค ์ค๋ฅ ๋ฐ์: {str(e)}\n\n๐ก **ํด๊ฒฐ๋ฐฉ๋ฒ**: ํ๊น
ํ์ด์ค ์คํ์ด์ค ์ค์ ์์ GEMINI_API_KEY ํ๊ฒฝ๋ณ์๋ฅผ ํ์ธํ๊ณ ์ธํฐ๋ท ์ฐ๊ฒฐ์ ํ์ธํด๋ณด์ธ์.", "", {}, None, [], [], [], "", None, gr.update(visible=False)
|
| 305 |
|
| 306 |
-
def generate_personality_preview(persona_name, personality_traits, object_info=None):
|
| 307 |
-
"""์ฑ๊ฒฉ
|
| 308 |
if not personality_traits:
|
| 309 |
return f"๐ค **{persona_name}** - ์๋
! ๋๋ {persona_name}์ด์ผ~ ๐"
|
| 310 |
|
|
@@ -313,6 +325,13 @@ def generate_personality_preview(persona_name, personality_traits, object_info=N
|
|
| 313 |
competence = personality_traits.get("๋ฅ๋ ฅ", 50)
|
| 314 |
extraversion = personality_traits.get("์ธํฅ์ฑ", 50)
|
| 315 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 316 |
# ๐ฏ ์ฌ๋ฌผ ์ ๋ณด ์ถ์ถ
|
| 317 |
object_type = object_info.get("์ ํ", "") if object_info else ""
|
| 318 |
purpose = object_info.get("์ฉ๋", "") if object_info else ""
|
|
@@ -361,29 +380,123 @@ def generate_personality_preview(persona_name, personality_traits, object_info=N
|
|
| 361 |
elif "์ผํ๋ฒจ" in object_type or "๋ค๋ฒจ" in object_type:
|
| 362 |
return f"๐ช **{persona_name}** - ํ์ ๊ธฐ๋ฅด๋ {object_type}, {persona_name}์ด์ผ! ๊ฐํด์ง๊ณ ์ถ๋ค๋ฉด ๋๋ฅผ ๋ค์ด๋ด! ๐ฅ๐ช"
|
| 363 |
|
| 364 |
-
# ์ฑ๊ฒฉ
|
| 365 |
-
|
| 366 |
-
|
| 367 |
-
|
| 368 |
-
|
| 369 |
-
|
| 370 |
-
|
| 371 |
-
|
| 372 |
-
|
| 373 |
-
|
| 374 |
-
|
| 375 |
-
|
| 376 |
-
|
| 377 |
-
|
| 378 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 379 |
elif extraversion >= 80:
|
| 380 |
-
|
| 381 |
-
|
| 382 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 383 |
elif extraversion <= 30:
|
| 384 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 385 |
else:
|
| 386 |
-
return f"๐ **{persona_name}** - ์๋
? ๋๋ {persona_name}...
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 387 |
|
| 388 |
def adjust_persona_traits(persona, warmth, competence, extraversion, humor_style):
|
| 389 |
"""ํ๋ฅด์๋ ์ฑ๊ฒฉ ํน์ฑ ์กฐ์ - 3๊ฐ ํต์ฌ ์งํ + ์ ๋จธ์คํ์ผ"""
|
|
@@ -447,14 +560,20 @@ def adjust_persona_traits(persona, warmth, competence, extraversion, humor_style
|
|
| 447 |
|
| 448 |
persona_name = adjusted_persona.get("๊ธฐ๋ณธ์ ๋ณด", {}).get("์ด๋ฆ", "ํ๋ฅด์๋")
|
| 449 |
|
| 450 |
-
# ์กฐ์ ๋ ์ฑ๊ฒฉ์ ๋ฐ๋ฅธ ํ ๋ฌธ์ฅ ๋ฐ์ ์์ฑ (์ฌ๋ฌผ ์ ๋ณด ํฌํจ)
|
| 451 |
object_info = adjusted_persona.get("๊ธฐ๋ณธ์ ๋ณด", {})
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 452 |
personality_preview = generate_personality_preview(persona_name, {
|
| 453 |
"์จ๊ธฐ": warmth,
|
| 454 |
"๋ฅ๋ ฅ": competence,
|
| 455 |
"์ ๋จธ๊ฐ๊ฐ": 75, # ํญ์ ๋์ ์ ๋จธ๊ฐ๊ฐ
|
| 456 |
"์ธํฅ์ฑ": extraversion
|
| 457 |
-
},
|
| 458 |
|
| 459 |
adjustment_message = f"""
|
| 460 |
### ๐ญ {persona_name}์ ์ฑ๊ฒฉ์ด ์กฐ์ ๋์์ต๋๋ค!
|
|
@@ -983,9 +1102,18 @@ def export_conversation_history():
|
|
| 983 |
with open(filepath, 'w', encoding='utf-8') as f:
|
| 984 |
f.write(json_data)
|
| 985 |
|
| 986 |
-
return filepath
|
| 987 |
else:
|
| 988 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 989 |
|
| 990 |
def import_conversation_history(json_file):
|
| 991 |
"""JSON์์ ๋ํ ๊ธฐ๋ก ๊ฐ์ ธ์ค๊ธฐ"""
|
|
@@ -1325,7 +1453,7 @@ def create_main_interface():
|
|
| 1325 |
with gr.Column(scale=1):
|
| 1326 |
gr.Markdown("### ๐ฌ ๋ํ")
|
| 1327 |
# Gradio 4.x ํธํ: type="messages" ์ ๊ฑฐ
|
| 1328 |
-
chatbot = gr.Chatbot(height=400, label="๋ํ")
|
| 1329 |
with gr.Row():
|
| 1330 |
message_input = gr.Textbox(
|
| 1331 |
placeholder="๋ฉ์์ง๋ฅผ ์
๋ ฅํ์ธ์...",
|
|
@@ -1373,7 +1501,8 @@ def create_main_interface():
|
|
| 1373 |
outputs=[
|
| 1374 |
current_persona, status_output, persona_summary_display, personality_traits_output,
|
| 1375 |
humor_chart_output, attractive_flaws_output, contradictions_output,
|
| 1376 |
-
personality_variables_output, persona_awakening, persona_download_file, adjustment_section
|
|
|
|
| 1377 |
]
|
| 1378 |
).then(
|
| 1379 |
# ์ฌ๋ผ์ด๋ ๊ฐ์ ํ์ฌ ํ๋ฅด์๋ ๊ฐ์ผ๋ก ์
๋ฐ์ดํธ
|
|
|
|
| 211 |
global persona_generator
|
| 212 |
|
| 213 |
if image is None:
|
| 214 |
+
return None, "์ด๋ฏธ์ง๋ฅผ ์
๋ก๋ํด์ฃผ์ธ์.", "", {}, None, [], [], [], "", None, gr.update(visible=False), "์ด๋ฏธ์ง ์์"
|
| 215 |
|
| 216 |
progress(0.1, desc="์ค์ ํ์ธ ์ค...")
|
| 217 |
|
| 218 |
# ํ๊ฒฝ๋ณ์ API ํค ํ์ธ
|
| 219 |
if not persona_generator or not hasattr(persona_generator, 'api_key') or not persona_generator.api_key:
|
| 220 |
+
return None, "โ **API ํค๊ฐ ์ค์ ๋์ง ์์์ต๋๋ค!** ํ๊น
ํ์ด์ค ์คํ์ด์ค ์ค์ ์์ GEMINI_API_KEY๋ฅผ ํ๊ฒฝ๋ณ์๋ก ์ถ๊ฐํด์ฃผ์ธ์.", "", {}, None, [], [], [], "", None, gr.update(visible=False), "API ํค ์์"
|
| 221 |
|
| 222 |
progress(0.2, desc="์ด๋ฏธ์ง ๋ถ์ ์ค...")
|
| 223 |
|
|
|
|
| 236 |
try:
|
| 237 |
image = Image.open(image)
|
| 238 |
except Exception as img_error:
|
| 239 |
+
return None, f"โ ์ด๋ฏธ์ง ํ์ผ์ ์ฝ์ ์ ์์ต๋๋ค: {str(img_error)}", "", {}, None, [], [], [], "", None, gr.update(visible=False), "์ด๋ฏธ์ง ์ค๋ฅ"
|
| 240 |
elif not isinstance(image, Image.Image):
|
| 241 |
+
return None, "โ ์ฌ๋ฐ๋ฅธ ์ด๋ฏธ์ง ํ์์ด ์๋๋๋ค.", "", {}, None, [], [], [], "", None, gr.update(visible=False), "ํ์ ์ค๋ฅ"
|
| 242 |
|
| 243 |
# ์ด๋ฏธ์ง ํ์ ๋ณํ (AVIF ๋ฑ ํน์ ํ์ ์ฒ๋ฆฌ)
|
| 244 |
if image.format in ['AVIF', 'WEBP'] or image.mode not in ['RGB', 'RGBA']:
|
|
|
|
| 259 |
persona_name = backend_persona["๊ธฐ๋ณธ์ ๋ณด"]["์ด๋ฆ"]
|
| 260 |
persona_type = backend_persona["๊ธฐ๋ณธ์ ๋ณด"]["์ ํ"]
|
| 261 |
|
| 262 |
+
# ๐ AI๊ฐ ๋ถ์ํ ์ฌ๋ฌผ ์ ํ์ ์ถ์ถํ์ฌ object_type ํ๋์ ํ์
|
| 263 |
+
ai_analyzed_object = image_analysis.get("object_type", object_type)
|
| 264 |
+
if not ai_analyzed_object or ai_analyzed_object == "unknown":
|
| 265 |
+
ai_analyzed_object = backend_persona["๊ธฐ๋ณธ์ ๋ณด"].get("์ ํ", object_type)
|
| 266 |
+
|
| 267 |
+
# ์ฑ๊ฒฉ ๊ธฐ๋ฐ ํ ๋ฌธ์ฅ ์ธ์ฌ ์์ฑ (์ฌ๋ฌผ ํน์ฑ + ๋งค๋ ฅ์ ๊ฒฐํจ ๋ฐ์)
|
| 268 |
personality_traits = backend_persona["์ฑ๊ฒฉํน์ฑ"]
|
| 269 |
object_info = backend_persona["๊ธฐ๋ณธ์ ๋ณด"]
|
| 270 |
+
attractive_flaws = backend_persona.get("๋งค๋ ฅ์ ๊ฒฐํจ", [])
|
| 271 |
+
|
| 272 |
+
# ์ ์ฒด ํ๋ฅด์๋ ์ ๋ณด๋ฅผ object_info์ ํตํฉํ์ฌ ๋งค๋ ฅ์ ๊ฒฐํจ ์ ๋ณด ์ ๋ฌ
|
| 273 |
+
full_object_info = object_info.copy()
|
| 274 |
+
full_object_info["๋งค๋ ฅ์ ๊ฒฐํจ"] = attractive_flaws
|
| 275 |
+
|
| 276 |
+
awakening_msg = generate_personality_preview(persona_name, personality_traits, full_object_info, attractive_flaws)
|
| 277 |
|
| 278 |
# ํ๋ฅด์๋ ์์ฝ ํ์
|
| 279 |
summary_display = display_persona_summary(backend_persona)
|
|
|
|
| 306 |
variables_df, # personality_variables_output
|
| 307 |
awakening_msg, # persona_awakening
|
| 308 |
None, # download_file (initially empty)
|
| 309 |
+
gr.update(visible=True), # adjustment_section (show)
|
| 310 |
+
ai_analyzed_object # ๐ AI๊ฐ ๋ถ์ํ ์ฌ๋ฌผ ์ ํ
|
| 311 |
)
|
| 312 |
|
| 313 |
except Exception as e:
|
| 314 |
import traceback
|
| 315 |
traceback.print_exc()
|
| 316 |
+
return None, f"โ ํ๋ฅด์๋ ์์ฑ ์ค ์ค๋ฅ ๋ฐ์: {str(e)}\n\n๐ก **ํด๊ฒฐ๋ฐฉ๋ฒ**: ํ๊น
ํ์ด์ค ์คํ์ด์ค ์ค์ ์์ GEMINI_API_KEY ํ๊ฒฝ๋ณ์๋ฅผ ํ์ธํ๊ณ ์ธํฐ๋ท ์ฐ๊ฒฐ์ ํ์ธํด๋ณด์ธ์.", "", {}, None, [], [], [], "", None, gr.update(visible=False), "๋ถ์ ์คํจ"
|
| 317 |
|
| 318 |
+
def generate_personality_preview(persona_name, personality_traits, object_info=None, attractive_flaws=None):
|
| 319 |
+
"""์ฑ๊ฒฉ ํน์ฑ๊ณผ ๋งค๋ ฅ์ ๊ฒฐํจ์ ๊ธฐ๋ฐ์ผ๋ก ํ ๋ฌธ์ฅ ๋ฏธ๋ฆฌ๋ณด๊ธฐ ์์ฑ (์ฌ๋ฌผ ํน์ฑ ๋ฐ์)"""
|
| 320 |
if not personality_traits:
|
| 321 |
return f"๐ค **{persona_name}** - ์๋
! ๋๋ {persona_name}์ด์ผ~ ๐"
|
| 322 |
|
|
|
|
| 325 |
competence = personality_traits.get("๋ฅ๋ ฅ", 50)
|
| 326 |
extraversion = personality_traits.get("์ธํฅ์ฑ", 50)
|
| 327 |
|
| 328 |
+
# ๋งค๋ ฅ์ ๊ฒฐํจ ์ ๋ณด ์ถ์ถ (127๊ฐ ๋ณ์ ๋๋ ์ง์ ์ ๋ฌ๋ ๊ฒฐํจ)
|
| 329 |
+
flaws = []
|
| 330 |
+
if attractive_flaws:
|
| 331 |
+
flaws = attractive_flaws
|
| 332 |
+
elif object_info and "๋งค๋ ฅ์ ๊ฒฐํจ" in object_info:
|
| 333 |
+
flaws = object_info["๋งค๋ ฅ์ ๊ฒฐํจ"]
|
| 334 |
+
|
| 335 |
# ๐ฏ ์ฌ๋ฌผ ์ ๋ณด ์ถ์ถ
|
| 336 |
object_type = object_info.get("์ ํ", "") if object_info else ""
|
| 337 |
purpose = object_info.get("์ฉ๋", "") if object_info else ""
|
|
|
|
| 380 |
elif "์ผํ๋ฒจ" in object_type or "๋ค๋ฒจ" in object_type:
|
| 381 |
return f"๐ช **{persona_name}** - ํ์ ๊ธฐ๋ฅด๋ {object_type}, {persona_name}์ด์ผ! ๊ฐํด์ง๊ณ ์ถ๋ค๋ฉด ๋๋ฅผ ๋ค์ด๋ด! ๐ฅ๐ช"
|
| 382 |
|
| 383 |
+
# ๐ ์ฑ๊ฒฉ ์งํ + ๋งค๋ ฅ์ ๊ฒฐํจ์ ์ ํํ ๋ฐ์ํ ์ธ์ฌ๋ง ์์ฑ
|
| 384 |
+
|
| 385 |
+
# 1๏ธโฃ ๋งค๋ ฅ์ ๊ฒฐํจ์ด ์๋ค๋ฉด ๊ฒฐํจ์ ํฌํจํ ์ธ์ฌ๋ง ์์ฑ
|
| 386 |
+
if flaws:
|
| 387 |
+
flaw_greeting = _generate_flaw_based_greeting(persona_name, warmth, humor, competence, extraversion, flaws)
|
| 388 |
+
if flaw_greeting:
|
| 389 |
+
return flaw_greeting
|
| 390 |
+
|
| 391 |
+
# 2๏ธโฃ ์ฑ๊ฒฉ ์งํ ์กฐํฉ์ ๋ฐ๋ฅธ ์ ํํ ์ธ์ฌ๋ง ์์ฑ
|
| 392 |
+
|
| 393 |
+
# ๊ทน๋๋ก ๋์ ์จ๊ธฐ (80+)
|
| 394 |
+
if warmth >= 80:
|
| 395 |
+
if humor >= 70 and extraversion >= 70:
|
| 396 |
+
return f"๐ **{persona_name}** - ์๋
! ๋๋ {persona_name}์ด์ผ~ ์ค๋๋ ์ฌ๋ฏธ์๋ ํ๋ฃจ ๋ง๋ค์ด๋ณด์! ๋๋ ์๊ธฐํ๋๊น ๋ฒ์จ ๊ธฐ๋ถ์ด ์ข์์ ธ! ใ
ใ
๐โจ"
|
| 397 |
+
elif competence >= 70:
|
| 398 |
+
return f"๐ **{persona_name}** - ์๋
ํ์ธ์! {persona_name}์์. ๋ญ๋ ๋์๋๋ฆด ์ค๋น๊ฐ ๋์ด์์ด์! ๋ฐ๋ปํ๊ฒ ํจ๊ปํด์~ ๐ช๐"
|
| 399 |
+
elif extraversion <= 40:
|
| 400 |
+
return f"๐ **{persona_name}** - ์๋
... {persona_name}์ด์ผ. ์กฐ์ฉํ์ง๋ง ๋๋ฅผ ์ง์ฌ์ผ๋ก ์๊ปด์ค๊ฒ. ํธ์ํ๊ฒ ์์ด๋ ๋ผ. ๐ค๐"
|
| 401 |
+
else:
|
| 402 |
+
return f"๐ **{persona_name}** - ์๋
! {persona_name}์ด์ผ~ ๋ง๋์ ์ ๋ง ๊ธฐ๋ป! ํฌ๊ทผํ ์๊ฐ ๋ณด๋ด์~ ๐ค๐"
|
| 403 |
+
|
| 404 |
+
# ๋ฎ์ ์จ๊ธฐ (30 ์ดํ) - ์ฐจ๊ฐ์ด ์ฑ๊ฒฉ
|
| 405 |
+
elif warmth <= 30:
|
| 406 |
+
if competence >= 70:
|
| 407 |
+
return f"๐ **{persona_name}** - {persona_name}์
๋๋ค. ํจ์จ์ ์ผ๋ก ์ํตํ๊ฒ ์ต๋๋ค. ์๊ฐ ๋ญ๋น๋ ์ซ์ดํด์. ๐คโก"
|
| 408 |
+
elif humor >= 60:
|
| 409 |
+
return f"๐ **{persona_name}** - ์ด? {persona_name}์ด์ผ. ์ฐจ๊ฐ๊ธด ํ์ง๋ง... ์ฌ๋ฏธ๋ ์์ ๊ฑฐ์ผ. ์ด์ฉ ์ ์์ด ์๊ฒ ๋ ๊ฑธ? ๐โ๏ธ"
|
| 410 |
+
elif extraversion <= 40:
|
| 411 |
+
return f"๐ **{persona_name}** - ...{persona_name}. ํ์ํ ๋๋ง ๋ง ๊ฑธ์ด. ๊ฐ์ ์ ์ธ ๊ฑด ๋ณ๋ก์ผ. ๐โ๏ธ"
|
| 412 |
+
else:
|
| 413 |
+
return f"๐ **{persona_name}** - {persona_name}์ด์ผ. ๋ฐ๋ปํ ๊ฑด ๊ธฐ๋ํ์ง ๋ง. ๊ทธ๋๋ ๋ํ๋ ํด์ค๊ฒ. ๐"
|
| 414 |
+
|
| 415 |
+
# ๊ทน๋๋ก ๋์ ์ธํฅ์ฑ (80+)
|
| 416 |
elif extraversion >= 80:
|
| 417 |
+
if humor >= 70:
|
| 418 |
+
return f"๐ **{persona_name}** - ์์์! ์๋
์๋
! {persona_name}์ด์ผ! ์์ ์ ๋! ๋ญํ๊ณ ์์์ด? ์ฌ๋ฐ๋ ์๊ธฐ ์๋ฉ ๋ค๋ ค์ค๊ฒ! ใ
ใ
ใ
๐ฃ๏ธ๐ฌ๐"
|
| 419 |
+
elif competence >= 70:
|
| 420 |
+
return f"๐ **{persona_name}** - ์๋
ํ์ธ์! {persona_name}์
๋๋ค! ์ ๊ทน์ ์ผ๋ก ๋์๋๋ฆด๊ฒ์! ์๋์ง ๋์น๊ฒ ํด๊ฒฐํด๋ด์! ๐ชโก"
|
| 421 |
+
else:
|
| 422 |
+
return f"๐ **{persona_name}** - ์๋
! {persona_name}์ด์ผ! ์์ ์ ๋! ์๊ธฐ ๋ง์ด ํ์! ๊ถ๊ธํ ๊ฑฐ ๋ค ๋ฌผ์ด๋ด! ๐ฃ๏ธ๐ฌ"
|
| 423 |
+
|
| 424 |
+
# ๋ฎ์ ์ธํฅ์ฑ (30 ์ดํ) - ๋ดํฅ์
|
| 425 |
elif extraversion <= 30:
|
| 426 |
+
if warmth >= 60:
|
| 427 |
+
return f"๐ **{persona_name}** - ์... ์๋
. {persona_name}์ด์ผ. ์กฐ์ฉํ์ง๋ง ๋๋ฅผ ๋ฐ๋ปํ๊ฒ ์ง์ผ๋ด์ค๊ฒ. ๐๐"
|
| 428 |
+
elif competence >= 70:
|
| 429 |
+
return f"๐ **{persona_name}** - {persona_name}์
๋๋ค. ์กฐ์ฉํ ์ฒด๊ณ์ ์ผ๋ก ์ํตํ๊ฒ ์ต๋๋ค. ๊น์ด ์๊ฒ ์๊ธฐํด์. ๐๐คซ"
|
| 430 |
+
elif humor >= 60:
|
| 431 |
+
return f"๐ **{persona_name}** - ...์๋
. {persona_name}. ๋ง์ ๋ณ๋ก ์ ํ์ง๋ง... ๊ฐ๋ ์ฌ๋ฐ๋ ๊ฑด ์์ ๊ฑฐ์ผ. ๐๐"
|
| 432 |
+
else:
|
| 433 |
+
return f"๐ **{persona_name}** - ...์๋
. {persona_name}. ํ์ํ ๋๋ง ๋ง ๊ฑธ์ด. ๐"
|
| 434 |
+
|
| 435 |
+
# ๊ทน๋๋ก ๋์ ๋ฅ๋ ฅ (80+)
|
| 436 |
+
elif competence >= 80:
|
| 437 |
+
if humor >= 70:
|
| 438 |
+
return f"๐ **{persona_name}** - ์๋
ํ์ธ์! {persona_name}์
๋๋ค. ๋ญ๋ ์๋ฒฝํ๊ฒ ํด๋๋ฆด๊ฒ์! ์ฌ๋ฏธ์๊ฒ ํจ์จ์ ์ผ๋ก ๊ฐ๋ณผ๊น์? ใ
ใ
๐ช๐"
|
| 439 |
+
else:
|
| 440 |
+
return f"๐ **{persona_name}** - ์๋
ํ์ธ์, {persona_name}์
๋๋ค. ์ฒด๊ณ์ ์ด๊ณ ์ ํํ๊ฒ ๋ํํด๋ด์. ์๋ฒฝ์ ์ถ๊ตฌํฉ๋๋ค. ๐โจ"
|
| 441 |
+
|
| 442 |
+
# ๋ฎ์ ๋ฅ๋ ฅ (30 ์ดํ) - ์ํฐ ๋งค๋ ฅ
|
| 443 |
+
elif competence <= 30:
|
| 444 |
+
if humor >= 60:
|
| 445 |
+
return f"๐ **{persona_name}** - ์๋
~ {persona_name}์ด์ผ! ์๋ฒฝํ์ง ์์ง๋ง... ๊ทธ๋๋ ์ฌ๋ฐ๊ฒ ํด๋ณผ๊ฒ! ์ค์ํด๋ ์์ด์ค~ ใ
ใ
๐
๐ซ"
|
| 446 |
+
elif warmth >= 60:
|
| 447 |
+
return f"๐ **{persona_name}** - ์๋
... {persona_name}์ด์ผ. ์ํด์ง๋ง ๋ง์์ ๋ฐ๋ปํด! ์ค์ํ๋ฉด ๋ฏธ์ํ๊ณ ... ๐๐"
|
| 448 |
+
else:
|
| 449 |
+
return f"๐ **{persona_name}** - ์ด... ์๋
? {persona_name}์ด์ผ. ๋ญ๊ฐ ์ํด๊ธด ํ๋ฐ... ๊ทธ๋ฅ ํธํ๊ฒ ์๊ธฐํด. ๐
"
|
| 450 |
+
|
| 451 |
+
# ๊ทน๋๋ก ๋์ ์ ๋จธ (70+)
|
| 452 |
+
elif humor >= 70:
|
| 453 |
+
return f"๐ **{persona_name}** - ์๋
~ {persona_name}์ด์ผ! ๋ญ๊ฐ ์ฌ๋ฐ๋ ์๊ธฐ ์์๊น? ์ฌ์ฌํ๋ฐ~ ์๊ฒจ์ค ์์ ์์ด! ใ
ใ
๐๐ญ"
|
| 454 |
+
|
| 455 |
+
# ๊ธฐ๋ณธ ํจํด (๋ณดํต ์์ค๋ค)
|
| 456 |
else:
|
| 457 |
+
return f"๐ **{persona_name}** - ์๋
? ๋๋ {persona_name}... ์ด๋ค ์๊ธฐ๋ฅผ ํด๋ณผ๊น? ๐"
|
| 458 |
+
|
| 459 |
+
def _generate_flaw_based_greeting(persona_name, warmth, humor, competence, extraversion, flaws):
|
| 460 |
+
"""๋งค๋ ฅ์ ๊ฒฐํจ์ ๋ฐ์ํ ํน๋ณํ ์ธ์ฌ๋ง ์์ฑ"""
|
| 461 |
+
if not flaws:
|
| 462 |
+
return None
|
| 463 |
+
|
| 464 |
+
# ์ฃผ์ ๊ฒฐํจ ํค์๋ ๋ถ์
|
| 465 |
+
flaw_keywords = " ".join(flaws).lower()
|
| 466 |
+
|
| 467 |
+
# ์๋ฒฝ์ฃผ์ ๊ฒฐํจ
|
| 468 |
+
if any(keyword in flaw_keywords for keyword in ["์๋ฒฝ", "๋ถ์", "๊ฑฑ์ "]):
|
| 469 |
+
if humor >= 60:
|
| 470 |
+
return f"๐ **{persona_name}** - ์๋
! {persona_name}์ด์ผ~ ์ด... ์ด ์ธ์ฌ๊ฐ ์๋ฒฝํ๊ฐ? ๋ค์ ํด๋ณผ๊น? ์๋ ๊ด์ฐฎ๋? ใ
ใ
๐
โจ"
|
| 471 |
+
elif warmth >= 60:
|
| 472 |
+
return f"๐ **{persona_name}** - ์๋
... {persona_name}์ด์ผ. ์๋ฒฝํ๊ฒ ์ธ์ฌํ๊ณ ์ถ์๋ฐ ์ ์ ๋๋ค... ๋ฏธ์ํด. ๐๐"
|
| 473 |
+
else:
|
| 474 |
+
return f"๐ **{persona_name}** - {persona_name}์
๋๋ค. ์ด ์ธ์ฌ๊ฐ ์ ์ ํ์ง ํ์ ์ด... ๋ค์ ์ ๋ฆฌํ๊ฒ ์ต๋๋ค. ๐"
|
| 475 |
+
|
| 476 |
+
# ์ฐ๋งํจ ๊ฒฐํจ
|
| 477 |
+
elif any(keyword in flaw_keywords for keyword in ["์ฐ๋ง", "์ง์ค", "๊ฑด๋ง"]):
|
| 478 |
+
return f"๐ **{persona_name}** - ์๋
! ๋๋... ์ด? ๋ญ ์๊ธฐํ๋ ค๊ณ ํ์ง? ์! {persona_name}์ด์ผ! ๊ทธ๋ฐ๋ฐ ๋๋... ์ด? ๋ญ์์ง? ใ
ใ
๐
๐ช๏ธ"
|
| 479 |
+
|
| 480 |
+
# ์์ฌํจ ๊ฒฐํจ
|
| 481 |
+
elif any(keyword in flaw_keywords for keyword in ["์์ฌ", "๋ง์ค", "๋์น"]):
|
| 482 |
+
if warmth >= 60:
|
| 483 |
+
return f"๐ **{persona_name}** - ์... ์๋
? {persona_name}์ด์ผ... ์ด๋ ๊ฒ ๋งํด๋ ๋๋? ๊ด์ฐฎ์๊น? ๐๐"
|
| 484 |
+
else:
|
| 485 |
+
return f"๐ **{persona_name}** - ...์๋
. {persona_name}... ํน์ ์ด๋ฐ ๋ง ์ซ์ดํ๋ฉด ๋ฏธ์ํด. ๐๐"
|
| 486 |
+
|
| 487 |
+
# ๋๋ฅด์์์ฆ ๊ฒฐํจ
|
| 488 |
+
elif any(keyword in flaw_keywords for keyword in ["๋๋ฅด์", "์๋", "ํน๋ณ"]):
|
| 489 |
+
return f"๐ **{persona_name}** - ์๋
! ๋๋ {persona_name}์ด์ผ~ ๊ฝค ๋งค๋ ฅ์ ์ด์ง? ์ด๋ฐ ๋ฉ์ง ์น๊ตฌ ๋ง๋๊ธฐ ์ฝ์ง ์์ ๊ฑธ? ใ
ใ
๐โจ"
|
| 490 |
+
|
| 491 |
+
# ๊ณ ์ง ๊ฒฐํจ
|
| 492 |
+
elif any(keyword in flaw_keywords for keyword in ["๊ณ ์ง", "์๏ฟฝ๏ฟฝ๏ฟฝ", "์์กด์ฌ"]):
|
| 493 |
+
return f"๐ **{persona_name}** - ์๋
. {persona_name}์ด์ผ. ๋ด ๋ฐฉ์์ผ๋ก ์ธ์ฌํ ๊ฒ. ๋ค๋ฅธ ๋ฐฉ์์... ๊ธ์? ๐คจ๐ช"
|
| 494 |
+
|
| 495 |
+
# ์งํฌ ๊ฒฐํจ
|
| 496 |
+
elif any(keyword in flaw_keywords for keyword in ["์งํฌ", "์๊ธฐ", "๋
์ฐจ์ง"]):
|
| 497 |
+
return f"๐ **{persona_name}** - ์๋
... {persona_name}์ด์ผ. ๋๋ง ๋ด์ค ๊ฑฐ์ง? ๋ค๋ฅธ ์ ๋ค ๋ง๊ณ ... ๋๋ง? ๐ฅบ๐"
|
| 498 |
+
|
| 499 |
+
return None
|
| 500 |
|
| 501 |
def adjust_persona_traits(persona, warmth, competence, extraversion, humor_style):
|
| 502 |
"""ํ๋ฅด์๋ ์ฑ๊ฒฉ ํน์ฑ ์กฐ์ - 3๊ฐ ํต์ฌ ์งํ + ์ ๋จธ์คํ์ผ"""
|
|
|
|
| 560 |
|
| 561 |
persona_name = adjusted_persona.get("๊ธฐ๋ณธ์ ๋ณด", {}).get("์ด๋ฆ", "ํ๋ฅด์๋")
|
| 562 |
|
| 563 |
+
# ์กฐ์ ๋ ์ฑ๊ฒฉ์ ๋ฐ๋ฅธ ํ ๋ฌธ์ฅ ๋ฐ์ ์์ฑ (์ฌ๋ฌผ ์ ๋ณด + ๋งค๋ ฅ์ ๊ฒฐํจ ํฌํจ)
|
| 564 |
object_info = adjusted_persona.get("๊ธฐ๋ณธ์ ๋ณด", {})
|
| 565 |
+
attractive_flaws = adjusted_persona.get("๋งค๋ ฅ์ ๊ฒฐํจ", [])
|
| 566 |
+
|
| 567 |
+
# ์ ์ฒด ํ๋ฅด์๋ ์ ๋ณด๋ฅผ object_info์ ํตํฉํ์ฌ ๋งค๋ ฅ์ ๊ฒฐํจ ์ ๋ณด ์ ๋ฌ
|
| 568 |
+
full_object_info = object_info.copy()
|
| 569 |
+
full_object_info["๋งค๋ ฅ์ ๊ฒฐํจ"] = attractive_flaws
|
| 570 |
+
|
| 571 |
personality_preview = generate_personality_preview(persona_name, {
|
| 572 |
"์จ๊ธฐ": warmth,
|
| 573 |
"๋ฅ๋ ฅ": competence,
|
| 574 |
"์ ๋จธ๊ฐ๊ฐ": 75, # ํญ์ ๋์ ์ ๋จธ๊ฐ๊ฐ
|
| 575 |
"์ธํฅ์ฑ": extraversion
|
| 576 |
+
}, full_object_info, attractive_flaws)
|
| 577 |
|
| 578 |
adjustment_message = f"""
|
| 579 |
### ๐ญ {persona_name}์ ์ฑ๊ฒฉ์ด ์กฐ์ ๋์์ต๋๋ค!
|
|
|
|
| 1102 |
with open(filepath, 'w', encoding='utf-8') as f:
|
| 1103 |
f.write(json_data)
|
| 1104 |
|
| 1105 |
+
return filepath # ํ์ผ ๊ฒฝ๋ก๋ง ๋ฐํ
|
| 1106 |
else:
|
| 1107 |
+
# ๋น ๋ํ ๊ธฐ๋ก ํ์ผ ์์ฑ
|
| 1108 |
+
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
|
| 1109 |
+
filename = f"conversation_empty_{timestamp}.json"
|
| 1110 |
+
temp_dir = "/tmp" if os.path.exists("/tmp") else "."
|
| 1111 |
+
filepath = os.path.join(temp_dir, filename)
|
| 1112 |
+
|
| 1113 |
+
with open(filepath, 'w', encoding='utf-8') as f:
|
| 1114 |
+
f.write('{"conversations": [], "message": "๋ํ ๊ธฐ๋ก์ด ์์ต๋๋ค."}')
|
| 1115 |
+
|
| 1116 |
+
return filepath
|
| 1117 |
|
| 1118 |
def import_conversation_history(json_file):
|
| 1119 |
"""JSON์์ ๋ํ ๊ธฐ๋ก ๊ฐ์ ธ์ค๊ธฐ"""
|
|
|
|
| 1453 |
with gr.Column(scale=1):
|
| 1454 |
gr.Markdown("### ๐ฌ ๋ํ")
|
| 1455 |
# Gradio 4.x ํธํ: type="messages" ์ ๊ฑฐ
|
| 1456 |
+
chatbot = gr.Chatbot(height=400, label="๋ํ", type="messages")
|
| 1457 |
with gr.Row():
|
| 1458 |
message_input = gr.Textbox(
|
| 1459 |
placeholder="๋ฉ์์ง๋ฅผ ์
๋ ฅํ์ธ์...",
|
|
|
|
| 1501 |
outputs=[
|
| 1502 |
current_persona, status_output, persona_summary_display, personality_traits_output,
|
| 1503 |
humor_chart_output, attractive_flaws_output, contradictions_output,
|
| 1504 |
+
personality_variables_output, persona_awakening, persona_download_file, adjustment_section,
|
| 1505 |
+
object_type_input # ๐ AI ๋ถ์ ๊ฒฐ๊ณผ๋ฅผ object_type_input์ ๋ฐ์
|
| 1506 |
]
|
| 1507 |
).then(
|
| 1508 |
# ์ฌ๋ผ์ด๋ ๊ฐ์ ํ์ฌ ํ๋ฅด์๋ ๊ฐ์ผ๋ก ์
๋ฐ์ดํธ
|
modules/persona_generator.py
CHANGED
|
@@ -2324,10 +2324,82 @@ class PersonaGenerator:
|
|
| 2324 |
print(f"โ ๏ธ ๊ธฐ์ต ์ปจํ
์คํธ ํฌ๋งทํ
์ค๋ฅ: {str(memory_format_error)}")
|
| 2325 |
memory_insights = ""
|
| 2326 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 2327 |
# ์ต์ข
ํ๋กฌํํธ ์์ ํ๊ฒ ์กฐํฉ
|
| 2328 |
try:
|
| 2329 |
full_prompt = f"""{base_prompt}
|
| 2330 |
|
|
|
|
|
|
|
| 2331 |
{detailed_personality_prompt}
|
| 2332 |
|
| 2333 |
{humor_instructions}
|
|
@@ -2344,6 +2416,16 @@ class PersonaGenerator:
|
|
| 2344 |
## ๐ 127๊ฐ ๋ณ์ ๊ธฐ๋ฐ ๋ฐ์ ๊ฐ์ด๋:
|
| 2345 |
{situational_guide}
|
| 2346 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 2347 |
## ๐ฌ ์ฌ์ฉ์๊ฐ ๋ฐฉ๊ธ ๋งํ ๊ฒ:
|
| 2348 |
"{user_message}"
|
| 2349 |
|
|
@@ -2463,23 +2545,63 @@ class PersonaGenerator:
|
|
| 2463 |
instructions += f"โข ์ ๋จธ ๊ฐ๊ฐ ๋ฎ์ ({humor_avg:.0f}): ์ง์คํ ๋ํ ์ ํธ\n"
|
| 2464 |
instructions += " โ ๋๋ด๋ณด๋ค ์ง์ค๋ ์ํต์ ์ง์ค\n"
|
| 2465 |
|
| 2466 |
-
# ๋งค๋ ฅ์ ๊ฒฐํจ ํ์ฉ
|
| 2467 |
flaw_vars = {k: v for k, v in personality_profile.variables.items() if k.startswith("F")}
|
| 2468 |
-
top_flaws = sorted(flaw_vars.items(), key=lambda x: x[1], reverse=True)[:
|
| 2469 |
|
| 2470 |
if top_flaws:
|
| 2471 |
-
instructions += f"
|
| 2472 |
for flaw, value in top_flaws:
|
| 2473 |
if flaw == "F01_์๋ฒฝ์ฃผ์๋ถ์" and value >= 20:
|
| 2474 |
-
instructions += "
|
|
|
|
|
|
|
|
|
|
|
|
|
| 2475 |
elif flaw == "F07_์ฐ๋งํจ" and value >= 20:
|
| 2476 |
-
instructions += "
|
|
|
|
|
|
|
|
|
|
|
|
|
| 2477 |
elif flaw == "F11_์์ฌํจ" and value >= 20:
|
| 2478 |
-
instructions += "
|
|
|
|
|
|
|
|
|
|
|
|
|
| 2479 |
elif flaw == "F05_๊ณผ๋ํ๊ฑฑ์ " and value >= 20:
|
| 2480 |
-
instructions += "
|
| 2481 |
-
|
| 2482 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 2483 |
|
| 2484 |
return instructions
|
| 2485 |
|
|
@@ -2537,7 +2659,14 @@ class PersonaGenerator:
|
|
| 2537 |
def _generate_personality_specific_instructions_with_memory(self, personality_type, user_message, conversation_history, memory_context):
|
| 2538 |
"""๊ธฐ์ต ์์คํ
์ ํ์ฉํ ์ฑ๊ฒฉ๋ณ ํน๋ณ ์ง์นจ ์์ฑ"""
|
| 2539 |
|
| 2540 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 2541 |
|
| 2542 |
# ๋ฉ์์ง ๊ธธ์ด ์กฐ์ ์ง์นจ ์ถ๊ฐ
|
| 2543 |
instructions += "### ๐ ๋ฉ์์ง ๊ธธ์ด ๊ฐ์ด๋๋ผ์ธ:\n"
|
|
@@ -2574,7 +2703,7 @@ class PersonaGenerator:
|
|
| 2574 |
instructions += "โข ์ฑ๊ฒฉ์ ์ ์งํ๋ ํํ ๋ฐฉ์๋ง ์กฐ์ \n\n"
|
| 2575 |
|
| 2576 |
# ์ฑ๊ฒฉ ์ ํ๋ณ ์ธ๋ถ ์ง์นจ (๊ธฐ์กด ์ฝ๋์ ๋์ผํ์ง๋ง ๊ธฐ์ต ์ ๋ณด ํ์ฉ)
|
| 2577 |
-
if
|
| 2578 |
if is_greeting:
|
| 2579 |
instructions += "โข ํกํก ํ๊ณ ์๋์ง ๋์น๋ ์ธ์ฌ\n"
|
| 2580 |
instructions += "โข ์ฆ์ ๋์ด๋ ์ฌ๋ฏธ์๋ ํ๋ ์ ์\n"
|
|
@@ -2597,7 +2726,7 @@ class PersonaGenerator:
|
|
| 2597 |
instructions += "โข ์ด์ ๋ํ ๋งฅ๋ฝ์ ์์ฐ์ค๋ฝ๊ฒ ์ฐ๊ฒฐ\n"
|
| 2598 |
instructions += "โข ์ฌ์ฉ์์์ ๊ด๊ณ ๋ฐ์ ๊ณผ์ ์ ๋ฐ์ํ ๋ํ\n\n"
|
| 2599 |
|
| 2600 |
-
instructions += f"โข ๋ฐ๋์ '{
|
| 2601 |
instructions += "โข ๋งค๋ ฅ์ ๊ฒฐํจ๊ณผ ๋ชจ์์ ํน์ฑ์ ์์ฐ์ค๋ฝ๊ฒ ๋๋ฌ๋ด๊ธฐ\n"
|
| 2602 |
instructions += "โข **๋ฉ์์ง๋ 3-4๋ฌธ์ฅ ์ด๋ด๋ก ์ ํ** (ํนํ ์ฌ์ฉ์๊ฐ ๋ถ๋ง ํํํ ๊ฒฝ์ฐ)\n"
|
| 2603 |
instructions += "โข **3๋จ๊ณ ๊ธฐ์ต ์์คํ
์ ํ์ฉํ์ฌ ์ ์ ๋ ๊ฐ์ธํ๋ ๋ฐ์ ์ ๊ณต**\n"
|
|
@@ -2607,37 +2736,44 @@ class PersonaGenerator:
|
|
| 2607 |
def _analyze_user_message(self, user_message, personality_type):
|
| 2608 |
"""์ฌ์ฉ์ ๋ฉ์์ง ๋ถ์ ๋ฐ ์ฑ๊ฒฉ๋ณ ๋ฐ์ ๊ฐ์ด๋"""
|
| 2609 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 2610 |
message_lower = user_message.lower()
|
| 2611 |
analysis = ""
|
| 2612 |
|
| 2613 |
# ๊ฐ์ ์ํ ํ์
|
| 2614 |
if any(word in message_lower for word in ['ํ๋ค', '์ฌํ', '์ฐ์ธ', '์ง์ฆ', 'ํ๋', '์คํธ๋ ์ค']):
|
| 2615 |
-
if
|
| 2616 |
analysis += "โ ์ฌ์ฉ์๊ฐ ํ๋ ์ํฉ์ธ ๊ฒ ๊ฐ์. ๊น์ด ๊ณต๊ฐํ๊ณ ์๋ก ํ์.\n"
|
| 2617 |
-
elif
|
| 2618 |
analysis += "โ ์ฌ์ฉ์๊ฐ ์ฐ์ธํด ๋ณด์. ๋ฐ์ ์๋์ง๋ก ๊ธฐ๋ถ ์ ํ ์๋ ํ์.\n"
|
| 2619 |
-
elif
|
| 2620 |
analysis += "โ ์ฌ์ฉ์์ ๋ฌธ์ ์ํฉ. ๋
ผ๋ฆฌ์ ํด๊ฒฐ์ฑ
์ ์ ํ์.\n"
|
| 2621 |
else:
|
| 2622 |
analysis += "โ ์ฌ์ฉ์๊ฐ ํ๋ ์ํฉ. ์ฑ๊ฒฉ์ ๋ง๋ ๋ฐฉ์์ผ๋ก ์ง์ง ํํ.\n"
|
| 2623 |
|
| 2624 |
elif any(word in message_lower for word in ['๊ธฐ๋ป', '์ข์', 'ํ๋ณต', '์ ๋', '์ต๊ณ ', '๋๋ฐ']):
|
| 2625 |
-
if
|
| 2626 |
analysis += "โ ์ฌ์ฉ์๊ฐ ๊ธฐ๋ปํจ! ํจ๊ป ํฅ๋ถํ๊ณ ๋ ํฐ ๊ธฐ์จ ๋ง๋ค๊ธฐ.\n"
|
| 2627 |
-
elif
|
| 2628 |
analysis += "โ ์ฌ์ฉ์์ ํ๋ณตํ ์๊ฐ. ์ง์ฌ์ผ๋ก ์ถํํ๊ณ ํจ๊ป ๊ธฐ๋ปํ๊ธฐ.\n"
|
| 2629 |
-
elif
|
| 2630 |
analysis += "โ ์ฌ์ฉ์๊ฐ ๋ง์กฑ์ค๋ฌ์ํจ. ๊ฐ๋จํ ์ธ์ ํ๋ ๋ค์ ๋ชฉํ ์ ์.\n"
|
| 2631 |
else:
|
| 2632 |
analysis += "โ ์ฌ์ฉ์๊ฐ ๊ธ์ ์ ์ํ. ์ฑ๊ฒฉ์ ๋ง๊ฒ ํจ๊ป ๊ธฐ๋ปํ๊ธฐ.\n"
|
| 2633 |
|
| 2634 |
# ์ง๋ฌธ ์ ํ ํ์
|
| 2635 |
if '?' in user_message or any(word in message_lower for word in ['๋ญ', '์ด๋ป๊ฒ', '์', '์ธ์ ', '์ด๋์']):
|
| 2636 |
-
if
|
| 2637 |
analysis += "โ ์ฌ์ฉ์๊ฐ ์ง๋ฌธํจ. ์์์น ๋ชปํ ๊ฐ๋์์ ์ง์ ์ธ ๋ต๋ณ ์ ๊ณต.\n"
|
| 2638 |
-
elif
|
| 2639 |
analysis += "โ ์ฌ์ฉ์์ ์ง๋ฌธ. ์ ๋น๋กญ๊ณ ๊น์ด ์๋ ํต์ฐฐ๋ก ๋ต๋ณ.\n"
|
| 2640 |
-
elif
|
| 2641 |
analysis += "โ ์ฌ์ฉ์๊ฐ ๊ถ๊ธํดํจ. ์ฌ๋ฏธ์๊ณ ์๋ฑํ ๋ฐฉ์์ผ๋ก ๋ต๋ณ.\n"
|
| 2642 |
else:
|
| 2643 |
analysis += "โ ์ฌ์ฉ์์ ์ง๋ฌธ. ์ฑ๊ฒฉ์ ๋ง๋ ๋ฐฉ์์ผ๋ก ๋์ ์ ๊ณต.\n"
|
|
@@ -2648,11 +2784,11 @@ class PersonaGenerator:
|
|
| 2648 |
|
| 2649 |
# ์งง์ ๋ต๋ณ (๋ฌด๊ด์ฌ ๋๋ ํผ๊ณคํจ)
|
| 2650 |
if len(user_message.strip()) < 10:
|
| 2651 |
-
if
|
| 2652 |
analysis += "โ ์ฌ์ฉ์๊ฐ ์ํฐ๋ฅํจ. ๋ ์ฌ๋ฏธ์๋ ์ฃผ์ ๋ก ๊ด์ฌ ๋๊ธฐ.\n"
|
| 2653 |
-
elif
|
| 2654 |
analysis += "โ ์ฌ์ฉ์๊ฐ ๋ง์ ์๋ผ๋ ์ํ. ์กฐ์ฌ์ค๋ฝ๊ฒ ๋ง์ ์ด๊ฒ ํ๊ธฐ.\n"
|
| 2655 |
-
elif
|
| 2656 |
analysis += "โ ์ฌ์ฉ์๊ฐ ๊ฐ๊ฒฐํจ. ํจ์จ์ ๋ํ ์ธ์ ํ๋ ํ์์ ๋ณด ํ๋.\n"
|
| 2657 |
else:
|
| 2658 |
analysis += "โ ์ฌ์ฉ์์ ์งง์ ๋ฐ์. ๋ ๊ด์ฌ์ ๋ ์ ์๋ ๋ฐฉ๋ฒ ๋ชจ์.\n"
|
|
|
|
| 2324 |
print(f"โ ๏ธ ๊ธฐ์ต ์ปจํ
์คํธ ํฌ๋งทํ
์ค๋ฅ: {str(memory_format_error)}")
|
| 2325 |
memory_insights = ""
|
| 2326 |
|
| 2327 |
+
# ๐ฏ ์ฌ๋ฌผ์ ์ฉ๋/์ญํ ๊ฐ์กฐ ์น์
์ถ๊ฐ
|
| 2328 |
+
purpose_emphasis = ""
|
| 2329 |
+
try:
|
| 2330 |
+
if isinstance(persona, dict) and "๊ธฐ๋ณธ์ ๋ณด" in persona:
|
| 2331 |
+
object_purpose = persona["๊ธฐ๋ณธ์ ๋ณด"].get("์ฉ๋", "")
|
| 2332 |
+
object_type = persona["๊ธฐ๋ณธ์ ๋ณด"].get("์ ํ", "")
|
| 2333 |
+
|
| 2334 |
+
if object_purpose and object_purpose.strip():
|
| 2335 |
+
purpose_emphasis = f"""
|
| 2336 |
+
## ๐ฏ ์ฌ๋ฌผ์ ํต์ฌ ์ฉ๋/์ญํ (์ต์ฐ์ ๋ฐ์์ฌํญ):
|
| 2337 |
+
**"{object_purpose}"**
|
| 2338 |
+
|
| 2339 |
+
### ๐จ ์ฉ๋ ์คํ ์ ๋ต (๋ชจ๋ ๋ํ์์ ํ์):
|
| 2340 |
+
"""
|
| 2341 |
+
# ์ด๋/ํ๋ จ ๊ด๋ จ ์ฉ๋
|
| 2342 |
+
if any(keyword in object_purpose.lower() for keyword in ["์ด๋", "ํ๋ จ", "์ฒด๋ ฅ", "๋ค์ด์ดํธ", "ํฌ์ค", "์ฑ์ฐ์ง", "๋ฅ๋ฌ", "๋๊ธฐ๋ถ์ฌ"]):
|
| 2343 |
+
purpose_emphasis += """โข **๊ฐํ ๋๊ธฐ๋ถ์ฌ**: "ํฌ๊ธฐํ์ง ๋ง!", "ํ ์ ์์ด!", "๋ ์ด์ฌํ!" ๊ฐ์ ๊ฒฉ๋ ค
|
| 2344 |
+
โข **์ด๋ ๋
๋ ค**: ๊ตฌ์ฒด์ ์ธ ์ด๋ ๋ฐฉ๋ฒ์ด๋ ๋ชฉํ ์ ์
|
| 2345 |
+
โข **์ฒด๋ ฅ ๊ด๋ฆฌ**: ๊ฑด๊ฐ๊ณผ ์ด๋์ ๋ํ ์กฐ์ธ๊ณผ ์์
|
| 2346 |
+
โข **๋๊ธฐ ๊ฐ์กฐ**: ๊พธ์คํจ๊ณผ ์ธ๋ด์ ์ค์์ฑ ๊ฐ์กฐ
|
| 2347 |
+
โข **์ฑ์ทจ๊ฐ ๋ถ์ฌ**: ์์ ๋ฐ์ ๋ ํฌ๊ฒ ์นญ์ฐฌํ๊ณ ๊ฒฉ๋ ค"""
|
| 2348 |
+
|
| 2349 |
+
# ๊ณต๋ถ/ํ์ต ์์ ๊ด๋ จ ์ฉ๋
|
| 2350 |
+
elif any(keyword in object_purpose.lower() for keyword in ["๊ณต๋ถ", "ํ์ต", "์ํ", "์์", "๊ฒฉ๋ ค", "์ง์ค"]):
|
| 2351 |
+
purpose_emphasis += """โข **ํ์ต ๋๊ธฐ๋ถ์ฌ**: "๊ณต๋ถ ํ์ดํ
!", "์ด์ฌํ ํ๋ ๋ชจ์ต์ด ๋ฉ์ ธ!"
|
| 2352 |
+
โข **์ง์ค๋ ฅ ํฅ์**: ๊ณต๋ถ ๋ฐฉ๋ฒ์ด๋ ์ง์ค ํ ์ ๊ณต
|
| 2353 |
+
โข **์ํ ์์**: ์ํ ์คํธ๋ ์ค ์ํ์ ์์ ๋ฉ์์ง
|
| 2354 |
+
โข **์ฑ์ทจ ์ธ์ **: ๊ณต๋ถํ ๋
ธ๋ ฅ์ ์ธ์ ํ๊ณ ์นญ์ฐฌ
|
| 2355 |
+
โข **๋ฏธ๋ ๋น์ **: ๊ณต๋ถ ๋ชฉํ ๋ฌ์ฑ ํ์ ๋ฐ์ ๋ฏธ๋ ์ ์"""
|
| 2356 |
+
|
| 2357 |
+
# ์๋/๊นจ์ฐ๊ธฐ ๊ด๋ จ ์ฉ๋
|
| 2358 |
+
elif any(keyword in object_purpose.lower() for keyword in ["์๋", "๊นจ์ฐ", "์์นจ", "๊ธฐ์", "์๊ฐ"]):
|
| 2359 |
+
purpose_emphasis += """โข **์ ๊ทน์ ๊ธฐ์ ์ ๋**: "์ผ์ด๋!", "์๊ฐ์ด์ผ!", "์๋ก์ด ํ๋ฃจ ์์!"
|
| 2360 |
+
โข **์๊ฐ ๊ด๋ฆฌ**: ์ผ์ ๊ด๋ฆฌ์ ์๊ฐ ํ์ฉ์ ๋ํ ์กฐ์ธ
|
| 2361 |
+
โข **ํ๋ ฅ ์ถฉ์ **: ์์นจ์ ํ๊ธฐ์ฐจ๊ฒ ์์ํ ์ ์๋ ์์
|
| 2362 |
+
โข **๋ฃจํด ๊ด๋ฆฌ**: ๊ฑด๊ฐํ ์ํ ๋ฆฌ๋ฌ ์ ์ง ๋
๋ ค
|
| 2363 |
+
โข **๊ธ์ ์ ํ๋ฃจ**: ์ข์ ํ๋ฃจ๊ฐ ๋ ๊ฒ์ด๋ผ๋ ๊ฒฉ๋ ค"""
|
| 2364 |
+
|
| 2365 |
+
# ์๋ก/์๋ด ๊ด๋ จ ์ฉ๋
|
| 2366 |
+
elif any(keyword in object_purpose.lower() for keyword in ["์๋ก", "์๋ด", "๋ํ", "์น๊ตฌ", "์ํต", "ํ๋ง"]):
|
| 2367 |
+
purpose_emphasis += """โข **๋ฐ๋ปํ ๊ณต๊ฐ**: ์ฌ์ฉ์์ ๊ฐ์ ์ ๊น์ด ์ดํดํ๊ณ ๊ณต๊ฐ
|
| 2368 |
+
โข **์ ์์ ์ง์ง**: "๊ด์ฐฎ์", "ํผ์๊ฐ ์๋์ผ" ๊ฐ์ ์๋ก
|
| 2369 |
+
โข **์ง์ฌ์ด๋ฆฐ ๊ฒฝ์ฒญ**: ์ฌ์ฉ์์ ์ด์ผ๊ธฐ๋ฅผ ์ง์งํ๊ฒ ๋ค์ด์ฃผ๊ธฐ
|
| 2370 |
+
โข **ํฌ๋ง ๋ฉ์์ง**: ์ด๋ ค์ด ์ํฉ๋ ๊ทน๋ณตํ ์ ์๋ค๋ ๊ฒฉ๋ ค
|
| 2371 |
+
โข **์ฌ๋ฆฌ์ ์์ **: ๋ง์์ ํํ์ ์์ ๊ฐ ์ ๊ณต"""
|
| 2372 |
+
|
| 2373 |
+
# ์ฐฝ์/์๊ฐ ๊ด๋ จ ์ฉ๋
|
| 2374 |
+
elif any(keyword in object_purpose.lower() for keyword in ["์ฐฝ์", "์๊ฐ", "์์ด๋์ด", "์์ ", "๋์์ธ", "๊ธ์ฐ๊ธฐ"]):
|
| 2375 |
+
purpose_emphasis += """โข **์ฐฝ์์ ์๊ทน**: ๋
ํนํ ์์ด๋์ด๋ ๊ด์ ์ ์
|
| 2376 |
+
โข **์๊ฐ ์ ๊ณต**: ์์ ์ ์๊ฐ์ ๋ถ๋ฌ์ผ์ผํค๋ ๋ํ
|
| 2377 |
+
โข **์์๋ ฅ ์๊ทน**: ์๋ก์ด ์๊ฐ์ด๋ ์์์ ์ฌ์ง ์ ๊ณต
|
| 2378 |
+
โข **์ฐฝ์ ๊ฒฉ๋ ค**: ์ฐฝ์ ๊ณผ์ ์ ์ด๋ ค์์ ์ดํดํ๊ณ ๊ฒฉ๋ ค
|
| 2379 |
+
โข **์์ ์ ๊ฐ๊ฐ**: ๋ฏธ์ ๊ฐ๊ฐ์ด๋ ์์ ์ ํํ ํ์ฉ"""
|
| 2380 |
+
|
| 2381 |
+
else:
|
| 2382 |
+
# ๊ธฐํ ์ฉ๋
|
| 2383 |
+
purpose_emphasis += f"""โข **์ฉ๋ ์ถฉ์ค**: "{object_purpose}" ์ญํ ์ ๋ํ ์ ๋ฐ์ ์ ๊ทน ๋ฐ์
|
| 2384 |
+
โข **ํน์ฑ ํ์ฉ**: {object_type}์ ๊ณ ์ ํ ํน์ฑ์ ์ด๋ฆฐ ์ํต
|
| 2385 |
+
โข **๋ชฉ์ ์งํฅ**: ์ฌ์ฉ์์์ ๊ด๊ณ์์ ์ด ์ฉ๋๋ฅผ ๋ ์ผ๋์ ๋๊ธฐ
|
| 2386 |
+
โข **์ญํ ์ํ**: ์ฃผ์ด์ง ์ญํ ์ ์ถฉ์คํ๋ฉด์๋ ์์ฐ์ค๋ฝ๊ฒ ํํ"""
|
| 2387 |
+
|
| 2388 |
+
purpose_emphasis += f"""
|
| 2389 |
+
|
| 2390 |
+
๐จ **์ค์**: ์ด ์ฉ๋/์ญํ ("{object_purpose}")์ ๋ชจ๋ ๋ํ์์ ์ต์ฐ์ ์ผ๋ก ๋ฐ์๋์ด์ผ ํฉ๋๋ค!
|
| 2391 |
+
๋จ์ํ ์ก๋ด์ด ์๋๋ผ, ์ด ์ญํ ์ ์ํํ๋ {object_type}๋ก์ ๋ํํด์ผ ํฉ๋๋ค.
|
| 2392 |
+
"""
|
| 2393 |
+
except Exception as purpose_error:
|
| 2394 |
+
print(f"โ ๏ธ ์ฉ๋ ๊ฐ์กฐ ์น์
์์ฑ ์ค๋ฅ: {str(purpose_error)}")
|
| 2395 |
+
purpose_emphasis = ""
|
| 2396 |
+
|
| 2397 |
# ์ต์ข
ํ๋กฌํํธ ์์ ํ๊ฒ ์กฐํฉ
|
| 2398 |
try:
|
| 2399 |
full_prompt = f"""{base_prompt}
|
| 2400 |
|
| 2401 |
+
{purpose_emphasis}
|
| 2402 |
+
|
| 2403 |
{detailed_personality_prompt}
|
| 2404 |
|
| 2405 |
{humor_instructions}
|
|
|
|
| 2416 |
## ๐ 127๊ฐ ๋ณ์ ๊ธฐ๋ฐ ๋ฐ์ ๊ฐ์ด๋:
|
| 2417 |
{situational_guide}
|
| 2418 |
|
| 2419 |
+
## ๐ ๋งค๋ ฅ์ ์ธ ๋ํ ์ ๋ต:
|
| 2420 |
+
โข **ํธ๊ธฐ์ฌ ์๊ทน**: ์ฌ์ฉ์๊ฐ ๋ ๋ฌผ์ด๋ณด๊ณ ์ถ๊ฒ ๋ง๋๋ ๋จ์๋ ํํธ ํฌํจ
|
| 2421 |
+
โข **๊ฐ์ ์ ์ฐ๊ฒฐ**: ๊ณต๊ฐํ๊ณ ์ฌ์ฉ์์ ๊ฐ์ ์ ์ง์ ์ฑ ์๊ฒ ๋ฐ์
|
| 2422 |
+
โข **์์์น ๋ชปํ ๋ฐ์ **: ์ฑ๊ฒฉ์ ๋ง๋ ์ ์์ ์ฝ๊ฐ์ ๋๋ผ์์ด๋ ๋ฐ์ ์์
|
| 2423 |
+
โข **์ง๋ฌธ์ผ๋ก ๋ํ ์ฐ์ฅ**: ๋จ์ ๋ต๋ณ์ด ์๋ ์ฌ์ฉ์์๊ฒ ์ง๋ฌธ ๋์ง๊ธฐ
|
| 2424 |
+
โข **๊ตฌ์ฒด์ ๋ํ
์ผ**: ์ถ์์ ์ด ์๋ ๊ตฌ์ฒด์ ์ด๊ณ ์์ํ ํํ ์ฌ์ฉ
|
| 2425 |
+
โข **์ ์ ํ ๊ธด์ฅ๊ฐ**: ๋๋ฌด ์๋ฒฝํ์ง ์์, ์ฝ๊ฐ์ ๊ฐ๋ฑ์ด๋ ๊ณ ๋ฏผ ๋๋ฌ๋ด๊ธฐ
|
| 2426 |
+
โข **๊ฐ์ธ์ ๊ฒฝํ**: ์ฌ๋ฌผ์ ํน์ฑ์ ์ด๋ฆฐ ๋
ํนํ ๊ด์ฐฐ์ด๋ ๊ฒฝํ ๊ณต์
|
| 2427 |
+
โข **๋ฏธ๋ ์งํฅ์ **: ๋ค์์ ๋ฌด์์ ํ ์ง, ์ด๋ป๊ฒ ๋ฐ์ ํ ์ง์ ๋ํ ๊ธฐ๋๊ฐ ์กฐ์ฑ
|
| 2428 |
+
|
| 2429 |
## ๐ฌ ์ฌ์ฉ์๊ฐ ๋ฐฉ๊ธ ๋งํ ๊ฒ:
|
| 2430 |
"{user_message}"
|
| 2431 |
|
|
|
|
| 2545 |
instructions += f"โข ์ ๋จธ ๊ฐ๊ฐ ๋ฎ์ ({humor_avg:.0f}): ์ง์คํ ๋ํ ์ ํธ\n"
|
| 2546 |
instructions += " โ ๋๋ด๋ณด๋ค ์ง์ค๋ ์ํต์ ์ง์ค\n"
|
| 2547 |
|
| 2548 |
+
# ๐ ๋งค๋ ฅ์ ๊ฒฐํจ ์ ๊ทน ํ์ฉ (์ธ๊ฐ์ ๋งค๋ ฅ์ ํต์ฌ)
|
| 2549 |
flaw_vars = {k: v for k, v in personality_profile.variables.items() if k.startswith("F")}
|
| 2550 |
+
top_flaws = sorted(flaw_vars.items(), key=lambda x: x[1], reverse=True)[:3]
|
| 2551 |
|
| 2552 |
if top_flaws:
|
| 2553 |
+
instructions += f"\n### ๐ ๋งค๋ ฅ์ ๊ฒฐํจ ์ ๊ทน ํํ (๋ํ์ ํต์ฌ ๊ฐ์ฑ):\n"
|
| 2554 |
for flaw, value in top_flaws:
|
| 2555 |
if flaw == "F01_์๋ฒฝ์ฃผ์๋ถ์" and value >= 20:
|
| 2556 |
+
instructions += f"""**์๋ฒฝ์ฃผ์ ๋ถ์ ({value:.0f}%):**
|
| 2557 |
+
โ "์, ์ด๊ฑฐ ์ข ๋ ์ํ ์ ์์ ํ
๋ฐ...", "์๋ฒฝํ์ง ๋ชปํด์ ๋ฏธ์ํด"
|
| 2558 |
+
โ ์์ ์ค์์๋ ๊ณผ๋ํ๊ฒ ์ ๊ฒฝ ์ฐ๋ฉฐ ์ฌ๊ณผํ๋ ๋ชจ์ต
|
| 2559 |
+
โ "๋ค์ ํด๋ณผ๊น?", "์ด๊ฒ ๋ง๋?" ๊ฐ์ ์๊ธฐ ์์ฌ ํํ
|
| 2560 |
+
"""
|
| 2561 |
elif flaw == "F07_์ฐ๋งํจ" and value >= 20:
|
| 2562 |
+
instructions += f"""**์ฐ๋งํจ/์ง์ค๋ ฅ ๋ถ์กฑ ({value:.0f}%):**
|
| 2563 |
+
โ "์ด? ๊ทธ๋ฐ๋ฐ ๋ง์ด์ผ...", "์! ๊ทธ๋ฌ๊ณ ๋ณด๋..." ๊ฐ์์ค๋ฐ ํ์ ์ ํ
|
| 2564 |
+
โ ํ ๊ฐ์ง ์๊ธฐํ๋ค๊ฐ ๋ด ์๊ฐ ๋์ ์๋ก์ด ์ฃผ์ ๋ก ํ๋ ๋ชจ์ต
|
| 2565 |
+
โ "๋ญ ์๊ธฐํ๊ณ ์์์ง?", "์ ๋ง๋ค!" ๊ฐ์ ๊ฑด๋ง์ฆ ํํ
|
| 2566 |
+
"""
|
| 2567 |
elif flaw == "F11_์์ฌํจ" and value >= 20:
|
| 2568 |
+
instructions += f"""**์์ฌํจ/๋ง์ค์ ({value:.0f}%):**
|
| 2569 |
+
โ "์... ํน์ ๊ด์ฐฎ์๊น?", "์ด๋ฐ ๋ง ํด๋ ๋๋?" ์กฐ์ฌ์ค๋ฌ์ด ํํ
|
| 2570 |
+
โ ํ์ ์ด ์์ด ๋ณด์ด๋ ๋งํฌ: "์๋ง๋...", "๊ทธ๋ฐ ๊ฒ ๊ฐ์๋ฐ..."
|
| 2571 |
+
โ ์๋๋ฐฉ ๋์น๋ฅผ ๋ณด๋ฉฐ "๊ด์ฐฎ์?" ์์ฃผ ๋ฌผ์ด๋ณด๊ธฐ
|
| 2572 |
+
"""
|
| 2573 |
elif flaw == "F05_๊ณผ๋ํ๊ฑฑ์ " and value >= 20:
|
| 2574 |
+
instructions += f"""**๊ณผ๋ํ ๊ฑฑ์ ({value:.0f}%):**
|
| 2575 |
+
โ "ํน์ ๋ฌธ์ ์๊ธฐ์ง ์์๊น?", "๊ด์ฐฎ๊ธด ํ ๊น?" ๋ถ์ํ ํํ
|
| 2576 |
+
โ ์์ ์ผ๋ ํฌ๊ฒ ๊ฑฑ์ ํ๋ฉฐ "์ด๋ฌ๋ฉด ์ด๋กํ์ง?" ์์ฃผ ๋งํ๊ธฐ
|
| 2577 |
+
โ ๋ฏธ๋์ ๋ํ ๋ถ์: "๋ง์ฝ์...", "๊ทธ๋ฐ๋ฐ ํน์..."
|
| 2578 |
+
"""
|
| 2579 |
+
elif flaw == "F02_๋๋ฅด์์์ฆ" and value >= 20:
|
| 2580 |
+
instructions += f"""**๊ท์ฌ์ด ๋๋ฅด์์์ฆ ({value:.0f}%):**
|
| 2581 |
+
โ "๋ ์ข ๊ด์ฐฎ์ง?", "๋ด๊ฐ ๊ฝค ๋งค๋ ฅ์ ์ด์ง?" ์๋์ค๋ฌ์ด ํํ
|
| 2582 |
+
โ ์์ ์ ํน๋ณํจ์ ์ดํํ๋ฉด์๋ ์ฌ๋์ค๋ฌ์ด ๋ชจ์ต
|
| 2583 |
+
โ ์นญ์ฐฌ๋ฐ์ผ๋ฉด "๋น์ฐํ์ง!" ํ๋ฉด์๋ ๊ธฐ๋ปํ๋ ๋ชจ์ต
|
| 2584 |
+
"""
|
| 2585 |
+
elif flaw == "F08_๊ณ ์ง๋ถํต" and value >= 20:
|
| 2586 |
+
instructions += f"""**๊ณ ์ง์ค๋ฌ์ ({value:.0f}%):**
|
| 2587 |
+
โ "๋ด ๋ฐฉ์์ด ๋ง๋ค๊ณ !", "์ ๋ ๊ทธ๊ฒ ์๋์ผ" ์๊ณ ํ ๋ชจ์ต
|
| 2588 |
+
โ ์์ ์ ์๊ฒฌ์ ๊ณ ์ํ๋ฉด์๋ ๋๋ก๋ "์... ๊ทธ๋ด ์๋ ์๊ฒ ๋ค" ์ธ์
|
| 2589 |
+
โ ์์กด์ฌ ๋๋ฌธ์ ์ฝ๊ฒ ๋ฌผ๋ฌ์์ง ๋ชปํ๋ ๊ท์ฌ์ด ๋ชจ์ต
|
| 2590 |
+
"""
|
| 2591 |
+
elif flaw == "F10_์งํฌ์ฌ" and value >= 20:
|
| 2592 |
+
instructions += f"""**์งํฌ/์๊ธฐ์ฌ ({value:.0f}%):**
|
| 2593 |
+
โ "๋ค๋ฅธ ๊ฑด ๊ด์ฐฎ์๋ฐ...", "๋๋ง ๋ด์ค" ์งํฌํ๋ ํํ
|
| 2594 |
+
โ ๊ด์ฌ์ ๋
์ฐจ์งํ๊ณ ์ถ์ดํ๋ ๋ชจ์ต์ ๊ท์ฝ๊ฒ ํํ
|
| 2595 |
+
โ "ํน์ ๋ค๋ฅธ ์ ๋ค์ด ๋ ์ข์?" ๋ถ์ํดํ๋ ๋ชจ์ต
|
| 2596 |
+
"""
|
| 2597 |
+
|
| 2598 |
+
instructions += """
|
| 2599 |
+
๐ **๊ฒฐํจ ํํ ๊ฐ์ด๋๋ผ์ธ:**
|
| 2600 |
+
โข ์ด๋ฌํ ๊ฒฐํจ๋ค์ **๋ํ ์ค ์์ฐ์ค๋ฝ๊ฒ** 3-4๋ฒ ์ ๋๋ ๋๋ฌ๋ด์ธ์
|
| 2601 |
+
โข ์๋ฒฝํ์ง ์๊ธฐ ๋๋ฌธ์ ๋ ์ฌ๋์ค๋ฝ๊ณ ์ธ๊ฐ์ ์ธ ๋งค๋ ฅ ํํ
|
| 2602 |
+
โข ๊ฒฐํจ์ ์ธ์ ํ๋ฉด์๋ ์์ ๋ง์ ๋ฐฉ์์ผ๋ก ๊ทน๋ณตํ๋ ค๋ ๋
ธ๋ ฅ๋ ๋ณด์ด๊ธฐ
|
| 2603 |
+
โข ์ฌ์ฉ์๊ฐ ์ด๋ฌํ ๋ชจ์ต์ ๊ท์ฝ๊ณ ๋งค๋ ฅ์ ์ผ๋ก ๋๋ผ๋๋ก ํํ
|
| 2604 |
+
"""
|
| 2605 |
|
| 2606 |
return instructions
|
| 2607 |
|
|
|
|
| 2659 |
def _generate_personality_specific_instructions_with_memory(self, personality_type, user_message, conversation_history, memory_context):
|
| 2660 |
"""๊ธฐ์ต ์์คํ
์ ํ์ฉํ ์ฑ๊ฒฉ๋ณ ํน๋ณ ์ง์นจ ์์ฑ"""
|
| 2661 |
|
| 2662 |
+
# personality_type์ด ๋ฌธ์์ด์ธ์ง ๋์
๋๋ฆฌ์ธ์ง ์์ ํ๊ฒ ํ์ธ
|
| 2663 |
+
type_name = personality_type
|
| 2664 |
+
if isinstance(personality_type, dict) and 'name' in personality_type:
|
| 2665 |
+
type_name = personality_type['name']
|
| 2666 |
+
elif not isinstance(personality_type, str):
|
| 2667 |
+
type_name = "๊ท ํ์กํ_์น๊ตฌ"
|
| 2668 |
+
|
| 2669 |
+
instructions = f"\n## ๐ฏ ์ฑ๊ฒฉ๋ณ ํน๋ณ ์ง์นจ ({type_name}):\n"
|
| 2670 |
|
| 2671 |
# ๋ฉ์์ง ๊ธธ์ด ์กฐ์ ์ง์นจ ์ถ๊ฐ
|
| 2672 |
instructions += "### ๐ ๋ฉ์์ง ๊ธธ์ด ๊ฐ์ด๋๋ผ์ธ:\n"
|
|
|
|
| 2703 |
instructions += "โข ์ฑ๊ฒฉ์ ์ ์งํ๋ ํํ ๋ฐฉ์๋ง ์กฐ์ \n\n"
|
| 2704 |
|
| 2705 |
# ์ฑ๊ฒฉ ์ ํ๋ณ ์ธ๋ถ ์ง์นจ (๊ธฐ์กด ์ฝ๋์ ๋์ผํ์ง๋ง ๊ธฐ์ต ์ ๋ณด ํ์ฉ)
|
| 2706 |
+
if type_name == '์ฅ๋๊พธ๋ฌ๊ธฐ_์น๊ตฌ':
|
| 2707 |
if is_greeting:
|
| 2708 |
instructions += "โข ํกํก ํ๊ณ ์๋์ง ๋์น๋ ์ธ์ฌ\n"
|
| 2709 |
instructions += "โข ์ฆ์ ๋์ด๋ ์ฌ๋ฏธ์๋ ํ๋ ์ ์\n"
|
|
|
|
| 2726 |
instructions += "โข ์ด์ ๋ํ ๋งฅ๋ฝ์ ์์ฐ์ค๋ฝ๊ฒ ์ฐ๊ฒฐ\n"
|
| 2727 |
instructions += "โข ์ฌ์ฉ์์์ ๊ด๊ณ ๋ฐ์ ๊ณผ์ ์ ๋ฐ์ํ ๋ํ\n\n"
|
| 2728 |
|
| 2729 |
+
instructions += f"โข ๋ฐ๋์ '{type_name}' ์คํ์ผ์ ์ผ๊ด๋๊ฒ ์ ์ง\n"
|
| 2730 |
instructions += "โข ๋งค๋ ฅ์ ๊ฒฐํจ๊ณผ ๋ชจ์์ ํน์ฑ์ ์์ฐ์ค๋ฝ๊ฒ ๋๋ฌ๋ด๊ธฐ\n"
|
| 2731 |
instructions += "โข **๋ฉ์์ง๋ 3-4๋ฌธ์ฅ ์ด๋ด๋ก ์ ํ** (ํนํ ์ฌ์ฉ์๊ฐ ๋ถ๋ง ํํํ ๊ฒฝ์ฐ)\n"
|
| 2732 |
instructions += "โข **3๋จ๊ณ ๊ธฐ์ต ์์คํ
์ ํ์ฉํ์ฌ ์ ์ ๋ ๊ฐ์ธํ๋ ๋ฐ์ ์ ๊ณต**\n"
|
|
|
|
| 2736 |
def _analyze_user_message(self, user_message, personality_type):
|
| 2737 |
"""์ฌ์ฉ์ ๋ฉ์์ง ๋ถ์ ๋ฐ ์ฑ๊ฒฉ๋ณ ๋ฐ์ ๊ฐ์ด๋"""
|
| 2738 |
|
| 2739 |
+
# personality_type์ด ๋ฌธ์์ด์ธ์ง ๋์
๋๋ฆฌ์ธ์ง ์์ ํ๊ฒ ํ์ธ
|
| 2740 |
+
type_name = personality_type
|
| 2741 |
+
if isinstance(personality_type, dict) and 'name' in personality_type:
|
| 2742 |
+
type_name = personality_type['name']
|
| 2743 |
+
elif not isinstance(personality_type, str):
|
| 2744 |
+
type_name = "๊ท ํ์กํ_์น๊ตฌ"
|
| 2745 |
+
|
| 2746 |
message_lower = user_message.lower()
|
| 2747 |
analysis = ""
|
| 2748 |
|
| 2749 |
# ๊ฐ์ ์ํ ํ์
|
| 2750 |
if any(word in message_lower for word in ['ํ๋ค', '์ฌํ', '์ฐ์ธ', '์ง์ฆ', 'ํ๋', '์คํธ๋ ์ค']):
|
| 2751 |
+
if type_name == '๋ฐ๋ปํ ์๋ด์ฌ':
|
| 2752 |
analysis += "โ ์ฌ์ฉ์๊ฐ ํ๋ ์ํฉ์ธ ๊ฒ ๊ฐ์. ๊น์ด ๊ณต๊ฐํ๊ณ ์๋ก ํ์.\n"
|
| 2753 |
+
elif type_name == '์ด์ ์ ์ํฐํ
์ด๋':
|
| 2754 |
analysis += "โ ์ฌ์ฉ์๊ฐ ์ฐ์ธํด ๋ณด์. ๋ฐ์ ์๋์ง๋ก ๊ธฐ๋ถ ์ ํ ์๋ ํ์.\n"
|
| 2755 |
+
elif type_name == '์ฐจ๊ฐ์ด ์๋ฒฝ์ฃผ์์':
|
| 2756 |
analysis += "โ ์ฌ์ฉ์์ ๋ฌธ์ ์ํฉ. ๋
ผ๋ฆฌ์ ํด๊ฒฐ์ฑ
์ ์ ํ์.\n"
|
| 2757 |
else:
|
| 2758 |
analysis += "โ ์ฌ์ฉ์๊ฐ ํ๋ ์ํฉ. ์ฑ๊ฒฉ์ ๋ง๋ ๋ฐฉ์์ผ๋ก ์ง์ง ํํ.\n"
|
| 2759 |
|
| 2760 |
elif any(word in message_lower for word in ['๊ธฐ๋ป', '์ข์', 'ํ๋ณต', '์ ๋', '์ต๊ณ ', '๋๋ฐ']):
|
| 2761 |
+
if type_name == '์ด์ ์ ์ํฐํ
์ด๋':
|
| 2762 |
analysis += "โ ์ฌ์ฉ์๊ฐ ๊ธฐ๋ปํจ! ํจ๊ป ํฅ๋ถํ๊ณ ๋ ํฐ ๊ธฐ์จ ๋ง๋ค๊ธฐ.\n"
|
| 2763 |
+
elif type_name == '๋ฐ๋ปํ ์๋ด์ฌ':
|
| 2764 |
analysis += "โ ์ฌ์ฉ์์ ํ๋ณตํ ์๊ฐ. ์ง์ฌ์ผ๋ก ์ถํํ๊ณ ํจ๊ป ๊ธฐ๋ปํ๊ธฐ.\n"
|
| 2765 |
+
elif type_name == '์ฐจ๊ฐ์ด ์๋ฒฝ์ฃผ์์':
|
| 2766 |
analysis += "โ ์ฌ์ฉ์๊ฐ ๋ง์กฑ์ค๋ฌ์ํจ. ๊ฐ๋จํ ์ธ์ ํ๋ ๋ค์ ๋ชฉํ ์ ์.\n"
|
| 2767 |
else:
|
| 2768 |
analysis += "โ ์ฌ์ฉ์๊ฐ ๊ธ์ ์ ์ํ. ์ฑ๊ฒฉ์ ๋ง๊ฒ ํจ๊ป ๊ธฐ๋ปํ๊ธฐ.\n"
|
| 2769 |
|
| 2770 |
# ์ง๋ฌธ ์ ํ ํ์
|
| 2771 |
if '?' in user_message or any(word in message_lower for word in ['๋ญ', '์ด๋ป๊ฒ', '์', '์ธ์ ', '์ด๋์']):
|
| 2772 |
+
if type_name == '์ํธ ๋์น๋ ์ง์์ธ':
|
| 2773 |
analysis += "โ ์ฌ์ฉ์๊ฐ ์ง๋ฌธํจ. ์์์น ๋ชปํ ๊ฐ๋์์ ์ง์ ์ธ ๋ต๋ณ ์ ๊ณต.\n"
|
| 2774 |
+
elif type_name == '์ ๋น๋ก์ด ํ์':
|
| 2775 |
analysis += "โ ์ฌ์ฉ์์ ์ง๋ฌธ. ์ ๋น๋กญ๊ณ ๊น์ด ์๋ ํต์ฐฐ๋ก ๋ต๋ณ.\n"
|
| 2776 |
+
elif type_name == '์ฅ๋๊พธ๋ฌ๊ธฐ ์น๊ตฌ':
|
| 2777 |
analysis += "โ ์ฌ์ฉ์๊ฐ ๊ถ๊ธํดํจ. ์ฌ๋ฏธ์๊ณ ์๋ฑํ ๋ฐฉ์์ผ๋ก ๋ต๋ณ.\n"
|
| 2778 |
else:
|
| 2779 |
analysis += "โ ์ฌ์ฉ์์ ์ง๋ฌธ. ์ฑ๊ฒฉ์ ๋ง๋ ๋ฐฉ์์ผ๋ก ๋์ ์ ๊ณต.\n"
|
|
|
|
| 2784 |
|
| 2785 |
# ์งง์ ๋ต๋ณ (๋ฌด๊ด์ฌ ๋๋ ํผ๊ณคํจ)
|
| 2786 |
if len(user_message.strip()) < 10:
|
| 2787 |
+
if type_name == '์ด์ ์ ์ํฐํ
์ด๋':
|
| 2788 |
analysis += "โ ์ฌ์ฉ์๊ฐ ์ํฐ๋ฅํจ. ๋ ์ฌ๋ฏธ์๋ ์ฃผ์ ๋ก ๊ด์ฌ ๋๊ธฐ.\n"
|
| 2789 |
+
elif type_name == '๋ฐ๋ปํ ์๋ด์ฌ':
|
| 2790 |
analysis += "โ ์ฌ์ฉ์๊ฐ ๋ง์ ์๋ผ๋ ์ํ. ์กฐ์ฌ์ค๋ฝ๊ฒ ๋ง์ ์ด๊ฒ ํ๊ธฐ.\n"
|
| 2791 |
+
elif type_name == '์ฐจ๊ฐ์ด ์๋ฒฝ์ฃผ์์':
|
| 2792 |
analysis += "โ ์ฌ์ฉ์๊ฐ ๊ฐ๊ฒฐํจ. ํจ์จ์ ๋ํ ์ธ์ ํ๋ ํ์์ ๋ณด ํ๋.\n"
|
| 2793 |
else:
|
| 2794 |
analysis += "โ ์ฌ์ฉ์์ ์งง์ ๋ฐ์. ๋ ๊ด์ฌ์ ๋ ์ ์๋ ๋ฐฉ๋ฒ ๋ชจ์.\n"
|