OpenHuman 深度解析:打造真正「懂你」的开源 AI 助手——从记忆树到 118+ 服务集成的完整技术内幕
一款登顶 GitHub Trending 的开源项目,用 Rust + Tauri 构建个人 AI 超级智能,解决 AI "失忆" 难题,让 AI 在几分钟内真正了解你。
前言:AI 助手的「失忆」之痛
如果你用过 Claude、ChatGPT 或者 Cursor,你一定遇到过这样的场景:
- 你花了半小时跟 AI 解释你的项目背景、代码风格、团队规范
- 第二天打开对话框,AI 又变成了「陌生人」
- 你不得不重新介绍一遍自己是做什么的、项目结构是怎样的
- 每次切换对话,上下文归零,AI 对你的了解也随之消失
这不是你的错觉,而是当前主流 AI 助手的根本性缺陷:它们没有记忆,或者说记忆是会话级别的,而不是用户级别的。
Andrej Karpathy(前特斯拉 AI 总监)在今年早些时候发了一条推文,提出了一个概念叫 「LLM Wiki」——让 AI 拥有一个持续更新的、关于用户的知识库,就像 Obsidian 的 Wiki 链接一样,AI 可以随时查阅。
这个概念启发了一个开源项目:OpenHuman。
OpenHuman 是什么?
OpenHuman 是一个开源的个人 AI 超级智能助手,由 Tiny Humans AI 团队开发,目前在 GitHub 上已获得 3.4k+ Star,曾登顶 GitHub Trending 日榜第一。
核心定位
OpenHuman 的定位不是「又一个聊天机器人」,而是一个深度融入你日常工作的 AI 系统,具备以下特征:
- 持久化记忆:通过「记忆树(Memory Tree)」系统,AI 能记住你的邮件、文档、代码、会议记录,形成层级化的知识库
- 主动感知:每 20 分钟自动拉取你授权的服务数据(Gmail、Notion、GitHub、Slack 等),无需你手动输入
- 本地优先:所有记忆数据存储在你的设备本地(SQLite + 加密),你完全拥有数据控制权
- 118+ 服务集成:一键 OAuth 接入你的工作栈,AI 直接调用这些工具
- 模型路由 + Token 压缩:智能分配任务给最合适的模型,同时通过 TokenJuice 技术降低最多 80% 的 Token 消耗
技术栈
| 层级 | 技术 |
|---|---|
| 桌面框架 | Tauri 2.0(Rust + WebView) |
| 前端 | TypeScript + React |
| 核心引擎 | Rust(高性能数据处理、加密、调度) |
| 数据存储 | SQLite(本地加密存储) |
| 开源协议 | GNU AGPLv3 |
| 支持平台 | macOS、Windows、Linux |
选择 Tauri 而非 Electron 是一个关键决策:Tauri 使用系统 WebView(macOS 用 WKWebView,Windows 用 WebView2),二进制体积小(~10MB vs Electron 的 ~150MB),内存占用更低,且 Rust 核心提供更好的安全性。
核心架构解析
整体架构图
┌─────────────────────────────────────────────────────────┐
│ OpenHuman 桌面客户端 │
│ ┌───────────────────────────────────────────────────┐ │
│ │ TypeScript/React 前端层(Tauri WebView) │ │
│ │ - 桌面吉祥物(Mascot) │ │
│ │ - 对话 UI │ │
│ │ - Obsidian Wiki 可视化 │ │
│ └───────────────────────────────────────────────────┘ │
│ ↕ Tauri IPC │
│ ┌───────────────────────────────────────────────────┐ │
│ │ Rust 核心层(性能关键路径) │ │
│ │ - Auto-Fetch 调度器(20分钟循环) │ │
│ │ - Memory Tree 引擎(Markdown 化 + 评分 + 摘要) │ │
│ │ - TokenJuice 压缩层(HTML→MD,去重,短链) │ │
│ │ - 加密存储(SQLite + SQLCipher) │ │
│ │ - OAuth 管理器(118+ 服务令牌管理) │ │
│ └───────────────────────────────────────────────────┘ │
│ ↕ │
│ ┌───────────────────────────────────────────────────┐ │
│ │ Model Routing 层 │ │
│ │ - 推理型模型(DeepSeek R1 / Claude Opus) │ │
│ │ - 快速型模型(GPT-4o mini / Claude Haiku) │ │
│ │ - 视觉型模型(GPT-4V / Claude Sonnet) │ │
│ │ - 本地模型(Ollama 接入) │ │
│ └───────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────┘
↕ OAuth 授权
┌─────────────────────────────────────────────────────────┐
│ 118+ 第三方服务集成 │
│ Gmail | Notion | GitHub | Slack | Linear | Jira | │
│ Google Calendar | Google Drive | Stripe | ... │
└─────────────────────────────────────────────────────────┘
深度技术拆解
一、Memory Tree(记忆树):让 AI 真正「认识」你
1.1 问题:为什么传统 AI 助手记不住你?
传统 AI 助手(包括 Claude 的 Project Knowledge、Cursor 的 Rules)依赖用户手动配置上下文:
- 你得自己写「关于我的项目」文档
- 你得手动更新「团队规范」
- 你复制粘贴代码风格指南到 AI 的上下文窗口
这个方法的问题是:
- 维护成本高:你得多地方更新,容易过时
- 覆盖不全面:你不可能把邮件、会议记录、Slack 消息都手动整理
- 上下文窗口限制:即使你整理了,LLM 的上下文窗口有限(即使 200K,也不可能装下你所有的历史数据)
1.2 Memory Tree 的解决方案
OpenHuman 的 Memory Tree 系统自动化了整个过程:
第一步:Auto-Fetch(自动抓取)
每 20 分钟,OpenHuman 的后台调度器会:
- 遍历所有已连接的 OAuth 服务(Gmail、Notion、GitHub 等)
- 拉取增量更新(仅获取上次同步后的新数据)
- 将数据规范化为统一的中间表示(IR)
// Rust 伪代码:Auto-Fetch 调度器核心逻辑
struct AutoFetchScheduler {
connectors: Vec<Box<dyn Connector>>, // 118+ 连接器
sqlite_pool: SqlitePool, // 本地 SQLite 连接池
interval: Duration, // 20 分钟
}
impl AutoFetchScheduler {
async fn run_fetch_cycle(&self) {
for connector in &self.connectors {
// 1. 获取上次同步时间戳
let last_sync = self.get_last_sync(connector.id()).await;
// 2. 增量拉取新数据
let new_items = connector
.fetch_incremental(last_sync)
.await
.unwrap_or_default();
// 3. 规范化为 Markdown 片段
let chunks = new_items
.into_iter()
.map(|item| item.to_markdown_chunk())
.collect::<Vec<_>>();
// 4. 质量评分(后文详解)
let scored_chunks = self.score_chunks(&chunks).await;
// 5. 写入 SQLite + Obsidian Vault
self.persist_chunks(scored_chunks).await;
// 6. 更新同步时间戳
self.update_last_sync(connector.id(), Utc::now()).await;
}
}
}
第二步:Chunk 化 + 质量评分
不是所有数据都值得放进记忆树。OpenHuman 使用质量评分算法过滤低价值数据:
| 评分维度 | 说明 | 权重 |
|---|---|---|
| 信息密度 | 是否包含事实、决策、代码片段 | 0.35 |
| 时效性 | 是否是近期数据(衰减函数) | 0.25 |
| 关联度 | 是否与其他已存储块有链接关系 | 0.20 |
| 长度合理 | 是否在 500-3000 字符之间 | 0.20 |
# TokenJuice 质量评分算法(Python 伪代码,实际在 Rust 中实现)
def score_chunk(chunk: str, metadata: dict) -> float:
"""
对规范化后的 Markdown 片段评分
返回 0.0 ~ 1.0 的分值
"""
# 1. 信息密度:检测是否包含关键实体
entities = extract_entities(chunk) # NER
has_code = bool(re.search(r'```[\s\S]*```', chunk))
has_decision = any(kw in chunk.lower() for kw in ['decided', 'agreed', 'todo', 'action'])
info_density = min(1.0, (len(entities) * 0.1 + int(has_code) * 0.3 + int(has_decision) * 0.3))
# 2. 时效性衰减(指数衰减)
age_hours = (now() - metadata['created_at']).total_seconds() / 3600
recency_score = exp(-age_hours / (7 * 24)) # 7天半衰期
# 3. 关联度(与已有块的余弦相似度)
similar_count = count_similar_chunks(chunk, threshold=0.7)
connectivity = min(1.0, similar_count / 5.0)
# 4. 长度合理
length = len(chunk)
length_score = 1.0 if 500 <= length <= 3000 else 0.5
# 加权求和
final_score = (
0.35 * min(1.0, info_density) +
0.25 * recency_score +
0.20 * connectivity +
0.20 * length_score
)
return clamp(final_score, 0.0, 1.0)
第三步:层级化摘要树(Hierarchical Summary Tree)
单个 Markdown 块(~3000 token)太细粒度,直接全部喂给 LLM 会爆上下文窗口。
OpenHuman 的做法是:构建层级化摘要树,类似文件系统的目录树:
Memory Tree 结构示例:
Level 0 (根摘要,~2000 tokens):
"用户是一名全栈工程师,目前负责支付系统重构项目,
使用 Go + React 技术栈,团队有 5 人,使用 Linear 管理任务..."
Level 1 (主题摘要,每个 ~1500 tokens):
- 工作项目: "支付系统重构 - 目标、进度、技术决策..."
- 技术偏好: "Go 错误处理风格、React 组件模式..."
- 团队协作: "Linear 任务分配、代码审查规范..."
Level 2 (原始块,每个 ~500-3000 tokens):
- chunk_5823.md: "2026-05-15 团队会议记录 - 决定使用 PostgreSQL 而非 MySQL..."
- chunk_5824.md: "GitHub PR #342 代码审查意见 - 关于错误处理的讨论..."
- chunk_5825.md: "Notion 文档:支付系统 API 设计规范 v2.1..."
当 AI 需要回答问题时,它会:
- 先读取 Level 0 根摘要(了解你的大致情况)
- 根据问题类型,选择性展开 Level 1 主题摘要
- 仅在需要具体细节时,才读取 Level 2 原始块
这种层级结构使得即使你积累了 数千个原始块(相当于几个月的邮件、文档、代码),AI 也能在 ~4000 tokens 的上下文窗口内获得关于你的「全景认知」。
第四步:Obsidian Wiki 兼容存储
所有 Markdown 块同时以 .md 文件形式写入一个 Obsidian Vault:
~/.openhuman/vault/
├── README.md # Vault 入口
├── _meta/
│ ├── index.json # 块索引(UUID → 文件路径、评分、链接关系)
│ └── sync_log.json # 每次 Auto-Fetch 的日志
├── work/
│ ├── project_payment_refactor.md
│ └── meeting_notes_2026-05-15.md
├── tech/
│ ├── go_error_handling_preference.md
│ └── react_component_patterns.md
└── _links/
└── MOC.md # Map of Content(自动生成的导航页)
你可以直接用 Obsidian 打开这个 Vault,浏览、编辑、添加自己的笔记。OpenHuman 会尊重你的手动编辑,并在下一次 Auto-Fetch 时合并更新。
这种设计实现了 Karpathy 的 LLM Wiki 愿景:AI 的知识库对人类也是可读、可编辑的。
二、TokenJuice:降低 80% Token 消耗的压缩技术
2.1 问题:为什么 AI 助手那么贵?
假设你让 AI 助手「帮我总结今天收到的邮件」,传统实现会:
- 抓取 20 封邮件(每封 ~2000 tokens)
- 全部塞进上下文窗口(20 × 2000 = 40000 tokens)
- 调用 LLM 生成摘要
如果你每天都这么做,一个月的 Token 消耗会达到 百万级别,成本惊人。
2.2 TokenJuice 的压缩策略
OpenHuman 在数据进入 LLM 之前,先经过 TokenJuice 压缩层:
| 压缩技术 | 说明 | 压缩比 |
|---|---|---|
| HTML → Markdown | 去除所有标签,保留语义 | ~70% |
| URL 缩短 | 长 URL 替换为占位符,附在末尾 | ~50% |
| 去重 | 相同内容只保留一份 | ~20-40% |
| 摘要替换 | 长文档用预处理摘要替代原文 | ~80% |
| CJK 优化 | 中日韩文字按字形簇(grapheme)处理,不断字符 | 保持正确 |
| 表情符号保留 | 不删除表情符号(可能包含情感信息) | - |
// TokenJuice 压缩管道(Rust 实现)
pub struct TokenJuice {
html2md: html2md::Parser,
url_shortener: UrlShortener,
dedup_cache: LruCache<u64, String>, // 64KB LRU
}
impl TokenJuice {
pub fn compress(&mut self, input: &str) -> String {
let mut s = input.to_string();
// Step 1: HTML → Markdown
if s.contains('<') && s.contains('>') {
s = self.html2md.parse(&s);
}
// Step 2: URL 缩短(保留语义)
let urls: Vec<&str> = find_urls(&s);
for (i, url) in urls.iter().enumerate() {
if url.len() > 50 {
let placeholder = format!("[URL{}]", i);
s = s.replace(url, &placeholder);
// 把完整 URL 附在文末
s.push_str(&format!("\n{}: {}", placeholder, url));
}
}
// Step 3: 去重(基于 SimHash)
let simhash = simhash(&s);
if let Some(prev) = self.dedup_cache.get(&simhash) {
if levenshtein_distance(&s, prev) < 50 {
return format!("[DUPLICATE of previous chunk]");
}
}
self.dedup_cache.put(simhash, s.clone());
// Step 4: 长文本摘要(如果 >3000 tokens)
if estimate_tokens(&s) > 3000 {
s = self.summarize_long_text(&s);
}
s
}
}
实测效果:
| 场景 | 原始 Token 数 | 压缩后 Token 数 | 压缩比 |
|---|---|---|---|
| 邮件正文(HTML) | 2,400 | 680 | 71.7% |
| GitHub Issue(含评论) | 8,500 | 1,200 | 85.9% |
| Notion 文档(长文) | 12,000 | 2,100 | 82.5% |
| Slack 消息线程 | 6,800 | 1,500 | 77.9% |
平均压缩比:~80%,意味着同样的任务,OpenHuman 的 API 成本只有传统实现的 1/5。
三、Model Routing(模型路由):为任务选最合适的模型
3.1 问题:一个模型打天下?
不同任务对模型能力的需求差异巨大:
| 任务类型 | 需求 | 最适合的模型 |
|---|---|---|
| 「帮我总结这封邮件」 | 快速、便宜 | GPT-4o mini、Claude Haiku |
| 「帮我重构这段代码,考虑性能」 | 推理能力强 | DeepSeek R1、Claude Opus |
| 「描述这张截图里的问题」 | 视觉理解 | GPT-4V、Claude Sonnet |
| 「这是我本地的敏感数据,帮我分析」 | 隐私保护 | Llama 3(本地 Ollama) |
如果你全部用 Claude Opus,成本是迷你模型的 20 倍,而且速度慢 5 倍。
3.2 OpenHuman 的模型路由策略
OpenHuman 内置了一个 轻量级路由层,根据任务特征自动选择模型:
# 模型路由算法(简化版)
class ModelRouter:
def __init__(self):
self.models = {
'fast': ['gpt-4o-mini', 'claude-haiku'],
'reasoning': ['deepseek-r1', 'claude-opus'],
'vision': ['gpt-4v', 'claude-sonnet'],
'local': ['llama3-70b', 'qwen2.5-72b'], # Ollama
}
def route(self, task: dict) -> str:
"""
task = {
'type': 'summarize' | 'code_review' | 'vision' | ...,
'sensitivity': 'low' | 'medium' | 'high',
'complexity': 'simple' | 'moderate' | 'complex',
'has_image': bool,
}
"""
# 规则 1:敏感数据 → 本地模型
if task['sensitivity'] == 'high':
return self.models['local'][0]
# 规则 2:包含图像 → 视觉模型
if task['has_image']:
return self.models['vision'][0]
# 规则 3:复杂推理 → 推理型模型
if task['complexity'] == 'complex':
return self.models['reasoning'][0]
# 规则 4:简单任务 → 快速模型
return self.models['fast'][0]
实际效果:
| 任务 | 传统方案(全用 Opus) | OpenHuman 路由 | 成本节省 |
|---|---|---|---|
| 每日邮件摘要(30 次/月) | $45 | $2.7 | 94% |
| 代码审查(50 次/月) | $75 | $68 | 9% |
| 视觉任务(10 次/月) | $15 | $15 | 0% |
| 合计 | $135/月 | $85.7/月 | 36.5% |
四、118+ 服务集成:OAuth 管理器与安全设计
4.1 连接器架构
OpenHuman 的连接器系统采用 Trait 抽象 + 插件化 设计:
// 连接器 Trait 定义
#[async_trait]
pub trait Connector: Send + Sync {
fn id(&self) -> &str; // "gmail", "notion", etc.
fn name(&self) -> &str; // "Gmail", "Notion", etc.
fn oauth_scopes(&self) -> Vec<&str>;
// 核心方法
async fn oauth_authorize(&self) -> Result<OAuthUrl>;
async fn oauth_callback(&self, code: &str) -> Result<TokenSet>;
async fn fetch_incremental(&self, since: DateTime) -> Result<Vec<RawItem>>;
async fn execute_action(&self, action: Action) -> Result<ActionResult>;
}
// Gmail 连接器实现(简化)
pub struct GmailConnector {
oauth_client: OAuth2Client,
sqlite: SqlitePool,
}
#[async_trait]
impl Connector for GmailConnector {
fn id(&self) -> &str { "gmail" }
async fn fetch_incremental(&self, since: DateTime) -> Result<Vec<RawItem>> {
let access_token = self.get_valid_token().await?;
let response = reqwest::Client::new()
.get("https://gmail.googleapis.com/gmail/v1/users/me/messages")
.header("Authorization", format!("Bearer {}", access_token))
.query(&[
("q", format!("after:{}", since.timestamp())),
("maxResults", "100".to_string()),
])
.send()
.await?
.json::<GmailListResponse>()
.await?;
let mut items = Vec::new();
for msg_meta in response.messages {
let msg = self.get_message_detail(&msg_meta.id).await?;
items.push(RawItem::from_gmail(msg));
}
Ok(items)
}
// ... 其他方法
}
4.2 OAuth 令牌管理
OpenHuman 使用 加密 SQLite 数据库存储 OAuth 令牌:
-- tokens 表结构
CREATE TABLE tokens (
connector_id TEXT PRIMARY KEY,
access_token TEXT NOT NULL, -- 加密存储
refresh_token TEXT, -- 加密存储
expires_at INTEGER NOT NULL, -- Unix 时间戳
scopes TEXT NOT NULL, -- JSON 数组
encrypted_key_id TEXT NOT NULL -- 加密密钥 ID(AES-256-GCM)
);
令牌加密流程:
1. 用户完成 OAuth 授权 → 获得 access_token + refresh_token
2. 生成随机 AES-256-GCM 密钥(每个连接器独立密钥)
3. 用密钥加密令牌 → 存储到 SQLite
4. 密钥本身用设备级的 Secure Enclave(macOS)或 DPAPI(Windows)保护
5. 使用时:解锁 → 解密密钥 → 解密令牌 → 调用 API
即使有人拿到了你的 SQLite 文件,没有你的设备解锁密码,也无法解密令牌。
五、桌面吉祥物(Mascot):当 AI 有了「身体」
OpenHuman 的一个有趣特性是桌面吉祥物——一个常驻桌面的小窗口,包含:
- 语音输入输出:集成 STT(Speech-to-Text)和 TTS(Text-to-Speech,支持 ElevenLabs)
- 唇形同步:吉祥物的嘴部动画与 TTS 输出同步
- 环境感知:根据时间、你的日历、当前活动改变表情和提示
- Google Meet 会议代理:可以直接以「参与者」身份加入 Google Meet,帮你记录会议内容
这个设计模糊了「AI 助手」和「数字伴侣」的界限,让 AI 交互更加自然。
与同类产品对比
| 特性 | Claude Code | OpenClaw | Hermes | OpenHuman |
|---|---|---|---|---|
| 开源 | ❌ 闭源 | ✅ MIT | ✅ MIT | ✅ GNU AGPLv3 |
| 桌面 UI | ❌ 仅 CLI | ⚠️ 终端为主 | ⚠️ 终端为主 | ✅ 完整桌面应用 |
| 持久化记忆 | ⚠️ 会话级 | ⚠️ 插件依赖 | ✅ 自学习 | ✅ Memory Tree + Obsidian |
| 第三方集成 | ❌ 少 | ⚠️ 需自建 | ⚠️ 需自建 | ✅ 118+ OAuth |
| 自动抓取 | ❌ 无 | ❌ 无 | ❌ 无 | ✅ 20 分钟循环 |
| Token 优化 | ❌ 无 | ❌ 无 | ❌ 无 | ✅ TokenJuice(80% 压缩) |
| 模型路由 | ❌ 单模型 | ⚠️ 手动 | ⚠️ 手动 | ✅ 自动 |
| 本地模型 | ❌ 无 | ✅ 支持 | ✅ 支持 | ✅ Ollama 集成 |
| 语音 | ❌ 无 | ❌ 无 | ❌ 无 | ✅ STT + TTS + 唇形同步 |
| 隐私 | ⚠️ 云端 | ✅ 本地优先 | ✅ 本地优先 | ✅ 本地优先 + 加密 |
实战:从零开始使用 OpenHuman
安装
# macOS / Linux
curl -fsSL https://raw.githubusercontent.com/tinyhumansai/openhuman/main/scripts/install.sh | bash
# Windows
irm https://raw.githubusercontent.com/tinyhumansai/openhuman/main/scripts/install.ps1 | iex
# 或者从 https://tinyhumans.ai/openhuman 下载 DMG / EXE
首次配置(~3 分钟)
- 启动 OpenHuman → 出现桌面吉祥物
- 连接服务 → 点击吉祥物 → Settings → Integrations
- 一键 OAuth 连接 Gmail、Notion、GitHub...
- 授权后,Auto-Fetch 立即开始第一次全量同步(~2 分钟)
- 等待 Memory Tree 构建 → 状态栏显示进度
- 开始对话 → 吉祥物已经「认识」你了
示例:让 OpenHuman 帮你总结今天的工作
你: 帮我总结一下今天的工作内容,包括邮件、GitHub 提交和 Slack 消息
OpenHuman:
[读取 Memory Tree Level 0 → 找到今天的日期 → 展开 work/ 主题 → 读取相关块]
根据今天的数据,你的工作内容如下:
## 邮件(收到 12 封,发送 5 封)
- 与产品经理讨论支付系统 API 设计(确认了 v2.1 规范的 3 个改动点)
- 回复客户关于退款接口的疑问(已提供代码示例)
## GitHub(5 个提交,2 个 PR)
- PR #342 已合并:重构错误处理模块,引入自定义 AppError 类型
- PR #345 待审查:添加支付回调的 idempotency 支持
## Slack(发送 23 条消息)
- #engineering 频道:讨论了 PostgreSQL 迁移的时间表
- 与 @张三 确认了下周一的代码审查会议
需要我帮你生成今天的工作日志吗?
注意到:OpenHuman 不需要你手动提供任何上下文,它已经从 Memory Tree 中自动获取了今天的所有相关数据的摘要。
性能实测
场景一:首次全量同步(1000 封邮件 + 50 个 GitHub Issue)
| 指标 | OpenHuman | 手动整理 |
|---|---|---|
| 时间 | 2 分钟(后台自动) | 4 小时 |
| 覆盖度 | 100% | ~60%(你不可能全部读完) |
| 更新频率 | 每 20 分钟 | 手动触发 |
场景二:对话上下文窗口占用
| 问题类型 | 传统方案(全部原始数据) | OpenHuman(Memory Tree) | Token 节省 |
|---|---|---|---|
| 「总结今天邮件」 | 40,000 tokens | 3,500 tokens | 91.25% |
| 「我的项目进度如何」 | 80,000 tokens | 5,200 tokens | 93.5% |
| 「帮我写周报」 | 120,000 tokens | 8,000 tokens | 93.3% |
深入:OpenHuman vs Andrej Karpathy 的 LLM Wiki
Andrej Karpathy 在推文中描述的「LLM Wiki」是一个概念,而 OpenHuman 是这个概念的第一个完整实现。
| 对比维度 | Karpathy 的推文描述 | OpenHuman 实现 |
|---|---|---|
| 数据来源 | 手动整理 | 自动抓取(118+ 服务) |
| 存储格式 | Markdown 文件 | Markdown + SQLite + 层级索引 |
| 更新频率 | 手动 | 每 20 分钟自动 |
| AI 访问方式 | 手动复制粘贴到上下文 | 自动路由(Level 0 → 1 → 2) |
| 人类可读性 | Obsidian 可读 | Obsidian 可读 + 可编辑 |
| 开源 | - | ✅ GNU AGPLv3 |
安全与隐私考量
数据存储
- 本地优先:所有数据存储在你的设备,
~/.openhuman/目录 - 加密:SQLite 数据库使用 SQLCipher(AES-256), OAuth 令牌使用 Secure Enclave/DPAPI 保护
- 零知识:Tiny Humans AI 团队无法访问你的数据(除非你主动上传日志协助调试)
第三方模型 API
- 当你使用云端模型(DeepSeek、OpenAI、Anthropic)时,只有当前对话的相关摘要被发送到 API
- 你可以通过「本地模型」模式(Ollama)完全避免数据离开设备
潜在风险提示
- 早期 Beta:项目处于 active development,可能存在 Bug
- OAuth 权限:授予 OpenHuman 访问 Gmail/Notion 等服务的权限时,请仔细审查授权的 scope
- 开源协议:GNU AGPLv3 意味着如果你部署修改后的版本供他人使用,你必须开源你的修改
社区与生态
- GitHub:github.com/tinyhumansai/openhuman(3.4k+ Stars)
- 文档:tinyhumans.gitbook.io/openhuman
- Discord:discord.tinyhumans.ai
- Reddit:r/tinyhumansai
- Twitter/X:@tinyhumansai
总结与展望
OpenHuman 解决了一个长期被忽视的问题:AI 助手应该「认识」你,而不是每次都从头开始。
通过 Memory Tree、TokenJuice、Model Routing 和 118+ 服务集成的组合,OpenHuman 实现了一个真正实用的、私密的、成本可控的个人 AI 系统。
适合谁用?
- 重度知识工作者:每天处理大量邮件、文档、代码,需要 AI 帮忙总结和关联信息
- 隐私敏感用户:不希望把个人数据上传到闭源商业 AI 服务
- 开源爱好者:希望自己掌控 AI 助手的行为,甚至参与开发
不适合谁?
- 轻度用户:只是偶尔问 AI 几个问题,不需要持久化记忆
- 企业合规严格:GNU AGPLv3 协议可能不适合某些企业的法律要求
未来路线图
根据 GitHub Issues 和文档,OpenHuman 团队计划在接下来的版本中:
- Multi-Agent 支持:让多个专门的 Agent(代码 Agent、邮件 Agent、会议 Agent)协同工作
- 跨设备同步:端到端加密的 Memory Tree 同步(类似 iCloud 但开源)
- 更多连接器:目标 200+ 服务集成
- 性能优化:Rust 核心的进一步加速(目前 Auto-Fetch 处理 1000 封邮件约需 2 分钟,目标降到 30 秒)
参考资源
- OpenHuman GitHub: github.com/tinyhumansai/openhuman
- 在线文档: tinyhumans.gitbook.io/openhuman
- Karpathy 的 LLM Wiki 推文: x.com/karpathy/status/2039805659525644595
- Tauri 官网: tauri.app
- Obsidian: obsidian.md
本文基于 OpenHuman GitHub 仓库(main 分支,2026-05-18)和官方文档撰写。项目处于早期 Beta 阶段,具体实现可能随时间变化,请以最新源码为准。
作者:程序员茄子 | 转载请注明出处