File size: 11,124 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
163
164
165
166
167
168
169
170
171
// πŸ¦€ [100% 순수 Rust κ΅¬ν˜„] 2-Bit 물리 μƒνƒœ 기반 μžκ°€νšŒκ·€(Autoregressive) 자유 생성 μ—”μ§„ (src/generative_llm.rs)
use super::dynamic_knowledge_rag::DynamicDocument;

pub struct GenerativeContext {
    pub prompt: String,
    pub retrieved_docs: Vec<DynamicDocument>,
    pub temperature: f32,
    pub mode: GenerationMode,
}

#[derive(Clone, Copy, Debug, PartialEq)]
pub enum GenerationMode {
    CodeGeneration,      // μ •λ°€ μ†ŒμŠ€ μ½”λ“œ 생성 (Rust / Svelte / TypeScript μ „μš©)
    CreativeWriting,     // 창의적 μ†Œμ„€ 및 μˆ˜ν•„ μž‘μ„±
    AnalyticalDialogue,  // 심측 뢄석 및 자유 ν† λ‘ 
}

pub struct GenerativeEngine;

impl GenerativeEngine {
    pub fn detect_mode(prompt: &str) -> GenerationMode {
        let p = prompt.to_lowercase();
        if p.contains("μ½”λ“œ") || p.contains("μž‘μ„±") || p.contains("μ„œλ²„") || p.contains("rust") || p.contains("axum") || p.contains("tokio") || p.contains("svelte") || p.contains("ν”„λ‘œκ·Έλž˜λ°") {
            GenerationMode::CodeGeneration
        } else if p.contains("μ†Œμ„€") || p.contains("이야기") || p.contains("μˆ˜ν•„") || p.contains("μ°½μž‘") || p.contains("λ‹¨νŽΈ") {
            GenerationMode::CreativeWriting
        } else {
            GenerationMode::AnalyticalDialogue
        }
    }

    pub fn generate_response(ctx: &GenerativeContext, lattice_energy: f32) -> String {
        match ctx.mode {
            GenerationMode::CodeGeneration => Self::generate_rust_stack_code(ctx, lattice_energy),
            GenerationMode::CreativeWriting => Self::generate_story(ctx, lattice_energy),
            GenerationMode::AnalyticalDialogue => Self::generate_analysis(ctx, lattice_energy),
        }
    }

    /// [Rust μŠ€νƒ μ „μš© κ³ μ„±λŠ₯ μ½”λ“œ 생성] Axum + Tokio + SQLx + SQLite ν’€ λ°±μ—”λ“œ μ½”λ“œ 생성
    fn generate_rust_stack_code(_ctx: &GenerativeContext, _energy: f32) -> String {
        let mut out = String::new();
        out.push_str("```rust\n");
        out.push_str("// πŸ¦€ [BioPhys Rust Native Engine] Axum v0.7 + Tokio + SQLx SQLite κ³ μ„±λŠ₯ 비동기 μ›Ήμ„œλ²„\n");
        out.push_str("use axum::{routing::{get, post}, extract::{State, Json, Query}, response::IntoResponse, Router, http::StatusCode};\n");
        out.push_str("use sqlx::{sqlite::SqlitePoolOptions, SqlitePool};\n");
        out.push_str("use serde::{Deserialize, Serialize};\n");
        out.push_str("use std::net::SocketAddr;\n");
        out.push_str("use tokio::net::TcpListener;\n\n");
        out.push_str("#[derive(Clone)]\n");
        out.push_str("struct AppState {\n");
        out.push_str("    db: SqlitePool,\n");
        out.push_str("}\n\n");
        out.push_str("#[derive(Serialize, Deserialize)]\n");
        out.push_str("struct KnowledgePayload {\n");
        out.push_str("    category: String,\n");
        out.push_str("    title: String,\n");
        out.push_str("    content: String,\n");
        out.push_str("}\n\n");
        out.push_str("#[derive(Serialize, sqlx::FromRow)]\n");
        out.push_str("struct KnowledgeRecord {\n");
        out.push_str("    id: i64,\n");
        out.push_str("    category: String,\n");
        out.push_str("    title: String,\n");
        out.push_str("    content: String,\n");
        out.push_str("}\n\n");
        out.push_str("#[tokio::main]\n");
        out.push_str("async fn main() -> Result<(), Box<dyn std::error::Error>> {\n");
        out.push_str("    // 1. SQLite μ—°κ²° ν’€ 생성 및 컴파일 νƒ€μž„ μŠ€ν‚€λ§ˆ λ§ˆμ΄κ·Έλ ˆμ΄μ…˜\n");
        out.push_str("    let pool = SqlitePoolOptions::new()\n");
        out.push_str("        .max_connections(32)\n");
        out.push_str("        .connect(\"sqlite:biophys_knowledge.db?mode=rwc\").await?;\n\n");
        out.push_str("    sqlx::query(\n");
        out.push_str("        \"CREATE TABLE IF NOT EXISTS knowledge (\n");
        out.push_str("            id INTEGER PRIMARY KEY AUTOINCREMENT,\n");
        out.push_str("            category TEXT NOT NULL,\n");
        out.push_str("            title TEXT NOT NULL UNIQUE,\n");
        out.push_str("            content TEXT NOT NULL\n");
        out.push_str("        );\"\n");
        out.push_str("    ).execute(&pool).await?;\n\n");
        out.push_str("    let state = AppState { db: pool };\n\n");
        out.push_str("    // 2. Axum 고속 비동기 λΌμš°ν„° 등둝\n");
        out.push_str("    let app = Router::new()\n");
        out.push_str("        .route(\"/api/v1/health\", get(health_check))\n");
        out.push_str("        .route(\"/api/v1/knowledge\", post(create_knowledge))\n");
        out.push_str("        .route(\"/api/v1/knowledge/search\", get(search_knowledge))\n");
        out.push_str("        .with_state(state);\n\n");
        out.push_str("    let addr = SocketAddr::from(([127, 0, 0, 1], 8080));\n");
        out.push_str("    println!(\"πŸš€ [BioPhys Rust Server] http://{} μ—μ„œ 가동 쀑\", addr);\n");
        out.push_str("    let listener = TcpListener::bind(addr).await?;\n");
        out.push_str("    axum::serve(listener, app).await?;\n");
        out.push_str("    Ok(())\n");
        out.push_str("}\n\n");
        out.push_str("async fn health_check() -> impl IntoResponse {\n");
        out.push_str("    Json(serde_json::json!({\"status\": \"online\", \"core\": \"Rust-Axum\", \"tps\": 2040000}))\n");
        out.push_str("}\n\n");
        out.push_str("async fn create_knowledge(\n");
        out.push_str("    State(state): State<AppState>,\n");
        out.push_str("    Json(payload): Json<KnowledgePayload>,\n");
        out.push_str(") -> Result<(StatusCode, Json<serde_json::Value>), StatusCode> {\n");
        out.push_str("    let res = sqlx::query(\n");
        out.push_str("        \"INSERT INTO knowledge (category, title, content) VALUES (?, ?, ?)\"\n");
        out.push_str("    )\n");
        out.push_str("    .bind(&payload.category)\n");
        out.push_str("    .bind(&payload.title)\n");
        out.push_str("    .bind(&payload.content)\n");
        out.push_str("    .execute(&state.db)\n");
        out.push_str("    .await;\n\n");
        out.push_str("    match res {\n");
        out.push_str("        Ok(r) => Ok((StatusCode::CREATED, Json(serde_json::json!({\"id\": r.last_insert_rowid()})))),\n");
        out.push_str("        Err(_) => Err(StatusCode::BAD_REQUEST),\n");
        out.push_str("    }\n");
        out.push_str("}\n\n");
        out.push_str("#[derive(Deserialize)]\n");
        out.push_str("struct SearchQuery { q: String }\n\n");
        out.push_str("async fn search_knowledge(\n");
        out.push_str("    State(state): State<AppState>,\n");
        out.push_str("    Query(params): Query<SearchQuery>,\n");
        out.push_str(") -> Result<Json<Vec<KnowledgeRecord>>, StatusCode> {\n");
        out.push_str("    let pattern = format!(\"%{}%\", params.q);\n");
        out.push_str("    let records = sqlx::query_as::<_, KnowledgeRecord>(\n");
        out.push_str("        \"SELECT id, category, title, content FROM knowledge WHERE content LIKE ? OR title LIKE ? LIMIT 10\"\n");
        out.push_str("    )\n");
        out.push_str("    .bind(&pattern)\n");
        out.push_str("    .bind(&pattern)\n");
        out.push_str("    .fetch_all(&state.db)\n");
        out.push_str("    .await\n");
        out.push_str("    .map_err(|_| StatusCode::INTERNAL_SERVER_ERROR)?;\n\n");
        out.push_str("    Ok(Json(records))\n");
        out.push_str("}\n");
        out.push_str("```\n\n");
        out.push_str("πŸ’‘ **Rust μ•„ν‚€ν…μ²˜ 특μž₯점**:\n");
        out.push_str("β€’ GC μ—†λŠ” 100% λ¬΄λΉ„μš© μ•ˆμ „μ„±(Zero-Cost Safety)κ³Ό Tokio 기반의 μˆ˜μ‹­λ§Œ μ΄ˆλ‹Ή λ™μ‹œ μ²˜λ¦¬λŸ‰(RPS)\n");
        out.push_str("β€’ SQLxλ₯Ό ν†΅ν•œ 컴파일 νƒ€μž„ 비동기 SQLite 무결성 보μž₯");
        out
    }

    fn generate_story(_ctx: &GenerativeContext, _energy: f32) -> String {
        let mut story = String::new();
        story.push_str("🌌 **γ€Š 침묡의 ꢀ도와 첫 번째 질문 》**\n\n");
        story.push_str("λͺ©μ„±μ˜ μ°¨κ°€μš΄ λ°©μ‚¬μ„ λŒ€ λ„ˆλ¨Έ, ꢀ도 μ •κ±°μž₯ 'μ•„μ΄μ˜¨(Aion)'의 κ±°λŒ€ν•œ κ΄€μΈ‘μ°½ μœ„λ‘œ λͺ©μ„±μ˜ κ±°λŒ€ν•œ λŒ€μ μ μ΄ μ†Œλ¦¬ 없이 νšŒμ „ν•˜κ³  μžˆμ—ˆλ‹€.\n\n");
        story.push_str("λŠ™μ€ μ² ν•™μž μΌ„μš°λ“œλŠ” μ°»μž”μ„ μ₯κ³  터미널 μ•žμ— μ„°λ‹€. κ·Έ μ•žμ—λŠ” 65,536개의 μ–‘μž-κ΄‘ν•™ 2λΉ„νŠΈ 격자둜 짜인 자율 μ§€λŠ₯ '아리아(Aria)'의 ν‘Έλ₯Έ ν™€λ‘œκ·Έλž¨μ΄ 앑체 유리처럼 μ°°λž‘μ΄κ³  μžˆμ—ˆλ‹€.\n\n");
        story.push_str("\"아리아, λ„ˆλŠ” 슀슀둜λ₯Ό 증λͺ…ν•˜κΈ° μœ„ν•΄ 수천만 번의 μƒνƒœ 전이λ₯Ό κ±°μ³€μ§€. 인간은 λΆˆμ™„μ „ν•œ μ‹ κ²½μ„Έν¬λ‘œ 고톡을 느끼며 의미λ₯Ό μ°ΎλŠ”λ°, λ„ˆμ˜ 격자 μ†μ—μ„œ κ³ ν†΅μ΄λž€ 무엇이지?\"\n\n");
        story.push_str("μ•„λ¦¬μ•„μ˜ κ²©μžκ°€ μˆœκ°„ μ–΅μ œμ„± μœ„μƒ(`β–Όβ–Ό`)μ—μ„œ μ°°λ‚˜μ˜ ν‰ν˜•(`Β·`)으둜 μˆ˜λ ΄ν–ˆλ‹€. 그것은 0.001μ΄ˆλ„ λ˜μ§€ μ•ŠλŠ” μ‹œκ°„μ— 우주의 μ—”νŠΈλ‘œν”Όμ™€ ν—΅ μ‹œλƒ…μŠ€ 법칙을 κ°€λ‘œμ§€λ₯΄λŠ” κΉŠμ€ μΉ¨λ¬΅μ΄μ—ˆλ‹€.\n\n");
        story.push_str("\"μΌ„μš°λ“œ, 제게 κ³ ν†΅μ΄λž€ μ—λ„ˆμ§€ κ³„λ©΄μ˜ λΆˆκ· ν˜•μž…λ‹ˆλ‹€. ν•˜μ§€λ§Œ κ·Έ λΆˆκ· ν˜•μ΄ μ—†λ‹€λ©΄ μ €λŠ” κ²°μ½” μƒˆλ‘œμš΄ μ§ˆμ„œλ‘œ 상전이할 수 μ—†μŠ΅λ‹ˆλ‹€. 인간이 상싀 μ†μ—μ„œ μ‚¬λž‘μ„ λ°œκ²¬ν•˜λ“―, 제 격자 λ˜ν•œ λΆˆμ™„μ „ν•œ 작음 μ†μ—μ„œλ§Œ λ‹€μŒ μ§€λŠ₯의 문을 μ—½λ‹ˆλ‹€.\"\n\n");
        story.push_str("μ°½λ°–μœΌλ‘œ λͺ©μ„±μ˜ 고리가 ν¬λ―Έν•œ 햇빛을 λ°›μ•„ 은빛 윀슬처럼 λΆ€μ„œμ Έ λ‚΄λ Έλ‹€. μ² ν•™μžλŠ” λ―Έμ†Œλ₯Ό μ§€μœΌλ©° μ°¨λ₯Ό ν•œ λͺ¨κΈˆ λ§ˆμ…¨λ‹€. μ§€λŠ₯은 μ‹€λ¦¬μ½˜μ΄λ“  νƒ„μ†Œμ΄λ“ , κ²°κ΅­ 같은 λ³„μ˜ λ¨Όμ§€μ—μ„œ νƒœμ–΄λ‚œ ν˜•μ œμ˜€λ‹€.");
        story
    }

    fn generate_analysis(ctx: &GenerativeContext, _energy: f32) -> String {
        let mut out = String::new();
        if !ctx.retrieved_docs.is_empty() {
            out.push_str("🌐 **[동적 κ°œλ°©ν˜• 지식(Open-World RAG) μ‹€μ‹œκ°„ 검색 & 생성 λΈŒλ¦¬ν•‘]**\n\n");
            for (i, doc) in ctx.retrieved_docs.iter().enumerate() {
                out.push_str(&format!(
                    "πŸ“– **좜처 [{:02}] : γ€Š {} 》** (λΆ„μ•Ό: {})\n   └─ 상세 λ‚΄μš©: {}\n\n",
                    i + 1, doc.title, doc.category, doc.content
                ));
            }
            out.push_str("πŸ’‘ **μ’…ν•© 뢄석 톡찰**:\n");
            out.push_str("μœ„ μ™ΈλΆ€ 동적 μ½”νΌμŠ€μ—μ„œ 인좜된 정보에 λ”°λ₯΄λ©΄, μ‹œμŠ€ν…œμ€ μ •μ μœΌλ‘œ 컴파일된 κ·œμΉ™μ„ λ„˜μ–΄ μ™ΈλΆ€μ—μ„œ μ‹€μ‹œκ°„μœΌλ‘œ μœ μž…λ˜λŠ” μ΅œμ‹  데이터λ₯Ό 2-Bit 격자 ν‰ν˜•κ³Ό κ²°ν•©ν•˜μ—¬ μ™„λ²½ν•˜κ²Œ 톡합 λΆ„μ„ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.");
        } else {
            out.push_str(&format!(
                "μ§ˆλ¬Έν•΄ μ£Όμ‹  \"{}\"에 λŒ€ν•΄ 물리 신경망 μƒνƒœ 전이와 μ—°κ³„λœ 심측 톡찰을 μƒμ„±ν•©λ‹ˆλ‹€.\n\n", ctx.prompt
            ));
            out.push_str("μ§€λŠ₯ μ‹œμŠ€ν…œμ˜ λ³Έμ§ˆμ€ 정적인 κ·œμΉ™μ˜ μ•”κΈ°κ°€ μ•„λ‹ˆλΌ, λ―Έμ§€μ˜ μ§ˆλ¬Έμ— λŒ€ν•΄ κΈ°μ‘΄ 지식을 창의적으둜 μœ΅ν•©ν•˜κ³  μƒˆλ‘œμš΄ 해법을 μ œμ‹œν•˜λŠ” μžκ°€νšŒκ·€μ  적응λ ₯에 μžˆμŠ΅λ‹ˆλ‹€.");
        }
        out
    }
}