把整个个人知识库灌进长上下文 LLM,作为"形状记忆"——不存事件,只存形状。回忆是重构,不是检索。
传统记忆系统 = 向量检索 + RAG。wake 不是检索,是注入:把你整个 markdown 知识库(几百 KB - 几 MB)一次性塞进 DeepSeek 1M context 的 system prompt,触发 prompt cache,每次提问让模型按"被 KB 塑型过的 substrate"输出联想——不是回答问题,是给出"这个问题在你的 KB 上激活了什么"。
为什么这样做能工作:
- DeepSeek 的 1M context + prompt cache 让"全量注入"在经济和延迟上都可行(单次召回 ¥0.001 量级)
- 注意力本身就是有损压缩 —— 把整个 KB 都给模型,模型自己决定哪部分浮起来,这比 top-k 余弦检索更接近"人脑想起一件事"
- substrate 被塑型 —— 同一个 query 在不同 KB 下激活完全不同的"记忆"。KB 是 substrate,不是数据库
详见 wake 作者的知识库快照:kb-snapshot.txt (这就是 demo;同时也是这套方法论的 dogfood)。
你的 markdown 知识库 (Obsidian / 任何 .md 目录)
↓ build_snapshot.sh
kb-snapshot.txt (单个文件,约几百 KB)
↓ 注入 system prompt
DeepSeek 1M context (prompt cache 命中)
↓ query → recall(query) 返回联想式片段
↓
推荐默认路径:
1. UserPromptSubmit hook ── 用户提交 prompt 时注入一次 (默认推荐)
2. MCP 工具 ── 模型按需主动调用 (最克制)
3. lens 代理 ── 可选 Anthropic API 代理 / 实验性请求改写层
git clone https://github.com/Fzhiyu1/wake.git
cd wake
python3 -m venv .venv
.venv/bin/pip install openai # daemon / mcp / hook 必须
.venv/bin/pip install fastapi uvicorn httpx # 可选: 如果要用集成 C (lens 代理)
cp .env.example .env
# 填入 DEEPSEEK_API_KEY,从 https://platform.deepseek.com/ 拿试一次召回:
.venv/bin/python3 daemon.py "怎么判断 AI 在幻觉"应该看到几行带 [[wikilink]] 的"联想式"输出,而不是百科全书答案。如果输出像答题,检查是否在用 demo 的 kb-snapshot.txt(下方"换成你自己的 KB"一节)。
推荐默认路径: UserPromptSubmit hook
默认推荐把 wake 作为 Claude Code 的 UserPromptSubmit hook 使用。hook 只在用户提交 prompt 时触发一次,不会在工具调用续跑时重新召回,也不会改写 Anthropic /messages 请求体。
~/.claude/settings.json 里加:
{
"hooks": {
"UserPromptSubmit": [{
"hooks": [{"type": "command", "command": "/path/to/wake/hook.sh"}]
}]
}
}每次发消息时把 wake 召回结果以 [记忆] ... 形式 stdout 注入。Claude Code 把它当 hook 输出。
不要同时启用 lens wake_memory 插件和 UserPromptSubmit hook
两者同时启用会造成双重注入。wake_memory 插件还会在每个 /messages 请求触发,包括工具调用后的续跑请求,可能覆盖上一轮注入的记忆块并影响 prompt cache。
~/.claude.json 里加:
{
"mcpServers": {
"wake": {
"command": "/path/to/wake/.venv/bin/python3",
"args": ["/path/to/wake/mcp_server.py"],
"type": "stdio"
}
}
}模型会在判断"用户提到他过去想过的东西"时主动调 memory_recall。代价:模型可能不调,但调用很精准。
lens 是可选的 Anthropic API 代理
lens/ 可以作为透明 Anthropic API 代理或实验性请求改写层使用。常规 wake 使用不需要 lens。默认不加载任何插件;只有显式设置 LENS_PLUGINS=wake_memory 才会启用请求改写注入。
.venv/bin/pip install fastapi uvicorn httpx # 一次性
LENS_PLUGINS= .venv/bin/python3 lens/proxy.py客户端切到代理:
unset HTTP_PROXY HTTPS_PROXY
export ANTHROPIC_BASE_URL=http://localhost:8765
export NO_PROXY=localhost,127.0.0.1
claude # 或 cursor / 任何用 Anthropic API 的客户端如果你在中国大陆访问 api.anthropic.com 需要走代理:
LENS_UPSTREAM_PROXY=http://your-proxy:port LENS_PLUGINS= .venv/bin/python3 lens/proxy.py只有在明确要实验 lens 请求改写注入时才启用 wake_memory 插件。启用后,lens 会拦截每个 /messages 请求 → 调 wake 召回 → 把 [当前相关记忆] 块塞进 system → 转发给 Anthropic。
lens/plugins/examples/ 里有两个 hello-world 插件(echo、system_prefix),可以参考着写自己的。
仓库里的 kb-snapshot.txt 是个空模板(26 行说明文字),只是占住位置——直接跑 daemon 会按 system-prompt.md 的"无相关记忆"规则全部返回 ——。要看到真正的"联想",必须替换成你自己的知识库。
⚠ 重要前提
system-prompt.md跟kb-snapshot.txt一样,也是作者的私人配置——它假设 KB 是 Obsidian 风格、用[[wikilink]]命名概念。装 wake 时必须重写
system-prompt.md来匹配你自己 KB 的风格。不重写的话,daemon 会按作者 KB 的格式输出[[xxx]],但你的 KB 里根本没这种东西——完全错位。wake 的核心(
daemon.py+lens这套机制)跟你的 KB 长什么样无关。system-prompt.md只是"针对某一份 KB 的输出风格塑造模板",换 KB 就要换 prompt。
替换成你自己的:
# 1. 改 build_snapshot.sh 里的 KB 路径
vi build_snapshot.sh
# 把 KB="/path/to/knowledge-base" 指向你的笔记目录
# 2. 重建快照
./build_snapshot.sh
# 3. (强烈建议) 标 skip-worktree,防止把私人 KB 误推到自己 fork 的公开仓库
git update-index --skip-worktree kb-snapshot.txt
# 本地 kb-snapshot.txt 保留你的真实 KB,git status 永远显示干净。
# 撤销:git update-index --no-skip-worktree kb-snapshot.txt
# 4. 重写 system-prompt.md (必须)
# 现版本是为作者 KB 调的——假设你用 [[wikilink]] 概念命名,
# 示例 query/output 都基于作者的特定 KB。
# 你的 KB 风格不同的话,姿态规则可以保留,但示例和格式约定要全换。KB 结构推荐(不强制):
your-kb/
├── 1-concepts/ ← 原子概念卡(一卡一念)
├── 2-explorations/ ← 长对话整理
├── 3-projects/ ← 在做的事
├── 4-references/ ← 外部资料笔记
├── INDEX.md ← 一卡一行 + summary(可选,但能大幅提升召回)
└── CLUSTERS.md ← 主题聚类(可选)
任何能转成 markdown 的笔记系统都可以(Obsidian、Logseq、纯文件夹)。
| 变量 | 默认 | 说明 |
|---|---|---|
DEEPSEEK_API_KEY |
(必填) | 从 platform.deepseek.com 申请 |
WAKE_OWNER |
(空) | KB 归属人名字,影响 MCP 工具描述里的措辞 |
WAKE_TIMEOUT |
15 |
daemon 调用超时(秒) |
LENS_PORT |
8765 |
lens 监听端口 |
LENS_UPSTREAM |
https://api.anthropic.com |
lens 上游 API |
LENS_UPSTREAM_PROXY |
(空) | lens 上游代理(中国大陆通常需要) |
LENS_PLUGINS |
(空) | 启用的插件,逗号分隔;默认不加载插件。设为 wake_memory 可显式启用 lens 记忆注入 |
| 路径 | 角色 |
|---|---|
daemon.py |
召回入口。recall(query) -> str,也能直接命令行调用 |
system-prompt.md |
注入给 DeepSeek 的 system prompt,定义"联想"输出风格 |
kb-snapshot.txt |
KB 序列化产物,daemon 启动时一次性载入 |
build_snapshot.sh |
从 markdown 目录重建 kb-snapshot.txt |
mcp_server.py |
把 daemon 包装成 MCP stdio server |
hook.sh |
Claude Code UserPromptSubmit hook |
lens/proxy.py |
内置 Anthropic API 代理,可选高级/实验路径(集成 C) |
lens/plugins/wake_memory.py |
lens 可选插件,负责拦截请求 + 注入记忆 + 剥旧累积 |
lens/plugins/examples/ |
hello-world 插件示例(echo、system_prefix),写自己插件的起点 |
docs/demo.html |
项目 landing 页,可单独部署到 GitHub Pages 或任何静态托管 |
不是。RAG 是把 KB 切片 + 向量化 + 检索 top-k + 拼到 prompt 里。 wake 是把 KB 整个塞进 system prompt,不切片、不向量化、不检索——靠模型自己的注意力做"自然有损压缩"。
| RAG | wake | |
|---|---|---|
| KB 量级 | GB 级、文档级 | KB 到几 MB,概念级 |
| 召回风格 | 引用原文 | 联想浮现(可能不点名出处) |
| 适合 | 客服、检索、知识查询 | 个人思考记忆、第二大脑、写作助手 |
| 单次成本 | ~10K token | ~150K-1M token,但 prompt cache 后接近 RAG |
如果你的 KB > 几 MB,wake 就不合适了——这是个人 KB 工具,不是企业知识库方案。
- DeepSeek 1M context + prompt cache 让"全量注入"在 2026 变得可行
- "记忆 ≠ 检索,是 substrate 对新输入的形状响应"——wake 作者 2026-05-02 的 KB 笔记
- Madeleine cookie / 双过程理论 / 自由能原理:浮现 vs 主动检索的二元结构
完整方法论在 kb-snapshot.txt 里,搜 多层有损压缩 失败可见性 塑型源的多样性 等概念。
- 必须有 DeepSeek API key(模型可换,改
daemon.py里 base_url 即可——但 1M context 是关键依赖) - 单次召回 1-3 秒(daemon 冷启动 + DeepSeek 推理),lens 集成时每次对话延迟 +1-3s
- KB 改了要手动跑
build_snapshot.sh(可以挂 git post-commit hook) - 召回质量强依赖 system-prompt.md 的调教,以及 KB 本身的概念结构。空 KB 或纯流水账 KB 出不来"联想"