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 产品雏形。