编程 用 Go 单二进制搭一个 NotebookLM 替代品:Notex 的部署、模型模式与 RAG 参数

2026-09-28 00:03:46

用 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 的精细度——比如引用是否细到具体段落、跨来源冲突时如何取舍——原始材料没有展开,需要自己在同一批文档上跑一遍才能判断。

推荐文章

程序员茄子在线接单