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()
}
}
|