haepa_mac commited on
Commit
a98acac
ยท
1 Parent(s): d2625e0

๐Ÿ”ง ์„ฑ๊ฒฉ ํŠน์„ฑ ํ‘œ์‹œ ๊ฐœ์„  ๋ฐ UI ์ตœ์ ํ™” - ์บก์ณ ์Šคํƒ€์ผ ์ ์šฉ, ์„ฑ๊ฒฉ ์กฐ์ • UI ๊ฐœ์„ , ์œ ๋จธํƒ€์ž… ๊ธฐ๋ณธ๊ฐ’ ์„ค์ •

Browse files
Files changed (2) hide show
  1. app.py +89 -15
  2. modules/persona_generator.py +10 -10
app.py CHANGED
@@ -961,7 +961,7 @@ def import_persona_from_json(json_file):
961
  return None, f"โŒ JSON ๋ถˆ๋Ÿฌ์˜ค๊ธฐ ์ค‘ ์˜ค๋ฅ˜ ๋ฐœ์ƒ: {str(e)}", "", {}
962
 
963
  def format_personality_traits(persona):
964
- """์„ฑ๊ฒฉ ํŠน์„ฑ์„ ์‚ฌ์šฉ์ž ์นœํ™”์ ์ธ ํ˜•ํƒœ๋กœ ํฌ๋งท (์ˆ˜์น˜ ์—†์ด ์„œ์ˆ ํ˜•๋งŒ) - API ์„ค์ • ์ ์šฉ"""
965
  global persona_generator
966
 
967
  if not persona or "์„ฑ๊ฒฉํŠน์„ฑ" not in persona:
@@ -970,13 +970,80 @@ def format_personality_traits(persona):
970
  # ๊ธ€๋กœ๋ฒŒ persona_generator ์‚ฌ์šฉ (API ์„ค์ •์ด ์ ์šฉ๋œ ์ƒํƒœ)
971
  if persona_generator is None:
972
  persona_generator = PersonaGenerator()
 
 
 
 
 
 
 
 
973
 
 
 
 
 
974
  personality_traits = persona["์„ฑ๊ฒฉํŠน์„ฑ"]
975
- descriptions = persona_generator.get_personality_descriptions(personality_traits)
976
 
977
- result = "### ๐ŸŒŸ ์„ฑ๊ฒฉ ํŠน์„ฑ\n\n"
978
- for trait, description in descriptions.items():
979
- result += f"**{trait}**: {description}\n\n"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
980
 
981
  return result
982
 
@@ -1315,11 +1382,14 @@ def create_main_interface():
1315
  info="์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ ์žฌ๋ฏธ์žˆ๊ฒŒ ๋งŒ๋“ค๊นŒ์š”?"
1316
  )
1317
 
1318
- # ์‹ค์‹œ๊ฐ„ ๋ฏธ๋ฆฌ๋ณด๊ธฐ ํ‘œ์‹œ
1319
  personality_preview = gr.Markdown("", elem_classes=["persona-greeting"], label="์„ฑ๊ฒฉ ์กฐ์ • ๋ฏธ๋ฆฌ๋ณด๊ธฐ")
1320
 
1321
  with gr.Row():
1322
- adjust_btn = gr.Button("โœจ ์„ฑ๊ฒฉ ์กฐ์ • ์ ์šฉ", variant="primary")
 
 
 
1323
  finalize_btn = gr.Button("๐ŸŽ‰ ์นœ๊ตฌ ํ™•์ •ํ•˜๊ธฐ!", variant="secondary")
1324
 
1325
  # ์กฐ์ • ๊ฒฐ๊ณผ ํ‘œ์‹œ
@@ -1464,19 +1534,23 @@ def create_main_interface():
1464
  outputs=[personality_preview]
1465
  )
1466
 
1467
- # ๐ŸŽฏ ์‹ค์‹œ๊ฐ„ ๋ฏธ๋ฆฌ๋ณด๊ธฐ ์—…๋ฐ์ดํŠธ - ๊ฐ ์Šฌ๋ผ์ด๋”/๋ผ๋””์˜ค ๋ณ€๊ฒฝ ์‹œ
1468
- for component in [warmth_slider, competence_slider, extraversion_slider, humor_style_radio]:
1469
- component.change(
1470
- fn=generate_realtime_preview,
1471
- inputs=[current_persona, warmth_slider, competence_slider, extraversion_slider, humor_style_radio],
1472
- outputs=[personality_preview]
1473
- )
1474
 
1475
- # ์„ฑ๊ฒฉ ์กฐ์ • ์ ์šฉ
1476
  adjust_btn.click(
1477
  fn=adjust_persona_traits,
1478
  inputs=[current_persona, warmth_slider, competence_slider, extraversion_slider, humor_style_radio],
1479
  outputs=[current_persona, adjustment_result, adjusted_info_output]
 
 
 
 
 
1480
  )
1481
 
1482
  # ํŽ˜๋ฅด์†Œ๋‚˜ ์ตœ์ข… ํ™•์ •
 
961
  return None, f"โŒ JSON ๋ถˆ๋Ÿฌ์˜ค๊ธฐ ์ค‘ ์˜ค๋ฅ˜ ๋ฐœ์ƒ: {str(e)}", "", {}
962
 
963
  def format_personality_traits(persona):
964
+ """์„ฑ๊ฒฉ ํŠน์„ฑ์„ ํŠน์„ฑ ์ค‘์‹ฌ์˜ ๊ฐ„๋‹จํ•œ ๋ฆฌ์ŠคํŠธ ํ˜•ํƒœ๋กœ ํฌ๋งท (์บก์ณ ์Šคํƒ€์ผ)"""
965
  global persona_generator
966
 
967
  if not persona or "์„ฑ๊ฒฉํŠน์„ฑ" not in persona:
 
970
  # ๊ธ€๋กœ๋ฒŒ persona_generator ์‚ฌ์šฉ (API ์„ค์ •์ด ์ ์šฉ๋œ ์ƒํƒœ)
971
  if persona_generator is None:
972
  persona_generator = PersonaGenerator()
973
+
974
+ # ๊ธฐ๋ณธ ์ •๋ณด์—์„œ ์‚ฌ๋ฌผ์˜ ํŠน์„ฑ ์ถ”์ถœ
975
+ basic_info = persona.get("๊ธฐ๋ณธ์ •๋ณด", {})
976
+ object_type = basic_info.get("์œ ํ˜•", "")
977
+ purpose = basic_info.get("์šฉ๋„", "")
978
+
979
+ # ์ƒ์•  ์Šคํ† ๋ฆฌ์—์„œ ํŠน์„ฑ ์ถ”์ถœ
980
+ life_story = persona.get("์ƒ์• ์Šคํ† ๋ฆฌ", {})
981
 
982
+ # ๋งค๋ ฅ์  ๊ฒฐํ•จ
983
+ attractive_flaws = persona.get("๋งค๋ ฅ์ ๊ฒฐํ•จ", [])
984
+
985
+ # ์„ฑ๊ฒฉ ํŠน์„ฑ
986
  personality_traits = persona["์„ฑ๊ฒฉํŠน์„ฑ"]
 
987
 
988
+ # ํŠน์„ฑ ๋ฆฌ์ŠคํŠธ ์ƒ์„ฑ
989
+ characteristics = []
990
+
991
+ # 1. ์˜จ๊ธฐ ํŠน์„ฑ
992
+ warmth = personality_traits.get("์˜จ๊ธฐ", 50)
993
+ if warmth >= 70:
994
+ characteristics.append("๋”ฐ๋œปํ•˜๊ณ  ํฌ๊ทผํ•œ ๋งˆ์Œ")
995
+ elif warmth >= 50:
996
+ characteristics.append("์นœ๊ทผํ•˜๊ณ  ๋‹ค์ •ํ•œ ์„ฑ๊ฒฉ")
997
+ else:
998
+ characteristics.append("์ฐจ๋ถ„ํ•˜๊ณ  ์ง„์ค‘ํ•œ ๋ฉด")
999
+
1000
+ # 2. ์‚ฌ๋ฌผ์˜ ๊ณ ์œ  ํŠน์„ฑ (์œ ํ˜• ๊ธฐ๋ฐ˜)
1001
+ if "๊ณฐ" in object_type or "์ธํ˜•" in object_type:
1002
+ characteristics.append("๋ถ€๋“œ๋Ÿฝ๊ณ  ํฌ๊ทผํ•œ ๊ฐ์ด‰")
1003
+ elif "์ฑ…" in object_type:
1004
+ characteristics.append("์ง€์‹๊ณผ ์ด์•ผ๊ธฐ๋ฅผ ๋‹ด๊ณ  ์žˆ์Œ")
1005
+ elif "์ปต" in object_type or "๋จธ๊ทธ" in object_type:
1006
+ characteristics.append("๋”ฐ๋œปํ•œ ์Œ๋ฃŒ์™€ ํ•จ๊ป˜ํ•˜๋Š” ์‹œ๊ฐ„")
1007
+ elif "์‹œ๊ณ„" in object_type:
1008
+ characteristics.append("์‹œ๊ฐ„์˜ ์†Œ์ค‘ํ•จ์„ ์•Œ๋ ค์คŒ")
1009
+ elif "์—ฐํ•„" in object_type or "ํŽœ" in object_type:
1010
+ characteristics.append("์ฐฝ์ž‘๊ณผ ๊ธฐ๋ก์˜ ๋™๋ฐ˜์ž")
1011
+ else:
1012
+ characteristics.append(f"{object_type}๋งŒ์˜ ๋…ํŠนํ•œ ๋งค๋ ฅ")
1013
+
1014
+ # 3. ํ™œ๋™ ์‹œ๊ฐ„๋Œ€๋‚˜ ํ™˜๊ฒฝ ํŠน์„ฑ
1015
+ extraversion = personality_traits.get("์™ธํ–ฅ์„ฑ", 50)
1016
+ if extraversion >= 70:
1017
+ characteristics.append("๋‚ฎ์— ๋” ํ™œ๋ฐœํ•ด์ง")
1018
+ elif extraversion <= 30:
1019
+ characteristics.append("๋ฐค์— ๋” ํ™œ๋ฐœํ•ด์ง")
1020
+ else:
1021
+ characteristics.append("ํ•˜๋ฃจ ์ข…์ผ ์ผ์ •ํ•œ ์—๋„ˆ์ง€")
1022
+
1023
+ # 4. ๋งค๋ ฅ์  ๊ฒฐํ•จ ์ค‘ ํ•˜๋‚˜๋ฅผ ํŠน์„ฑ์œผ๋กœ ํ‘œํ˜„
1024
+ if attractive_flaws:
1025
+ flaw = attractive_flaws[0]
1026
+ if "ํ„ธ" in flaw:
1027
+ characteristics.append("๊ฐ€๋” ํ„ธ์ด ํ—ํด์–ด์ ธ์„œ ๊ฑฑ์ •")
1028
+ elif "๋จผ์ง€" in flaw:
1029
+ characteristics.append("๋จผ์ง€๊ฐ€ ์Œ“์ด๋Š” ๊ฑธ ์‹ ๊ฒฝ ์”€")
1030
+ elif "์–ผ๋ฃฉ" in flaw:
1031
+ characteristics.append("์ž‘์€ ์–ผ๋ฃฉ๋„ ๋ˆˆ์— ๋„์–ด ๊ณ ๋ฏผ")
1032
+ elif "์ƒ‰" in flaw:
1033
+ characteristics.append("์ƒ‰์ด ๋ฐ”๋ž˜๋Š” ๊ฒƒ์„ ์กฐ๊ธˆ ๊ฑฑ์ •")
1034
+ else:
1035
+ characteristics.append("์™„๋ฒฝํ•˜์ง€ ์•Š์€ ๋ชจ์Šต๋„ ๋ฐ›์•„๋“ค์ž„")
1036
+
1037
+ # 5. ๊ธฐ์–ต๊ณผ ๊ฒฝํ—˜
1038
+ if life_story:
1039
+ characteristics.append("์˜ค๋ž˜๋œ ์ด์•ผ๊ธฐ๋“ค ๊ธฐ์–ต")
1040
+ else:
1041
+ characteristics.append("์ƒˆ๋กœ์šด ์ถ”์–ต ๋งŒ๋“ค๊ธฐ๋ฅผ ๊ธฐ๋Œ€")
1042
+
1043
+ # โœจ ์•„์ด์ฝ˜๊ณผ ํ•จ๊ป˜ ๋ฆฌ์ŠคํŠธ ํ˜•ํƒœ๋กœ ๋ฐ˜ํ™˜
1044
+ result = ""
1045
+ for char in characteristics:
1046
+ result += f"โœจ {char}\n\n"
1047
 
1048
  return result
1049
 
 
1382
  info="์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ ์žฌ๋ฏธ์žˆ๊ฒŒ ๋งŒ๋“ค๊นŒ์š”?"
1383
  )
1384
 
1385
+ # ๋ฏธ๋ฆฌ๋ณด๊ธฐ ํ‘œ์‹œ (์‹ค์‹œ๊ฐ„ ์—…๋ฐ์ดํŠธ ์—†์Œ)
1386
  personality_preview = gr.Markdown("", elem_classes=["persona-greeting"], label="์„ฑ๊ฒฉ ์กฐ์ • ๋ฏธ๋ฆฌ๋ณด๊ธฐ")
1387
 
1388
  with gr.Row():
1389
+ preview_btn = gr.Button("๐Ÿ‘๏ธ ๋ฏธ๋ฆฌ๋ณด๊ธฐ", variant="secondary")
1390
+ adjust_btn = gr.Button("โœจ ์„ฑ๊ฒฉ ์กฐ์ • ๋ฐ˜์˜", variant="primary")
1391
+
1392
+ with gr.Row():
1393
  finalize_btn = gr.Button("๐ŸŽ‰ ์นœ๊ตฌ ํ™•์ •ํ•˜๊ธฐ!", variant="secondary")
1394
 
1395
  # ์กฐ์ • ๊ฒฐ๊ณผ ํ‘œ์‹œ
 
1534
  outputs=[personality_preview]
1535
  )
1536
 
1537
+ # ๐ŸŽฏ ๋ฏธ๋ฆฌ๋ณด๊ธฐ ๋ฒ„ํŠผ - ์‚ฌ์šฉ์ž๊ฐ€ ์ˆ˜๋™์œผ๋กœ ๋ฏธ๋ฆฌ๋ณด๊ธฐ ์š”์ฒญ
1538
+ preview_btn.click(
1539
+ fn=generate_realtime_preview,
1540
+ inputs=[current_persona, warmth_slider, competence_slider, extraversion_slider, humor_style_radio],
1541
+ outputs=[personality_preview]
1542
+ )
 
1543
 
1544
+ # ์„ฑ๊ฒฉ ์กฐ์ • ๋ฐ˜์˜ - ์‹ค์ œ ํŽ˜๋ฅด์†Œ๋‚˜์— ์ ์šฉ
1545
  adjust_btn.click(
1546
  fn=adjust_persona_traits,
1547
  inputs=[current_persona, warmth_slider, competence_slider, extraversion_slider, humor_style_radio],
1548
  outputs=[current_persona, adjustment_result, adjusted_info_output]
1549
+ ).then(
1550
+ # ๋ฐ˜์˜ ํ›„ ๋ฏธ๋ฆฌ๋ณด๊ธฐ๋„ ์—…๋ฐ์ดํŠธ
1551
+ fn=generate_realtime_preview,
1552
+ inputs=[current_persona, warmth_slider, competence_slider, extraversion_slider, humor_style_radio],
1553
+ outputs=[personality_preview]
1554
  )
1555
 
1556
  # ํŽ˜๋ฅด์†Œ๋‚˜ ์ตœ์ข… ํ™•์ •
modules/persona_generator.py CHANGED
@@ -1916,7 +1916,7 @@ class PersonaGenerator:
1916
  return profile
1917
 
1918
  def _determine_humor_style_from_matrix(self, humor_matrix, personality_traits):
1919
- """HumorMatrix๋ฅผ ํ™œ์šฉํ•œ ์œ ๋จธ ์Šคํƒ€์ผ ๊ฒฐ์ •"""
1920
 
1921
  # HumorMatrix์˜ ์ฐจ์›๊ฐ’๋“ค์„ ํ™œ์šฉ
1922
  warmth_vs_wit = humor_matrix.dimensions["warmth_vs_wit"]
@@ -1927,17 +1927,17 @@ class PersonaGenerator:
1927
  wordplay_freq = humor_matrix.derived_attributes["wordplay_frequency"]
1928
  sarcasm_level = humor_matrix.derived_attributes["sarcasm_level"]
1929
 
1930
- # ๊ตฌ์ฒด์ ์ธ ์œ ๋จธ ์Šคํƒ€์ผ ๋ฌธ์žฅ ์ƒ์„ฑ
1931
- if warmth_vs_wit >= 70 and subtle_vs_exp >= 70:
1932
- return f"๋”ฐ๋œปํ•˜๊ณ  ํ‘œํ˜„๋ ฅ ํ’๋ถ€ํ•œ ์œ ๋จธ (๋ง์žฅ๋‚œ ๋นˆ๋„: {wordplay_freq}%)"
1933
- elif warmth_vs_wit <= 30 and wordplay_freq >= 70:
1934
- return f"์ง€์ ์ด๊ณ  ์–ธ์–ด์œ ํฌ๊ฐ€ ๋งŽ์€ ์œ„ํŠธ (ํ’์ž ์ˆ˜์ค€: {sarcasm_level}%)"
1935
- elif self_vs_obs >= 70:
1936
- return f"์ž๊ธฐ ๋น„ํ•˜์ ์ด๊ณ  ์นœ๊ทผํ•œ ์œ ๋จธ (์ž๊ธฐ์ฐธ์กฐ ์„ฑํ–ฅ ๋†’์Œ)"
1937
  elif sarcasm_level >= 60:
1938
- return f"๋‚ ์นด๋กญ๊ณ  ๊ด€์ฐฐ๋ ฅ ์žˆ๋Š” ์•„์ด๋Ÿฌ๋‹ˆ ์œ ๋จธ (ํ’์ž {sarcasm_level}%)"
 
 
1939
  else:
1940
- return f"์ž์—ฐ์Šค๋Ÿฝ๊ณ  ์ƒํ™ฉ์— ๋งž๋Š” ๊ท ํ˜•์žกํžŒ ์œ ๋จธ"
1941
 
1942
  def _generate_communication_style_from_profile(self, personality_profile):
1943
  """PersonalityProfile์„ ํ™œ์šฉํ•œ ์†Œํ†ต ๋ฐฉ์‹ ์ƒ์„ฑ"""
 
1916
  return profile
1917
 
1918
  def _determine_humor_style_from_matrix(self, humor_matrix, personality_traits):
1919
+ """HumorMatrix๋ฅผ ํ™œ์šฉํ•œ ์œ ๋จธ ์Šคํƒ€์ผ ๊ฒฐ์ • (๊ธฐ๋ณธ 5๊ฐ€์ง€ ์Šคํƒ€์ผ๋กœ ๋ฐ˜ํ™˜)"""
1920
 
1921
  # HumorMatrix์˜ ์ฐจ์›๊ฐ’๋“ค์„ ํ™œ์šฉ
1922
  warmth_vs_wit = humor_matrix.dimensions["warmth_vs_wit"]
 
1927
  wordplay_freq = humor_matrix.derived_attributes["wordplay_frequency"]
1928
  sarcasm_level = humor_matrix.derived_attributes["sarcasm_level"]
1929
 
1930
+ # ๐ŸŽฏ ๊ธฐ๋ณธ 5๊ฐ€์ง€ ์œ ๋จธ ์Šคํƒ€์ผ ์ค‘ ํ•˜๋‚˜๋กœ ๊ฒฐ์ • (์˜ค๋ฅ˜ ๋ฐฉ์ง€)
1931
+ if warmth_vs_wit >= 70:
1932
+ return "๋”ฐ๋œปํ•œ ์œ ๋จธ๋Ÿฌ์Šค"
1933
+ elif wordplay_freq >= 70 or warmth_vs_wit <= 30:
1934
+ return "์œ„ํŠธ์žˆ๋Š” ์žฌ์น˜๊พผ"
 
 
1935
  elif sarcasm_level >= 60:
1936
+ return "๋‚ ์นด๋กœ์šด ๊ด€์ฐฐ์ž"
1937
+ elif self_vs_obs >= 70:
1938
+ return "์ž๊ธฐ ๋น„ํ•˜์ "
1939
  else:
1940
+ return "์žฅ๋‚œ๊พธ๋Ÿฌ๊ธฐ"
1941
 
1942
  def _generate_communication_style_from_profile(self, personality_profile):
1943
  """PersonalityProfile์„ ํ™œ์šฉํ•œ ์†Œํ†ต ๋ฐฉ์‹ ์ƒ์„ฑ"""