为Claude Code构建本地记忆引擎:基于MCP与向量数据库的持久化上下文解决方案
1. 项目概述:为Claude Code装上本地记忆引擎
如果你和我一样,日常开发重度依赖Claude Code,那你肯定也经历过这种抓狂时刻:昨天刚和它详细讨论了一个复杂的项目架构,画了图,解释了核心模块的交互逻辑,结果今天打开新会话,它一脸茫然,仿佛失忆了一般。或者,在一个漫长的调试会话中,你终于找到了那个诡异的边界条件bug,但聊着聊着,因为上下文窗口满了,它把最开始的问题描述和关键错误日志给“忘”了,对话开始变得鸡同鸭讲。
这就是Claude Code,或者说所有基于大语言模型的编码助手,目前最大的痛点:它们没有真正的长期记忆,每个会话都是孤岛,上下文窗口就是它们短暂的工作记忆容量。一旦满了,最早的信息就会被丢弃,无论那信息有多重要。
我之前是OpenClaw的深度用户,那是一个可以通过Slack、Discord等渠道交互的AI助手。OpenClaw社区有两个堪称“神器”的插件:memory-lancedb-pro和lossless-claw。前者给了AI一个本地的、持久的向量记忆库,能自动从对话中提取关键信息并存储,需要时通过语义搜索召回;后者则实现了一种“无损上下文管理”,把每一条消息都存档到一个SQLite数据库里,并用有向无环图(DAG)来管理摘要,确保任何被压缩的细节都能被重新展开、追溯。
当Claude Code出现后,我迅速切换了过去——它的代码理解和生成能力在终端环境中简直如鱼得水。但随之而来的,就是对那套强大记忆系统的深深怀念。于是,我决定动手把OpenClaw社区那套精妙的设计“移植”过来,但不是简单的复制粘贴,而是为Claude Code和它的MCP(模型上下文协议)生态量身打造一个本地优先的解决方案。这就是OpenClawdCode的由来:一个完全本地运行、通过MCP为Claude Code赋予长期记忆和上下文管理能力的服务器。
2. 核心设计思路与架构解析
2.1 目标与边界:我们能做什么,不能做什么
在动手之前,必须想清楚核心目标。我的目标不是再造一个OpenClaw,也不是要魔改Claude Code本身。Claude Code是一个闭源商业产品,它的核心上下文管理逻辑我们无法触及。因此,OpenClawdCode的定位非常明确:做一个增强插件,而非替代引擎。
它能做的:
- 提供跨会话的持久化记忆:利用本地的LanceDB向量数据库,存储从对话中自动或手动提取的“记忆点”(如项目决策、代码片段解释、API密钥格式偏好等)。
- 实现智能的上下文预加载:在用户每次发送提示前,通过Claude Code提供的钩子(Hook),自动搜索并注入与当前工作目录/项目相关的记忆,让AI“想起”之前的相关讨论。
- 搭建无损消息存档:将Claude Code的每轮对话(用户提问、AI回复、工具调用结果)完整地记录到SQLite数据库中,即使Claude Code内部因为上下文窗口限制而压缩或丢弃了这些消息,我们这里也有完整备份。
- 集成外部知识库:索引你的Obsidian笔记库或本地文档,让Claude Code能通过语义搜索引用你的个人知识。
它不能做的(也是重要的设计约束):
- 阻止Claude Code的原生上下文压缩:这是最关键的一点。当对话轮数太多,Claude Code自身的上下文管理策略会启动,它会主动摘要、丢弃早期消息以腾出空间。OpenClawdCode无法阻止这个过程。我们的策略是“你丢你的,我存我的”。我们确保所有原始消息都有备份,并提供工具让AI在需要时能主动查询这些存档,把丢失的细节“拉”回当前上下文。这有点像给你的AI配了一个超大的、随时可查的“外部脑”或“会议纪要”。
- 替代OpenClaw的通信渠道:OpenClaw的核心价值之一是跨平台(Slack, Discord等)交互。OpenClawdCode专注于终端内的开发工作流,不涉及消息通道。
2.2 技术栈选型与理由
整个系统的设计遵循“本地优先、简单可靠、社区驱动”的原则。
- 记忆存储(LanceDB):为什么是LanceDB而不是更流行的Chroma或Qdrant?首先,LanceDB是一个嵌入文件格式(lance)的数据库,它的数据文件就是简单的目录和文件,备份、迁移极其方便,完美契合“本地优先”。其次,它原生支持高效的向量搜索和混合搜索(结合向量相似度和BM25关键词匹配),这正是
memory-lancedb-pro的核心能力之一。最后,它不需要单独的服务器进程,一个Python库就能驱动,部署复杂度降到最低。 - 嵌入模型(Ollama + nomic-embed-text):所有文本(记忆、笔记)都需要转化为向量才能进行语义搜索。Ollama让我们能在本地轻松运行开源模型。选择
nomic-embed-text模型是因为它在MTEB基准测试中表现优异,且上下文长度支持8192 tokens,足够处理大部分代码片段和文档。最重要的是,它完全离线运行,隐私有保障。 - 消息存档(SQLite):为了实现
lossless-claw式的无损追溯,我们需要一个轻量级、可靠的关系型数据库来存储每一条消息,并建立它们之间的引用关系(DAG)。SQLite是毋庸置疑的选择,单文件、零配置、强一致性,几乎存在于所有系统上。 - 集成协议(MCP - Model Context Protocol):这是Anthropic为AI工具调用定义的标准协议。Claude Code原生支持MCP服务器。通过将OpenClawdCode实现为一个MCP服务器,我们就能以标准、安全的方式为Claude Code提供
store_memory,recall_memory等工具,无需任何黑科技或破解。 - 运行时钩子(Claude Code Hooks):这是实现自动化的关键。Claude Code暴露了一些生命周期钩子,比如
UserPromptSubmit(用户发送消息前)、Stop(会话结束时)。我们通过修改Claude Code的配置文件(settings.json),在这些钩子触发时执行我们的脚本,从而实现自动记忆注入、会话总结存档等操作。
整个架构的协作流程如下图所示,它清晰地展示了用户、Claude Code、MCP工具和本地数据存储之间的关系:
用户终端 │ ├─ 输入命令/问题 ───────────────┐ │ ▼ │ [Claude Code 进程] │ │ │ ┌─────────┴─────────┐ │ │ 生命周期钩子 (Hooks) │◄─── 配置文件注入 │ │ • UserPromptSubmit│ 自动行为 │ │ • PostToolUse │ │ │ • Stop │ │ │ • PostCompact │ │ │ • SessionStart │ │ └─────────┬─────────┘ │ │ │ ┌─────────▼─────────┐ │ │ MCP 工具调用 │◄─── 按需调用 │ │ • store_memory │ │ │ • recall_memory │ │ │ • search_vault │ │ │ • log_session │ │ └─────────┬─────────┘ │ │ └───────────────────────┐ │ ▼ ▼ ┌─────────────────────────────────────┐ │ 本地数据存储层 │ │ ┌────────────┬──────────────────┐ │ │ │ LanceDB │ SQLite │ │ │ │ (向量记忆) │ (无损消息DAG) │ │ │ └────────────┴──────────────────┘ │ │ ┌────────────────────────────────┐ │ │ │ Ollama (嵌入模型) │ │ │ └────────────────────────────────┘ │ │ ┌────────────────────────────────┐ │ │ │ Obsidian Vault (可选知识源) │ │ │ └────────────────────────────────┘ │ └─────────────────────────────────────┘这个架构确保了所有数据处理都在本地完成,没有数据上传到任何云端服务器,最大程度地保护了代码和对话的隐私性。
3. 详细安装与配置指南
3.1 基础环境准备与一键安装
OpenClawdCode的设计目标之一就是简化安装。项目提供了一个setup.sh脚本,它试图自动化大部分流程。但在运行之前,我们最好理解它每一步在做什么,以便在出现问题时能手动排查。
首先,确保你的系统满足最低要求:
- 操作系统:Linux, macOS,或带有WSL2的Windows。
- Python:3.10 或更高版本。这是许多现代AI库的硬性要求。
- Claude Code:已安装并配置好CLI。你需要能正常使用
claude命令。 - 磁盘空间:约500MB,主要用于存储Ollama模型和数据库。
安装步骤分解:
克隆仓库:
git clone https://github.com/TechFath3r/OpenClawdCode.git cd OpenClawdCode这一步获取了所有源代码和配置模板。
运行安装脚本:
chmod +x setup.sh # 确保脚本可执行 ./setup.sh接下来,脚本会依次执行以下操作,你可能会看到相应的提示和输出:
- 检查并安装Ollama:如果系统未安装Ollama,脚本会尝试通过curl安装。安装完成后,它会拉取
nomic-embed-text嵌入模型。这一步耗时最长,取决于你的网速。 - 创建Python虚拟环境:在
~/.local/share/openclawd/目录下创建一个独立的Python环境,避免污染系统包。 - 安装Python依赖:在虚拟环境中安装
openclawdcode包及其所有依赖(如lancedb,ollama客户端等)。 - 注册MCP服务器:执行
claude mcp add openclawdcode,这会在你的Claude Code配置中添加一个指向本地MCP服务器的条目。 - 配置生命周期钩子:这是最关键也最容易出错的一步。脚本会尝试修改
~/.claude/settings.json文件,注入几个关键的钩子。我强烈建议你在运行前备份这个文件! - 环境变量配置:脚本会创建一个默认的配置文件
~/.config/openclawd/.env,基于项目中的.env.example。
- 检查并安装Ollama:如果系统未安装Ollama,脚本会尝试通过curl安装。安装完成后,它会拉取
注意:自动化脚本虽然方便,但可能因为系统差异(如Python路径、权限)而失败。如果安装后Claude Code无法识别工具或钩子不生效,请跳转到下面的“手动配置与故障排查”部分。
3.2 手动配置与故障排查
如果setup.sh运行不顺利,或者你想更精细地控制配置,可以遵循以下手动步骤。
1. 检查并安装Ollama:访问 ollama.com 下载并安装。然后手动拉取嵌入模型:
ollama pull nomic-embed-text2. 设置Python环境与安装包:
# 创建项目目录和虚拟环境 mkdir -p ~/.local/share/openclawd cd ~/.local/share/openclawd python3 -m venv venv source venv/bin/activate # 安装 openclawdcode 包 # 假设你已经将项目代码放在了 ~/OpenClawdCode pip install ~/OpenClawdCode3. 手动注册MCP服务器:编辑或创建Claude Code的MCP配置。通常配置文件在~/.claude/desktop-config.json或通过claude mcp list查看位置。 你需要添加一个类似这样的配置块:
{ "mcpServers": { "openclawdcode": { "command": "/home/your_username/.local/share/openclawd/venv/bin/python", "args": [ "-m", "openclawdcode.server" ], "env": { "OPENCLAWD_LANCEDB_PATH": "/home/your_username/.local/share/openclawd/lancedb" } } } }更可靠的方法是使用CLI命令(如果setup.sh的这一步失败了):
# 确保你在虚拟环境中 source ~/.local/share/openclawd/venv/bin/activate # 使用绝对路径注册 claude mcp add openclawdcode --cmd `which python` -m openclawdcode.server4. 手动配置钩子(Hooks):打开~/.claude/settings.json。如果不存在,先启动一次Claude Code让它生成。 在hooks字段中添加配置。一个完整的配置示例如下:
{ "hooks": { "UserPromptSubmit": [ { "command": "/home/your_username/.local/share/openclawd/venv/bin/python", "args": [ "-m", "openclawdcode.hooks.prompt_submit" ], "cwd": "." } ], "Stop": [ { "command": "/home/your_username/.local/share/openclawd/venv/bin/python", "args": [ "-m", "openclawdcode.hooks.stop" ], "cwd": "." } ], "PostCompact": [ { "command": "/home/your_username/.local/share/openclawd/venv/bin/python", "args": [ "-m", "openclawdcode.hooks.post_compact" ], "cwd": "." } ] } }UserPromptSubmit: 在每次你发送消息给Claude Code之前执行。我们的脚本会在这里搜索相关记忆并注入上下文。Stop: 在会话结束时执行。用于触发会话总结和最终记忆提取。PostCompact: 在Claude Code执行了一次原生上下文压缩后执行。这是一个信号,告诉我们有些消息被移除了,可以触发一次针对被移除内容的深度记忆提取和存档。
5. 环境变量配置:复制项目中的.env.example文件到~/.config/openclawd/.env,并根据你的情况修改:
mkdir -p ~/.config/openclawd cp /path/to/OpenClawdCode/.env.example ~/.config/openclawd/.env nano ~/.config/openclawd/.env关键配置项:
OPENCLAWD_LANCEDB_PATH=/home/your_username/.local/share/openclawd/lancedb OPENCLAWD_OLLAMA_URL=http://localhost:11434 OPENCLAWD_EMBED_MODEL=nomic-embed-text # 可选:你的Obsidian笔记库路径 OPENCLAWD_VAULT_PATH=/path/to/your/obsidian/vault # 可选:ChromaDB知识库路径(如果你有其他文档库) OPENCLAWD_CHROMADB_PATH=完成以上步骤后,重启Claude Code。在新的会话中,输入/help,你应该能在工具列表中看到store_memory,recall_memory等,这表示MCP服务器连接成功。同时,你可以尝试在终端不同目录下开始对话,观察AI的回复是否开始提及之前项目的上下文,这表示钩子正在工作。
4. 核心功能深度使用与实操
4.1 记忆的自动捕获与智能召回
这是OpenClawdCode最核心的“魔法”。你不需要刻意去“保存”记忆,系统会在对话中自动识别并存储有价值的信息。
自动捕获是如何工作的?系统主要通过两个时机来捕获记忆:
- 会话结束时(Stop Hook):当一次对话结束,系统会对整个会话记录进行分析,使用一个提取模型(可以配置,默认也用Ollama上的一个轻量模型)来识别对话中的关键事实、决策、学习点和代码片段。例如,如果你和AI讨论后决定“本项目使用FastAPI框架,数据库用PostgreSQL,采用DDD架构”,这句话就会被提取为一个独立的记忆单元。
- 上下文压缩后(PostCompact Hook):当Claude Code因为上下文窗口满而压缩历史消息时,被移除的旧消息恰恰可能是重要的长期记忆来源。此时,系统会专门针对这批被“丢弃”的消息进行记忆提取,确保重要信息不丢失。
每个记忆单元会被向量化后存入LanceDB,并自动打上“范围(scope)”标签。默认的范围是你的当前工作目录(cwd),这样不同项目的记忆就自然隔离了。
智能召回又是如何发生的?这依赖于UserPromptSubmit钩子。每次你输入问题并按下回车后,在问题实际发送给Claude Code模型之前,这个钩子脚本会被触发。它会:
- 获取你当前的工作目录。
- 以你的当前问题为查询输入,在LanceDB中搜索同一范围(scope)下最相关的记忆。搜索采用混合模式:既计算语义相似度(向量搜索),也匹配关键词(BM25),然后综合排序。
- 将排名前3-5条最相关的记忆,以一种自然的提示词格式,预先添加到你的问题之前,再一起发送给Claude Code。
例如,你在/projects/my_app目录下工作过,并存储了关于“用户认证使用JWT”的记忆。几天后,你在同一目录下新开一个会话,问:“怎么实现登录接口?”。在钩子作用下,实际发送给AI的提示会变成:
[相关记忆回顾] - 我们之前决定在这个项目中使用JWT进行用户认证,令牌有效期设为7天。 - 用户模型包含字段:id, email, hashed_password, created_at。 - 认证相关的路由放在 `/api/v1/auth` 路径下。 用户的新问题:怎么实现登录接口?这样,AI在回答时就已经“记得”项目的技术选型和上下文了,给出的建议会直接贴合你的项目现状,而不是泛泛而谈。
4.2 工具手册:赋予AI记忆能力
除了自动机制,你也可以通过MCP工具主动管理记忆。在Claude Code会话中,输入/可以看到所有可用工具。
1.store_memory- 主动保存记忆当你明确想记录某个信息时使用。
- 用法:
/store_memory “记忆内容” - 示例:
/store_memory “本项目部署在AWS的us-east-1区域,使用的EC2实例类型是t3.large。” - 实操心得:对于非常明确、结构化的事实,主动存储比等待自动提取更准确。我习惯在做出重要技术决策后,立刻用这个命令记录下来。
2.recall_memory- 主动搜索记忆当你想让AI回忆某个特定主题时使用。
- 用法:
/recall_memory “搜索关键词” - 示例:
/recall_memory “关于数据库连接池的配置” - 底层原理:这个工具会执行一次混合检索。它首先将你的查询词向量化,在LanceDB中进行ANN(近似最近邻)向量搜索,得到语义上相似的候选记忆。同时,它也用查询词进行传统的BM25全文检索。最后,两个结果集通过一个加权分数(可配置)进行融合重排序,并应用“韦伯衰减”算法——越久远的记忆,其得分会被适度降低,除非它本身相关性极高。这模拟了人类的记忆特点:近期和高度相关的记忆更容易被想起。
3.search_vault- 查询个人知识库(需配置Obsidian)这是将个人笔记转化为AI可检索知识的关键。
- 前提:在
.env中设置OPENCLAWD_VAULT_PATH,并运行过openclawd-index --vault /your/path建立索引。 - 用法:
/search_vault “在笔记中搜索的概念” - 示例:你在笔记里记录过“微服务熔断器模式详解”。当你在代码中遇到相关问题,可以
/search_vault “熔断器 CircuitBreaker”,AI就能引用你笔记中的详细解释来回答,答案更个性化、更准确。
4.log_session- 保存会话总结在会话结束时,你可以命令AI将整个对话总结成一篇结构化的Markdown笔记,并自动保存到你的Obsidian Vault的指定位置(如Claude/Sessions/2024-05-27-调试API网关.md)。
- 用法:直接输入
/log_session。 - 价值:这相当于自动生成了高质量的工作日志,方便日后回顾。因为总结是由AI基于完整对话生成的,质量远高于自己事后回忆。
4.3 Obsidian Vault集成:打造第二大脑工作流
对于使用Obsidian做知识管理的开发者来说,这个集成是“杀手级”功能。它实现了双向流动:
- Obsidian → Claude Code:你的所有笔记(技术方案、学习心得、会议记录)经过索引后,成为AI的扩展知识库。AI的回答可以基于你的私人知识体系,而不仅仅是通用训练数据。
- Claude Code → Obsidian:每次有价值的对话都可以通过
log_session工具归档到Obsidian中,形成可搜索、可链接的会话记录。
设置自动化索引:为了让知识库保持最新,你需要定期运行索引。最佳实践是设置一个cron任务(Linux/macOS)或计划任务(Windows)。
# 编辑crontab crontab -e # 添加一行,每15分钟增量索引一次(假设虚拟环境在默认位置) */15 * * * * /home/your_username/.local/share/openclawd/venv/bin/openclawd-index --incremental >> /tmp/openclawd_index.log 2>&1--incremental参数让脚本只扫描和索引自上次以来新建或修改过的文件,速度非常快。
注意事项:首次全量索引可能较慢,取决于你的笔记库大小。建议在系统空闲时进行。另外,确保你的笔记是纯文本Markdown格式,复杂的插件或特殊语法可能无法被正确解析。
5. 高级配置与性能调优
5.1 记忆存储的精细化管理
默认配置适用于大多数场景,但针对大型或长期项目,你可能需要对记忆存储进行调优。
1. 范围(Scope)策略:默认范围是工作目录。但你可以在.env中配置更复杂的策略。例如,你可以设置范围基于git仓库的根目录,这样同一个代码库的不同分支可以共享记忆。
# 在钩子脚本或自定义逻辑中,你可以动态设置范围 export OPENCLAWD_SCOPE_STRATEGY=git_root # 假设我们未来支持这个选项目前,你可以通过修改钩子脚本(hooks/prompt_submit.py)来自定义范围计算逻辑,比如读取.git目录或一个特定的项目配置文件。
2. 记忆去重与衰减:系统内置了基于内容哈希的简单去重,防止完全相同的记忆被重复存储。更高级的“韦伯衰减(Weibull Decay)”评分在recall_memory的排序中生效。在.env中,你可以调整衰减参数:
# 记忆的“半衰期”系数,值越大,旧记忆衰减得越慢。默认1.0。 OPENCLAWD_MEMORY_DECAY_FACTOR=1.2 # 相关性权重 vs 新鲜度权重。默认0.7 vs 0.3。 OPENCLAWD_RECALL_SCORE_WEIGHTS=0.7,0.3如果你发现AI总是召回非常旧的、可能过时的记忆,可以适当调高OPENCLAWD_MEMORY_DECAY_FACTOR,让时间衰减效应更明显。
3. 清理陈旧记忆:目前项目没有提供自动清理工具。对于长期使用,LanceDB表可能会变大。你可以手动检查或编写脚本清理。记忆存储在OPENCLAWD_LANCEDB_PATH目录下的表中,可以通过LanceDB Python API连接并执行删除操作(例如,删除特定范围下或早于某个时间戳的记忆)。
5.2 嵌入模型与检索质量
检索的相关性直接取决于嵌入模型的质量和检索策略。
1. 更换嵌入模型:如果你对nomic-embed-text的效果不满意,或者需要更长的上下文,可以更换Ollama支持的其它嵌入模型。
- 修改
.env:OPENCLAWD_EMBED_MODEL=mxbai-embed-large - 然后运行
ollama pull mxbai-embed-large拉取新模型。 - 注意:更换模型后,已有的向量记忆将失效,因为不同模型生成的向量空间不同。你需要清空LanceDB数据库(删除
OPENCLAWD_LANCEDB_PATH目录)并重新开始,或者运行一个迁移脚本(如果未来社区提供)来重新向量化所有记忆。
2. 调整混合检索权重:混合检索(Hybrid Search)结合了向量搜索的“语义理解”和BM25的“关键词匹配”。你可以在.env中调整它们的权重,以适应不同类型的查询。
# 向量搜索得分权重,BM25得分权重 = 1 - VECTOR_WEIGHT OPENCLAWD_HYBRID_SEARCH_VECTOR_WEIGHT=0.6- 如果查询多是具体名词、API名称(如“
axios的timeout配置”),可以调低VECTOR_WEIGHT(如0.4),让关键词匹配占主导。 - 如果查询多是概念性、描述性问题(如“如何设计一个可扩展的缓存层”),可以调高
VECTOR_WEIGHT(如0.8),让语义搜索占主导。
5.3 无损消息存档(LCM)的配置与使用
这是从lossless-claw移植的核心功能之一(在v1.1计划中)。它旨在解决“Claude Code压缩了消息,但我后来又想看”的问题。
工作原理:
- 系统在后台将所有消息(用户输入、AI回复、工具调用及结果)存入一个SQLite数据库。
- 每条消息都有一个唯一ID,并可以引用其“父消息”(形成DAG)。
- 当Claude Code触发
PostCompact钩子时,系统不仅提取记忆,还会为被移除的消息块生成一个简洁的摘要,并作为一条新的“摘要消息”存入数据库,链接到被摘要的原始消息。 - 未来,将提供
lcm_grep(在存档中搜索)、lcm_expand(展开某个摘要查看原始消息)等工具,让AI能主动查询“被遗忘”的细节。
配置与数据位置:无损消息存档的数据库默认位于~/.local/share/openclawd/sessions.db。你可以通过环境变量OPENCLAWD_SESSION_DB_PATH修改其位置。由于是SQLite,你可以用任何SQLite浏览器(如DB Browser for SQLite)打开查看表结构(messages,summaries,edges等)和内容。
使用场景想象:假设你三天前和Claude Code进行了一次长达50轮的复杂调试。今天,你在修改相关代码时遇到了一个似曾相识的错误。你可以让AI使用/lcm_grep “错误信息片段”在历史存档中搜索。AI找到相关的历史会话和具体轮次后,可以使用/lcm_expand [message_id]将当时的完整对话上下文拉取回来,结合当前问题给出更精准的建议。这彻底打破了会话边界。
6. 常见问题与故障排查实录
在实际部署和使用中,你可能会遇到以下问题。这里记录了我踩过的坑和解决方案。
6.1 安装与连接问题
问题1:运行setup.sh后,Claude Code中看不到/store_memory等工具。
- 排查步骤:
- 检查MCP服务器列表:在终端执行
claude mcp list。查看openclawdcode是否在列表中,状态是否为connected。 - 检查服务器日志:MCP服务器启动时可能会有错误。尝试手动启动它来查看输出:
观察是否有导入错误、连接Ollama失败等提示。最常见的错误是Ollama服务未启动或嵌入模型未下载。cd ~/.local/share/openclawd source venv/bin/activate python -m openclawdcode.server - 验证Ollama:运行
ollama list确认nomic-embed-text模型存在。运行curl http://localhost:11434/api/embeddings测试Ollama API是否可达。
- 检查MCP服务器列表:在终端执行
- 解决方案:
- 如果Ollama未启动:
ollama serve(注意这会阻塞终端,通常Ollama应作为服务运行)。 - 如果模型不存在:
ollama pull nomic-embed-text。 - 如果手动启动服务器报Python依赖错误,回到虚拟环境重新安装:
pip install --force-reinstall /path/to/OpenClawdCode。
- 如果Ollama未启动:
问题2:钩子(Hooks)没有生效,AI回复时没有显示“相关记忆回顾”。
- 排查步骤:
- 检查
settings.json:确认~/.claude/settings.json中的hooks配置路径是否正确。特别是command的路径,必须指向虚拟环境中的Python解释器绝对路径。 - 检查钩子脚本权限:确保钩子脚本(如
prompt_submit.py)有可执行权限,或者通过Python模块方式调用(如-m openclawdcode.hooks.prompt_submit)是正确配置的。 - 查看Claude Code日志:Claude Code桌面版通常有日志文件。在macOS上可能在
~/Library/Logs/Claude/,在Linux上可能在~/.config/Claude/logs/。查找包含hook或UserPromptSubmit的错误信息。 - 手动测试钩子:在项目目录下,手动运行钩子命令,看是否有输出或错误:
cd /your/project/path ~/.local/share/openclawd/venv/bin/python -m openclawdcode.hooks.prompt_submit # 它可能会等待标准输入,输入一些JSON数据模拟Claude Code的调用。
- 检查
- 解决方案:
- 最可能的原因是路径错误。仔细核对
settings.json中command和args的每一个字符。 - 确保你在运行Claude Code时,当前工作目录(cwd)是钩子配置中预期的目录。钩子脚本依赖
cwd来确定记忆范围。
- 最可能的原因是路径错误。仔细核对
6.2 运行时功能异常
问题3:AI回忆的记忆完全不相关,或者总是召回很久以前的记忆。
- 原因分析:
- 范围(Scope)不匹配:记忆的存储范围和当前查询的范围不一致。比如记忆是在
/project/A下存储的,但你在/project/B下查询。 - 嵌入模型不适合你的领域:
nomic-embed-text是通用模型,如果你的对话全是极其专业的领域术语或代码,可能嵌入效果不佳。 - 混合搜索权重不合理:可能关键词匹配权重太低,导致一些精确的技术术语没有被优先检索。
- 缺乏记忆衰减:旧记忆没有被有效降权。
- 范围(Scope)不匹配:记忆的存储范围和当前查询的范围不一致。比如记忆是在
- 解决方案:
- 首先确认你是在正确的项目目录下工作。
- 尝试使用
/recall_memory工具进行主动搜索,观察结果。如果主动搜索也不相关,问题可能出在检索环节。 - 调整
.env中的OPENCLAWD_HYBRID_SEARCH_VECTOR_WEIGHT和OPENCLAWD_MEMORY_DECAY_FACTOR参数,进行A/B测试。 - 考虑为你的专业领域微调一个嵌入模型(高级用法),或者尝试其他预训练模型。
问题4:自动记忆提取抓取了太多无用信息,把对话中的闲聊也存进去了。
- 原因分析:默认的记忆提取模型可能不够精确,或者提取的阈值设置得太低。
- 解决方案:
- 目前项目使用一个轻量级模型进行提取。你可以在
.env中指定一个更擅长指令遵循和内容分析的模型进行提取,例如OPENCLAWD_EXTRACTION_MODEL=llama3.2:3b(需要更强大的GPU/CPU)。 - 未来版本可能会提供提取置信度阈值配置,允许你过滤掉低置信度的记忆。
- 养成使用
/store_memory主动记录关键信息的习惯,减少对自动提取的依赖。
- 目前项目使用一个轻量级模型进行提取。你可以在
问题5:索引Obsidian Vault速度很慢,或者卡住。
- 原因分析:
- Vault 过大,包含成千上万个文件。
- 包含了非文本文件(如图片、PDF),Ollama嵌入模型无法处理。
- 网络问题导致连接Ollama服务超时。
- 解决方案:
- 首次索引使用
--incremental参数可能不会加快速度,因为它需要先建立基础索引。首次全量索引时,耐心等待或放在后台运行。 - 在
openclawd-index命令中增加--exclude参数,排除assets/,attachments/等目录。 - 确保Ollama服务运行稳定,并且
OPENCLAWD_OLLAMA_URL设置正确。可以尝试调大Ollama服务的超时设置(在Ollama启动参数或配置文件中)。
- 首次索引使用
6.3 性能与资源优化
问题6:每次提问前感觉有轻微的延迟。
- 原因分析:这是
UserPromptSubmit钩子在执行记忆检索。延迟主要来自:1)网络请求Ollama服务生成查询向量;2)LanceDB进行向量搜索。 - 解决方案:
- 确保Ollama服务运行在本地,网络延迟极低。
- 如果LanceDB数据库非常大(>10万条记忆),考虑定期归档或清理非常陈旧的记忆。
- 可以调低每次召回的记忆数量(未来可能在配置中提供
OPENCLAWD_RECALL_LIMIT),默认5条可能减少到3条。 - 这是功能性和即时性的权衡,轻微的延迟(通常100-300毫秒)对于获得上下文增强来说是值得的。
问题7:磁盘空间占用增长较快。
- 原因分析:主要占用来自:1)Ollama模型文件(
nomic-embed-text约几百MB);2)LanceDB向量数据;3)SQLite消息存档。 - 解决方案:
- LanceDB和SQLite数据库都是本地文件,可以定期备份后清理。例如,可以编写一个脚本,每月归档一次超过6个月的记忆和会话数据。
- 对于SQLite消息存档,如果不需要极其详细的历史,可以考虑只保留消息的元数据和摘要,而不存储完整的、冗长的AI回复内容(未来版本可能提供此配置)。
7. 迁移、备份与社区贡献
7.1 从OpenClaw的memory-lancedb-pro迁移
如果你曾是OpenClaw用户,并且有一个存满记忆的LanceDB数据库,OpenClawdCode提供了一个迁移脚本,帮助你尽可能保留这些记忆。
迁移步骤:
- 找到你原有OpenClaw插件中LanceDB数据库的路径。通常可能在OpenClaw的配置目录下。
- 运行迁移脚本(务必先进行试运行):
cd /path/to/OpenClawdCode source ~/.local/share/openclawd/venv/bin/activate python scripts/migrate_claudia.py --source /path/to/your/old/lancedb --table memories --dry-run--dry-run参数会模拟迁移过程,显示将要执行的操作和可能的问题,而不会实际写入数据。 - 检查试运行输出,确认无误后,移除
--dry-run参数执行真实迁移。python scripts/migrate_claudia.py --source /path/to/your/old/lancedb --table memories
注意事项:
- 模式差异:两个项目的记忆表结构可能不完全相同。迁移脚本会处理常见的字段映射,但一些自定义字段可能会丢失。
- 向量重新计算:如果两个项目使用的嵌入模型不同,迁移脚本不会重新计算向量。这意味着迁移过来的记忆,在OpenClawdCode中使用新的嵌入模型进行搜索时,相关性可能会下降。对于最重要的记忆,建议在迁移后,在OpenClawdCode中手动用
/store_memory重新存储一次。
7.2 数据备份与恢复
你的记忆和会话记录是宝贵的知识资产,定期备份至关重要。
备份:由于所有数据都是本地文件,备份非常简单:
# 备份整个OpenClawdCode数据目录 tar -czf openclawd_backup_$(date +%Y%m%d).tar.gz ~/.local/share/openclawd/ # 同时备份配置文件 cp ~/.config/openclawd/.env /your/backup/path/恢复:
- 安装OpenClawdCode(全新安装)。
- 停止Claude Code和相关服务。
- 解压备份文件到
~/.local/share/openclawd/。 - 恢复配置文件
~/.config/openclawd/.env。 - 重启Claude Code。
7.3 参与社区贡献
OpenClawdCode是一个社区驱动项目,源自对两个优秀插件功能的怀念。项目的健康发展离不开使用者的反馈和贡献。
如何贡献:
- 反馈问题:如果你遇到bug,或者有功能建议,请去GitHub仓库的Issues页面详细描述。提供你的环境信息、复现步骤和期望的结果。
- 分享用例:在项目的Discussions板块,分享你是如何在具体项目中使用的,遇到了哪些惊喜或挑战。你的用例能启发其他人。
- 贡献代码:查看
tasks/todo.md中的路线图,选择你感兴趣的任务。即使是文档改进、增加测试用例也是极好的贡献。 - 适配其他LLM/助手:MCP协议是开放的。虽然本项目为Claude Code设计,但其核心的MCP服务器、记忆逻辑、钩子机制,理论上可以适配其他支持MCP的AI工作台(如Cursor的新版本)。如果你进行了适配,欢迎提交PR或分享经验。
当前的重点开发方向(基于社区反馈):
- 完善无损消息存档(LCM)工具:实现
lcm_grep,lcm_expand等工具,让查询历史会话变得像在代码库中grep一样方便。 - 增强记忆提取模型:提供更多模型选择,并可能集成更精准的提取策略。
- 开发Web管理界面:一个简单的本地Web UI,用于浏览、搜索、编辑和删除记忆,比纯命令行更友好。
- 提供更多存储后端:除了LanceDB,考虑支持ChromaDB、PostgreSQL(pgvector)等,满足不同用户的需求。
这个项目的生命力在于解决真实开发者的痛点。如果你也厌倦了AI助手的“金鱼记忆”,欢迎一起来让它变得更聪明、更贴心。
