多模态来源入库
支持 PDF / Markdown / DOCX / HTML 网页、YouTube 字幕、本地音频转录、贴文本等多种来源;Web 抓取使用 Firecrawl/Jina,文档解析使用 Docling。所有资料以 Source 实体落在 SurrealDB。
lfnovo · 隐私优先的开源 NotebookLM 替代·二脑工作台
核心思路:Open Notebook 不是「文件夹 + 全文搜索」式的旧时代笔记软件,而是一台知识编译机——把搜索来的多模态资料,通过 AI 技能(解析 / 嵌入 / 总结 / 播客)持续编译进结构化的 SurrealDB 知识库;当你回头检索时,模型给出的不是切片召回,而是编译后的上下文 + 引用溯源。每一次问答、每一段播客,都让你的私有知识库更厚——这就是 AI 时代知识管理的核心范式。
Open Notebook 是一个开源、隐私优先的 NotebookLM 替代品,定位为个人与团队的 “二脑工作台”:将论文、组织文档、会议记录、网页、音频与视频等多模态资料集中管理,以 Notebook → Sources → Notes 三层结构进行语义检索、AI 辅助问答、学术写作与播客生成。
项目作者 lfnovo 采用 MIT License 开源,推荐部署方式为 docker compose up -d,一键启动 Streamlit UI (8502) + FastAPI Service (5055) + SurrealDB v2 (8000) 三件套;首次启动仅需一个加密密钥 OPEN_NOTEBOOK_ENCRYPTION_KEY,所有模型提供商(18+,含 DashScope/Qwen、OpenAI、Anthropic、Google、Ollama、vLLM 等)都在 UI 里动态配置,数据全部落在本地 SurrealDB 中。是今年「AI 原生个人知识库」赛道里最接近生产可用、且完全开源的代表工具之一。
支持 PDF / Markdown / DOCX / HTML 网页、YouTube 字幕、本地音频转录、贴文本等多种来源;Web 抓取使用 Firecrawl/Jina,文档解析使用 Docling。所有资料以 Source 实体落在 SurrealDB。
同时支持 OpenAI、Anthropic、Google Gemini、DashScope (Qwen)、Ollama、vLLM、Groq、DeepSeek、火山方舟、Mistral、Cohere 等;在 UI Settings 中点击切换,不需重启。
内置向量检索,问答时自动返回 原文引用 + 页码定位,遵循 Karpathy 在 LLM Wiki Gist 中提出的 “索引 ≠ 检索,检索 ≠ 推理” 原则。
复现 NotebookLM 最火的能力:选中一组 Sources 后,以你选择的语言生成双主持对话脚本 + 语音音频;语音后端可接 ElevenLabs / Coqui TTS / Edge-TTS。
所有 Notebook、Sources、Notes、嵌入向量与 API Key 均加密后落在本地 SurrealDB(./surreal_data);启用 Ollama 后可脱网运行,数据不出机器,适合企业内部与高隐私需求场景。
5055 端口提供一套 FastAPI REST,可被外部 Agent / Workflow / IDE 插件调用;可作为个人知识库的 后端服务,与 Obsidian / Logseq / VSCode / Claude Code 联动。
成功判定:通过公网域名访问 https://your-domain 返回 200(Streamlit UI 可访问)且 https://your-domain/health 返回 ok(域名通过 SLB / Nginx 反向代理绑定到容器 8502 端口)。
open-notebook-agent-install.md — 含 9 章完整流程:前置检查 / 人类输入 / docker-compose.yml 模板 / docker.env 模板 / 启动 / 分级验收 / 10 项故障排查 / 停止 / 接入 DashScope 国内镜像友好 docker --version # required docker compose version # required (v2 syntax) lsof -i :8502 || echo free # 8502 不能被占 lsof -i :5055 || echo free # 5055 不能被占 lsof -i :8000 || echo free # 8000 不能被占 openssl rand -hex 32。一旦设定不得修改(会锁住数据库里已保存的 API Key) .env services: surrealdb: image: surrealdb/surrealdb:v2 ports: ["8000:8000"] volumes: ["./surreal_data:/mydata"] user: root command: start --user $${SURREAL_USER} --pass $${SURREAL_PASS} rocksdb:/mydata/database.db open_notebook: image: lfnovo/open_notebook:v1-latest ports: - "8502:8502" # Streamlit UI - "5055:5055" # FastAPI service env_file: ["docker.env"] depends_on: ["surrealdb"] volumes: ["./notebook_data:/app/data"] # open-notebook/docker.env OPEN_NOTEBOOK_ENCRYPTION_KEY=${OPEN_NOTEBOOK_ENCRYPTION_KEY} OPEN_NOTEBOOK_PASSWORD=${OPEN_NOTEBOOK_PASSWORD:-} SURREAL_USER=root SURREAL_PASS=root SURREAL_NAMESPACE=open_notebook SURREAL_DATABASE=staging # 1. 创建工作目录 mkdir -p open-notebook && cd open-notebook mkdir -p surreal_data notebook_data # 2. 生成加密密钥(首次部署才需) openssl rand -hex 32 # 复制输出,作为 OPEN_NOTEBOOK_ENCRYPTION_KEY # 3. 写入 docker-compose.yml 与 docker.env(见上方模板) # 4. 拉起服务 docker compose --env-file docker.env up -d # 5. 查看状态 docker compose ps docker compose logs -f open_notebook # Ctrl+C 退出 # 6. 配置反向代理(阿里云 SLB / Nginx) # 将公网 443 / HTTPS 流量转发到容器 8502;同步绑域名 + 申请免费 SSL 证书 # 示例 Nginx:proxy_pass http://127.0.0.1:8502; # 7. 通过公网域名访问 UI open https://your-domain # 先在 DNS / SLB 绑定好域名 + HTTPS 证书 # === 容器内部自检(在服务器上跑) === sleep 15 && docker compose ps curl -fsS http://127.0.0.1:8502 >/dev/null && echo "✅ 容器 UI OK" curl -fsS http://127.0.0.1:5055/health && echo "✅ 容器 API OK" # === 公网验证(必须通过 SLB / Nginx 反代后才能跑通) === curl -fsS https://your-domain >/dev/null && echo "✅ 公网 UI OK" curl -fsS https://your-domain/health && echo "✅ 公网 /health OK" /etc/docker/daemon.json 配置阿里云容器镜像加速:{"registry-mirrors": ["https://<your-id>.mirror.aliyuncs.com"]},然后 systemctl restart dockerdocker-compose.yml 修改左侧映射(例如 "8503:8502"),并同步更新 SLB / Nginx upstream 端口;公网入口仍走 https://your-domain./surreal_data 目录可写权限;若以前跑过 surreal v1,需 rm -rf surreal_data 后重启docker compose down → rm -rf surreal_data → 重新生成密钥后重起(已保存的 API Key 会丢失)https://dashscope.aliyuncs.com/compatible-mode/v1;model:qwen-max 或 qwen3-72bhttp://host.docker.internal:11434,model 选 qwen2.5 / llama3.1 等本地已拉取的型号