用 Go 单二进制搭一个 NotebookLM 替代品:Notex 的部署、模型模式与 RAG 参数
项目信息
- 项目地址:https://github.com/smallnest/notex
- Python 版本克隆:pynotex(https://github.com/Beeta/pynotex)
- 底层编排库:LangGraphGo(https://github.com/smallnest/langgraphgo)
- License:Apache License 2.0
- Issue:https://github.com/smallnest/notex/issues ,讨论区:https://github.com/smallnest/notex/discussions
Notex 是一个隐私优先的开源 NotebookLM 替代品:从文档创建 notebook,基于来源做问答与内容转换。存储默认落在本地 SQLite,云端后端可选。
功能清单
- 多来源类型:PDF、纯文本、Markdown、DOCX、HTML、音频文件(MP3、WAV、M4A 等),以及视频 URL(YouTube、Bilibili,自动抽取字幕)
- 基于来源的 AI 问答,回答会带出处引用
- 多种转换:Summary、FAQ、Study Guide、Outline、Timeline、Glossary、Quiz、Mindmap(Mermaid.js)、Infographic、Podcast,另支持自定义 prompt
- Infographic:调用 Google 的 Gemini Nano Banana 生成手绘风格信息图
- Podcast:从内容生成播客脚本
- 多模型:OpenAI、Ollama 及其他兼容 API
- 界面为 Academic Brutalist 风格
前置依赖
- Go 1.23 或更高版本
- 一个 LLM API key(OpenAI),或本地运行的 Ollama
- markitdown(可选,用于更好的文档转换)
- yt-dlp(可选,用于提取 YouTube / Bilibili 字幕)
- vosk-transcriber(可选,用于音频转文字)
安装与启动
git clone https://github.com/smallnest/notex.git
cd notex
go mod tidy
go run . -server
然后打开 http://localhost:8080 。
构建正式二进制:
go build -o notex .
./notex -server
配置:OpenAI 还是 Ollama
把 .env.example 复制为 .env,只配置一个 LLM provider。
Option A:OpenAI
OPENAI_API_KEY=sk-...
OPENAI_BASE_URL=https://api.openai.com/v1
OPENAI_MODEL=gpt-4o-mini
EMBEDDING_MODEL=text-embedding-3-small
可选模型:gpt-4o-mini(快、便宜,推荐)、gpt-4o、gpt-3.5-turbo。兼容 OpenAI 协议的服务(Azure、DeepSeek)改 OPENAI_BASE_URL 即可,比如 DeepSeek 用 OPENAI_BASE_URL=https://api.deepseek.com/v1 加 OPENAI_MODEL=deepseek-chat。
Option B:Ollama(本地、免费)
OLLAMA_BASE_URL=http://localhost:11434
OLLAMA_MODEL=llama3.2
llama3.2 推荐;qwen2.5 对中文内容表现很好;mistral 英文不错;codellama 面向代码。模型完全跑在本机,数据不出本地,代价是更大的模型要更多内存和 CPU。
如果用信息图功能,另外配 Google Gemini:
GOOGLE_API_KEY=...
key 从 https://makersuite.google.com/app/apikey 申请。
向量库与 RAG 参数
SERVER_HOST=0.0.0.0
SERVER_PORT=8080
VECTOR_STORE_TYPE=sqlite # Options: sqlite, memory, supabase, postgres, redis
MAX_SOURCES=5 # Maximum sources to retrieve for context
CHUNK_SIZE=1000
CHUNK_OVERLAP=200
ENABLE_MARKITDOWN=true
ENABLE_VOSK_TRANSCRIBER=false
VOSK_MODEL_PATH=/usr/local/share/vosk-model-en
ENABLE_PODCAST=true
PODCAST_VOICE=alloy # Options: alloy, echo, fable, onyx, nova, shimmer
ALLOW_DELETE=true
ALLOW_MULTIPLE_NOTES_OF_SAME_TYPE=true
VECTOR_STORE_TYPE 默认 sqlite,意味着不额外起服务、单二进制就能跑通检索;memory 适合一次性验证,supabase / postgres / redis 留给要外部托管或已有基础设施的场景——代价是多一套要维护的连接与凭据。
MAX_SOURCES=5 决定每次喂给模型的上下文里放几个来源,CHUNK_SIZE=1000 与 CHUNK_OVERLAP=200 决定切片粒度和重叠量。调大 MAX_SOURCES 或 CHUNK_SIZE 会直接抬高 token 消耗;重叠过小容易把跨段落的语义切断,过大则重复内容挤占上下文。
音频与字幕的外部命令边界
音频(MP3、WAV、M4A、AAC、FLAC、OGG、WMA、OPUS)的自动转写走 ENABLE_VOSK_TRANSCRIBER 加 VOSK_MODEL_PATH;文档转换走 ENABLE_MARKITDOWN;YouTube / Bilibili 字幕抽取走 yt-dlp。这三条路径都依赖外部命令或本地模型目录,任一缺失时对应来源类型会不可用,所以它们在默认配置里都是可关的。启动前先确认 markitdown、yt-dlp、vosk-transcriber 在 PATH 里,以及 VOSK_MODEL_PATH 指向实际存在的模型目录。
使用流程
新建 Notebook,然后添加来源:上传文件、粘贴文本、或从 URL 导入(网页、YouTube / Bilibili 视频字幕)。和来源对话时返回引用。转换卡片覆盖 Summary、FAQ、Study Guide、Outline、Podcast、Timeline、Glossary、Quiz、Infographic、Mindmap(Mermaid.js),以及自定义 prompt。
开发
go test -v ./...
go build -o notex .
go fmt ./...
golangci-lint run
go vet ./...
与 Open Notebook 的差异
Notex 的做法更偏向“Go 单二进制 + SQLite”,部署形态简单;lfnovo/open-notebook 那条路子在多模态与播客成品上走得更远。至于 citation 的精细度——比如引用是否细到具体段落、跨来源冲突时如何取舍——原始材料没有展开,需要自己在同一批文档上跑一遍才能判断。