


















分析日期:2026-06-05
项目地址:https://github.com/lfnovo/open-notebook
官方网站:https://www.open-notebook.ai
Open Notebook 是一个 开源、注重隐私保护的 Google Notebook LM 替代方案。
它将 AI 对话、文档管理、播客生成、智能笔记等功能整合到一个自托管(self-hosted)平台中。用户可以导入 PDF、视频、音频、网页、Office 文档等多模态内容,然后通过 AI 进行问答、摘要、生成播客、生成智能笔记等操作。
核心定位关键词:开源 · 自托管 · 多模型 · 多模态 · 隐私优先
这是一个在 Notebook LM 兴起后快速发展的开源克隆项目,但功能上已超越了原始商业产品,尤其是在多模型支持和自托管能力方面。
| 特性 | Open Notebook | Google Notebook LM |
|---|---|---|
| 部署方式 | 自托管(Docker) | Google 云端 SaaS |
| 数据隐私 | 完全掌控,数据本地存储 | 上传到 Google 服务器 |
| AI 提供商 | 18+(OpenAI、Anthropic、Ollama、Groq 等) | 仅限 Google 模型 |
| 播客功能 | 1-4 个自定义角色 | 固定 2 个角色 |
| 自定义转换 | 支持(Custom Transformations) | 有限 |
| REST API | 完整开放 | 无公开 API |
| 费用 | 仅付 AI 调用费 | 免费 + 订阅制 |
| 开源可扩展 | 完全开源可定制 | 闭源 |
┌─────────────────────────────────────────────────────────────────────┐
│ 核心功能模块架构 │
├─────────────────────────────────────────────────────────────────────┤
│ │
│ 📚 Notebook 工作流 │
│ ├─ 资料源管理(Sources) - PDF/视频/音频/网页/Office 文档 │
│ ├─ 智能笔记(Notes) - AI 辅助笔记 + 手动编辑 │
│ └─ 上下文对话(Chat) - 基于资料源的问答对话 │
│ │
│ 🎙️ Podcast 生成 │
│ ├─ 多角色播客(1-4 speaker) - 自定义角色声音 │
│ ├─ Speaker Profiles - 角色配置档案 │
│ └─ Episode Profiles - 节目格式模板 │
│ │
│ 🔍 智能搜索 │
│ ├─ 全文检索(Full-Text Search) │
│ ├─ 向量检索(Vector Search) │
│ └─ 混合检索(Hybrid Search) │
│ │
│ ⚙️ 内容转换(Transformations) │
│ ├─ 自定义 Prompt 驱动的内容处理 │
│ ├─ 摘要、提取、分类、分析 │
│ └─ 可共享的转换配置 │
│ │
│ 🤖 AI 模型生态 │
│ └─ 18+ 提供商统一接口层(Esperanto 协议) │
│ OpenAI / Anthropic / Google / Groq / Ollama / DeepSeek 等 │
│ │
│ 🔐 安全与权限 │
│ ├─ 加密的 API 密钥存储(AES-256) │
│ └─ 可选的密码登录保护 │
│ │
│ 🌐 REST API / MCP │
│ └─ 完整的 OpenAPI 文档 + Model Context Protocol 集成 │
│ │
└─────────────────────────────────────────────────────────────────────┘
这是项目最具技术深度的设计之一。
项目实现了一个名为 Esperanto 的内部 AI 接入层,将 18+ 不同 AI 提供商的 API 抽象成统一的接口:
| 能力层级 | 接口名称 | 支持的能力 |
|---|---|---|
| 核心对话 | generate_text / generate_text_stream |
文本补全、函数调用、结构化输出 |
| 嵌入向量 | embed / embed_batch |
向量检索 |
| 语音合成 | text_to_speech / text_to_speech_stream |
播客生成 |
| 语音识别 | speech_to_text |
音频转文字 |
| 图像理解 | image_generation |
图像理解 |
技术价值:业务代码只写一次,切换模型零成本。用户可在 UI 中一键切换 GPT-4o / Claude / Llama 等。
选用 SurrealDB v2(而非传统 PostgreSQL + Redis 组合)作为核心数据库,具备以下优势:
vector::cosine / vector::similarity 函数后端 chat_service.py 实现了精心设计的流式对话:
embedding_service.py 中实现了一个健壮的文档向量化流程:
原始文件(PDF/视频/网页)
│
▼
文本提取(PyPDF2、Ffprobe、BeautifulSoup)
│
▼
智能分块(~1500 tokens/块 + 重叠 150 tokens)
│
▼
向量嵌入(Embedding) + 元数据注入
│
▼
SurrealDB 存储(文本 + 向量 + 元数据)
│
▼
查询时:混合检索(BM25 + VSS)→ 重排序 → 注入 Prompt
podcast_service.py(~100KB)是一个相对完整的多角色播客流水线:
credentials_service.py 中:
OPEN_NOTEBOOK_ENCRYPTION_KEY 派生的 AES-256-GCM 存储支持通过 MCP 将 Open Notebook 的资料源、笔记、搜索能力暴露给 AI Agent,实现 Agent-Notebook 交互。
┌─────────────────────────────────────────────────────┐
│ Next.js 前端 (frontend/) │
│ React + TypeScript + Tailwind CSS │
│ 路由:/notebooks / /sources / /chat / /podcasts │
└──────────────────┬──────────────────────────────────┘
│ HTTPS / API calls
┌──────────────────▼──────────────────────────────────┐
│ FastAPI 后端 (api/) │
│ ├─ main.py FastAPI 入口 + 路由注册 │
│ ├─ auth.py 认证/会话/加密 │
│ ├─ models.py 所有 Pydantic 数据模型 │
│ ├─ *service.py 业务服务层 (~15 个服务) │
│ └─ routers/* API 端点层 (~15 个路由) │
└──────────────────┬──────────────────────────────────┘
│ SurrealQL / WebSocket
┌──────────────────▼──────────────────────────────────┐
│ SurrealDB (Docker) │
│ 单文件 RocksDB 存储 · 原生向量支持 │
└─────────────────────────────────────────────────────┘
只有 2 个核心容器:
lfnovo/open_notebook:v1-latest(主应用)surrealdb/surrealdb:v2(数据库)对比需要 5-10 个容器的同类项目,这是极简架构的典范。
服务层按领域划分,每个 *service.py 文件约 500-3000 行,功能内聚,适合二次开发。
docs/ 目录包含 30+ Markdown 文件)| 部署模式 | CPU | 内存 | 磁盘 | GPU | 说明 |
|---|---|---|---|---|---|
| 试用(云模型) | 2 vCPU | 4 GB | 10 GB | 不需要 | 仅使用 OpenAI/Groq 等云端 API |
| 生产(云模型) | 4 vCPU | 8 GB | 50 GB SSD | 不需要 | 推荐配置 |
| 本地 LLM (7B) | 8+ vCPU | 16+ GB | 100 GB SSD | 推荐 NVIDIA 8GB | 运行 Ollama 本地模型 |
| 本地 LLM (70B) | 16+ vCPU | 64+ GB | 200 GB NVMe | NVIDIA 48GB | 高性能推理 |
| 组件 | 最低版本 | 说明 |
|---|---|---|
| Docker | 24.0+ | 推荐 25+ |
| Docker Compose | v2.20+ | 随 Docker 提供 |
| 浏览器 | Chrome/Edge/Firefox/Safari(最新版) | 前端界面 |
| Node.js(开发) | 20+ | 前端 Next.js 构建 |
| Python(开发) | 3.12+ | 后端开发 |
| 操作系统 | Linux / macOS / Windows | 全平台支持 |
| 提供商 | 对话 LLM | 嵌入向量 | TTS | STT | 本地部署 |
|---|---|---|---|---|---|
| OpenAI | ✅ GPT-4o / GPT-4 | ✅ | ✅ | ✅ | ❌ 云端 |
| Anthropic | ✅ Claude 3.5 / 4 | ❌ | ❌ | ❌ | ❌ 云端 |
| Google Gemini | ✅ | ✅ | ✅ | ✅ | ❌ 云端 |
| Ollama | ✅ Llama/Qwen/Mistral | ✅ | ❌ | ❌ | ✅ 本地 |
| Groq | ✅ 超快推理 | ❌ | ❌ | ✅ | ❌ 云端 |
| DeepSeek | ✅ R1(推理模型) | ✅ | ❌ | ❌ | ❌ 云端 |
| LM Studio | ✅ | ✅ | ❌ | ❌ | ✅ 本地 |
| ElevenLabs | ❌ | ❌ | ✅ | ❌ | ❌ 云端 |
| Mistral | ✅ | ✅ | ❌ | ❌ | ❌ 云端 |
| Perplexity | ✅ | ❌ | ❌ | ❌ | ❌ 云端 |
| OpenRouter | ✅ 聚合 100+ 模型 | ❌ | ❌ | ❌ | ❌ 云端 |
| ... 其他 8+ | 视提供商而定 |
# Step 1: 下载 docker-compose.yml
curl -o docker-compose.yml \
https://raw.githubusercontent.com/lfnovo/open-notebook/main/docker-compose.yml
# Step 2: (可选)修改加密密钥
# 编辑 docker-compose.yml 中 OPEN_NOTEBOOK_ENCRYPTION_KEY
# Step 3: 启动
docker compose up -d
# Step 4: 打开浏览器访问
# http://localhost:8502
# 首次访问会看到欢迎页面,进入 Settings → API Keys 配置你的模型提供商
# Step 5: (可选)配置本地 Ollama,完全离线运行
# 拉取 models: ollama pull qwen2.5:7b
# 在 UI 中选择 Ollama 作为提供商
open-notebook/
├── api/ # 🔴 后端(FastAPI)
│ ├── main.py # FastAPI 入口,注册所有路由
│ ├── auth.py # 认证 / 会话 / JWT 相关
│ ├── models.py # Pydantic 数据模型定义
│ ├── client.py # AI 提供商客户端(Esperanto 协议实现)
│ ├── chat_service.py # 对话核心服务
│ ├── notebook_service.py # Notebook 管理
│ ├── sources_service.py # 资料源管理与解析
│ ├── notes_service.py # 笔记服务
│ ├── credentials_service.py # API 密钥加密存储
│ ├── models_service.py # AI 模型注册/发现
│ ├── embedding_service.py # 向量嵌入服务
│ ├── podcast_service.py # 播客生成
│ ├── podcast_api_service.py # 播客 API 适配
│ ├── episode_profiles_service.py # 播客 Episode 配置
│ ├── insights_service.py # 洞察生成
│ ├── context_service.py # 上下文注入
│ ├── command_service.py # 命令模式调用
│ ├── settings_service.py # 全局设置
│ └── routers/ # API 路由层 (~15 个文件)
│ ├── chat.py # /chat 对话端点
│ ├── source_chat.py # /source-chat 单资料源对话
│ ├── notebooks.py # /notebooks CRUD
│ ├── sources.py # /sources CRUD + 上传
│ ├── notes.py # /notes CRUD
│ ├── search.py # /search 全文 + 向量检索
│ ├── models.py # /models 模型管理
│ ├── credentials.py # /credentials 密钥管理
│ ├── embedding.py # /embeddings 手动向量化
│ ├── embedding_rebuild.py # /embeddings/rebuild 重建索引
│ ├── podcasts.py # /podcasts
│ ├── episode_profiles.py # /episode-profiles
│ ├── speaker_profiles.py # /speaker-profiles
│ ├── transformations.py # /transformations 自定义 Prompt
│ ├── languages.py # /languages
│ ├── config.py # /config 公共配置
│ ├── settings.py # /settings
│ └── auth.py # /auth 登录
│
├── frontend/ # 🟢 前端(Next.js + React + TypeScript)
│ ├── src/
│ │ ├── app/(dashboard)/ # 仪表盘页面
│ │ │ ├── notebooks/ # 笔记本列表/详情/对话
│ │ │ ├── sources/ # 资料源管理
│ │ │ ├── search/ # 搜索页
│ │ │ ├── podcasts/ # 播客生成器
│ │ │ ├── transformations/ # 内容转换
│ │ │ ├── settings/ # 设置与 API Keys
│ │ │ └── advanced/ # 高级:重建向量、系统信息
│ │ └── lib/ # 共享组件/工具
│ ├── package.json
│ ├── next.config.ts
│ └── tsconfig.json
│
├── docs/ # 🔵 文档体系(40+ Markdown)
│ ├── 0-START-HERE/ # 快速上手
│ ├── 1-INSTALLATION/ # 安装指南
│ ├── 2-CORE-CONCEPTS/ # 核心概念(AI Context/Notebook/Podcast)
│ ├── 3-USER-GUIDE/ # 用户使用手册
│ ├── 4-AI-PROVIDERS/ # 各 AI 提供商配置
│ ├── 5-CONFIGURATION/ # 安全、环境变量、MCP
│ ├── 6-TROUBLESHOOTING/ # 故障排查
│ └── 7-DEVELOPMENT/ # 架构/代码标准/贡献指南
│
├── examples/ # 示例 docker-compose 配置
│ ├── docker-compose-ollama.yml # 本地 Ollama 模式
│ ├── docker-compose-full-local.yml # 全本地模式
│ └── docker-compose-dev.yml # 开发模式
│
├── commands/ # CLI 命令集合
│ ├── embedding_commands.py # 向量重建 CLI
│ ├── podcast_commands.py # 播客生成 CLI
│ └── source_commands.py # 资料源操作 CLI
│
├── tests/ # 测试(前端 + 后端)
│
├── Makefile # 构建/开发脚本
├── docker-compose.yml # 标准部署
├── Dockerfile # 单阶段多服务 Docker 镜像
├── Dockerfile.single # 精简单容器版本
├── .env.example # 环境变量示例
├── LICENSE # MIT License
└── README.md # 项目主文档
api/main.py - FastAPI 应用入口routers/ 下 ~15 个模块逐个注册到 FastAPI 实例api/models.py - 数据模型层NotebookCreate / SourceCreate / ChatRequest / PodcastGenerationRequestapi/client.py - AI 统一客户端(Esperanto 协议核心)这是项目的 技术灵魂。它通过适配器模式(Adapter Pattern)将 18+ 家提供商的异构 API 统一成内部语言:
# 伪代码展示核心设计模式
class AIClient:
providers: dict[str, ProviderAdapter]
def generate_text(self, provider, model, prompt, **kwargs):
adapter = self.providers[provider]
return adapter.generate_text(model, prompt, **kwargs)
class OpenAIAdapter(ProviderAdapter):
def generate_text(self, model, prompt, **kwargs):
# 转换为 OpenAI 消息格式
# 调用 openai.ChatCompletion.create
# 统一返回格式
class OllamaAdapter(ProviderAdapter):
def generate_text(self, model, prompt, **kwargs):
# 调用本地 Ollama HTTP API
# 返回格式与 OpenAI 完全一致
为什么这很重要?
api/sources_service.py - 资料源与文档处理核心流程:上传 → 类型检测 → 提取文本 → 分块 → 向量化 → 存储
api/chat_service.py - 对话引擎核心能力:
[1] [2] 引用标记api/credentials_service.py - 密钥安全OPEN_NOTEBOOK_ENCRYPTION_KEYfrontend/src/app/(dashboard)/notebooks/ - 核心 UI| 场景 | 用户画像 | 使用方式 |
|---|---|---|
| 📚 学术研究助手 | 研究员、学生、教授 | 批量导入论文 PDF,通过 AI 对话快速理解核心要点,生成文献综述 |
| 💼 企业知识库 | IT/HR/法务团队 | 导入公司文档(规范、报告、合同),构建私有 AI 问答系统 |
| 🎙️ 内容创作者 | 播客主、YouTuber | 将研究资料自动生成为多角色播客脚本与音频 |
| 📊 市场/情报分析 | 分析师、咨询顾问 | 上传行业报告,多文档交叉问答,生成洞察笔记 |
| 🎓 学习辅助 | 学生、自学者 | 导入教材/课程资料,生成笔记 + 问答 + 学习路线 |
| 📖 记者/作家 | 调查记者、作家 | 整理大量资料源,AI 辅助梳理故事线,生成章节 |
| 🏢 客服知识库 | 企业支持团队 | 导入产品文档/FAQ,客服快速检索或自动生成回复 |
| 🔒 隐私敏感场景 | 政府、金融、医疗 | 本地 Ollama 运行,数据零上云,完全符合合规 |
┌──────────────────────────────────────────────────────────┐
│ 部署模式对比 │
├──────────┬──────────┬──────────┬──────────┬──────────────┤
│ 模式 | 云API | 本地 LLM | 本地数据 | 推荐人群 │
├──────────┼──────────┼──────────┼──────────┼──────────────┤
│ 模式 A | ✅ 是 | ❌ 否 | ✅ 是 | 普通用户 │
│ (云端) | | | | │
│ 模式 B | ✅ 是 | ✅ 是 | ✅ 是 | 高级用户 │
│ (混合) | | | | │
│ 模式 C | ❌ 否 | ✅ 是 | ✅ 是 | 极客/企业 │
│ (完全本地)│ | | | │
└──────────┴──────────┴──────────┴──────────┴──────────────┘
✅ S1. 部署极度简洁
仅 2 个 Docker 容器 + 一个环境变量加密密钥,对比同类开源项目(RAGFlow/Dify/FastGPT 等)需要 5-10 个容器,运维成本低。
✅ S2. 功能超越商业竞品 Notebook LM
播客多角色、Transformations、MCP 集成、完整 API 等功能均是 Google 版不具备或不完善的。
✅ S3. 多模型生态完整
18+ 提供商的抽象层是项目核心竞争力,这意味着任何新模型发布,用户都能即时使用。
✅ S4. 代码组织结构清晰
Service 层与 Router 层完全分离,符合后端最佳实践,二次开发的学习成本低。
✅ S5. 文档成熟度高
docs/ 目录 40+ Markdown 文件覆盖了从 0 基础到架构设计的全栈文档,项目健康度高。
✅ S6. 前端现代且美观
Next.js App Router + Tailwind + Radix UI 是当前最主流的现代前端组合,交互流畅。
现状:项目重度依赖 SurrealDB v2 的特性,但其社区规模和稳定性还远不如 PostgreSQL。
潜在问题:
建议:将数据库访问抽象成 Repository 模式(目前部分实现),以便未来支持 PostgreSQL/pgvector 作为替代后端。
现状:当前是单用户设计,所有数据存放在同一个数据库命名空间中。
潜在问题:
建议:增加用户/团队/角色抽象,这是 1.0 版本前必须解决的能力。
现状:向量索引、播客生成等耗时操作都是同步 HTTP 请求处理。
潜在问题:
建议:引入 Celery / Arq / RQ 等任务队列,或使用 FastAPI BackgroundTasks + 持久化队列。
现状:基本的分块 + 向量相似度查询,未采用高级 RAG 技术。
潜在问题:
建议:
search_service.py 中加入 Rerank 步骤现状:Next.js 前端调用 FastAPI 的 /api/* 端点,两者分别监听 :8502 和 :5055 两个端口。
可改进:可以考虑 Next.js API routes 转发,减少 CORS 配置;或将前端静态文件嵌入后端容器部署。
现状:有 tests 目录但覆盖率未公开发布,核心业务(尤其是 podcast、chat)的端到端测试较少。
建议:公开覆盖率数据,补充端到端测试和 LLM 响应的断言测试(使用确定性模型或 mock)。
根据 CHANGELOG.md、GitHub Issues 和社区讨论,预计近期重点方向:
| 时间线 | 功能 | 说明 |
|---|---|---|
| 已发布 | Next.js 前端重构 | 从原有模板重写为现代 Next.js App Router |
| 已发布 | 推理模型支持 | DeepSeek-R1、Qwen3 等思维链模型 |
| 进行中 | 多用户/多租户 | 引入账户系统和权限模型 |
| 进行中 | 跨 Notebook 引用 | 资料源在多个 Notebook 间复用 |
| 规划中 | 书签集成 | 与浏览器书签/ReadItLater 工具集成 |
| 规划中 | 异步处理管道 | 解决大文件上传和播客生成的同步阻塞问题 |
| 愿景 | 实时协作 | 多人协作编辑笔记本与实时共享对话 |
| 维度 | 评分 | 说明 |
|---|---|---|
| 功能完整性 | ⭐⭐⭐⭐⭐ | 功能超越 Notebook LM |
| 代码质量 | ⭐⭐⭐⭐ | 结构清晰,模块化良好 |
| 文档质量 | ⭐⭐⭐⭐⭐ | 文档体系非常完整 |
| 部署便捷性 | ⭐⭐⭐⭐⭐ | 2 容器即可启动 |
| 生态成熟度 | ⭐⭐⭐ | SurrealDB 是唯一短板 |
| 社区活跃度 | ⭐⭐⭐⭐ | GitHub 星增长快速,Discord 活跃 |
| 隐私/安全 | ⭐⭐⭐⭐ | 自托管 + 加密密钥存储 |
| 可扩展性 | ⭐⭐⭐⭐ | 模块化的 Service 架构易扩展 |
| 综合推荐度 | ⭐⭐⭐⭐ | 强烈推荐用于研究/学习/企业自托管 |
| 项目 | 定位 | Open Notebook 差异化 |
|---|---|---|
| Google Notebook LM | 闭源 SaaS · 研究助手 | 开源 · 可自托管 · 更多模型选择 · API |
| Dify | 通用 Agent 平台 | 更专注研究资料管理 · 极简部署 · 播客 |
| AnythingLLM | 本地 RAG 聊天 | 更多来源类型 · 笔记/Podcast 等高级功能 |
| RAGFlow | 企业级 RAG | 部署复杂度更低 · 文档驱动研究体验 |
| Open WebUI | LLM 聊天前端 | 比聊天多了 Notebooks/Sources/Notes 结构 |
结论:Open Notebook 在"研究资料管理 + AI 对话"这个垂直场景做到了开源世界的第一梯队。如果你每天的工作是阅读大量 PDF/论文/报告并希望通过 AI 加速理解和生成内容,这是当前最值得自托管的工具之一。
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。