楼层: 首页/ 软件技术/ Rust + AI 全栈/ Rust + AI 项目实战
08

Rust + AI 项目实战

Project Showcase

前面都是零件,这一章拼三个真车。每个项目讲清楚架构和关键代码,你照着能搭出来。

项目一:企业级 RAG 知识库

架构: 文档(PDF/Word/MD) → 加载(pdf-extract / docx-rs) → 切分(按章节 + 200-500 字 chunk) → Embedding(ort 跑 bge-small-zh) → qdrant 存向量 → 查询:问题向量化 → qdrant 检索 top-5 → 拼 prompt → candle / OpenAI 生成 → Axum 暴露 /api/chat → Tauri 桌面端调用

项目二:高性能 LLM 推理服务

架构: candle 加载 GGUF 量化模型 → 连续批处理(continuous batching): 每个请求不一定等齐,来一个插一个,跑完的替换 → KV Cache 管理 → Axum 暴露 OpenAI 兼容 API(/v1/chat/completions) → SSE 流式输出 → 多副本负载均衡 对标 vLLM,但包体 5MB,无 Python 依赖

项目三:跨端 AI 助手

架构: Tauri 2.0(桌面 + iOS + Android) → 前端 React → Rust 后端调云端 LLM API(流式 SSE) → 本地 qdrant 存长期记忆 → 系统托盘 + 全局快捷键呼出 → 自动更新(updater 插件签名验证) 对标微信读书 / 豆包桌面端,数据全在本地

项目一关键代码:RAG 检索+生成

async fn rag_answer( qdrant: &Qdrant, embed: &EmbeddingModel, llm: &LlmClient, question: &str, ) -> Result<String> { // 1. 问题向量化 let q_vec = embed.embed(question)?; // 2. 向量检索 top-5 let hits = qdrant::search_points("docs", q_vec, 5).await?; let contexts: Vec<String> = hits.iter() .map(|h| h.payload["text"].as_str().unwrap().into()) .collect(); // 3. 拼 prompt(开卷考试) let prompt = format!( "基于以下资料回答问题。资料里没有就说不知道。\n\n资料:\n{}\n\n问题:{}", contexts.join("\n---\n"), question ); // 4. 调 LLM 生成 llm.chat(&prompt).await }

项目二关键代码:连续批处理

// 简化版:来一个请求插一个 batch,跑完的替换 struct BatchEngine { active: Vec<PendingRequest>, max_batch: usize, } impl BatchEngine { async fn run_step(&mut self, model: &mut Model) { // 1. 把当前 active 里所有请求的新 token 拼一个 batch let batch = Self::build_batch(&self.active); // 2. 一次前向计算(GPU 利用率拉满) let logits = model.forward_batch(&batch).await; // 3. 采样,更新每个请求的 KV Cache // 4. 结束的请求移除,新来的插入下一轮 } }
记
本章小结

三个项目覆盖了 RAG、推理服务、跨端助手 三个最热方向。先把项目一做出来,你就有了一个能交付的 AI 产品雏形。