File size: 8,752 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 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 | // π BioPhys v5.0 λ§μ€ν° λνν μ± + μκ°νκ· μμ±(LLM) + λμ RAG ν΅ν© (src/bin/biophys_app.rs)
#[path="../dynamic_knowledge_rag.rs"] mod dynamic_knowledge_rag;
#[path="../generative_llm.rs"] mod generative_llm;
#[path="../korean_telemetry.rs"] mod korean_telemetry;
#[path="../parallel_engine.rs"] mod parallel_engine;
use std::io::{self, Write};
use std::time::Instant;
use dynamic_knowledge_rag::DynamicKnowledgeRAG;
use generative_llm::{GenerativeEngine, GenerativeContext, GenerationMode};
use parallel_engine::LargeScaleEngine;
use korean_telemetry::TelemetryReporter;
pub struct BioPhysMasterApp {
rag: DynamicKnowledgeRAG,
engine: LargeScaleEngine,
}
impl BioPhysMasterApp {
pub fn new() -> Self {
BioPhysMasterApp {
rag: DynamicKnowledgeRAG::new("knowledge_corpus"),
engine: LargeScaleEngine::new(256),
}
}
pub fn render_header(&self) {
println!("ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ");
println!("β π BioPhys v5.0 Master Generative & RAG Desktop App β");
println!("β Rust Native Autoregressive LLM + Dynamic Open-World Engine β");
println!("β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ£");
println!("β [λͺ¨λ 1] π» μμ μ½λ μμ±: 'νμ΄μ¬ μΉμλ² μ½λ μ§μ€', 'Rust λΉλκΈ° μ½λ' β");
println!("β [λͺ¨λ 2] ποΈ μ°½μ λ¬Έν μ°½μ: 'μ°μ£Όμ AIμ κ΄ν λ¨νΈ μμ€ μ¨μ€' β");
println!("β [λͺ¨λ 3] π λμ μ§μ μ£Όμ
: 'νμ΅ [λΆμΌ] | [μ λͺ©] | [λ΄μ©]' (무컴νμΌ RAG) β");
println!("β [λͺ¨λ 4] π¬ μ νμ μ§μ : μ§λ¬Έμ μμ λ‘κ² μ
λ ₯ μ μ€μκ° RAG κ²μ & λ΅λ³β");
println!("β β’ μ’
λ£ λ°©λ²: 'q' λλ 'exit' μ
λ ₯ β");
println!("ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ\n");
}
pub fn process_input(&mut self, prompt: &str) {
let trimmed = prompt.trim();
if trimmed.is_empty() { return; }
let t_start = Instant::now();
// 1. μ€μκ° λμ μ§μ μ£Όμ
λͺ
λ Ήμ΄ μ²λ¦¬ (ex: νμ΅ μμIT | QuantumX-9000 | μ€νμ€λͺ
)
if trimmed.starts_with("νμ΅") {
let rest = trimmed.trim_start_matches("νμ΅").trim();
let parts: Vec<&str> = rest.split('|').map(|s| s.trim()).collect();
if parts.len() >= 3 {
self.rag.ingest_new_knowledge(parts[0], parts[1], parts[2]);
println!("βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ");
println!("β β
[λμ μ§μ μ€μκ° μ£Όμ
μλ£! (μ»΄νμΌ λΆνμ)]");
println!("β ββ λΆμΌ: [{}]", parts[0]);
println!("β ββ μ λͺ©: γ {} γ", parts[1]);
println!("β ββ λ΄μ©: {}", parts[2]);
println!("β π μ½νΌμ€ μ μ₯: knowledge_corpus/world_knowledge_2026.jsonl (μ΄ {}건 λ¬Έμ)", self.rag.documents.len());
println!("βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ\n");
return;
} else {
println!("π‘ [μ¬μ©λ² μλ΄]: νμ΅ [λΆμΌ] | [μ λͺ©] | [μμΈ λ΄μ©] νμμΌλ‘ μ
λ ₯νμΈμ.\n");
return;
}
}
// 2. λͺ¨λ νλ³ λ° μλ§¨ν± RAG κ²μ
let mode = GenerativeEngine::detect_mode(trimmed);
let search_results = self.rag.search_documents(trimmed, 3);
let retrieved_docs = search_results.into_iter().map(|(d, _)| d.clone()).collect();
// 3. 256x256 격μ λμν μ°μ°
let prompt_energy: f32 = trimmed.bytes().map(|b| b as f32).sum::<f32>() / 1000.0;
for b in self.engine.bedrock.iter_mut() {
*b = (*b * 0.5) + (prompt_energy.sin() * 0.5);
}
let avg_e = self.engine.step_parallel();
let temperature = match mode {
GenerationMode::CodeGeneration => 0.2,
GenerationMode::CreativeWriting => 0.8,
GenerationMode::AnalyticalDialogue => 0.4,
};
let ctx = GenerativeContext {
prompt: trimmed.to_string(),
retrieved_docs,
temperature,
mode,
};
let generated_text = GenerativeEngine::generate_response(&ctx, avg_e);
let dur = t_start.elapsed().as_secs_f64() * 1000.0;
println!("βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ");
println!("β π£οΈ [μ¬μ©μ μ
λ ₯]: \"{}\"", trimmed);
println!("β π― [νλ³ λͺ¨λ]: {:?}", mode);
println!("β");
for line in generated_text.lines() {
println!("β {}", line);
}
println!("β");
println!("β β±οΈ [μκ°νκ· & RAG μμ± μ§μ°μκ°]: {:.3} ms | 물리 κ³λ©΄ μλμ§: {:.4}", dur, avg_e);
println!("βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ\n");
}
pub fn render_2d_lattice(&mut self) {
println!("βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ");
println!("β β‘ [256x256 볡μ‘κ³ 8λ μμ 격μ μ€μκ° 2D λ§΅]");
println!("β λ²λ‘: [β²β²]κ³Όν₯λΆ [β²]ν₯λΆ [Β·]ν΄μ§κΈ° [βΌ]μ΅μ [βΌβΌ]κ³Όμ΅μ \nβ");
for y in 0..4 {
print!("β ");
for x in 0..18 {
let state = self.engine.topsoil[y * 256 + x];
let symbol = match state.value() {
v if v >= 1.5 => "β²β²",
v if v > 0.0 => "β² ",
0.0 => "Β· ",
v if v <= -1.5 => "βΌβΌ",
_ => "βΌ ",
};
print!("{} ", symbol);
}
println!();
}
println!("β\nβ β
65,536κ° μλ
μ€ μ λ
Έλ μ μ νν μ€μκ° λκΈ°ν μλ£");
println!("βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ\n");
}
}
fn main() {
let mut app = BioPhysMasterApp::new();
app.render_header();
println!("============================================================");
println!(" π¬ μ€μκ° λνν ν둬ννΈ νμ±ν (μ§λ¬Έ / μ½λ μμ² / μμ€ μμ² / 'νμ΅' μ
λ ₯)");
println!("============================================================\n");
let stdin = io::stdin();
let mut buffer = String::new();
loop {
print!("BioPhys π¬ μ
λ ₯ > ");
let _ = io::stdout().flush();
buffer.clear();
if stdin.read_line(&mut buffer).is_err() { break; }
let trimmed = buffer.trim();
if trimmed == "q" || trimmed == "exit" || trimmed == "quit" {
println!("\nπ BioPhys μ±μ μ’
λ£ν©λλ€. μν°λ₯Ό λλ₯΄λ©΄ μ°½μ΄ λ«νλλ€.");
let _ = stdin.read_line(&mut buffer);
break;
}
if !trimmed.is_empty() {
app.process_input(trimmed);
app.render_2d_lattice();
}
}
}
|