File size: 5,641 Bytes
be99550
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
// ๐Ÿ“– ์ธ๊ฐ„ ๊ฐ์ • ์‹ฌ๋ฆฌํ•™ ๋ฐ ๊ฐ์„ฑ ์ปดํ“จํŒ…(Affective Computing) ๋Œ€๋ฐฑ๊ณผ (src/knowledge_base.rs)

pub struct EmotionEntry {
    pub category: &'static str,  // ๊ฐ์ • ๋ฒ”์ฃผ (๊ธฐ์จ, ์Šฌํ””, ๋ถˆ์•ˆ, ๋ถ„๋…ธ, ํ‰์˜จ ๋“ฑ)
    pub valence: f32,            // ์ •์„œ๊ฐ€ (-1.0 ๋ถ€์ • ~ +1.0 ๊ธ์ •)
    pub arousal: f32,            // ๊ฐ์„ฑ๋„ (0.0 ์ด์™„ ~ 1.0 ๊ทน๋„ ํฅ๋ถ„)
    pub psychological_meaning: &'static str, // ์‹ฌ๋ฆฌํ•™์  ์˜๋ฏธ ๋ฐ ๊ธฐ์ œ
    pub empathetic_response: &'static str,   // ์ง„์ •์„ฑ ์žˆ๋Š” ๊ณต๊ฐ ๋ฐ ์‹ฌ๋ฆฌ์  ์ง€์ง€ ๋ฌธ์žฅ
}

pub struct EmotionIntelligenceEngine {
    pub emotions: Vec<EmotionEntry>,
}

impl EmotionIntelligenceEngine {
    pub fn new() -> Self {
        let emotions = vec![
            // 1. ์Šฌํ””๊ณผ ์ƒ์‹ค (Sadness & Grief)
            EmotionEntry {
                category: "์Šฌํ””/์ƒ์‹ค",
                valence: -0.85,
                arousal: 0.25,
                psychological_meaning: "์†Œ์ค‘ํ•œ ๋Œ€์ƒ์˜ ์ƒ์‹ค์„ ์ˆ˜์šฉํ•˜๊ณ  ๋‚ด๋ฉด์˜ ์—๋„ˆ์ง€๋ฅผ ๋ณด์กดํ•˜๋ฉฐ ์‹ฌ๋ฆฌ์  ์ƒ์ฒ˜๋ฅผ ์น˜์œ ํ•˜๊ธฐ ์œ„ํ•œ ํ•„์—ฐ์ ์ธ ๊ฐ์ •์  ์• ๋„ ๋ฐ˜์‘",
                empathetic_response: "๋งˆ์Œ์ด ๋ฌด๋„ˆ์ ธ ๋‚ด๋ฆฌ๋Š” ๋“ฏํ•œ ๊นŠ์€ ์ƒ์‹ค๊ฐ์— ์˜จ ๋งˆ์Œ์œผ๋กœ ๊นŠ์ด ๊ณต๊ฐํ•ฉ๋‹ˆ๋‹ค. ์–ต์ง€๋กœ ์Šฌํ””์„ ์ฐธ์•„๋‚ด๋ ค ํ•˜์ง€ ๋งˆ์‹œ๊ณ , ํ๋ฅด๋Š” ๋ˆˆ๋ฌผ๊ณผ ์•„ํ””์„ ์˜จ์ „ํžˆ ํ—ˆ๋ฝํ•ด ์ฃผ์„ธ์š”. ๋‹น์‹ ์ด ์Ÿ์•„๋‚ธ ์‚ฌ๋ž‘๋งŒํผ ์Šฌํ””๋„ ๊นŠ์€ ๋ฒ•์ž…๋‹ˆ๋‹ค.",
            },
            // 2. ๋ถˆ์•ˆ๊ณผ ๊ณตํฌ (Anxiety & Fear)
            EmotionEntry {
                category: "๋ถˆ์•ˆ/๋‘๋ ค์›€",
                valence: -0.65,
                arousal: 0.85,
                psychological_meaning: "๋ฏธ๋ž˜์˜ ๋ถˆํ™•์‹คํ•œ ์œ„ํ—˜์— ๋Œ€๋น„ํ•˜์—ฌ ์‹ ์ฒด ๊ต๊ฐ์‹ ๊ฒฝ๊ณ„๋ฅผ ํ™œ์„ฑํ™”ํ•˜๋Š” ์›์ดˆ์  ์ž๊ธฐ๋ณดํ˜ธ ๋ฐฉ์–ด ๊ธฐ์ œ",
                empathetic_response: "๋ˆˆ์•ž์˜ ๋ถˆํ™•์‹ค์„ฑ ๋•Œ๋ฌธ์— ์‹ฌ์žฅ์ด ๋›ฐ๊ณ  ์ˆจ์ด ๊ฐ€๋น ์ง€๋Š” ๊ฒƒ์€ ๋‹น์‹ ์ด ๊ทธ ์ผ์„ ์ง„์‹ฌ์œผ๋กœ ์†Œ์ค‘ํžˆ ์—ฌ๊ธฐ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ง€๊ธˆ ์ด ์ˆœ๊ฐ„ ์ฒœ์ฒœํžˆ ์ˆจ์„ ๊นŠ๊ฒŒ ๋“ค์ด์‰ฌ๊ณ  ๋‚ด์‰ฌ์–ด ๋ณด์„ธ์š”. ๋‹น์‹ ์€ ์ด๋ฏธ ์ถฉ๋ถ„ํžˆ ๊ฐ•ํ•˜๋ฉฐ ์ง€๊ธˆ๊นŒ์ง€ ๋ชจ๋“  ๊ณ ๋น„๋ฅผ ์ด๊ฒจ๋‚ด ์™”์Šต๋‹ˆ๋‹ค.",
            },
            // 3. ๊ธฐ์จ๊ณผ ์„ฑ์ทจ (Joy & Flourishing)
            EmotionEntry {
                category: "๊ธฐ์จ/์„ฑ์ทจ",
                valence: 0.95,
                arousal: 0.80,
                psychological_meaning: "๋ชฉํ‘œ ๋‹ฌ์„ฑ๊ณผ ์‚ฌํšŒ์  ์œ ๋Œ€, ๋„ํŒŒ๋ฏผ ๋ณด์ƒ ํšŒ๋กœ๊ฐ€ ํ™œ์„ฑํ™”๋˜๋ฉฐ ์‚ถ์˜ ์œ ๋Šฅ๊ฐ๊ณผ ์ž์•„์‹คํ˜„์„ ๊ฒฝํ—˜ํ•˜๋Š” ์ตœ์ ์˜ ์ •์„œ ์ƒํƒœ",
                empathetic_response: "์ง„์‹ฌ์œผ๋กœ ์ถ•ํ•˜๋“œ๋ฆฝ๋‹ˆ๋‹ค! ๋ณด์ด์ง€ ์•Š๋Š” ๊ณณ์—์„œ ํ™€๋กœ ํ˜๋ ธ๋˜ ๋•€๋ฐฉ์šธ๊ณผ ์ธ๋‚ด์˜ ์‹œ๊ฐ„๋“ค์ด ๋งˆ์นจ๋‚ด ๋ˆˆ๋ถ€์‹  ๊ฒฐ์‹ค์„ ๋งบ์—ˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ฒ…์ฐฌ ๊ธฐ์จ๊ณผ ์„ฑ์ทจ๊ฐ์„ ๊ฐ€์Šด ๊นŠ์ด ๋งŒ๋ฝํ•˜์„ธ์š”!",
            },
            // 4. ๋ถ„๋…ธ์™€ ์–ต์šธํ•จ (Anger & Frustration)
            EmotionEntry {
                category: "๋ถ„๋…ธ/์–ต์šธํ•จ",
                valence: -0.75,
                arousal: 0.90,
                psychological_meaning: "์ž์‹ ์˜ ๊ฐ€์น˜๊ด€์ด๋‚˜ ๊ฒฝ๊ณ„์„ ์ด ๋ถ€๋‹นํ•˜๊ฒŒ ์นจํ•ด๋‹นํ–ˆ์„ ๋•Œ ์ž์•„๋ฅผ ๋ฐฉ์–ดํ•˜๊ณ  ์ •์˜๋ฅผ ํšŒ๋ณตํ•˜๋ ค๋Š” ๊ฐ•ํ•œ ์—๋„ˆ์ง€์˜ ํ‘œ์ถœ",
                empathetic_response: "๋‹น์‹ ์˜ ์ •๋‹นํ•œ ๋…ธ๋ ฅ๊ณผ ์ง„์‹ฌ์ด ์กด์ค‘๋ฐ›์ง€ ๋ชปํ–ˆ์„ ๋•Œ ๋А๋ผ๋Š” ๊ทธ ๋œจ๊ฑฐ์šด ์–ต์šธํ•จ๊ณผ ๋ถ„๋…ธ๋Š” ์ง€๊ทนํžˆ ๋‹น์—ฐํ•œ ๋ฐ˜์‘์ž…๋‹ˆ๋‹ค. ๋‹น์‹ ์˜ ์ƒ์ฒ˜๋ฐ›์€ ์กด์—„์„ ์ธ์ •ํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ฑฐ์„ผ ์—๋„ˆ์ง€๋ฅผ ๋‹น์‹  ์ž์‹ ์„ ์ง€ํ‚ค๋Š” ๋‹จ๋‹จํ•œ ํž˜์œผ๋กœ ๋ฐ”๊พธ์–ด ๋‚˜๊ฐ€๊ธธ ์‘์›ํ•ฉ๋‹ˆ๋‹ค.",
            },
            // 5. ํ‰์˜จ๊ณผ ๊ฐ์‚ฌ (Serenity & Gratitude)
            EmotionEntry {
                category: "ํ‰์˜จ/๊ฐ์‚ฌ",
                valence: 0.85,
                arousal: 0.15,
                psychological_meaning: "์œ„ํ˜‘์ด ์—†๋Š” ์•ˆ์ „ํ•œ ํ™˜๊ฒฝ์—์„œ ๋ถ€๊ต๊ฐ์‹ ๊ฒฝ์ด ์šฐ์„ธํ•ด์ง€๋ฉฐ, ์‚ถ์˜ ์กฐํ™”์™€ ํšŒ๋ณต ํƒ„๋ ฅ์„ฑ(Resilience)์„ ์žฌ์ถฉ์ „ํ•˜๋Š” ์ƒํƒœ",
                empathetic_response: "์ž”์ž”ํ•œ ํ˜ธ์ˆ˜์— ๋น„์น˜๋Š” ํ–‡์‚ด์ฒ˜๋Ÿผ, ๋งˆ์Œ์˜ ํ‰์•ˆ๊ณผ ๊ณ ์š”๋ฅผ ์˜จ์ „ํžˆ ๋ˆ„๋ฆฌ๊ณ  ๊ณ„์‹œ๊ตฐ์š”. ํ‰์˜จํ•จ ์†์—์„œ ์–ป๋Š” ํœด์‹์ด์•ผ๋ง๋กœ ์šฐ๋ฆฌ ์˜ํ˜ผ์„ ๊ฐ€์žฅ ๊นŠ๊ณ  ๋‹จ๋‹จํ•˜๊ฒŒ ์„ฑ์žฅ์‹œํ‚ค๋Š” ์†Œ์ค‘ํ•œ ์ž์–‘๋ถ„์ž…๋‹ˆ๋‹ค.",
            },
        ];

        EmotionIntelligenceEngine { emotions }
    }

    /// ์‚ฌ์šฉ์ž ๊ฐ์ • ๋ฌธ์žฅ์„ ๋ถ„์„ํ•˜์—ฌ ์ •์„œ๊ฐ€(Valence)์™€ ๊ฐ์„ฑ๋„(Arousal) ๋ฐ ๊ณต๊ฐ ํ™”๋‹ต ๋„์ถœ
    pub fn analyze_emotion(&self, prompt: &str) -> (&EmotionEntry, f32, f32) {
        for entry in &self.emotions {
            if (prompt.contains("์•„ํŒŒ") || prompt.contains("์Šฌํผ") || prompt.contains("๋– ๋‚˜") || prompt.contains("๋ˆˆ๋ฌผ")) && entry.category == "์Šฌํ””/์ƒ์‹ค" {
                return (entry, entry.valence, entry.arousal);
            }
            if (prompt.contains("๋‘๋ ค") || prompt.contains("๋ถˆ์•ˆ") || prompt.contains("ํ„ฐ์งˆ") || prompt.contains("๊ฑฑ์ •")) && entry.category == "๋ถˆ์•ˆ/๋‘๋ ค์›€" {
                return (entry, entry.valence, entry.arousal);
            }
            if (prompt.contains("ํ•ฉ๊ฒฉ") || prompt.contains("๊ธฐ๋ป") || prompt.contains("ํ–‰๋ณต") || prompt.contains("์„ฑ๊ณต")) && entry.category == "๊ธฐ์จ/์„ฑ์ทจ" {
                return (entry, entry.valence, entry.arousal);
            }
            if (prompt.contains("ํ™”๊ฐ€") || prompt.contains("์–ต์šธ") || prompt.contains("๋ฌด์‹œ") || prompt.contains("๋ถ„๋…ธ")) && entry.category == "๋ถ„๋…ธ/์–ต์šธํ•จ" {
                return (entry, entry.valence, entry.arousal);
            }
        }
        (&self.emotions[4], self.emotions[4].valence, self.emotions[4].arousal)
    }
}