File size: 5,842 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
// ๐Ÿ“– [BioPhys ํ†ตํ•ฉ ๋งˆ์Šคํ„ฐ ์ง€์‹ ๋ฐฑ๊ณผ์‚ฌ์ „] (src/knowledge_base.rs)

pub struct KnowledgeEntry {
    pub domain: String,
    pub keyword: String,
    pub title_or_name: String,
    pub description: String,
    pub core_insight: String,
}

pub struct MultiDomainKnowledgeBase {
    pub entries: Vec<KnowledgeEntry>,
}

impl MultiDomainKnowledgeBase {
    pub fn new() -> Self {
        let mut kb = MultiDomainKnowledgeBase { entries: Vec::new() };

        // 1. ์ž์—ฐ๊ณผํ•™ & ๋žœ๋“œ๋งˆํฌ ๋…ผ๋ฌธ (2010~2026)
        kb.add("์ž์—ฐ๊ณผํ•™", "ํž‰์Šค๋ณด์†", "CERN ํž‰์Šค ๋ณด์† ๋ฐœ๊ฒฌ (2012)", "๋ชจ๋“  ๊ธฐ๋ณธ ์ž…์ž์— ์งˆ๋Ÿ‰์„ ๋ถ€์—ฌํ•˜๋Š” ํž‰์Šค ๋ฉ”์ปค๋‹ˆ์ฆ˜์˜ ์‹ค์กด ์ž…์ฆ (๋…ธ๋ฒจ๋ฌผ๋ฆฌํ•™์ƒ)", "์ž…์ž๋ฌผ๋ฆฌํ•™ ํ‘œ์ค€๋ชจํ˜•์˜ ๋งˆ์ง€๋ง‰ ํผ์ฆ ์™„์„ฑ");
        kb.add("์ž์—ฐ๊ณผํ•™", "์ค‘๋ ฅํŒŒ", "LIGO ์ค‘๋ ฅํŒŒ ์ง์ ‘ ๊ฒ€์ถœ (2016)", "13์–ต ๊ด‘๋…„ ์ „ ๋ธ”๋ž™ํ™€ ์ถฉ๋Œ์ด ์ผ์œผํ‚จ ์‹œ๊ณต๊ฐ„์˜ ์ถœ๋ ์ž„์„ ๊ฐ„์„ญ๊ณ„๋กœ ์ตœ์ดˆ ๊ด€์ธก", "์•„์ธ์Šˆํƒ€์ธ ์ผ๋ฐ˜์ƒ๋Œ€์„ฑ 100๋…„ ์˜ˆ์ธก ์ž…์ฆ ๋ฐ ์ค‘๋ ฅํŒŒ ์ฒœ๋ฌธํ•™ ๊ฐœ๋ง‰");
        kb.add("์ž์—ฐ๊ณผํ•™", "mRNA", "mRNA ๋‰ดํด๋ ˆ์˜ค์‹œ๋“œ ๋ณ€ํ˜• ๋ฐฑ์‹  (Kariko & Weissman, 2020)", "์Šˆ๋„์œ ๋ฆฌ๋”˜ ๋ณ€ํ˜•์œผ๋กœ ์„ ์ฒœ ๋ฉด์—ญ ๊ณผ๋ฏผ ๋ฐ˜์‘์„ ์–ต์ œํ•˜์—ฌ ์ธ๋ฅ˜ ์ตœ์ดˆ mRNA ๋ฐฑ์‹  ์ƒ์šฉํ™”", "๊ฐ์—ผ๋ณ‘ ๋ฐ ์ฐจ์„ธ๋Œ€ ์•” ๋ฐฑ์‹  ํ”Œ๋žซํผ ํ™•๋ฆฝ");
        kb.add("์ž์—ฐ๊ณผํ•™", "ํ•ต์œตํ•ฉ", "NIF ๋ ˆ์ด์ € ํ•ต์œตํ•ฉ ์ˆœ์—๋„ˆ์ง€ ์ด๋“ ์ ํ™” (2022)", "ํˆฌ์ž… ๋ ˆ์ด์ € ์—๋„ˆ์ง€(2.05MJ)๋ณด๋‹ค ๋งŽ์€ ํ•ต์œตํ•ฉ ์—๋„ˆ์ง€(3.15MJ) ์ƒ์„ฑ ๋‹ฌ์„ฑ", "์ธ๊ณต ํƒœ์–‘ ๋ฌดํ•œ ์ฒญ์ • ์—๋„ˆ์ง€ ์ƒ์šฉํ™”์˜ ์—ญ์‚ฌ์  ์ด์ •ํ‘œ");

        // 2. ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด (Languages)
        kb.add("ํ”„๋กœ๊ทธ๋ž˜๋ฐ์–ธ์–ด", "Rust", "Rust (๋Ÿฌ์ŠคํŠธ)", "๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ(GC) ์—†์ด ์ปดํŒŒ์ผ ํƒ€์ž„ ์†Œ์œ ๊ถŒ(Ownership)๊ณผ ๋นŒ๋ฆผ ๊ฒ€์‚ฌ๊ธฐ๋กœ 100% ๋ฉ”๋ชจ๋ฆฌ ์•ˆ์ „์„ฑ ๋ณด์žฅ", "๋ฌด๋น„์šฉ ์ถ”์ƒํ™”์™€ ์Šค๋ ˆ๋“œ ์•ˆ์ „ ๋™์‹œ์„ฑ(Fearless Concurrency)");
        kb.add("ํ”„๋กœ๊ทธ๋ž˜๋ฐ์–ธ์–ด", "C++", "C/C++", "ํ•˜๋“œ์›จ์–ด์™€ ๋ฉ”๋ชจ๋ฆฌ ํฌ์ธํ„ฐ๋ฅผ ์ง์ ‘ ์ œ์–ดํ•˜๋ฉฐ RAII์™€ ํ…œํ”Œ๋ฆฟ ๋ฉ”ํƒ€ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์ง€์›", "๊ทนํ•œ์˜ ์‹คํ–‰ ์„ฑ๋Šฅ์„ ์š”๊ตฌํ•˜๋Š” ๊ฒŒ์ž„ ์—”์ง„, ๊ทธ๋ž˜ํ”ฝ์Šค, ์ปค๋„ ํ‘œ์ค€");
        kb.add("ํ”„๋กœ๊ทธ๋ž˜๋ฐ์–ธ์–ด", "Python", "Python (ํŒŒ์ด์ฌ)", "๊ฐ„๊ฒฐํ•œ ๋ฌธ๋ฒ•๊ณผ C-ํ™•์žฅ ๋ชจ๋“ˆ ๊ฒฐํ•ฉ์œผ๋กœ ์ „ ์„ธ๊ณ„ AI/๋ฐ์ดํ„ฐ ๊ณผํ•™ ์ƒํƒœ๊ณ„ ์ฃผ๋„", "๋™์  ํƒ€์ดํ•‘๊ณผ ํ’๋ถ€ํ•œ AI ํ”„๋ ˆ์ž„์›Œํฌ(PyTorch) ์ง€์›");

        // 3. ์˜คํ”ˆ์†Œ์Šค ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ (Libraries)
        kb.add("์˜คํ”ˆ์†Œ์Šค", "Tokio", "Tokio (๋น„๋™๊ธฐ ๋Ÿฐํƒ€์ž„)", "์ž‘์—… ํ›”์น˜๊ธฐ(Work-Stealing) ์Šค์ผ€์ค„๋Ÿฌ์™€ non-blocking I/O ์ด๋ฒคํŠธ ๋ฃจํ”„๋กœ ์ˆ˜์‹ญ๋งŒ ๋™์‹œ ์—ฐ๊ฒฐ ์ฒ˜๋ฆฌ", "Rust ๊ณ ์„ฑ๋Šฅ ๋น„๋™๊ธฐ ๋„คํŠธ์›Œํฌ ํ‘œ์ค€");
        kb.add("์˜คํ”ˆ์†Œ์Šค", "vLLM", "vLLM (์ดˆ๊ณ ์† LLM ์ถ”๋ก )", "PagedAttention ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ KV ์บ์‹œ ๋‚ญ๋น„๋ฅผ 0%๋กœ ์ค„์ด๊ณ  ์—ฐ์† ๋ฐฐ์น˜(Continuous Batching) ์ง€์›", "LLM ์„œ๋น™ ์ฒ˜๋ฆฌ๋Ÿ‰ 2~4๋ฐฐ ๊ทน๋Œ€ํ™”");
        kb.add("์˜คํ”ˆ์†Œ์Šค", "Tauri", "Tauri (๊ฒฝ๋Ÿ‰ ๋ฐ์Šคํฌํ†ฑ ํ”„๋ ˆ์ž„์›Œํฌ)", "๋ฌด๊ฑฐ์šด Chromium ๋Œ€์‹  OS ๋„ค์ดํ‹ฐ๋ธŒ ์›น๋ทฐ์™€ Rust ๋ฐฑ์—”๋“œ IPC ํ†ต์‹ ์„ ๊ฒฐํ•ฉํ•œ ์ดˆ๊ฒฝ๋Ÿ‰ ์•ฑ ํ”„๋ ˆ์ž„์›Œํฌ", "์ˆ˜ MB ๋ฏธ๋งŒ์˜ ์ดˆ๊ฒฝ๋Ÿ‰ ๋ฐ”์ด๋„ˆ๋ฆฌ์™€ ๋ฉ”๋ชจ๋ฆฌ ํšจ์œจ");

        // 4. ๋ฏธ์ˆ ์‚ฌ์กฐ & UI/UX ๋””์ž์ธ (Art & Design)
        kb.add("๋ฏธ์ˆ /๋””์ž์ธ", "๋””ํ„ฐ๋žŒ์Šค", "๋””ํ„ฐ ๋žŒ์Šค์˜ ๊ตฟ ๋””์ž์ธ 10๊ณ„๋ช…", "'์ข‹์€ ๋””์ž์ธ์€ ๊ฐ€๋Šฅํ•œ ํ•œ ์ตœ์†Œํ•œ์˜ ๋””์ž์ธ(Less, but better)'์ด๋ผ๋Š” 10๋Œ€ ์›์น™", "์• ํ”Œ ๋ฏธ๋‹ˆ๋ฉ€๋ฆฌ์ฆ˜๊ณผ ํ˜„๋Œ€ ์ „์ž๊ธฐ๊ธฐ UI ๋‹จ์ˆœํ™”์˜ ์ ˆ๋Œ€ ๊ธฐ์ค€");
        kb.add("๋ฏธ์ˆ /๋””์ž์ธ", "๋ฐ”์šฐํ•˜์šฐ์Šค", "๋ฐ”์šฐํ•˜์šฐ์Šค์™€ ๊ธฐ๋Šฅ์ฃผ์˜", "'ํ˜•ํƒœ๋Š” ๊ธฐ๋Šฅ์„ ๋”ฐ๋ฅธ๋‹ค(Form follows function)'๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ๊ธฐํ•˜ํ•™์  ๋‹จ์ˆœ๋ฏธ์™€ ๋Œ€๋Ÿ‰์ƒ์‚ฐ ์œตํ•ฉ", "ํ˜„๋Œ€ ๊ทธ๋ž˜ํ”ฝ ๊ทธ๋ฆฌ๋“œ ์‹œ์Šคํ…œ ๋ฐ ๋ชจ๋˜ ๋””์ž์ธ์˜ ๊ธฐํ‹€");
        kb.add("๋ฏธ์ˆ /๋””์ž์ธ", "๊ธ€๋ž˜์Šค๋ชจํ”ผ์ฆ˜", "๊ธ€๋ž˜์Šค๋ชจํ”ผ์ฆ˜ (Liquid Glass UI)", "๋ฐ˜ํˆฌ๋ช… ๋ฐฐ๊ฒฝ ๋ธ”๋Ÿฌ(Backdrop blur), ํ…Œ๋‘๋ฆฌ ๊ด‘ํƒ, Z-์ถ• ๋‹ค์ธต ๊ทธ๋ฆผ์ž๋กœ ๋ฐ˜ํˆฌ๋ช… ์•ก์ฒด ์œ ๋ฆฌ ์งˆ๊ฐ ๋ถ€์—ฌ", "๋‹คํฌ ๋ชจ๋“œ ํ™˜๊ฒฝ์—์„œ ์ž…์ฒด์  ์‹œ๊ฐ ๊ณ„์ธต ๊ตฌ์กฐ์™€ ๋ฏธ๋ž˜์ง€ํ–ฅ์  ์‹ฌ๋ฏธ์„ฑ ์ œ๊ณต");

        // 5. ํ•œ๊ตญ์–ด ์–ดํœ˜ & ๋Œ€ํ™”
        kb.add("ํ•œ๊ตญ์–ด์–ดํœ˜", "์œค์Šฌ", "์ˆœ์šฐ๋ฆฌ๋ง ์œค์Šฌ", "ํ–‡๋น›์ด๋‚˜ ๋‹ฌ๋น›์— ๋น„์น˜์–ด ๋ฐ˜์ง์ด๋Š” ์•„๋ฆ„๋‹ค์šด ์ž”๋ฌผ๊ฒฐ", "์ž์—ฐ์˜ ๋น›๊ณผ ๋ฌผ๊ฒฐ์ด ๋นš์–ด๋‚ด๋Š” ๊ณ ์œ ํ•œ ํ•œ๊ตญ์  ๋ฏธํ•™");
        kb.add("ํ•œ๊ตญ์–ด์–ดํœ˜", "์‹œ๋‚˜๋ธŒ๋กœ", "์ˆœ์šฐ๋ฆฌ๋ง ์‹œ๋‚˜๋ธŒ๋กœ", "๋ชจ๋ฅด๋Š” ์‚ฌ์ด์— ์กฐ๊ธˆ์”ฉ ์กฐ๊ธˆ์”ฉ ์ผ์ด ์ง„ํ–‰๋˜๋Š” ๋ชจ์–‘", "๋ณต์žก๊ณ„์˜ ์ ์ง„์  ์ž๊ธฐ์กฐ์งํ™”์™€ ์ž์—ฐ์Šค๋Ÿฌ์šด ๋ณ€ํ™”์˜ ์€์œ ");

        kb
    }

    fn add(&mut self, domain: &str, keyword: &str, title_or_name: &str, description: &str, core_insight: &str) {
        self.entries.push(KnowledgeEntry {
            domain: domain.to_string(),
            keyword: keyword.to_string(),
            title_or_name: title_or_name.to_string(),
            description: description.to_string(),
            core_insight: core_insight.to_string(),
        });
    }

    pub fn search(&self, prompt: &str) -> Vec<&KnowledgeEntry> {
        let normalized = prompt.to_lowercase().replace(" ", "");
        self.entries.iter().filter(|e| {
            let k_norm = e.keyword.to_lowercase().replace(" ", "");
            let t_norm = e.title_or_name.to_lowercase().replace(" ", "");
            normalized.contains(&k_norm) || normalized.contains(&t_norm) ||
            (prompt.contains("ํž‰์Šค") && e.keyword == "ํž‰์Šค๋ณด์†") ||
            (prompt.contains("์ค‘๋ ฅํŒŒ") && e.keyword == "์ค‘๋ ฅํŒŒ") ||
            (prompt.contains("Rust") && e.keyword == "Rust") ||
            (prompt.contains("๋””์ž์ธ") && e.domain == "๋ฏธ์ˆ /๋””์ž์ธ") ||
            (prompt.contains("๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ") && e.domain == "์˜คํ”ˆ์†Œ์Šค")
        }).collect()
    }
}