// πŸ“– [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, } 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() } }