haepada commited on
Commit
2835d21
ยท
1 Parent(s): 520a5ae

๐ŸŽญ ์„ฑ๊ฒฉ ์กฐ์ • ํ›„ ๋™์  ํŠน์„ฑ ์„ค๋ช… ์—…๋ฐ์ดํŠธ ์‹œ์Šคํ…œ ๊ตฌํ˜„ - format_personality_traits ํ•จ์ˆ˜ ์™„์ „ ๊ฐœ์„ ํ•˜์—ฌ ํ•˜๋“œ์ฝ”๋”ฉ ์ œ๊ฑฐ, AI ๊ธฐ๋ฐ˜ ๋™์  ์„ฑ๊ฒฉ ํŠน์„ฑ ์„ค๋ช… ์ƒ์„ฑ, ์„ฑ๊ฒฉ ์ˆ˜์น˜ ๋ณ€๊ฒฝ ์‹œ ํŠน์„ฑ ์„ค๋ช… ์‹ค์‹œ๊ฐ„ ์—…๋ฐ์ดํŠธ, 127๊ฐœ ๋ณ€์ˆ˜์™€ ์™„์ „ ์—ฐ๋™

Browse files
Files changed (1) hide show
  1. app.py +119 -53
app.py CHANGED
@@ -701,6 +701,9 @@ def adjust_persona_traits(persona, warmth, competence, extraversion, humor_style
701
  {change_analysis}{additional_changes}
702
  """
703
 
 
 
 
704
  # ์กฐ์ •๋œ ๋งค๋ ฅ์  ๊ฒฐํ•จ๊ณผ ๋ชจ์ˆœ์  ํŠน์„ฑ์„ DataFrame์œผ๋กœ ์ƒ์„ฑ
705
  flaws_df = []
706
  if "๋งค๋ ฅ์ ๊ฒฐํ•จ" in adjusted_persona:
@@ -732,12 +735,12 @@ def adjust_persona_traits(persona, warmth, competence, extraversion, humor_style
732
  contradiction_type = "๐Ÿ’ซ ๋ณตํ•ฉ์  ๋งค๋ ฅ"
733
  contradictions_df.append([f"{i}. {contradiction}", contradiction_type])
734
 
735
- return adjusted_persona, adjustment_message, adjusted_info, variables_df, flaws_df, contradictions_df
736
 
737
  except Exception as e:
738
  import traceback
739
  traceback.print_exc()
740
- return persona, f"์กฐ์ • ์ค‘ ์˜ค๋ฅ˜ ๋ฐœ์ƒ: {str(e)}", {}, [], [], []
741
 
742
  def finalize_persona(persona):
743
  """ํŽ˜๋ฅด์†Œ๋‚˜ ์ตœ์ข… ํ™•์ • - ํ™˜๊ฒฝ๋ณ€์ˆ˜ API ์„ค์ • ์‚ฌ์šฉ"""
@@ -1252,84 +1255,147 @@ def import_persona_from_json(json_file):
1252
  return None, f"โŒ JSON ๋ถˆ๋Ÿฌ์˜ค๊ธฐ ์ค‘ ์˜ค๋ฅ˜ ๋ฐœ์ƒ: {str(e)}", "", {}
1253
 
1254
  def format_personality_traits(persona):
1255
- """์„ฑ๊ฒฉ ํŠน์„ฑ์„ ํŠน์„ฑ ์ค‘์‹ฌ์˜ ๊ฐ„๋‹จํ•œ ๋ฆฌ์ŠคํŠธ ํ˜•ํƒœ๋กœ ํฌ๋งท (์บก์ณ ์Šคํƒ€์ผ)"""
1256
  global persona_generator
1257
 
1258
  if not persona or "์„ฑ๊ฒฉํŠน์„ฑ" not in persona:
1259
  return "ํŽ˜๋ฅด์†Œ๋‚˜๊ฐ€ ์ƒ์„ฑ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค."
1260
 
1261
- # ๊ธ€๋กœ๋ฒŒ persona_generator ์‚ฌ์šฉ (API ์„ค์ •์ด ์ ์šฉ๋œ ์ƒํƒœ)
1262
- if persona_generator is None:
1263
- persona_generator = PersonaGenerator()
1264
-
1265
  # ๊ธฐ๋ณธ ์ •๋ณด์—์„œ ์‚ฌ๋ฌผ์˜ ํŠน์„ฑ ์ถ”์ถœ
1266
  basic_info = persona.get("๊ธฐ๋ณธ์ •๋ณด", {})
1267
  object_type = basic_info.get("์œ ํ˜•", "")
1268
  purpose = basic_info.get("์šฉ๋„", "")
1269
 
1270
- # ์ƒ์•  ์Šคํ† ๋ฆฌ์—์„œ ํŠน์„ฑ ์ถ”์ถœ
1271
- life_story = persona.get("์ƒ์• ์Šคํ† ๋ฆฌ", {})
1272
-
1273
  # ๋งค๋ ฅ์  ๊ฒฐํ•จ
1274
  attractive_flaws = persona.get("๋งค๋ ฅ์ ๊ฒฐํ•จ", [])
1275
 
1276
- # ์„ฑ๊ฒฉ ํŠน์„ฑ
1277
  personality_traits = persona["์„ฑ๊ฒฉํŠน์„ฑ"]
1278
 
1279
- # ํŠน์„ฑ ๋ฆฌ์ŠคํŠธ ์ƒ์„ฑ
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1280
  characteristics = []
1281
 
1282
- # 1. ์˜จ๊ธฐ ํŠน์„ฑ
1283
  warmth = personality_traits.get("์˜จ๊ธฐ", 50)
1284
- if warmth >= 70:
1285
- characteristics.append("๋”ฐ๋œปํ•˜๊ณ  ํฌ๊ทผํ•œ ๋งˆ์Œ")
1286
- elif warmth >= 50:
1287
- characteristics.append("์นœ๊ทผํ•˜๊ณ  ๋‹ค์ •ํ•œ ์„ฑ๊ฒฉ")
1288
- else:
 
 
1289
  characteristics.append("์ฐจ๋ถ„ํ•˜๊ณ  ์ง„์ค‘ํ•œ ๋ฉด")
 
 
1290
 
1291
- # 2. ์‚ฌ๋ฌผ์˜ ๊ณ ์œ  ํŠน์„ฑ (์œ ํ˜• ๊ธฐ๋ฐ˜)
1292
- if "๊ณฐ" in object_type or "์ธํ˜•" in object_type:
1293
- characteristics.append("๋ถ€๋“œ๋Ÿฝ๊ณ  ํฌ๊ทผํ•œ ๊ฐ์ด‰")
1294
- elif "์ฑ…" in object_type:
1295
- characteristics.append("์ง€์‹๊ณผ ์ด์•ผ๊ธฐ๋ฅผ ๋‹ด๊ณ  ์žˆ์Œ")
1296
- elif "์ปต" in object_type or "๋จธ๊ทธ" in object_type:
1297
- characteristics.append("๋”ฐ๋œปํ•œ ์Œ๋ฃŒ์™€ ํ•จ๊ป˜ํ•˜๋Š” ์‹œ๊ฐ„")
1298
- elif "์‹œ๊ณ„" in object_type:
1299
- characteristics.append("์‹œ๊ฐ„์˜ ์†Œ์ค‘ํ•จ์„ ์•Œ๋ ค์คŒ")
1300
- elif "์—ฐํ•„" in object_type or "ํŽœ" in object_type:
1301
- characteristics.append("์ฐฝ์ž‘๊ณผ ๊ธฐ๋ก์˜ ๋™๋ฐ˜์ž")
1302
  else:
1303
- characteristics.append(f"{object_type}๋งŒ์˜ ๋…ํŠนํ•œ ๋งค๋ ฅ")
1304
 
1305
- # 3. ํ™œ๋™ ์‹œ๊ฐ„๋Œ€๋‚˜ ํ™˜๊ฒฝ ํŠน์„ฑ
1306
  extraversion = personality_traits.get("์™ธํ–ฅ์„ฑ", 50)
1307
- if extraversion >= 70:
1308
- characteristics.append("๋‚ฎ์— ๋” ํ™œ๋ฐœํ•ด์ง")
1309
- elif extraversion <= 30:
1310
- characteristics.append("๋ฐค์— ๋” ํ™œ๋ฐœํ•ด์ง")
1311
- else:
1312
  characteristics.append("ํ•˜๋ฃจ ์ข…์ผ ์ผ์ •ํ•œ ์—๋„ˆ์ง€")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1313
 
1314
- # 4. ๋งค๋ ฅ์  ๊ฒฐํ•จ ์ค‘ ํ•˜๋‚˜๋ฅผ ํŠน์„ฑ์œผ๋กœ ํ‘œํ˜„
1315
  if attractive_flaws:
1316
- flaw = attractive_flaws[0]
1317
- if "ํ„ธ" in flaw:
1318
- characteristics.append("๊ฐ€๋” ํ„ธ์ด ํ—ํด์–ด์ ธ์„œ ๊ฑฑ์ •")
1319
- elif "๋จผ์ง€" in flaw:
1320
- characteristics.append("๋จผ์ง€๊ฐ€ ์Œ“์ด๋Š” ๊ฑธ ์‹ ๊ฒฝ ์”€")
1321
- elif "์–ผ๋ฃฉ" in flaw:
1322
- characteristics.append("์ž‘์€ ์–ผ๋ฃฉ๋„ ๋ˆˆ์— ๋„์–ด ๊ณ ๋ฏผ")
1323
- elif "์ƒ‰" in flaw:
1324
- characteristics.append("์ƒ‰์ด ๋ฐ”๋ž˜๋Š” ๊ฒƒ์„ ์กฐ๊ธˆ ๊ฑฑ์ •")
1325
  else:
1326
- characteristics.append("์™„๋ฒฝํ•˜๏ฟฝ๏ฟฝ๏ฟฝ ์•Š์€ ๋ชจ์Šต๋„ ๋ฐ›์•„๋“ค์ž„")
1327
-
1328
- # 5. ๊ธฐ์–ต๊ณผ ๊ฒฝํ—˜
1329
- if life_story:
1330
- characteristics.append("์˜ค๋ž˜๋œ ์ด์•ผ๊ธฐ๋“ค ๊ธฐ์–ต")
1331
  else:
1332
- characteristics.append("์ƒˆ๋กœ์šด ์ถ”์–ต ๋งŒ๋“ค๊ธฐ๋ฅผ ๊ธฐ๋Œ€")
1333
 
1334
  # โœจ ์•„์ด์ฝ˜๊ณผ ํ•จ๊ป˜ ๋ฆฌ์ŠคํŠธ ํ˜•ํƒœ๋กœ ๋ฐ˜ํ™˜
1335
  result = ""
@@ -1828,7 +1894,7 @@ def create_main_interface():
1828
  adjust_btn.click(
1829
  fn=adjust_persona_traits,
1830
  inputs=[current_persona, warmth_slider, competence_slider, extraversion_slider, humor_style_radio],
1831
- outputs=[current_persona, adjustment_result, adjusted_info_output, personality_variables_output, attractive_flaws_output, contradictions_output]
1832
  ).then(
1833
  # ๋ฐ˜์˜ ํ›„ ๋ฏธ๋ฆฌ๋ณด๊ธฐ๋„ ์—…๋ฐ์ดํŠธ
1834
  fn=generate_realtime_preview,
 
701
  {change_analysis}{additional_changes}
702
  """
703
 
704
+ # ๐Ÿ†• ์กฐ์ •๋œ ํŽ˜๋ฅด์†Œ๋‚˜์˜ ์š”์•ฝ ์ƒ์„ฑ (๋™์  ํŠน์„ฑ ์„ค๋ช… ํฌํ•จ)
705
+ adjusted_summary_display = display_persona_summary(adjusted_persona)
706
+
707
  # ์กฐ์ •๋œ ๋งค๋ ฅ์  ๊ฒฐํ•จ๊ณผ ๋ชจ์ˆœ์  ํŠน์„ฑ์„ DataFrame์œผ๋กœ ์ƒ์„ฑ
708
  flaws_df = []
709
  if "๋งค๋ ฅ์ ๊ฒฐํ•จ" in adjusted_persona:
 
735
  contradiction_type = "๐Ÿ’ซ ๋ณตํ•ฉ์  ๋งค๋ ฅ"
736
  contradictions_df.append([f"{i}. {contradiction}", contradiction_type])
737
 
738
+ return adjusted_persona, adjustment_message, adjusted_info, variables_df, flaws_df, contradictions_df, adjusted_summary_display
739
 
740
  except Exception as e:
741
  import traceback
742
  traceback.print_exc()
743
+ return persona, f"์กฐ์ • ์ค‘ ์˜ค๋ฅ˜ ๋ฐœ์ƒ: {str(e)}", {}, [], [], [], ""
744
 
745
  def finalize_persona(persona):
746
  """ํŽ˜๋ฅด์†Œ๋‚˜ ์ตœ์ข… ํ™•์ • - ํ™˜๊ฒฝ๋ณ€์ˆ˜ API ์„ค์ • ์‚ฌ์šฉ"""
 
1255
  return None, f"โŒ JSON ๋ถˆ๋Ÿฌ์˜ค๊ธฐ ์ค‘ ์˜ค๋ฅ˜ ๋ฐœ์ƒ: {str(e)}", "", {}
1256
 
1257
  def format_personality_traits(persona):
1258
+ """๐Ÿง  ์™„์ „ํ•œ ๋ณ€์ˆ˜ ๊ธฐ๋ฐ˜ ๋™์  ์„ฑ๊ฒฉ ํŠน์„ฑ ์„ค๋ช… ์ƒ์„ฑ - ํ•˜๋“œ์ฝ”๋”ฉ ์ œ๊ฑฐ"""
1259
  global persona_generator
1260
 
1261
  if not persona or "์„ฑ๊ฒฉํŠน์„ฑ" not in persona:
1262
  return "ํŽ˜๋ฅด์†Œ๋‚˜๊ฐ€ ์ƒ์„ฑ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค."
1263
 
 
 
 
 
1264
  # ๊ธฐ๋ณธ ์ •๋ณด์—์„œ ์‚ฌ๋ฌผ์˜ ํŠน์„ฑ ์ถ”์ถœ
1265
  basic_info = persona.get("๊ธฐ๋ณธ์ •๋ณด", {})
1266
  object_type = basic_info.get("์œ ํ˜•", "")
1267
  purpose = basic_info.get("์šฉ๋„", "")
1268
 
 
 
 
1269
  # ๋งค๋ ฅ์  ๊ฒฐํ•จ
1270
  attractive_flaws = persona.get("๋งค๋ ฅ์ ๊ฒฐํ•จ", [])
1271
 
1272
+ # ์„ฑ๊ฒฉ ํŠน์„ฑ (์กฐ์ •๋œ ๊ฐ’๋“ค)
1273
  personality_traits = persona["์„ฑ๊ฒฉํŠน์„ฑ"]
1274
 
1275
+ # ๐Ÿค– AI ๊ธฐ๋ฐ˜ ๋™์  ํŠน์„ฑ ์„ค๋ช… ์ƒ์„ฑ ์‹œ๋„
1276
+ if persona_generator and hasattr(persona_generator, 'api_key') and persona_generator.api_key:
1277
+ try:
1278
+ warmth = personality_traits.get("์˜จ๊ธฐ", 50)
1279
+ competence = personality_traits.get("๋Šฅ๋ ฅ", 50)
1280
+ extraversion = personality_traits.get("์™ธํ–ฅ์„ฑ", 50)
1281
+ humor_style = persona.get("์œ ๋จธ์Šคํƒ€์ผ", "๋”ฐ๋œปํ•œ ์œ ๋จธ๋Ÿฌ์Šค")
1282
+
1283
+ ai_prompt = f"""
1284
+ ๋‹ค์Œ ์ •๋ณด๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ์ด ํŽ˜๋ฅด์†Œ๋‚˜์˜ 5๊ฐ€์ง€ ํ•ต์‹ฌ ํŠน์„ฑ์„ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”.
1285
+
1286
+ **์‚ฌ๋ฌผ ์ •๋ณด:**
1287
+ - ์œ ํ˜•: {object_type}
1288
+ - ์šฉ๋„: {purpose}
1289
+
1290
+ **์กฐ์ •๋œ ์„ฑ๊ฒฉ ์ˆ˜์น˜:**
1291
+ - ์˜จ๊ธฐ: {warmth}/100 {'(๋งค์šฐ ๋”ฐ๋œปํ•จ)' if warmth >= 80 else '(๋”ฐ๋œปํ•จ)' if warmth >= 60 else '(๋ณดํ†ต)' if warmth >= 40 else '(์ฐจ๊ฐ€์›€)' if warmth >= 20 else '(๋งค์šฐ ์ฐจ๊ฐ€์›€)'}
1292
+ - ๋Šฅ๋ ฅ: {competence}/100 {'(๋งค์šฐ ์œ ๋Šฅํ•จ)' if competence >= 80 else '(์œ ๋Šฅํ•จ)' if competence >= 60 else '(๋ณดํ†ต)' if competence >= 40 else '(์„œํˆผ)' if competence >= 20 else '(๋งค์šฐ ์„œํˆผ)'}
1293
+ - ์™ธํ–ฅ์„ฑ: {extraversion}/100 {'(๋งค์šฐ ํ™œ๋ฐœํ•จ)' if extraversion >= 80 else '(ํ™œ๋ฐœํ•จ)' if extraversion >= 60 else '(๋ณดํ†ต)' if extraversion >= 40 else '(์กฐ์šฉํ•จ)' if extraversion >= 20 else '(๋งค์šฐ ์กฐ์šฉํ•จ)'}
1294
+ - ์œ ๋จธ์Šคํƒ€์ผ: {humor_style}
1295
+
1296
+ **๋งค๋ ฅ์  ๊ฒฐํ•จ:**
1297
+ {chr(10).join([f"- {flaw}" for flaw in attractive_flaws[:2]])}
1298
+
1299
+ **์š”์ฒญ์‚ฌํ•ญ:**
1300
+ 1. ์„ฑ๊ฒฉ ์ˆ˜์น˜๋ฅผ ์ •ํ™•ํžˆ ๋ฐ˜์˜ํ•œ ํŠน์„ฑ ์„ค๋ช…
1301
+ 2. ์‚ฌ๋ฌผ์˜ ๊ณ ์œ  ํŠน์„ฑ๊ณผ ์„ฑ๊ฒฉ์˜ ์กฐํ•ฉ
1302
+ 3. ๊ฐ ํŠน์„ฑ์€ 5-15์ž๋กœ ๊ฐ„๊ฒฐํ•˜๊ฒŒ
1303
+ 4. ๋งค๋ ฅ์ ์ด๊ณ  ๊ฐœ์„ฑ์ ์ธ ํ‘œํ˜„
1304
+
1305
+ **ํ˜•์‹:**
1306
+ [์„ฑ๊ฒฉ ๊ธฐ๋ฐ˜ ํŠน์„ฑ 1]
1307
+ [์‚ฌ๋ฌผ ๊ธฐ๋ฐ˜ ํŠน์„ฑ 1]
1308
+ [ํ™œ๋™/์—๋„ˆ์ง€ ํŠน์„ฑ 1]
1309
+ [๊ฒฐํ•จ ๊ธฐ๋ฐ˜ ํŠน์„ฑ 1]
1310
+ [๊ฒฝํ—˜/๊ธฐ์–ต ํŠน์„ฑ 1]
1311
+ """
1312
+
1313
+ ai_response = persona_generator._generate_text_with_api(ai_prompt)
1314
+
1315
+ if ai_response and len(ai_response.strip()) > 20:
1316
+ lines = ai_response.strip().split('\n')
1317
+ ai_characteristics = []
1318
+
1319
+ for line in lines:
1320
+ clean_line = line.strip().lstrip('1234567890.-โ€ข []').strip()
1321
+ if clean_line and len(clean_line) > 3:
1322
+ ai_characteristics.append(clean_line)
1323
+
1324
+ if len(ai_characteristics) >= 3:
1325
+ result = ""
1326
+ for char in ai_characteristics[:5]: # ์ตœ๋Œ€ 5๊ฐœ
1327
+ result += f"โœจ {char}\n\n"
1328
+ return result
1329
+
1330
+ except Exception as e:
1331
+ print(f"โš ๏ธ AI ํŠน์„ฑ ์„ค๋ช… ์ƒ์„ฑ ์‹คํŒจ: {e} - ๋ณ€์ˆ˜ ๊ธฐ๋ฐ˜ ํด๋ฐฑ ์‚ฌ์šฉ")
1332
+
1333
+ # ๐Ÿ”ง ํด๋ฐฑ: ์ˆœ์ˆ˜ ๋ณ€์ˆ˜ ๊ธฐ๋ฐ˜ ๋…ผ๋ฆฌ์  ์ƒ์„ฑ
1334
  characteristics = []
1335
 
1336
+ # 1. ์˜จ๊ธฐ ๊ธฐ๋ฐ˜ ํŠน์„ฑ (์ˆ˜์น˜ ๋ฐ˜์˜)
1337
  warmth = personality_traits.get("์˜จ๊ธฐ", 50)
1338
+ if warmth >= 80:
1339
+ characteristics.append("๋งค์šฐ ๋”ฐ๋œปํ•˜๊ณ  ํฌ๊ทผํ•œ ๋งˆ์Œ")
1340
+ elif warmth >= 65:
1341
+ characteristics.append("๋”ฐ๋œปํ•˜๊ณ  ์นœ๊ทผํ•œ ์„ฑ๊ฒฉ")
1342
+ elif warmth >= 35:
1343
+ characteristics.append("์ ๋‹นํžˆ ์นœ๊ทผํ•œ ๊ท ํ˜•๊ฐ")
1344
+ elif warmth >= 20:
1345
  characteristics.append("์ฐจ๋ถ„ํ•˜๊ณ  ์ง„์ค‘ํ•œ ๋ฉด")
1346
+ else:
1347
+ characteristics.append("์‹ ์ค‘ํ•˜๊ณ  ๋‚ด์„ฑ์ ์ธ ๊นŠ์ด")
1348
 
1349
+ # 2. ๋Šฅ๋ ฅ ๊ธฐ๋ฐ˜ ํŠน์„ฑ (์ˆ˜์น˜ ๋ฐ˜์˜)
1350
+ competence = personality_traits.get("๋Šฅ๋ ฅ", 50)
1351
+ if competence >= 80:
1352
+ characteristics.append("์™„๋ฒฝ์ฃผ์˜์  ๊ผผ๊ผผํ•จ")
1353
+ elif competence >= 65:
1354
+ characteristics.append("๋ฏฟ์Œ์งํ•œ ์•ˆ์ •๊ฐ")
1355
+ elif competence >= 35:
1356
+ characteristics.append("์ ๋‹นํ•œ ์—ฌ์œ ๋กœ์›€")
 
 
 
1357
  else:
1358
+ characteristics.append("๊ฒธ์†ํ•˜๊ณ  ๋ฐฐ์šฐ๋ ค๋Š” ๋งˆ์Œ")
1359
 
1360
+ # 3. ์™ธํ–ฅ์„ฑ ๊ธฐ๋ฐ˜ ํ™œ๋™ ํŠน์„ฑ (์ˆ˜์น˜ ๋ฐ˜์˜)
1361
  extraversion = personality_traits.get("์™ธํ–ฅ์„ฑ", 50)
1362
+ if extraversion >= 80:
1363
+ characteristics.append("ํ™œ๊ธฐ์ฐจ๊ณ  ์—๋„ˆ์ง€ ๋„˜์น˜๋Š” ๋ชจ์Šต")
1364
+ elif extraversion >= 65:
1365
+ characteristics.append("๋‚ฎ์— ๋” ํ™œ๋ฐœํ•ด์ง€๋Š” ๋ฆฌ๋“ฌ")
1366
+ elif extraversion >= 35:
1367
  characteristics.append("ํ•˜๋ฃจ ์ข…์ผ ์ผ์ •ํ•œ ์—๋„ˆ์ง€")
1368
+ else:
1369
+ characteristics.append("์กฐ์šฉํ•˜๊ณ  ์ฐจ๋ถ„ํ•œ ์‹œ๊ฐ„ ์„ ํ˜ธ")
1370
+
1371
+ # 4. ์‚ฌ๋ฌผ ๊ณ ์œ  ํŠน์„ฑ (๋™์  ์ƒ์„ฑ)
1372
+ if object_type:
1373
+ if any(keyword in object_type.lower() for keyword in ["์ปต", "๋จธ๊ทธ", "์ž”"]):
1374
+ characteristics.append("๋”ฐ๋œปํ•œ ์Œ๋ฃŒ์™€ ํ•จ๊ป˜ํ•˜๋Š” ์œ„๋กœ")
1375
+ elif any(keyword in object_type.lower() for keyword in ["์ฑ…", "๋…ธํŠธ"]):
1376
+ characteristics.append("์ง€์‹๊ณผ ์ด์•ผ๊ธฐ๋ฅผ ํ’ˆ์€ ๊นŠ์ด")
1377
+ elif any(keyword in object_type.lower() for keyword in ["์‹œ๊ณ„", "์•Œ๋žŒ"]):
1378
+ characteristics.append("์‹œ๊ฐ„์˜ ์†Œ์ค‘ํ•จ์„ ์•„๋Š” ์ •ํ™•์„ฑ")
1379
+ elif any(keyword in object_type.lower() for keyword in ["๋žจํ”„", "์กฐ๋ช…", "๋“ฑ"]):
1380
+ characteristics.append("๋”ฐ๋œปํ•œ ๋น›์œผ๋กœ ๊ณต๊ฐ„์„ ๋ฐํžˆ๋Š” ์—ญํ• ")
1381
+ elif any(keyword in object_type.lower() for keyword in ["์ธํ˜•", "๊ณฐ", "์žฅ๋‚œ๊ฐ"]):
1382
+ characteristics.append("๋ถ€๋“œ๋Ÿฌ์šด ์œ„๋กœ์™€ ๋”ฐ๋œปํ•œ ํฌ์˜น")
1383
+ else:
1384
+ characteristics.append(f"{object_type}๋งŒ์˜ ๋…ํŠนํ•œ ๊ฐœ์„ฑ")
1385
+ else:
1386
+ characteristics.append("์•Œ ์ˆ˜ ์—†๋Š” ์‹ ๋น„๋กœ์šด ๋งค๋ ฅ")
1387
 
1388
+ # 5. ๊ฒฐํ•จ/๊ฒฝํ—˜ ๊ธฐ๋ฐ˜ ํŠน์„ฑ (๋™์  ๋ฐ˜์˜)
1389
  if attractive_flaws:
1390
+ first_flaw = attractive_flaws[0]
1391
+ if any(keyword in first_flaw for keyword in ["์™„๋ฒฝ", "๊ฑฑ์ •", "์‹ ๊ฒฝ"]):
1392
+ characteristics.append("์„ธ์‹ฌํ•œ ๊ด€์‹ฌ๊ณผ ๋ฐฐ๋ คํ•˜๋Š” ๋งˆ์Œ")
1393
+ elif any(keyword in first_flaw for keyword in ["์ƒ‰", "๋ชจ์–‘", "์™ธ๋ชจ"]):
1394
+ characteristics.append("์ž์‹ ์˜ ๋ชจ์Šต์— ๋Œ€ํ•œ ์†Œ์†Œํ•œ ๊ณ ๋ฏผ")
 
 
 
 
1395
  else:
1396
+ characteristics.append("์™„๋ฒฝํ•˜์ง€ ์•Š์€ ๋ชจ์Šต๋„ ์†”์งํ•˜๊ฒŒ ๋ฐ›์•„๋“ค์ž„")
 
 
 
 
1397
  else:
1398
+ characteristics.append("์ƒˆ๋กœ์šด ๊ฒฝํ—˜์— ๋Œ€ํ•œ ๊ธฐ๋Œ€์™€ ํ˜ธ๊ธฐ์‹ฌ")
1399
 
1400
  # โœจ ์•„์ด์ฝ˜๊ณผ ํ•จ๊ป˜ ๋ฆฌ์ŠคํŠธ ํ˜•ํƒœ๋กœ ๋ฐ˜ํ™˜
1401
  result = ""
 
1894
  adjust_btn.click(
1895
  fn=adjust_persona_traits,
1896
  inputs=[current_persona, warmth_slider, competence_slider, extraversion_slider, humor_style_radio],
1897
+ outputs=[current_persona, adjustment_result, adjusted_info_output, personality_variables_output, attractive_flaws_output, contradictions_output, persona_summary_display]
1898
  ).then(
1899
  # ๋ฐ˜์˜ ํ›„ ๋ฏธ๋ฆฌ๋ณด๊ธฐ๋„ ์—…๋ฐ์ดํŠธ
1900
  fn=generate_realtime_preview,