// 🌌 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::() / 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(); } } }