第12篇:blockcell 架构深度解析 —— 为什么用 Rust 写 AI 框架
系列文章:《blockcell 开源项目深度解析》第 12/14 篇
开篇:一个反直觉的选择
AI 框架通常用 Python 写。LangChain、AutoGPT、CrewAI……几乎所有知名的 AI 智能体框架都是 Python。
blockcell 选择了 Rust。
这不是为了"炫技",而是有深思熟虑的工程理由。本篇从架构角度深度解析 blockcell 的设计决策。
整体架构图
┌─────────────────────────────────────────────────────────────┐
│ 用户接口层 │
│ CLI (agent/gateway) │ HTTP API │ WebSocket │ WebUI │
└─────────────────────────────────────────────────────────────┘
↕
┌─────────────────────────────────────────────────────────────┐
│ 消息路由层 │
│ InboundMessage → AgentRuntime → OutboundMessage │
│ 渠道:Telegram │ Slack │ Discord │ 飞书 │ WhatsApp │
└─────────────────────────────────────────────────────────────┘
↕
┌─────────────────────────────────────────────────────────────┐
│ Agent 核心层(TCB) │
│ ContextBuilder │ IntentClassifier │ TaskManager │
│ AgentRuntime │ EvolutionService │ CapabilityRegistry │
└─────────────────────────────────────────────────────────────┘
↕
┌──────────────────────┐ ┌────────────────────────────────┐
│ 工具层(Tools) │ │ 技能层(Skills) │
│ 50+ 内置工具 │ │ Rhai 脚本引擎 │
│ ToolRegistry │ │ SkillManager │
│ JSON Schema 验证 │ │ SkillDispatcher │
└──────────────────────┘ └────────────────────────────────┘
↕
┌─────────────────────────────────────────────────────────────┐
│ 存储层(Storage) │
│ SQLite(记忆/会话/审计) │ 文件系统(技能/媒体/配置) │
└─────────────────────────────────────────────────────────────┘
↕
┌─────────────────────────────────────────────────────────────┐
│ Provider 层 │
│ OpenAI │ Anthropic │ Gemini │ Ollama │ DeepSeek │ Kimi │
└─────────────────────────────────────────────────────────────┘
Crate 结构
blockcell 是一个 Cargo workspace,由 9 个 crate 组成:
blockcell/
├── bin/blockcell/ # 可执行文件入口
└── crates/
├── core/ # 配置、路径、共享类型、错误
├── agent/ # Agent 运行时、上下文、意图分类
├── tools/ # 50+ 内置工具 + 工具注册表
├── skills/ # Rhai 引擎、技能管理、进化服务
├── storage/ # SQLite 记忆、会话、审计日志
├── channels/ # 消息渠道适配器
├── providers/ # LLM Provider 客户端
├── scheduler/ # Cron 调度器
└── updater/ # 自升级工具
每个 crate 职责单一,依赖关系清晰:
bin → agent → tools → core
→ skills → core
→ storage → core
→ channels → core
→ providers → core
→ scheduler → core
为什么选择 Rust
理由一:内存安全 = 可信计算基
blockcell 的设计理念是 TCB(Trusted Computing Base,可信计算基)。
Rust 宿主是整个系统的安全边界。AI 生成的代码(Rhai 脚本)在这个边界内运行,无法突破。
Python 的问题是:内存错误、类型错误、并发问题都可能在运行时出现,很难在编译期发现。Rust 的所有权系统在编译期就排除了这些问题。
// Rust 编译器会在编译期拒绝这段代码
fn bad_code() {
let data = vec![1, 2, 3];
let ref1 = &data;
data.push(4); // 错误:不能在有不可变借用时修改
println!("{:?}", ref1);
}
理由二:异步并发 = 高效多任务
blockcell 需要同时处理:
- 多个消息渠道的轮询
- 多个后台任务的执行
- 定时任务的调度
- WebSocket 连接的维护
Rust 的 tokio 异步运行时让这一切都在单进程内高效运行,没有 Python GIL 的限制:
// 多个任务并发运行,互不阻塞
tokio::select! {
msg = inbound_rx.recv() => { /* 处理新消息 */ }
_ = tick_interval.tick() => { /* 定时维护 */ }
_ = shutdown_signal() => { break; }
}
理由三:单二进制 = 简单部署
Python 应用部署需要:
- Python 环境
- pip 依赖
- 虚拟环境
- 可能还需要 Docker
blockcell 编译后是一个单独的二进制文件,直接运行,零依赖:
# 就这么简单
./blockcell gateway
理由四:性能 = 低成本运行
在云服务器上运行 AI 智能体,计算成本主要来自 LLM API 调用,而不是框架本身。
但 Rust 的低内存占用(通常 < 50MB)意味着你可以在最便宜的 VPS 上运行 blockcell,而 Python 框架可能需要 200-500MB 内存。
关键设计模式
模式一:Trait 对象实现多态
blockcell 大量使用 Rust 的 Trait 对象(dyn Trait)实现多态,这让不同的实现可以互换:
// Provider trait:所有 LLM 提供商的统一接口
pub trait Provider: Send + Sync {
async fn chat(&self, messages: Vec<ChatMessage>, tools: Vec<Tool>)
-> Result<ChatResponse>;
}
// 具体实现
struct OpenAIProvider { ... }
struct AnthropicProvider { ... }
struct GeminiProvider { ... }
struct OllamaProvider { ... }
// 运行时根据配置选择
let provider: Box<dyn Provider> = match model_prefix {
"claude-" => Box::new(AnthropicProvider::new(...)),
"gemini-" => Box::new(GeminiProvider::new(...)),
"ollama/" => Box::new(OllamaProvider::new(...)),
_ => Box::new(OpenAIProvider::new(...)),
};
模式二:Arc 跨线程共享
子智能体需要访问主智能体的资源(TaskManager、MemoryStore 等),通过 Arc<dyn Trait> 安全共享:
// 类型别名,简化使用
pub type TaskManagerHandle = Arc<dyn TaskManagerOps + Send + Sync>;
pub type MemoryStoreHandle = Arc<dyn MemoryStoreOps + Send + Sync>;
pub type CapabilityRegistryHandle = Arc<Mutex<CapabilityRegistry>>;
// ToolContext 携带所有共享资源
pub struct ToolContext {
pub config: Arc<Config>,
pub task_manager: Option<TaskManagerHandle>,
pub memory_store: Option<MemoryStoreHandle>,
pub capability_registry: Option<CapabilityRegistryHandle>,
// ...
}
模式三:Channel 解耦消息流
消息的流转通过 tokio::mpsc channel 解耦:
stdin/Telegram/Slack → inbound_tx → AgentRuntime
AgentRuntime → outbound_tx → 打印/Telegram/Slack
AgentRuntime → confirm_tx → 用户确认
这让消息来源和处理逻辑完全解耦,添加新渠道只需要往 inbound_tx 发消息。
模式四:JSON Schema 驱动的工具系统
每个工具都通过 JSON Schema 描述自己:
pub trait Tool: Send + Sync {
fn name(&self) -> &str;
fn schema(&self) -> Value; // JSON Schema
fn validate(&self, params: &Value) -> Result<()>;
async fn execute(&self, params: Value, ctx: ToolContext) -> Result<Value>;
}
这个设计的好处:
- LLM 通过 schema 知道如何调用工具
- 参数在执行前经过 schema 验证
- 添加新工具只需实现 trait,不需要修改核心代码
意图分类优化 Token 消耗
这是一个很有意思的工程优化。
每次对话都需要把工具列表发给 LLM,但 50+ 个工具的 schema 加起来有 ~20,000 tokens,成本很高。
blockcell 实现了一个意图分类器,根据用户输入只发送相关工具:
// 14 个意图类别
enum IntentCategory {
Chat, // 闲聊 → 0 个工具
FileOps, // 文件操作 → ~8 个工具
WebSearch, // 网络搜索 → ~5 个工具
Finance, // 金融 → ~19 个工具
Blockchain, // 区块链 → ~8 个工具
// ...
}
Token 节省效果:
| 场景 | 优化前 | 优化后 | 节省 |
|---|---|---|---|
| “你好” | ~20K | ~800 | -96% |
| 文件操作 | ~20K | ~4K | -80% |
| 金融查询 | ~20K | ~8K | -60% |
Rhai 脚本引擎的选择
为什么选择 Rhai 而不是 Lua 或 JavaScript?
| 特性 | Rhai | Lua | JavaScript (Deno) |
|---|---|---|---|
| 纯 Rust 实现 | ✅ | ❌ | ❌ |
| 类型安全 | ✅ | ❌ | 部分 |
| 沙箱隔离 | ✅ | 需配置 | 需配置 |
| 语法友好 | ✅ | 一般 | ✅ |
| 嵌入复杂度 | 低 | 中 | 高 |
| 二进制大小 | 小 | 中 | 大 |
Rhai 是专为 Rust 嵌入设计的脚本语言,零外部依赖,天然沙箱,语法接近 Rust/JavaScript,是技能层的完美选择。
SQLite 的战略性使用
blockcell 在三个地方使用 SQLite:
- 记忆系统:
memory.db,FTS5 全文搜索 - 知识图谱:
knowledge_graphs/*.db,实体关系图 - 会话历史:
sessions.db,对话记录
为什么不用 PostgreSQL 或 Redis?
- 零运维:SQLite 是文件,不需要启动服务
- 足够快:对于单用户场景,SQLite 的性能绰绰有余
- 可移植:整个数据库就是一个文件,备份/迁移极简单
- FTS5:内置全文搜索,不需要 Elasticsearch
安全设计
路径安全
fn is_path_safe(&self, path: &Path) -> bool {
let workspace = Paths::workspace();
// 规范化路径,防止 ../../../etc/passwd 攻击
if let Ok(canonical) = path.canonicalize() {
canonical.starts_with(&workspace)
} else {
false
}
}
目录级授权缓存
一次授权,目录内所有文件自动允许:
// 用户授权了 /Users/alice/Desktop/project/
// 后续访问该目录内任何文件都不再询问
authorized_dirs: HashSet<PathBuf>
Gateway 认证
// Bearer Token 中间件
async fn auth_middleware(
State(state): State<AppState>,
req: Request,
next: Next,
) -> Response {
if req.uri().path() == "/v1/health" {
return next.run(req).await; // 健康检查不需要认证
}
// 检查 Authorization header 或 ?token= 参数
// ...
}
自升级系统
blockcell 有一个完整的自升级流程:
1. 检查 manifest(版本清单)
2. 验证签名(ed25519-dalek)
3. 下载新版本
4. 原子替换(rename 保证原子性)
5. 失败时自动回滚
// updater/atomic.rs
pub fn atomic_replace(new_binary: &Path, target: &Path) -> Result<()> {
let backup = target.with_extension("bak");
fs::copy(target, &backup)?; // 备份当前版本
fs::rename(new_binary, target)?; // 原子替换
// 如果后续验证失败,可以从 backup 恢复
Ok(())
}
与其他框架对比
| 特性 | blockcell | LangChain | AutoGPT | CrewAI |
|---|---|---|---|---|
| 语言 | Rust | Python | Python | Python |
| 内存安全 | ✅ 编译期 | ❌ 运行时 | ❌ | ❌ |
| 自我进化 | ✅ | ❌ | 部分 | ❌ |
| 消息渠道 | ✅ 5个 | 需插件 | ❌ | ❌ |
| 本地模型 | ✅ Ollama | ✅ | ✅ | ✅ |
| 单二进制 | ✅ | ❌ | ❌ | ❌ |
| 内置金融工具 | ✅ | ❌ | ❌ | ❌ |
| 浏览器自动化 | ✅ CDP | 需插件 | ❌ | ❌ |
开源贡献指南
如果你想为 blockcell 贡献代码,这里是快速入门:
添加一个新工具
- 在
crates/tools/src/创建新文件,如my_tool.rs - 实现
Tooltrait - 在
crates/tools/src/lib.rs添加pub mod my_tool; - 在
crates/tools/src/registry.rs注册工具 - 在
crates/agent/src/runtime.rs添加到子智能体注册表 - 在
crates/skills/src/service.rs添加到BUILTIN_TOOLS - 在
crates/agent/src/context.rs添加系统提示词规则
添加一个新渠道
- 在
crates/channels/src/创建新文件 - 实现消息接收循环(轮询或 WebSocket)
- 实现
send_message()函数 - 在
crates/core/src/config.rs添加配置结构 - 在
bin/blockcell/src/commands/gateway.rs添加启动逻辑
运行测试
cd blockcell
cargo test
# 应该看到 350+ 测试全部通过
小结
blockcell 的架构设计体现了几个核心原则:
- Rust 宿主 = 可信计算基:安全、稳定、不可变
- Rhai 技能 = 可变层:灵活、可进化、沙箱隔离
- Trait 对象 = 可扩展性:工具、Provider、渠道都可插拔
- Channel 解耦 = 可维护性:消息流清晰,组件独立
- SQLite = 零运维存储:简单可靠,无需外部服务
这套架构让 blockcell 在保持高性能和安全性的同时,具备了极强的可扩展性——无论是添加新工具、新渠道,还是让 AI 自己进化出新能力。
系列总结
恭喜你读完了整个系列!正文共 14 篇文章,我们覆盖了:
| 篇 | 主题 |
|---|---|
| 01 | 项目整体介绍 |
| 02 | 5分钟快速上手 |
| 03 | 50+ 内置工具详解 |
| 04 | Rhai 技能系统 |
| 05 | SQLite 记忆系统 |
| 06 | 多渠道接入 |
| 07 | CDP 浏览器自动化 |
| 08 | Gateway 服务模式 |
| 09 | 自我进化系统 |
| 10 | 金融场景实战 |
| 11 | 子智能体并发 |
| 12 | 架构深度解析 |
| 13 | 消息处理与自进化生命周期 |
| 14 | 名字由来 |
blockcell 是一个还在快速发展的开源项目。如果你觉得它有用,欢迎:
- ⭐ 给项目 Star
- 🐛 提交 Issue 报告问题
- 🔧 提交 PR 贡献代码
- 📢 分享给更多开发者
项目地址:https://github.com/blockcell-labs/blockcell
官网:https://blockcell.dev
更多推荐


所有评论(0)