关于 Palace
Palace 是面向编码 Agent 的本地优先记忆 MCP 服务,将项目内容原文存入 SQLite 文件,并在不同会话间检索。它结合本地嵌入、自动钩子和来源引用来管理记忆。
主要功能
- 01原文记忆存入 SQLite
- 02本地嵌入与混合搜索
- 03通过自动钩子召回会话记忆
- 04结果附带来源信息
- 05日记与带时间戳的事实图谱
适用场景
- 01跨会话找回项目决策
- 02重用过往修复、命令和偏好
- 03通过 Agent 或命令行搜索项目笔记
MCP 相关
Palace 向 MCP 客户端提供搜索、状态、日记和知识图谱等记忆工具。Agent 还可使用其嵌入迁移工具。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
我们还没有获取到这个服务的安装包或远程地址,请按项目 README 中的说明安装。
工具
本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。
详细介绍
为编码 Agent 打造的本地优先记忆。
让 Agent 在不同会话之间记住决策、修复、命令和偏好。
一个二进制文件、一个 SQLite 文件、无需 API 密钥、无需云服务。
快速开始 · 安装 · 工作原理 · 客户端 · 命令行 · MCP 工具 · 常见问题
Palace 为 Claude Code、Codex、Cursor、Gemini CLI、VS Code、OpenCode、 Cline、Zed、Goose、Windsurf 和 Claude Desktop 提供记忆,让记忆 在不同会话之间延续。它会原样存储发生过的内容,在相关时自动回忆, 并标明每个答案的来源。
You: why did we switch the queue to SQLite last month?
Agent: [palace_search → wing my_api, room decisions, filed 2026-09-03]
You dropped Redis because the deploy target had no persistent volume.
The benchmark you ran is in the same drawer.
🧭 为什么选择 Palace
每次新的 Agent 会话都从零开始。你得再次解释架构。 Agent 会重复上周被你否决的修复方案。它会搜索整个代码仓库, 重新发现几个月前定下的约定。
Palace 通过以下方式解决这些问题:
- 原样存储文本。 代码、笔记和对话会按原文存储,而不是存成会丢失细节的大模型摘要。
- 在本地运行。 嵌入向量由 ONNX Runtime 在你的 CPU 上通过
all-MiniLM-L6-v2(或其他支持的模型)生成。除非启用远程模式,否则任何内容都不会离开你的设备。 - 自动回忆,无需请求。 钩子会在会话开始、你发送提示词时,以及 Agent 调查问题期间注入相关记忆。Agent 无需记得主动搜索。
- 标注来源。 每条结果都会附带其侧翼、房间、源文件、抽屉 ID 和分数明细,方便你核实答案的来源。
- 以单个二进制文件交付。 无需 Python、向量数据库或 Docker。只需一个
palace可执行文件和一个palace.db文件。
它也适用于软件项目之外的场景。creative 和 personal
配置可适配世界观构建、小说创作、辅导或家庭笔记。
📦 安装
任选一种方式。每种方式都会安装 palace 二进制文件。之后运行 palace install
以连接你的 Agent。
macOS / Linux
curl -fsSL https://raw.githubusercontent.com/AncientiCe/palace-rs/main/scripts/install.sh | sh
Windows(PowerShell)
irm https://raw.githubusercontent.com/AncientiCe/palace-rs/main/scripts/install.ps1 | iex
这些脚本会下载匹配的 GitHub Release 二进制文件、验证其 SHA-256 校验和,并完成安装。之后要升级时,再次运行相同的命令即可。
Homebrew(macOS Apple Silicon / Linux)
brew tap AncientiCe/palace
brew install palace
升级时,请先刷新 tap。如果不运行 brew update,Homebrew 可能会一直
报告旧版本已安装:
brew update && brew upgrade palace
当某个版本发布更新了记忆协议规则(CHANGELOG 会说明),之后请再次运行
palace install,以便你的 Agent 获取新的规则文本。
MCP 注册表 / MCPB 捆绑包。 Palace 已在官方
MCP 注册表 中列出,名称为
io.github.ancientice/palace-rs。每次发布还会提供一个 palace-<version>.mcpb
捆绑包(Linux x86_64、macOS arm64、Windows x86_64),可在 Claude Desktop 等
兼容 MCPB 的宿主中一键安装。
从源代码构建
git clone https://github.com/AncientiCe/palace-rs && cd palace-rs
cargo build --release # binary at target/release/palace
| 平台 | 状态 |
|---|---|
| Linux x86_64 | 支持 |
| macOS Apple Silicon | 支持 |
| Windows x86_64 | 支持 |
| macOS Intel | 不支持(无 ONNX Runtime 构建版本) |
嵌入模型(约 90 MB)会在你首次挖掘或搜索时从 Hugging Face 下载,之后
会缓存在 ~/.cache/huggingface 中。
⚡ 快速开始
palace install # connect every supported agent on this machine
palace doctor # check that every client is wired up
palace init ~/my-project --yes --auto-mine # detect rooms, write palace.yaml, mine
重启你的 Agent 应用,使其重新加载 MCP 配置。然后试着询问:
“我们对这个项目如何处理数据库迁移有哪些了解?”
Agent 应调用 palace_search,并根据记忆作答,同时注明所用的抽屉。你也可以在终端中搜索:
palace search "how did we decide on the database schema"
之后,Agent 会在完成重要工作后写下一篇日记条目,并将持久有效的决策保存为事实。明天,无论使用哪个 Agent,都能从今天的进度继续工作。
🔍 工作原理
宫殿
记忆按建筑的结构组织,让搜索更聚焦:
图 1。一座宫殿包含多个翼区。房间对抽屉进行分组,知识图谱和日记则与它们并列。
| 概念 | 含义 | 示例 |
|---|---|---|
| 翼区 | 一个项目或主题 | my_api、sales_notes |
| 房间 | 翼区内的一个区域 | backend、testing、decisions |
| 抽屉 | 一段逐字文本,以及它的嵌入向量和元数据 | db.rs 中的一段文字、一篇日记条目 |
| 知识图谱 | 带时间戳的事实:主语 → 谓语 → 宾语 | my_api → uses_queue → SQLite(自 2026-09-03 起有效) |
| 日记 | 每个 Agent 的会话笔记,用于保持连续性 | “通过……修复了不稳定的迁移测试” |
| 隧道 | 不同翼区中房间之间的链接 | my_api/auth ↔ my_web/login |
翼区分为项目翼区(磁盘上的文件夹,由 palace mine 创建)和主题翼区(没有文件夹,例如聊天记录或会议笔记,由 palace_create_wing 创建)。
检索
flowchart LR
Q["💬 Question<br/>from you or the agent"] --> S["Sanitize<br/>strip pasted dumps"]
S --> I["Classify intent<br/>decision · how_to · preference …"]
I --> H["Hybrid search<br/>BM25 + cosine"]
H --> B["Coding boosts<br/>+ preference pass"]
B --> R{"Rerank?<br/>optional"}
R --> OUT["📎 Results<br/>scores + source + neighbours"]
DB[("palace.db<br/>local embeddings")] -.-> H
图 2。查询的处理过程。所有操作都在本地 CPU 上运行。
搜索会将 BM25 关键词评分与基于本地嵌入向量的余弦相似度结合起来,然后针对编码问题应用意图加权。每个查询都会被分类为 preference、decision、how_to、definition、temporal 或 unknown。偏好类问题(“我喜欢怎样写提交信息?”)会针对带有偏好标签的文本片段进行专门检索。本地交叉编码器重排器可作为选项使用(--rerank 或 PALACE_RERANK=1)。
嵌入模型
Palace 内置了 all-MiniLM-L6-v2,并且可以将 Palace 切换到另一个本地模型。所有向量都会根据已存储的文本重新构建,因此切换不会丢失记忆。
| 模型 ID | 模型 | 精度 | 备注 |
|---|---|---|---|
minilm-l6-v2 | all-MiniLM-L6-v2 | fp32 | 默认 |
minilm-l6-v2-q8 | all-MiniLM-L6-v2 | int8 | 索引速度约快 2 倍,基准测试中的召回率相同 |
bge-small | bge-small-en-v1.5 | fp32 | 实验性,索引速度约慢 2.5 倍 |
bge-small-q8 | bge-small-en-v1.5 | int8 | 实验性 |
bge-base-q8 | bge-base-en-v1.5 | int8 | 实验性,768 维 |
实验性模型在编码 Agent 评测中的得分低于 MiniLM,但在真实 Palace 的探测测试中得分更高(参见基准测试)。你可以在自己的 Palace 上试用:是否切换由验证结果决定。
palace embeddings list # models, which is active, which are downloaded
palace embeddings estimate minilm-l6-v2-q8 # time, disk and latency, measured on this machine
palace embeddings migrate minilm-l6-v2-q8 # build, verify, switch
palace embeddings rollback # back to the previous model, instantly
palace embeddings cleanup # drop the previous model's vectors
migrate 会分批构建新向量,同时搜索仍使用当前模型,因此可以安全地中断并重新运行。向量构建完成后,它会使用从你的 Palace 中选取的 200 个已知项探测,对比新模型和当前模型(混合与纯向量召回率 @1/@5,以及查询延迟)。只有当召回率 @5 的下降不超过 0.01,且 p95 查询延迟在预算范围内时,才会切换。预算为当前模型 p95 的两倍,且至少为 25 ms。运行 palace embeddings cutover --force 可强制切换,或运行 palace embeddings cancel 保留当前模型。
在 config.json 中设置 embedding_model(或设置 PALACE_EMBEDDING_MODEL)可为新的空 Palace 选择模型。现有 Palace 不会自行切换。palace status、palace_status 和 palace_session_context 会报告待处理的迁移,直到你运行 migrate。迁移不会自行发生:你需要运行 migrate,或让你的 Agent 运行它;这会使用 palace_embeddings MCP 工具(它会在服务后台执行相同步骤)。在远程模式下,模型由服务端管理,因此这些命令会在服务端运行。
检索前会清理 Agent 生成的查询转储。返回结果会附带分数来源(combined、cosine、bm25、coding_boost、preference_match、rerank_score、intent)以及来自同一源文件的相邻分块。
自动回忆(钩子)
palace install 会注册用户级钩子,因此记忆可在每个项目中生效,无需编辑各项目的文件:
图 3。三个钩子将记忆读入会话。第四个钩子确保会话中的经验教训被写回。
| 钩子 | 功能 |
|---|---|
| 会话开始 | 注入记忆协议、你在 general/preferences 中设定的固定规则(在每个项目中原样注入)、此项目的近期日记条目(来自任何 Agent),以及项目所在翼的顶层抽屉。 |
| 提交提示词 | 使用你的实际问题搜索 Palace,并在 Agent 回答前注入匹配的抽屉。如果历史问题没有找到内容,就会提示 Agent 运行 palace_search。在 Claude Code 中,还会添加一行提醒,直到会话调用 Palace 工具为止。跳过较短的提示词和斜杠命令。仅限 Claude Code 和 Codex。 |
| 工具使用后 | 当 Agent 使用 grep 搜索并读取文件时,回忆相关记忆,让先前的决策无需搜索即可浮现。在 Claude Code 中,还会记录会话调用的 Palace 工具。 |
| 停止 | 如果会话确实完成了工作,却没有保存任何内容,就会在会话结束前要求 Agent 写一条日记并记录决策,此请求只会发出一次。在 Claude Code 中,按会话进行判断,包括从未使用 Palace 的会话;其他 Agent 则依据近期活动时间窗口判断。 |
自动回忆仅限当前项目。其他项目翼中的抽屉和其他项目的日记不会显示。主题翼仍会显示。
所有钩子都以开放失败方式运行:如果 palace 缺失或为空,Agent 会照常工作。
记忆协议
palace install 还会在每个客户端的指令文件中写入一条简短规则,告诉 Agent 何时使用记忆:
- 会话开始:
palace_status→palace_session_context→palace_diary_search。 - 回答有关过去的决策、偏好或历史的问题之前: 在 grep 之前先运行
palace_search和palace_kg_query。 - 工作完成后: 运行
palace_diary_write,并使用palace_kg_add添加持久事实。
对于当前符号、精确定义,以及可能在提取后发生变化的代码,grep 仍然是首选工具。
九个协议工具都标记为 _meta."anthropic/alwaysLoad" = true,因此 Claude Code 2.1.121 及更高版本会保持这些工具加载,而不是将其延后到工具搜索时再加载。
记忆层
| 层级 | 名称 | 内容 |
|---|---|---|
| L0 | 身份 | ~/.palace/identity.txt,始终加载(约 100 个 token) |
| L1 | 核心故事 | 按重要性排列、按房间分组的顶层抽屉(约 600–900 个 token) |
| L2 | 按需 | 按翼和房间筛选的检索 |
| L3 | 深度搜索 | 对整个 palace 进行完整的混合搜索 |
palace wake-up 会打印 L0 和 L1。Agent 通过 MCP 工具访问 L2 和 L3。
🔌 支持的客户端
默认情况下,palace install 会为所有受支持的客户端配置
(--client all)。只有在 Gemini CLI、VS Code、Windsurf、OpenCode、Cline、Zed 和
Goose 的配置文件夹存在时,才会将它们纳入配置,因此 Palace 不会设置你没有安装的 Agent。使用 --client <name> 可显式配置一个客户端。
| 客户端 | --client | MCP 配置 | 规则文件 | 钩子 |
|---|---|---|---|---|
| Claude Code | claude | ~/.claude.json | ~/.claude/CLAUDE.md | ~/.claude/settings.json |
| Codex | codex | ~/.codex/config.toml | ~/.codex/AGENTS.md | ~/.codex/hooks.json(在 Codex CLI 中运行一次 /hooks 以信任这些钩子) |
| Cursor | cursor | ~/.cursor/mcp.json | ~/.cursor/rules/palace.mdc | ~/.cursor/hooks.json |
| Gemini CLI | gemini | ~/.gemini/settings.json | ~/.gemini/GEMINI.md | ~/.gemini/settings.json(仅在 Gemini 中你信任的文件夹内运行) |
| VS Code(Copilot) | vscode | Code/User/mcp.json | Code/User/prompts/palace.instructions.md | ~/.copilot/hooks/palace.json(无法在提示词时召回:VS Code 无法在该处注入内容) |
| OpenCode | opencode | ~/.config/opencode/opencode.json | ~/.config/opencode/palace.md,在 instructions 下列出 | ~/.config/opencode/plugins/palace.js |
| Cline | cline | ~/.cline/data/settings/cline_mcp_settings.json | ~/.cline/rules/palace.md | Documents/Cline/Hooks(提示词和工具调用后召回;Cline 无法在任务结束后继续运行,因此没有保存提醒)。不会覆盖你自己的钩子脚本。 |
| Zed | zed | Zed settings.json(context_servers) | Zed 的全局 AGENTS.md | 无。Zed 的 Agent 不支持钩子;在 Zed 中使用的外部 Agent 使用各自的 Palace 配置。 |
| Goose | goose | Goose config.yaml(extensions) | Goose .goosehints | ~/.agents/plugins/palace(仅提供保存提醒;Goose 钩子无法注入上下文;Windows 上需要 sh) |
| Windsurf | windsurf | ~/.codeium/windsurf/mcp_config.json | ~/.codeium/windsurf/memories/global_rules.md | 无。Cascade 钩子无法注入上下文。Devin Local 复用 Claude Code 钩子。 |
| Claude Desktop | claude-desktop | claude_desktop_config.json | ~/.claude/CLAUDE.md | 无。请改用 MCP 提示词。 |
规则文件以托管区块的形式写入。现有内容会保留。
palace install --client claude # one client only
palace install --scope project --path ./my-project # project-level rule files
palace install --no-rule # MCP wiring only, no rule
palace install --dry-run # preview the changes
palace uninstall # undo everything
使用 --scope project 时,规则会写入 <project>/CLAUDE.md、<project>/AGENTS.md
(Codex、OpenCode、Cline、Zed 和 Goose)、<project>/GEMINI.md、<project>/.github/copilot-instructions.md、
<project>/.windsurf/rules/palace.md 和 <project>/.cursor/rules/palace.mdc。
Cursor、VS Code 和 OpenCode 还会获得项目级 MCP 配置
(.cursor/mcp.json、.vscode/mcp.json、opencode.json)。
手动配置 MCP
任何 MCP 客户端都可以通过 palace mcp 将 Palace 作为 stdio 服务运行。
JSON 客户端(Claude Code、Cursor、Claude Desktop):
{
"mcpServers": {
"palace": { "command": "palace", "args": ["mcp"] }
}
}
Codex(~/.codex/config.toml):
[mcp_servers.palace]
command = "palace"
args = ["mcp"]
Claude Code CLI:
claude mcp add palace -- palace mcp
MCP 提示词
Claude Desktop 无法运行钩子,因此服务会在提示词选择器中提供两个提示词:
| 提示词 | 功能 |
|---|---|
continue-session | 加载热启动上下文,让 Agent 从你上次离开的地方继续 |
save-session | 将会话保存到记忆中,以便下次继续使用 |
配置方案
配置方案会更改 Agent 规则、协议文本,以及 palace init 查找的房间:
| 配置方案 | 适用场景 | 常见房间 |
|---|---|---|
coding(默认) | 软件项目 | 前端、后端、测试、文档、配置 |
creative | 世界构建、D&D、小说创作 | 角色、地点、背景设定、派系、时间线 |
personal | 辅导、照护、家务、客户记录 | 人员、健康、财务、家庭、日程 |
palace install --profile creative
配置方案会保存到 ~/.palace/config.json。设置 PALACE_PROFILE 可对单个进程覆盖此配置。
远程模式(共享团队记忆)
默认情况下,palace mcp 为你的本地 Palace 提供服务。远程模式会将其转为
stdio-to-HTTP 桥接,连接到共享的 Palace Server,
即面向团队的商业版可自托管服务。客户端注册方式无需更改。
palace remote set --endpoint https://palace.yourco.com # prompts for the ps_… API key
palace remote on
palace remote test # runs the MCP handshake and reports the tool count
palace remote status # mode, endpoint, masked key
palace local # back to the local palace
🧰 CLI 参考
运行 palace <command> --help 查看所有标志。
设置
| 命令 | 功能 |
|---|---|
palace install | 为你的 Agent 注册 MCP 服务、规则和钩子 |
palace uninstall | 移除这些内容 |
palace doctor | 检查二进制文件、数据库、MCP 配置和规则 |
palace seed-adoption-facts | 注入知识图谱事实,让 Agent 的记忆召回效果可衡量 |
添加记忆
| 命令 | 功能 |
|---|---|
palace init <dir> | 检测房间并写入 palace.yaml(--yes 跳过提示,--auto-mine 则会立即挖掘) |
palace mine <dir> | 对项目文件分块、嵌入并存储。再次运行时只会处理已更改的文件。 |
palace watch <dir> | 工作期间自动重新挖掘已更改的文件 |
palace mine-convos <dir> | 导入聊天记录:Claude Code 和 Codex JSONL、Claude.ai、ChatGPT、Slack |
palace sweep <path> | 将转录 JSONL 文件按每条消息存为一个抽屉 |
palace split | 将拼接在一起的 Claude Code 转录文件拆分为每个会话一个文件 |
查找记忆
| 命令 | 功能 |
|---|---|
palace search <query> | 混合搜索(--wing、--room、--limit、--rerank) |
palace wake-up | 打印 L0 身份信息和 L1 核心故事 |
palace status | 按翼和房间统计抽屉数量 |
palace wings | 列出已注册的翼,以及其类型、抽屉数量和上次挖掘时间 |
palace timeline | 按时间顺序列出知识图谱事实(使用 --entity 筛选) |
palace gain | 查看你的 Agent 使用 Palace 的情况,以及它节省的内容 |
维护
| 命令 | 功能 |
|---|---|
palace export / palace import <file> | 将抽屉备份为 JSON 或从 JSON 恢复(导入时会重建嵌入) |
palace prune --older-than-days <n> | 删除旧抽屉(使用 --dry-run 预览) |
palace repair | 为缺少向量的抽屉重新生成嵌入 |
palace upgrade-embeddings | 使用当前模型为所有内容重新生成嵌入(使用 --refresh-preferences 更新偏好跨度) |
palace embeddings … | 列出、估算、迁移到、验证、切换到或回滚嵌入模型 |
palace migrate <db> | 从另一个 Palace 数据库复制抽屉 |
palace compress | 将抽屉压缩为 AAAK 方言 |
服务
| 命令 | 功能 |
|---|---|
palace mcp | 启动 MCP stdio 服务 |
palace remote … / palace local | 配置并切换远程模式 |
palace hook <event> --client <c> | 由已安装钩子调用的钩子运行器 |
挖掘项目
flowchart LR
DIR["📁 Your repo"] --> F["Filter<br/>.gitignore + skip build dirs"]
F --> C{"Changed since<br/>last mine?"}
C -- no --> SKIP["Skip"]
C -- yes --> CH["Chunk + pick room<br/>using palace.yaml"]
CH --> E["Embed locally<br/>all-MiniLM-L6-v2"]
E --> DB[("palace.db")]
图 4.挖掘只会处理已更改的文件,因此重复运行的成本很低。
palace mine 会遵循 .gitignore,并跳过 .git、node_modules、
target、build、dist、vendor 等构建输出目录。它会读取常见的
文本和源代码格式:md、txt、rs、py、js、ts、tsx、go、
java、rb、sh、sql、json、yaml、toml、html、css、csv 等。
palace mine ~/my-project \
--wing my_project # override the wing name
--limit 100 # process at most 100 new or changed files
--dry-run # preview without storing
--no-gitignore # ignore .gitignore rules
--include vendor,third_party # force-include these paths
--limit 运行可以续接:下一次运行会从上次停止的位置继续。
使用 palace gain 衡量价值
palace gain # last 30 days
palace gain --project my_project --since 7d
palace gain --history # recent tool calls
palace gain --json
palace gain --record <query_id> <drawer_id> useful # or not_useful / wrong_answer
palace gain - last 30d (my_project)
Tool calls : 412 (sessions: 27)
Hit rate : 88% (search hits 142/162)
Precision@1 : 92%
Precision@5 : 95%
Tokens saved (est) : ~78,400
Re-index skipped : 31 (duplicate drawers avoided)
KG facts recalled : 56
Diary recalls : 8
Repeat Qs avoided : 19
p95 latency : 41 ms
使用情况元数据会保留在你的本地 palace.db 中。设置 PALACE_GAIN_DISABLED=1
即可关闭记录。
🧩 MCP 工具
全部 50 个工具
状态与健康状况
| 工具 | 描述 |
|---|---|
palace_status | Palace 概览:抽屉和翼的数量、近期会话(verbose 会额外显示房间、协议文本和 AAAK 规范) |
palace_verify | 检查 MCP 工具、数据库健康状况、嵌入和模型缓存 |
palace_recall_check | 运行项目记忆探测并报告预期命中结果 |
palace_gain | 使用收益与节省。可接受可选的 record 反馈负载。 |
palace_memory_report | 可读的清单:个人资料、各翼和各房间的数量、近期活动 |
翼与分类体系
| 工具 | 描述 |
|---|---|
palace_project_status | 此项目是已挖掘、已注册但未挖掘,还是未知? |
palace_mine | 按需挖掘代码仓库(需先征得用户同意) |
palace_create_wing | 创建主题或项目翼 |
palace_list_wings | 已注册的翼,包含类型、路径、上次挖掘时间和数量 |
palace_list_rooms | 列出某个翼中的房间 |
palace_get_taxonomy | 完整的翼 → 房间 → 数量树 |
搜索
| 工具 | 描述 |
|---|---|
palace_search | 混合搜索,包含评分来源和来源上下文 |
palace_preference_search | 专门用于搜索偏好和约定问题 |
palace_check_duplicate | 检查内容是否已存在 |
抽屉
| 工具 | 描述 |
|---|---|
palace_add_drawer | 将内容存储到某个翼和房间中 |
palace_remember | 存储重要性为 5 的关键信息 |
palace_get_drawer | 按 ID 获取抽屉 |
palace_list_drawers | 列出抽屉,可按翼和房间筛选 |
palace_update_drawer | 更新内容并刷新元数据 |
palace_delete_drawer / palace_forget | 移除抽屉 |
palace_explain | 完整溯源信息:存储者、存储时间、来源和重要性 |
palace_prune | 移除过时或价值较低的抽屉 |
palace_export / palace_import | 导出或导入 Palace 数据 |
palace_upgrade_embeddings | 重新生成抽屉的嵌入并刷新偏好向量 |
palace_embeddings | 列出模型、估算用量,并在你提出要求时迁移到其他嵌入模型 |
知识图谱
| 工具 | 描述 |
|---|---|
palace_kg_query | 查询实体的关系 |
palace_kg_add | 添加事实(主体 → 谓词 → 客体) |
palace_kg_invalidate | 将事实标记为不再成立 |
palace_kg_timeline | 按时间顺序列出事实 |
palace_kg_stats | 图谱概览 |
palace_conflicts | 查找过时或矛盾的事实 |
palace_seed_adoption_facts | 添加采用情况和质量门槛事实 |
图谱与隧道
| 工具 | 描述 |
|---|---|
palace_traverse | 从一个房间开始进行广度优先遍历 |
palace_find_tunnels | 查找连接两个翼的房间 |
palace_create_tunnel / palace_list_tunnels / palace_delete_tunnel | 管理已存储的隧道 |
palace_follow_tunnels | 从某个翼和房间开始沿隧道追踪 |
palace_graph_stats | 图谱摘要 |
日记与会话
| 工具 | 描述 |
|---|---|
palace_diary_write | 写入日记条目 |
palace_diary_read | 阅读近期条目 |
palace_diary_search | 搜索日记。all_agents: true 会搜索所有 Agent 的日记。 |
palace_session_context | 热启动上下文。如果当前 Agent 在该项目中没有近期工作记录,则回退到其他 Agent 的近期工作。 |
palace_list_agents | 列出 Agent 日记 |
内部
| 工具 | 描述 |
|---|---|
palace_get_aaak_spec | AAAK 压缩记忆方言规范 |
palace_hook_settings | Hook 设置 |
palace_memories_filed_away | stop hook 使用的确认信息 |
🔧 配置
设置的加载顺序为:环境变量,然后是
~/.palace/config.json,最后是默认值。
| 环境变量 | 默认值 | 说明 |
|---|---|---|
PALACE_PALACE_PATH | ~/.palace/palace | 数据目录。数据库位于其中的 palace.db。 |
PALACE_PROFILE | coding | coding、creative 或 personal |
PALACE_RERANK | off | 设为 1 可为每次搜索启用本地重排序器 |
PALACE_RERANK_MODEL | built-in | 覆盖重排序器模型 |
PALACE_ENTITY_LANGUAGES | en | 用于实体检测的语言,以逗号分隔 |
PALACE_GAIN_DISABLED | off | 设为 1 可关闭使用情况记录 |
PALACE_PROJECT | auto | 用于归因使用情况的项目名称 |
PALACE_SOURCE_DIR | ~/Desktop/transcripts | palace split 的默认来源 |
PALACE_MINE_TRACE | off | 设为 1 可打印各阶段挖掘耗时 |
PALACE_MCP_MODE | local | local 或 remote |
PALACE_EMBEDDING_MODEL | minilm-l6-v2 | 新建 palace 使用的嵌入模型(参见嵌入模型) |
PALACE_EMBEDDING_LATENCY_BUDGET_MS | 当前 p95 的 2 倍 | palace embeddings verify 的查询延迟预算 |
PALACE_EMBED_THREADS | 所有核心 | 用于嵌入的 ONNX 线程数 |
PALACE_REMOTE_ENDPOINT | none | Palace Server URL(主机、基础 URL 或完整的 /mcp URL) |
PALACE_API_KEY | none | Palace Server API 密钥(ps_…) |
config.json 使用相同设置作为键:palace_path、profile、
entity_languages、topic_wings、people_map、mcp_mode、
remote_endpoint、remote_api_key、embedding_model、
embedding_latency_budget_ms。Palace 会以仅所有者可读写的
0600 权限写入此文件。
palace.yaml(每个项目)
palace init 会创建此文件。编辑它可以调整文件到房间的映射方式:
wing: my_project
rooms:
- name: backend
description: Server and API code
keywords: [api, server, routes, models]
- name: frontend
description: UI components
keywords: [ui, components, pages, views]
- name: general
description: Everything else
keywords: []
📊 基准测试
编码 Agent 记忆评测
一组模拟真实项目记忆的夹具(决策、过去的故障、命令、惯例、 偏好、当前方向),包含 51 个问题,例如:
- 我们为什么选择捆绑式 sqlite?
- 上次我们如何修复迁移测试失败的问题?
- 我应该运行什么 clippy 命令?
cargo test --test coding_agent_eval -- --nocapture
测试会报告 recall@1 和 recall@5,并在检索结果低于固定阈值时失败。它回答了一个重要问题:编码 Agent 需要时,能否找到正确的项目上下文?
此评测有一部分是经过有意调优的。 排序器针对编码 Agent 的增强包含了少量取自评测问题本身的短语(例如 “explain themselves”、“proof priority” 和 “release theme”),因此此处和下方 bake-off 中的调优分数高于仅使用通用排序时的分数。我们会保留这些短语,直到通用改进达到相同分数,然后再将其移除。在移除这些短语后,使用相同代码测得的结果如下:
| 模式 | 使用评测短语(调优后)R@1 / R@5 | 不使用评测短语 R@1 / R@5 |
|---|---|---|
| 仅关键词(此测试) | 0.863 / 1.000 | 0.804 / 0.961 |
minilm-l6-v2 | 0.902 / 1.000 | 0.902 / 1.000 |
minilm-l6-v2-q8 | 0.922 / 1.000 | 0.902 / 1.000 |
这些短语不会影响此评测之外的结果:真实 palace 探测和每个会话的 LongMemEval 排序,在使用和不使用这些短语时完全相同。
嵌入模型对比测试
tests/embedding_bakeoff.rs 使用嵌入式抽屉,对此评测中的所有嵌入模型进行评分,并使用来自真实 Palace 的 200 个已知条目探测进行测试。它还会测量索引吞吐量和查询延迟。每个探测都是抽屉中的一个内部句子,约有 30% 的词被删去。
PALACE_RUN_BAKEOFF=1 PALACE_BAKEOFF_DB=~/.palace/palace/palace.db \
cargo test --release --test embedding_bakeoff -- --nocapture
| 模型 | 编码评测 R@1 / R@5(调优后) | Palace 探测 R@1 / R@5 | 索引 | 查询 p95 |
|---|---|---|---|---|
minilm-l6-v2(默认) | 0.902 / 1.000 | 0.850 / 0.970 | 112 个抽屉/秒 | 2.3 ms |
minilm-l6-v2-q8 | 0.922 / 1.000 | 0.860 / 0.980 | 204 个抽屉/秒 | 2.6 ms |
bge-small | 0.863 / 1.000 | 0.910 / 0.985 | 55 个抽屉/秒 | 7.2 ms |
bge-small-q8 | 0.863 / 1.000 | 0.915 / 0.985 | 103 个抽屉/秒 | 5.5 ms |
bge-base-q8 | 0.863 / 1.000 | 0.920 / 0.985 | 39 个抽屉/秒 | 11.0 ms |
混合召回率:从一个包含 10,700 个抽屉的 Palace 中抽取 400 个抽屉;Windows,16 个线程。BGE 的排名最佳,采用 0.5 的余弦下限以及余弦/BM25 各占一半的权重;其注册表条目中已包含这些设置。只有在编码 Agent 评测中达到 MiniLM 的表现,模型才会以非实验性模型的身份发布。因此,尽管 BGE 模型在真实 Palace 探测中表现更佳,目前仍处于实验阶段。verify 会在切换前用你自己的 Palace 测量同一指标。
LongMemEval
LongMemEval s_cleaned 上的检索召回率:评估了 470 个问题,每个问题对应一个约 50 个会话、115k 个 token 的干扰内容集合。按照惯例,不计入 30 个弃答问题。
| 配置 | 模型 | R@1 | R@5 | R@10 |
|---|---|---|---|---|
oracle 划分(合理性检查) | minilm-l6-v2 | 1.000 | 1.000 | 1.000 |
| 每个会话一个抽屉 | minilm-l6-v2 | 0.889 | 0.979 | 0.991 |
| 每个会话一个抽屉 | minilm-l6-v2-q8 | 0.891 | 0.979 | 0.991 |
| 对话轮次对,与 Palace 挖掘聊天记录的方式相同 | minilm-l6-v2-q8 | 0.906 | 0.985 | 0.994 |
对话轮次对这一行体现了 Palace 实际存储对话的方式:每个会话都会经过与 palace mine-convos 相同的标准化器和分块器(每个用户轮次及其回复组成一个块),会话排名取其最佳块。每会话行采用 LongMemEval 常用的粒度,便于与其他系统比较。
方法与各类型结果
- **粒度:**与各行所示相同。不使用 LLM 过滤、摘要或提取内容;用户和助手轮次会一同存储。
- **嵌入器:**MiniLM-L6-v2(384 维、ONNX、全精度或 int8),512-token 上限,本地运行。
- **检索:**Palace 的常规混合搜索(BM25 与余弦相似度融合,并应用排名加权),top-K 为 10。
- 任何阶段都不使用 LLM,不使用 GPU,也未针对 LongMemEval 调优。
- **指标:**会话粒度下的
recall_any@K。 - **硬件:**Windows,16 个线程。
| 问题类型 | 每会话,minilm-l6-v2 R@1 / R@5 | 对话轮次对,q8 R@1 / R@5 |
|---|---|---|
| knowledge-update | 0.944 / 1.000 | 0.958 / 1.000 |
| multi-session | 0.909 / 0.983 | 0.901 / 0.992 |
| single-session-assistant | 1.000 / 1.000 | 1.000 / 1.000 |
| single-session-preference | 0.633 / 0.833 | 0.767 / 0.900 |
| single-session-user | 0.922 / 1.000 | 0.984 / 1.000 |
| temporal-reasoning | 0.835 / 0.976 | 0.835 / 0.976 |
oracle 划分只包含标准答案会话,因此它检查的是流水线,而不是衡量检索效果。偏好问题是表现最弱的类别,因为“I prefer…”这类句子很少与问题共享关键词。其余大多数时间推理漏检都涉及相对日期(如“一周前”),而排名目前尚未使用这一信息。
较早的一次运行(2026 年 5 月,在加入编码 Agent 加权之前)每会话得分为 0.889 / 0.981 / 0.991。之后的排名器改动导致两个问题失分;其中一个已修复,另一个是因为惯例加权在“should”一词上触发。
🔒 隐私与数据
- 默认情况下,所有数据都存储在本地。 一个 SQLite 文件位于
~/.palace/palace/palace.db。嵌入向量由你的 CPU 计算。 - 网络访问仅用于从 Hugging Face 一次性下载模型,以及在开启远程模式时访问你自己的 Palace Server。
- 不收集遥测数据。
palace gain统计信息只会写入你的本地 数据库。 - 使用
palace export备份,或复制palace.db。 - 使用
palace_forget删除单条记忆,或删除~/.palace以清除所有内容。
Palace 会存储你挖掘的所有内容。在挖掘代码库之前,使用 .gitignore 排除机密信息。
🩺 故障排除
| 问题 | 解决方法 |
|---|---|
| Agent 从不调用 Palace | 运行 palace doctor,然后完全重启 Agent 应用。在 Codex CLI 中,运行一次 /hooks 以信任这些钩子。 |
palace: command not found | 打开新的终端,让 PATH 加载安装目录;或者使用完整路径运行 palace doctor。 |
| 没有搜索结果 | 检查 palace status。如果项目没有抽屉,运行 palace init <dir> --yes --auto-mine。 |
| 结果已过时 | 再次运行 palace mine <dir>(只会处理已更改的文件),或持续运行 palace watch <dir>。 |
| 模型下载失败 | 检查能否访问 huggingface.co,然后重试。首次成功下载后,模型会缓存下来。 |
| 首次运行时搜索较慢 | 首次调用会加载 ONNX 模型。同一会话中的后续调用速度很快。 |
| 某些抽屉没有向量 | palace repair |
❓ 常见问题
我需要告诉 Agent 使用它吗?
不需要。运行 palace install 后,钩子会在会话开始时、你发送提示词时以及 Agent 阅读代码时注入相关记忆。安装的规则会告诉 Agent 在回答有关历史的问题前搜索记忆,并在之后保存它学到的内容。
这和 CLAUDE.md 或 AGENTS.md 有什么不同?
这些文件是你手动编写和维护的指令,而且每一行都会加载到每个会话中。Palace 是一种可搜索的记忆,会随着你的工作不断增长:只会检索与当前问题相关的部分,并且 Claude Code、Codex、Cursor 和 Claude Desktop 共享同一份记忆。规则仍然写在指令文件中;历史记录则交给 Palace。
它会把我的数据发送到别处吗?
不会。存储、嵌入和搜索都在本地运行。唯一的网络请求是从 Hugging Face 下载模型的一次性请求,以及在你启用远程模式时,连接你自己的 Palace Server。请参阅隐私与数据。
它会拖慢我的 Agent 吗?
搜索通常只需几十毫秒(palace gain 会显示实际的 p50 和 p95)。会话中的首次调用会加载嵌入模型。钩子会以开放模式失败,因此 palace 缺失或损坏也不会阻塞 Agent。
记忆过时后会怎样?
重新运行 palace mine 会更新已更改的文件。对于事实,Agent 会调用 palace_kg_invalidate 并添加新事实,因此时间线会同时保留新旧事实。palace_conflicts 会标记看似过时或矛盾的事实,而 palace_forget 或 palace prune 则会移除你不再需要的抽屉。
整个团队可以共用一份记忆吗?
同一台机器上的不同 Agent 已经可以共用记忆:Codex 会话可以读取 Claude Code 会话的日志。对于团队,远程模式会将每个 palace mcp 指向同一个可自托管的 Palace Server。
它只能用于代码吗?
不是。creative 和 personal 配置针对世界构建、小说创作、辅导、照护和家庭记录进行了调优。Palace 可以读取 Markdown 和文本文件,因此 Claude Desktop 用户可以安装 MCPB 包并直接开始使用,无需编写代码。
📚 将 Palace 用作库
Palace 也是一个 Rust crate(palace)。将它添加为 git 依赖项:
[dependencies]
palace-rs = { git = "https://github.com/AncientiCe/palace-rs", default-features = false }
use palace::{db, knowledge_graph, store};
let conn = db::open_in_memory()?;
store::add_drawer(&conn, "wing_code", "backend",
"We use SQLite with WAL mode for concurrent reads.",
None, "architecture.md", 0, "example", 4.0)?;
knowledge_graph::add_triple(&conn, "Palace", "stores_data_in", "SQLite",
Some("2026-04-01"), None, 1.0, None, None)?;
default-features = false 会省去 CLI 依赖项。完整示例请参阅 examples/basic_usage.rs(cargo run --example basic_usage)。palace::palace::Palace::search_with_provenance 会返回与 MCP 工具相同的分数详情。
🧪 开发
cargo fmt
cargo clippy --all-targets --all-features -- -D warnings
cargo test --all-features
cargo audit
测试使用内存中的 SQLite,只有需要嵌入模型的测试才会加载该模型。请参阅 CONTRIBUTING.md、SECURITY.md 和 CHANGELOG.md。
🚚 从旧版本迁移
从 mempalace(0.1.x)迁移
0.2.0 版本将项目名称从 mempalace 更改为 palace。0.2.x 系列仍支持旧名称,但会发出警告。这些旧名称已在 0.3.0 中移除。
要从 0.1.x 升级,可以先安装一个 0.2.x 版本并运行
palace install,以迁移配置并将 ~/.mempalace 移至
~/.palace;也可以手动重命名:~/.mempalace → ~/.palace、
mempalace.yaml → palace.yaml、MEMPALACE_* → PALACE_*,以及
mempalace_* MCP 工具 → palace_*。原先运行 mempalace mcp 或
python -m mempalace.mcp_server 的钩子现在应运行 palace mcp。
从 Python 版本迁移
Rust 版本使用单个 palace.db 替代 ChromaDB 和 SQLite。ChromaDB 数据无法转换,因此请重新摄取:
palace init ~/my-project --yes --auto-mine
palace mine-convos ~/Desktop/transcripts
palace status
~/.palace/ 中的 identity.txt、people_map.json 和 known_names.json 仍然兼容,并会自动读取。
📜 许可证
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。