haepada commited on
Commit
84ae117
ยท
1 Parent(s): 0303194

๐ŸŽฏ ์™„์„ฑ: 152๊ฐœ ๋ณ€์ˆ˜ ์‹œ์Šคํ…œ & ์‹ค์‹œ๊ฐ„ ๋ณ€ํ™”๋Ÿ‰ ๋ถ„์„ - ์‚ฌ์šฉ์ž ์กฐ์ •๊ฐ’์ด ๋ชจ๋“  ๋ณ€์ˆ˜์— ์ฒด๊ณ„์  ๋ฐ˜์˜, ์œ ๋จธ์Šคํƒ€์ผ๋ณ„ ์ฐจ๋ณ„ํ™”, ๋ณ€ํ™”๋Ÿ‰ ๋ถ„์„์œผ๋กœ ์กฐ์ • ํšจ๊ณผ ์‹ค์‹œ๊ฐ„ ํ™•์ธ, ๋” ํ’์„ฑํ•˜๊ณ  ์ž…์ฒด์ ์ธ ์„ฑ๊ฒฉ ์ƒ์„ฑ์„ ์œ„ํ•œ AI+์ˆ˜ํ•™์  ์กฐํ•ฉ

Browse files
Files changed (1) hide show
  1. app.py +236 -22
app.py CHANGED
@@ -300,9 +300,57 @@ def create_persona_from_image(image, name, location, time_spent, object_type, pu
300
  contradictions = backend_persona.get("๋ชจ์ˆœ์ ํŠน์„ฑ", [])
301
  contradictions_df = [[contradiction, "๋ณตํ•ฉ์  ๋งค๋ ฅ"] for contradiction in contradictions]
302
 
303
- # 127๊ฐœ ์„ฑ๊ฒฉ ๋ณ€์ˆ˜๋ฅผ DataFrame ํ˜•ํƒœ๋กœ ๋ณ€ํ™˜
304
  variables = backend_persona.get("์„ฑ๊ฒฉ๋ณ€์ˆ˜127", {})
305
- variables_df = [[var, value, "์„ฑ๊ฒฉ ๋ณ€์ˆ˜"] for var, value in variables.items()]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
306
 
307
  progress(0.9, desc="์™„๋ฃŒ ์ค‘...")
308
 
@@ -442,6 +490,9 @@ def adjust_persona_traits(persona, warmth, competence, extraversion, humor_style
442
  return None, "์กฐ์ •ํ•  ํŽ˜๋ฅด์†Œ๋‚˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.", {}
443
 
444
  try:
 
 
 
445
  # ๊นŠ์€ ๋ณต์‚ฌ๋กœ ์›๋ณธ ๋ณดํ˜ธ
446
  adjusted_persona = copy.deepcopy(persona)
447
 
@@ -460,32 +511,102 @@ def adjust_persona_traits(persona, warmth, competence, extraversion, humor_style
460
  from modules.persona_generator import PersonalityProfile
461
  profile = PersonalityProfile.from_dict(adjusted_persona["์„ฑ๊ฒฉํ”„๋กœํ•„"])
462
 
463
- # ์˜จ๊ธฐ ๊ด€๋ จ ๋ณ€์ˆ˜๋“ค ์กฐ์ •
464
- warmth_vars = ["W01_์นœ์ ˆํ•จ", "W02_์นœ๊ทผํ•จ", "W06_๊ณต๊ฐ๋Šฅ๋ ฅ", "W07_ํฌ์šฉ๋ ฅ"]
 
465
  for var in warmth_vars:
466
- profile.variables[var] = warmth + random.randint(-10, 10)
467
- profile.variables[var] = max(0, min(100, profile.variables[var]))
468
 
469
- # ๋Šฅ๋ ฅ ๊ด€๋ จ ๋ณ€์ˆ˜๋“ค ์กฐ์ •
470
- competence_vars = ["C01_ํšจ์œจ์„ฑ", "C02_์ง€๋Šฅ", "C05_์ •ํ™•์„ฑ", "C09_์‹คํ–‰๋ ฅ"]
 
 
 
471
  for var in competence_vars:
472
- profile.variables[var] = competence + random.randint(-10, 10)
473
- profile.variables[var] = max(0, min(100, profile.variables[var]))
474
 
475
- # ์™ธํ–ฅ์„ฑ ๊ด€๋ จ ๋ณ€์ˆ˜๋“ค ์กฐ์ •
476
- extraversion_vars = ["E01_์‚ฌ๊ต์„ฑ", "E02_ํ™œ๋™์„ฑ", "E04_๊ธ์ •์ •์„œ"]
477
  for var in extraversion_vars:
478
- profile.variables[var] = extraversion + random.randint(-10, 10)
479
- profile.variables[var] = max(0, min(100, profile.variables[var]))
480
 
481
- # ์œ ๋จธ ๊ด€๋ จ ๋ณ€์ˆ˜๋“ค์€ ํ•ญ์ƒ ๋†’๊ฒŒ ์œ ์ง€
482
- humor_vars = ["H01_์–ธ์–ด์œ ํฌ๋นˆ๋„", "H02_์ƒํ™ฉ์œ ๋จธ๊ฐ๊ฐ", "H06_๊ด€์ฐฐ์œ ๋จธ๋Šฅ๋ ฅ", "H08_์œ ๋จธํƒ€์ด๋ฐ๊ฐ"]
483
- for var in humor_vars:
484
- profile.variables[var] = random.randint(70, 85)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
485
 
486
  # ์—…๋ฐ์ดํŠธ๋œ ํ”„๋กœํ•„ ์ €์žฅ
487
  adjusted_persona["์„ฑ๊ฒฉํ”„๋กœํ•„"] = profile.to_dict()
488
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
489
  # ์กฐ์ •๋œ ์ •๋ณด ํ‘œ์‹œ
490
  adjusted_info = {
491
  "์ด๋ฆ„": adjusted_persona.get("๊ธฐ๋ณธ์ •๋ณด", {}).get("์ด๋ฆ„", "Unknown"),
@@ -513,6 +634,9 @@ def adjust_persona_traits(persona, warmth, competence, extraversion, humor_style
513
  "์™ธํ–ฅ์„ฑ": extraversion
514
  }, full_object_info, attractive_flaws)
515
 
 
 
 
516
  adjustment_message = f"""
517
  ### ๐ŸŽญ {persona_name}์˜ ์„ฑ๊ฒฉ์ด ์กฐ์ •๋˜์—ˆ์Šต๋‹ˆ๋‹ค!
518
 
@@ -523,15 +647,17 @@ def adjust_persona_traits(persona, warmth, competence, extraversion, humor_style
523
  โ€ข ์œ ๋จธ๊ฐ๊ฐ: 75/100 (๊ณ ์ • - ๋ชจ๋“  ํŽ˜๋ฅด์†Œ๋‚˜๊ฐ€ ์œ ๋จธ๋Ÿฌ์Šค!)
524
  โ€ข ์œ ๋จธ์Šคํƒ€์ผ: {humor_style}
525
 
526
- ๐Ÿงฌ **๋ฐฑ๊ทธ๋ผ์šด๋“œ**: 127๊ฐœ ์„ธ๋ถ€ ๋ณ€์ˆ˜๊ฐ€ ์ด ์„ค์ •์— ๋งž์ถฐ ์ž๋™ ์กฐ์ •๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
 
 
527
  """
528
 
529
- return adjusted_persona, adjustment_message, adjusted_info
530
 
531
  except Exception as e:
532
  import traceback
533
  traceback.print_exc()
534
- return persona, f"์กฐ์ • ์ค‘ ์˜ค๋ฅ˜ ๋ฐœ์ƒ: {str(e)}", {}
535
 
536
  def finalize_persona(persona):
537
  """ํŽ˜๋ฅด์†Œ๋‚˜ ์ตœ์ข… ํ™•์ • - ํ™˜๊ฒฝ๋ณ€์ˆ˜ API ์„ค์ • ์‚ฌ์šฉ"""
@@ -1570,7 +1696,7 @@ def create_main_interface():
1570
  adjust_btn.click(
1571
  fn=adjust_persona_traits,
1572
  inputs=[current_persona, warmth_slider, competence_slider, extraversion_slider, humor_style_radio],
1573
- outputs=[current_persona, adjustment_result, adjusted_info_output]
1574
  ).then(
1575
  # ๋ฐ˜์˜ ํ›„ ๋ฏธ๋ฆฌ๋ณด๊ธฐ๋„ ์—…๋ฐ์ดํŠธ
1576
  fn=generate_realtime_preview,
@@ -1769,6 +1895,94 @@ def generate_realtime_preview(persona, warmth, competence, extraversion, humor_s
1769
  **๐Ÿ‘‹ ์˜ˆ์ƒ ์ธ์‚ฌ๋ง:**
1770
  {preview}"""
1771
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1772
  if __name__ == "__main__":
1773
  app = create_main_interface()
1774
  app.launch(server_name="0.0.0.0", server_port=7860)
 
300
  contradictions = backend_persona.get("๋ชจ์ˆœ์ ํŠน์„ฑ", [])
301
  contradictions_df = [[contradiction, "๋ณตํ•ฉ์  ๋งค๋ ฅ"] for contradiction in contradictions]
302
 
303
+ # 127๊ฐœ ์„ฑ๊ฒฉ ๋ณ€์ˆ˜๋ฅผ DataFrame ํ˜•ํƒœ๋กœ ๋ณ€ํ™˜ (์นดํ…Œ๊ณ ๋ฆฌ๋ณ„ ๋ถ„๋ฅ˜)
304
  variables = backend_persona.get("์„ฑ๊ฒฉ๋ณ€์ˆ˜127", {})
305
+ if not variables and "์„ฑ๊ฒฉํ”„๋กœํ•„" in backend_persona:
306
+ # ์„ฑ๊ฒฉํ”„๋กœํ•„์—์„œ ์ง์ ‘ ๊ฐ€์ ธ์˜ค๊ธฐ
307
+ variables = backend_persona["์„ฑ๊ฒฉํ”„๋กœํ•„"]["variables"]
308
+
309
+ variables_df = []
310
+ for var, value in variables.items():
311
+ # ์นดํ…Œ๊ณ ๋ฆฌ ๋ถ„๋ฅ˜
312
+ if var.startswith('W'):
313
+ category = f"๐Ÿ”ฅ ์˜จ๊ธฐ/๋”ฐ๋œปํ•จ ({value})"
314
+ elif var.startswith('C'):
315
+ category = f"๐Ÿ’ช ๋Šฅ๋ ฅ/์—ญ๋Ÿ‰ ({value})"
316
+ elif var.startswith('E'):
317
+ category = f"๐Ÿ—ฃ๏ธ ์™ธํ–ฅ์„ฑ ({value})"
318
+ elif var.startswith('H'):
319
+ category = f"๐Ÿ˜„ ์œ ๋จธ ({value})"
320
+ elif var.startswith('F'):
321
+ category = f"๐Ÿ’Ž ๋งค๋ ฅ์ ๊ฒฐํ•จ ({value})"
322
+ elif var.startswith('P'):
323
+ category = f"๐ŸŽญ ์„ฑ๊ฒฉํŒจํ„ด ({value})"
324
+ elif var.startswith('S'):
325
+ category = f"๐Ÿ—จ๏ธ ์–ธ์–ด์Šคํƒ€์ผ ({value})"
326
+ elif var.startswith('R'):
327
+ category = f"โค๏ธ ๊ด€๊ณ„์„ฑํ–ฅ ({value})"
328
+ elif var.startswith('D'):
329
+ category = f"๐Ÿ’ฌ ๋Œ€ํ™”์—ญํ•™ ({value})"
330
+ elif var.startswith('OBJ'):
331
+ category = f"๐Ÿ  ์‚ฌ๋ฌผ์ •์ฒด์„ฑ ({value})"
332
+ elif var.startswith('FORM'):
333
+ category = f"โœจ ํ˜•ํƒœํŠน์„ฑ ({value})"
334
+ elif var.startswith('INT'):
335
+ category = f"๐Ÿค ์ƒํ˜ธ์ž‘์šฉ ({value})"
336
+ elif var.startswith('U'):
337
+ category = f"๐ŸŒ ๋ฌธํ™”์ ํŠน์„ฑ ({value})"
338
+ else:
339
+ category = f"๐Ÿ“Š ๊ธฐํƒ€ ({value})"
340
+
341
+ # ๊ฐ’์— ๋”ฐ๋ฅธ ์ƒ‰์ƒ ํ‘œ์‹œ
342
+ if value >= 80:
343
+ status = "๐ŸŸข ๋งค์šฐ ๋†’์Œ"
344
+ elif value >= 60:
345
+ status = "๐ŸŸก ๋†’์Œ"
346
+ elif value >= 40:
347
+ status = "๐ŸŸ  ๋ณดํ†ต"
348
+ elif value >= 20:
349
+ status = "๐Ÿ”ด ๋‚ฎ์Œ"
350
+ else:
351
+ status = "โšซ ๋งค์šฐ ๋‚ฎ์Œ"
352
+
353
+ variables_df.append([var, value, category, status])
354
 
355
  progress(0.9, desc="์™„๋ฃŒ ์ค‘...")
356
 
 
490
  return None, "์กฐ์ •ํ•  ํŽ˜๋ฅด์†Œ๋‚˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.", {}
491
 
492
  try:
493
+ # ์›๋ณธ ํŽ˜๋ฅด์†Œ๋‚˜ ์ €์žฅ (๋ณ€ํ™”๋Ÿ‰ ๋น„๊ต์šฉ)
494
+ original_persona = copy.deepcopy(persona)
495
+
496
  # ๊นŠ์€ ๋ณต์‚ฌ๋กœ ์›๋ณธ ๋ณดํ˜ธ
497
  adjusted_persona = copy.deepcopy(persona)
498
 
 
511
  from modules.persona_generator import PersonalityProfile
512
  profile = PersonalityProfile.from_dict(adjusted_persona["์„ฑ๊ฒฉํ”„๋กœํ•„"])
513
 
514
+ # ์˜จ๊ธฐ ๊ด€๋ จ ๋ณ€์ˆ˜๋“ค ์กฐ์ • (10๊ฐœ ๋ชจ๋‘)
515
+ warmth_vars = ["W01_์นœ์ ˆํ•จ", "W02_์นœ๊ทผํ•จ", "W03_์ง„์‹ค์„ฑ", "W04_์‹ ๋ขฐ์„ฑ", "W05_์ˆ˜์šฉ์„ฑ",
516
+ "W06_๊ณต๊ฐ๋Šฅ๋ ฅ", "W07_ํฌ์šฉ๋ ฅ", "W08_๊ฒฉ๋ ค์„ฑํ–ฅ", "W09_์นœ๋ฐ€๊ฐํ‘œํ˜„", "W10_๋ฌด์กฐ๊ฑด์ ์ˆ˜์šฉ"]
517
  for var in warmth_vars:
518
+ base_value = warmth + random.randint(-15, 15)
519
+ profile.variables[var] = max(0, min(100, base_value))
520
 
521
+ # ๋Šฅ๋ ฅ ๊ด€๋ จ ๋ณ€์ˆ˜๋“ค ์กฐ์ • (16๊ฐœ ๋ชจ๋‘)
522
+ competence_vars = ["C01_ํšจ์œจ์„ฑ", "C02_์ง€๋Šฅ", "C03_์ฑ…์ž„๊ฐ", "C04_์‹ ๋ขฐ๋„", "C05_์ •ํ™•์„ฑ",
523
+ "C06_์ „๋ฌธ์„ฑ", "C07_ํ˜์‹ ์„ฑ", "C08_์ ์‘๋ ฅ", "C09_์‹คํ–‰๋ ฅ", "C10_๋ถ„์„๋ ฅ",
524
+ "C11_์˜์‚ฌ๊ฒฐ์ •๋ ฅ", "C12_๋ฌธ์ œํ•ด๊ฒฐ๋ ฅ", "C13_๊ณ„ํš์ˆ˜๋ฆฝ๋Šฅ๋ ฅ", "C14_์‹œ๊ฐ„๊ด€๋ฆฌ๋Šฅ๋ ฅ",
525
+ "C15_ํ’ˆ์งˆ๊ด€๋ฆฌ๋Šฅ๋ ฅ", "C16_์„ฑ๊ณผ๋‹ฌ์„ฑ๋ ฅ"]
526
  for var in competence_vars:
527
+ base_value = competence + random.randint(-15, 15)
528
+ profile.variables[var] = max(0, min(100, base_value))
529
 
530
+ # ์™ธํ–ฅ์„ฑ ๊ด€๋ จ ๋ณ€์ˆ˜๋“ค ์กฐ์ • (6๊ฐœ ๋ชจ๋‘)
531
+ extraversion_vars = ["E01_์‚ฌ๊ต์„ฑ", "E02_ํ™œ๋™์„ฑ", "E03_์ ๊ทน์„ฑ", "E04_๊ธ์ •์ •์„œ", "E05_์ž๊ทน์ถ”๊ตฌ์„ฑ", "E06_์ฃผ๋„์„ฑ"]
532
  for var in extraversion_vars:
533
+ base_value = extraversion + random.randint(-15, 15)
534
+ profile.variables[var] = max(0, min(100, base_value))
535
 
536
+ # ์œ ๋จธ ๊ด€๋ จ ๋ณ€์ˆ˜๋“ค ์กฐ์ • (10๊ฐœ ๋ชจ๋‘, ์œ ๋จธ์Šคํƒ€์ผ์— ๋”ฐ๋ผ)
537
+ humor_vars = ["H01_์–ธ์–ด์œ ํฌ๋นˆ๋„", "H02_์ƒํ™ฉ์œ ๋จธ๊ฐ๊ฐ", "H03_์ž๊ธฐ์กฐ๋กฑ๋Šฅ๋ ฅ", "H04_์œ„ํŠธ๊ฐ๊ฐ",
538
+ "H05_๋†๋‹ด์ˆ˜์šฉ๋„", "H06_๊ด€์ฐฐ์œ ๋จธ๋Šฅ๋ ฅ", "H07_์ƒํ™ฉ์žฌ์น˜", "H08_์œ ๋จธํƒ€์ด๋ฐ๊ฐ",
539
+ "H09_์œ ๋จธ์Šคํƒ€์ผ๋‹ค์–‘์„ฑ", "H10_์œ ๋จธ์ ์ ˆ์„ฑ"]
540
+
541
+ # ์œ ๋จธ์Šคํƒ€์ผ์— ๋”ฐ๋ฅธ ์ฐจ๋ณ„ํ™”
542
+ if humor_style == "๋”ฐ๋œปํ•œ":
543
+ humor_bonus = [10, 10, 5, 8, 12, 8, 10, 10, 8, 12] # ๋”ฐ๋œปํ•จ ๊ฐ•ํ™”
544
+ elif humor_style == "์žฌ์น˜์žˆ๋Š”":
545
+ humor_bonus = [15, 8, 8, 15, 8, 12, 15, 12, 12, 10] # ์žฌ์น˜/์œ„ํŠธ ๊ฐ•ํ™”
546
+ elif humor_style == "๋“œ๋ผ์ด":
547
+ humor_bonus = [12, 6, 10, 12, 6, 15, 8, 8, 10, 8] # ๊ด€์ฐฐํ˜•/๋“œ๋ผ์ด ๊ฐ•ํ™”
548
+ else: # ๊ธฐ๋ณธ๊ฐ’
549
+ humor_bonus = [10, 10, 8, 10, 10, 10, 10, 10, 10, 10]
550
+
551
+ for i, var in enumerate(humor_vars):
552
+ base_value = 75 + humor_bonus[i] + random.randint(-5, 5) # ์œ ๋จธ๋Š” ํ•ญ์ƒ ๋†’๊ฒŒ
553
+ profile.variables[var] = max(50, min(100, base_value))
554
+
555
+ # ์—…๋ฐ์ดํŠธ๋œ ์„ฑ๊ฒฉ๋ณ€์ˆ˜127๋„ ๋™์‹œ์— ์ €์žฅ
556
+ adjusted_persona["์„ฑ๊ฒฉ๋ณ€์ˆ˜127"] = profile.variables.copy()
557
 
558
  # ์—…๋ฐ์ดํŠธ๋œ ํ”„๋กœํ•„ ์ €์žฅ
559
  adjusted_persona["์„ฑ๊ฒฉํ”„๋กœํ•„"] = profile.to_dict()
560
 
561
+ # ์กฐ์ •๋œ ๋ณ€์ˆ˜๋“ค์„ DataFrame์œผ๋กœ ์ƒ์„ฑ
562
+ variables_df = []
563
+ if "์„ฑ๊ฒฉ๋ณ€์ˆ˜127" in adjusted_persona:
564
+ variables = adjusted_persona["์„ฑ๊ฒฉ๋ณ€์ˆ˜127"]
565
+ for var, value in variables.items():
566
+ # ์นดํ…Œ๊ณ ๋ฆฌ ๋ถ„๋ฅ˜
567
+ if var.startswith('W'):
568
+ category = f"๐Ÿ”ฅ ์˜จ๊ธฐ/๋”ฐ๋œปํ•จ ({value})"
569
+ elif var.startswith('C'):
570
+ category = f"๐Ÿ’ช ๋Šฅ๋ ฅ/์—ญ๋Ÿ‰ ({value})"
571
+ elif var.startswith('E'):
572
+ category = f"๐Ÿ—ฃ๏ธ ์™ธํ–ฅ์„ฑ ({value})"
573
+ elif var.startswith('H'):
574
+ category = f"๐Ÿ˜„ ์œ ๋จธ ({value})"
575
+ elif var.startswith('F'):
576
+ category = f"๐Ÿ’Ž ๋งค๋ ฅ์ ๊ฒฐํ•จ ({value})"
577
+ elif var.startswith('P'):
578
+ category = f"๐ŸŽญ ์„ฑ๊ฒฉํŒจํ„ด ({value})"
579
+ elif var.startswith('S'):
580
+ category = f"๐Ÿ—จ๏ธ ์–ธ์–ด์Šคํƒ€์ผ ({value})"
581
+ elif var.startswith('R'):
582
+ category = f"โค๏ธ ๊ด€๊ณ„์„ฑํ–ฅ ({value})"
583
+ elif var.startswith('D'):
584
+ category = f"๐Ÿ’ฌ ๋Œ€ํ™”์—ญํ•™ ({value})"
585
+ elif var.startswith('OBJ'):
586
+ category = f"๐Ÿ  ์‚ฌ๋ฌผ์ •์ฒด์„ฑ ({value})"
587
+ elif var.startswith('FORM'):
588
+ category = f"โœจ ํ˜•ํƒœํŠน์„ฑ ({value})"
589
+ elif var.startswith('INT'):
590
+ category = f"๐Ÿค ์ƒํ˜ธ์ž‘์šฉ ({value})"
591
+ elif var.startswith('U'):
592
+ category = f"๐ŸŒ ๋ฌธํ™”์ ํŠน์„ฑ ({value})"
593
+ else:
594
+ category = f"๐Ÿ“Š ๊ธฐํƒ€ ({value})"
595
+
596
+ # ๊ฐ’์— ๋”ฐ๋ฅธ ์ƒ‰์ƒ ํ‘œ์‹œ
597
+ if value >= 80:
598
+ status = "๐ŸŸข ๋งค์šฐ ๋†’์Œ"
599
+ elif value >= 60:
600
+ status = "๐ŸŸก ๋†’์Œ"
601
+ elif value >= 40:
602
+ status = "๐ŸŸ  ๋ณดํ†ต"
603
+ elif value >= 20:
604
+ status = "๐Ÿ”ด ๋‚ฎ์Œ"
605
+ else:
606
+ status = "โšซ ๋งค์šฐ ๋‚ฎ์Œ"
607
+
608
+ variables_df.append([var, value, category, status])
609
+
610
  # ์กฐ์ •๋œ ์ •๋ณด ํ‘œ์‹œ
611
  adjusted_info = {
612
  "์ด๋ฆ„": adjusted_persona.get("๊ธฐ๋ณธ์ •๋ณด", {}).get("์ด๋ฆ„", "Unknown"),
 
634
  "์™ธํ–ฅ์„ฑ": extraversion
635
  }, full_object_info, attractive_flaws)
636
 
637
+ # ๋ณ€ํ™”๋Ÿ‰ ๋ถ„์„ ์ƒ์„ฑ
638
+ change_analysis = show_variable_changes(original_persona, adjusted_persona)
639
+
640
  adjustment_message = f"""
641
  ### ๐ŸŽญ {persona_name}์˜ ์„ฑ๊ฒฉ์ด ์กฐ์ •๋˜์—ˆ์Šต๋‹ˆ๋‹ค!
642
 
 
647
  โ€ข ์œ ๋จธ๊ฐ๊ฐ: 75/100 (๊ณ ์ • - ๋ชจ๋“  ํŽ˜๋ฅด์†Œ๋‚˜๊ฐ€ ์œ ๋จธ๋Ÿฌ์Šค!)
648
  โ€ข ์œ ๋จธ์Šคํƒ€์ผ: {humor_style}
649
 
650
+ ๐Ÿงฌ **๋ฐฑ๊ทธ๋ผ์šด๋“œ**: 152๊ฐœ ์„ธ๋ถ€ ๋ณ€์ˆ˜๊ฐ€ ์ด ์„ค์ •์— ๋งž์ถฐ ์ž๋™ ์กฐ์ •๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
651
+
652
+ {change_analysis}
653
  """
654
 
655
+ return adjusted_persona, adjustment_message, adjusted_info, variables_df
656
 
657
  except Exception as e:
658
  import traceback
659
  traceback.print_exc()
660
+ return persona, f"์กฐ์ • ์ค‘ ์˜ค๋ฅ˜ ๋ฐœ์ƒ: {str(e)}", {}, []
661
 
662
  def finalize_persona(persona):
663
  """ํŽ˜๋ฅด์†Œ๋‚˜ ์ตœ์ข… ํ™•์ • - ํ™˜๊ฒฝ๋ณ€์ˆ˜ API ์„ค์ • ์‚ฌ์šฉ"""
 
1696
  adjust_btn.click(
1697
  fn=adjust_persona_traits,
1698
  inputs=[current_persona, warmth_slider, competence_slider, extraversion_slider, humor_style_radio],
1699
+ outputs=[current_persona, adjustment_result, adjusted_info_output, personality_variables_output]
1700
  ).then(
1701
  # ๋ฐ˜์˜ ํ›„ ๋ฏธ๋ฆฌ๋ณด๊ธฐ๋„ ์—…๋ฐ์ดํŠธ
1702
  fn=generate_realtime_preview,
 
1895
  **๐Ÿ‘‹ ์˜ˆ์ƒ ์ธ์‚ฌ๋ง:**
1896
  {preview}"""
1897
 
1898
+ def show_variable_changes(original_persona, adjusted_persona):
1899
+ """๋ณ€์ˆ˜ ๋ณ€ํ™”๋Ÿ‰์„ ์‹œ๊ฐํ™”ํ•˜์—ฌ ํ‘œ์‹œ"""
1900
+ if not original_persona or not adjusted_persona:
1901
+ return "๋ณ€ํ™”๋Ÿ‰์„ ๋น„๊ตํ•  ํŽ˜๋ฅด์†Œ๋‚˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค."
1902
+
1903
+ # ์›๋ณธ๊ณผ ์กฐ์ •๋œ ๋ณ€์ˆ˜๋“ค ๊ฐ€์ ธ์˜ค๊ธฐ
1904
+ original_vars = original_persona.get("์„ฑ๊ฒฉ๋ณ€์ˆ˜127", {})
1905
+ if not original_vars and "์„ฑ๊ฒฉํ”„๋กœํ•„" in original_persona:
1906
+ original_vars = original_persona["์„ฑ๊ฒฉํ”„๋กœํ•„"]["variables"]
1907
+
1908
+ adjusted_vars = adjusted_persona.get("์„ฑ๊ฒฉ๋ณ€์ˆ˜127", {})
1909
+ if not adjusted_vars and "์„ฑ๊ฒฉํ”„๋กœํ•„" in adjusted_persona:
1910
+ adjusted_vars = adjusted_persona["์„ฑ๊ฒฉํ”„๋กœํ•„"]["variables"]
1911
+
1912
+ if not original_vars or not adjusted_vars:
1913
+ return "๋ณ€์ˆ˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค."
1914
+
1915
+ # ๋ณ€ํ™”๋Ÿ‰ ๊ณ„์‚ฐ
1916
+ changes = []
1917
+ significant_changes = [] # ๋ณ€ํ™”๋Ÿ‰์ด 10 ์ด์ƒ์ธ ํ•ญ๋ชฉ๋“ค
1918
+
1919
+ for var in original_vars:
1920
+ if var in adjusted_vars:
1921
+ original_val = original_vars[var]
1922
+ adjusted_val = adjusted_vars[var]
1923
+ change = adjusted_val - original_val
1924
+
1925
+ changes.append((var, original_val, adjusted_val, change))
1926
+
1927
+ if abs(change) >= 10: # ๋ณ€ํ™”๋Ÿ‰์ด 10 ์ด์ƒ์ธ ๊ฒƒ๋งŒ
1928
+ significant_changes.append((var, original_val, adjusted_val, change))
1929
+
1930
+ # ์นดํ…Œ๊ณ ๋ฆฌ๋ณ„ ํ‰๊ท  ๋ณ€ํ™”๋Ÿ‰ ๊ณ„์‚ฐ
1931
+ category_changes = {}
1932
+ for var, orig, adj, change in changes:
1933
+ if var.startswith('W'):
1934
+ category = "์˜จ๊ธฐ"
1935
+ elif var.startswith('C'):
1936
+ category = "๋Šฅ๋ ฅ"
1937
+ elif var.startswith('E'):
1938
+ category = "์™ธํ–ฅ์„ฑ"
1939
+ elif var.startswith('H'):
1940
+ category = "์œ ๋จธ"
1941
+ else:
1942
+ category = "๊ธฐํƒ€"
1943
+
1944
+ if category not in category_changes:
1945
+ category_changes[category] = []
1946
+ category_changes[category].append(change)
1947
+
1948
+ # ํ‰๊ท  ๋ณ€ํ™”๋Ÿ‰ ๊ณ„์‚ฐ
1949
+ avg_changes = {}
1950
+ for category, change_list in category_changes.items():
1951
+ avg_changes[category] = sum(change_list) / len(change_list)
1952
+
1953
+ # ๊ฒฐ๊ณผ ํฌ๋งทํŒ…
1954
+ result = "### ๐Ÿ”„ ์„ฑ๊ฒฉ ๋ณ€์ˆ˜ ๋ณ€ํ™”๋Ÿ‰ ๋ถ„์„\n\n"
1955
+
1956
+ # ์นดํ…Œ๊ณ ๋ฆฌ๋ณ„ ํ‰๊ท  ๋ณ€ํ™”๋Ÿ‰
1957
+ result += "**๐Ÿ“Š ์นดํ…Œ๊ณ ๋ฆฌ๋ณ„ ํ‰๊ท  ๋ณ€ํ™”๋Ÿ‰:**\n"
1958
+ for category, avg_change in avg_changes.items():
1959
+ if avg_change > 5:
1960
+ trend = "โฌ†๏ธ ์ƒ์Šน"
1961
+ elif avg_change < -5:
1962
+ trend = "โฌ‡๏ธ ํ•˜๋ฝ"
1963
+ else:
1964
+ trend = "โžก๏ธ ์œ ์ง€"
1965
+ result += f"- {category}: {avg_change:+.1f} {trend}\n"
1966
+
1967
+ # ์ฃผ์š” ๋ณ€ํ™”๋Ÿ‰ (10 ์ด์ƒ)
1968
+ if significant_changes:
1969
+ result += f"\n**๐ŸŽฏ ์ฃผ์š” ๋ณ€ํ™” ํ•ญ๋ชฉ ({len(significant_changes)}๊ฐœ):**\n"
1970
+ for var, orig, adj, change in sorted(significant_changes, key=lambda x: abs(x[3]), reverse=True)[:10]:
1971
+ if change > 0:
1972
+ arrow = "โฌ†๏ธ"
1973
+ color = "๐ŸŸข"
1974
+ else:
1975
+ arrow = "โฌ‡๏ธ"
1976
+ color = "๐Ÿ”ด"
1977
+
1978
+ result += f"- {var}: {orig} โ†’ {adj} ({change:+d}) {arrow} {color}\n"
1979
+
1980
+ result += f"\n**๐Ÿ“ˆ ์ด ๋ณ€์ˆ˜ ๊ฐœ์ˆ˜:** {len(changes)}๊ฐœ\n"
1981
+ result += f"**๐Ÿ”„ ๋ณ€ํ™”๋œ ๋ณ€์ˆ˜:** {len([c for c in changes if c[3] != 0])}๊ฐœ\n"
1982
+ result += f"**๐Ÿ“Š ์ฃผ์š” ๋ณ€ํ™”:** {len(significant_changes)}๊ฐœ (๋ณ€ํ™”๋Ÿ‰ ยฑ10 ์ด์ƒ)\n"
1983
+
1984
+ return result
1985
+
1986
  if __name__ == "__main__":
1987
  app = create_main_interface()
1988
  app.launch(server_name="0.0.0.0", server_port=7860)