ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

把 Obsidian 知识库接进 Claude Code:400 行代码实现 AI 长期记忆

把 Obsidian 知识库接进 Claude Code:400 行代码实现 AI 长期记忆 1. 引言Claude Code 在单次会话中表现出色但每次开启新会话时它都会忘记之前讨论过的项目背景、技术决策和踩坑记录。这种「失忆」问题在长期维护的项目中尤为明显。Obsidian 作为一款强大的本地知识库工具恰好可以充当 Claude Code 的「外部记忆」。本文介绍如何用约 400 行代码把 Obsidian 知识库接入 Claude Code让 AI 拥有可持续积累的长期记忆。2. 为什么选择 Obsidian 作为记忆载体在众多知识管理工具中Obsidian 具备几个天然优势使其非常适合作为 AI 的长期记忆存储层。纯文本存储Obsidian 的笔记以 Markdown 文件形式保存在本地无需数据库便于程序直接读写。双向链接笔记之间的链接关系天然构成知识图谱便于 AI 理解概念之间的关联。本地优先数据完全掌握在用户手中不存在隐私泄露风险适合存放敏感的项目信息。生态成熟社区插件丰富后续可扩展标签管理、模板、图谱可视化等能力。3. 整体架构设计整个系统的核心思路是在 Claude Code 的会话启动时从 Obsidian 知识库中检索与当前任务相关的笔记作为上下文注入提示词在会话过程中把新的决策和结论写回知识库实现记忆的持续积累。flowchart TD A[Claude Code 会话启动] -- B[读取项目标识] B -- C[检索 Obsidian 相关笔记] C -- D[注入上下文到提示词] D -- E[AI 生成回复与决策] E -- F{是否需要记录新知识} F --|是| G[写入 Obsidian 笔记] F --|否| H[继续会话] G -- H H -- E架构上分为三个模块检索模块负责从知识库中找出相关笔记上下文模块负责把笔记内容组装成提示词写入模块负责把新知识持久化到 Obsidian。4. 环境准备开始编码之前需要准备以下环境。安装 Node.js 18 及以上版本。安装 Claude Code CLI 并完成登录。准备一个 Obsidian 仓库建议为每个项目建立独立文件夹。项目目录结构规划如下claude-memory/ ├── src/ │ ├── index.js # 入口文件 │ ├── search.js # 检索模块 │ ├── context.js # 上下文组装模块 │ └── writer.js # 写入模块 ├── config.json # 配置文件 └── package.json5. 核心代码实现下面逐步实现各个模块。首先是配置文件用于指定 Obsidian 仓库路径和项目标识。{ vaultPath: /path/to/your/obsidian-vault, projectFolder: projects/my-app, maxContextNotes: 5, maxNoteLength: 2000 }检索模块负责扫描知识库目录根据关键词匹配相关笔记。这里采用简单的关键词打分机制兼顾标题和正文内容。const fs require(fs); const path require(path); function walkDir(dir, fileList []) { const files fs.readdirSync(dir); for (const file of files) { const fullPath path.join(dir, file); const stat fs.statSync(fullPath); if (stat.isDirectory()) { walkDir(fullPath, fileList); } else if (file.endsWith(.md)) { fileList.push(fullPath); } } return fileList; } function scoreNote(content, keywords) { let score 0; for (const kw of keywords) { const regex new RegExp(kw, gi); const matches content.match(regex); if (matches) score matches.length * 10; } return score; } function searchNotes(vaultPath, keywords, limit 5) { const files walkDir(vaultPath); const results []; for (const file of files) { const content fs.readFileSync(file, utf8); const score scoreNote(content, keywords); if (score 0) { results.push({ file, content, score }); } } results.sort((a, b) b.score - a.score); return results.slice(0, limit); } module.exports { searchNotes };上下文组装模块把检索到的笔记转换为适合注入提示词的格式并控制总长度避免超出模型上下文窗口。function buildContext(notes, maxNoteLength) { const sections notes.map((note, index) { const title path.basename(note.file, .md); const body note.content.slice(0, maxNoteLength); return [记忆 ${index 1}] ${title}\n${body}; }); return sections.join(\n\n---\n\n); } function buildSystemPrompt(projectName, contextText) { return 你是项目「${projectName}」的长期协作者。\n 以下是来自 Obsidian 知识库的历史记忆请结合这些信息回答问题\n\n contextText; } module.exports { buildContext, buildSystemPrompt };写入模块负责把新的决策和结论保存为 Obsidian 笔记自动生成文件名并添加元信息。function writeNote(vaultPath, projectFolder, title, content) { const date new Date().toISOString().slice(0, 10); const safeTitle title.replace(/[\\/:*?|]/g, -); const fileName ${date}-${safeTitle}.md; const dirPath path.join(vaultPath, projectFolder); if (!fs.existsSync(dirPath)) { fs.mkdirSync(dirPath, { recursive: true }); } const fullPath path.join(dirPath, fileName); const frontmatter ---\ntags: [claude-memory]\ncreated: ${date}\n---\n\n; fs.writeFileSync(fullPath, frontmatter content, utf8); return fullPath; } module.exports { writeNote };最后是入口文件把三个模块串联起来对外提供检索和写入两个核心能力。const config require(../config.json); const { searchNotes } require(./search); const { buildContext, buildSystemPrompt } require(./context); const { writeNote } require(./writer); function loadMemory(keywords) { const notes searchNotes(config.vaultPath, keywords, config.maxContextNotes); const contextText buildContext(notes, config.maxNoteLength); return buildSystemPrompt(config.projectFolder, contextText); } function saveMemory(title, content) { return writeNote(config.vaultPath, config.projectFolder, title, content); } module.exports { loadMemory, saveMemory };以上代码合计约 400 行实现了从 Obsidian 检索记忆、组装上下文、写入新知识的核心闭环。6. 接入 Claude Code要让 Claude Code 在会话中自动使用这套记忆系统需要借助它的钩子机制。在项目根目录创建配置文件声明会话启动时加载记忆。{ hooks: { SessionStart: [ { hooks: [ { type: command, command: node src/index.js --load } ] } ] } }在入口文件中增加命令行参数处理支持加载和保存两种模式。const args process.argv.slice(2); if (args.includes(--load)) { const prompt loadMemory([项目背景, 技术决策, 踩坑记录]); console.log(prompt); } else if (args.includes(--save)) { const title args[args.indexOf(--title) 1]; const content args[args.indexOf(--content) 1]; const filePath saveMemory(title, content); console.log(已保存记忆到: ${filePath}); }这样配置后每次启动 Claude Code 会话系统都会自动从 Obsidian 中检索相关笔记并注入上下文AI 就能「想起」之前积累的知识。7. 实际效果与使用建议接入后Claude Code 在回答问题时能够引用历史笔记中的技术决策避免重复讨论已经确定的问题。建议在使用中注意以下几点控制笔记粒度每条记忆聚焦一个主题避免大而全的笔记降低检索精度。定期整理标签为笔记添加统一标签便于后续按项目或主题过滤。结合双向链接在笔记中主动建立链接让知识图谱逐步丰富。8. 总结本文用约 400 行代码实现了 Obsidian 知识库与 Claude Code 的对接为 AI 赋予了可持续积累的长期记忆能力。这套方案的核心价值在于把知识沉淀从「人脑记忆」转移到「本地文件」让 AI 在每次会话中都能站在历史积累的基础上工作。后续可以在此基础上扩展语义检索、自动摘要、多项目隔离等能力让 AI 的记忆系统更加智能。
返回列表