|
| 1 | +--- |
| 2 | +title: 用 Vault 系统构建 AI 时代的跨项目知识库 |
| 3 | +date: 2026-04-10 |
| 4 | +tags: [HagiCode, Vault, AI, 知识管理, 系统设计] |
| 5 | +--- |
| 6 | + |
| 7 | +## 用 Vault 系统构建 AI 时代的跨项目知识库 |
| 8 | + |
| 9 | +> 临摹项目学习法正在成为主流,只是学习资料分散、上下文断裂的痛点让 AI 助手难以发挥最大价值。本文介绍 HagiCode 项目的 Vault 系统设计——通过统一的存储抽象层,让 AI 助手能够理解和访问所有学习资源,实现真正的跨项目知识复用。 |
| 10 | +
|
| 11 | +## 背景 |
| 12 | + |
| 13 | +其实,在 AI 时代,我们学习新技术的方式正在悄然改变。传统的读书、看视频固然重要,但"临摹项目"——深入研究和学习优秀开源项目的代码、架构和设计模式——确实越来越高效。直接运行和修改高质量的开源项目,能让你最快理解真实世界的工程实践。 |
| 14 | + |
| 15 | +只是这种方式也带来了新的挑战。 |
| 16 | + |
| 17 | +**学习资料太分散**。笔记可能在 Obsidian 里,代码仓库散落在各个文件夹,AI 助手的对话历史又是一个独立的数据孤岛。每次需要 AI 帮助分析某个项目时,都得手动复制代码片段、整理上下文,过程相当繁琐。 |
| 18 | + |
| 19 | +**上下文经常断掉**。AI 助手无法直接访问本地学习资源,每次对话都得重新提供背景信息。临摹的代码仓库更新快,手动同步容易出错。更糟的是,多个学习项目之间难以共享知识——在 A 项目中学到的设计模式,AI 处理 B 项目时完全不知道。 |
| 20 | + |
| 21 | +这些问题的本质是"数据孤岛"。如果能有一个统一的存储抽象层,让 AI 助手能够理解和访问所有学习资源,问题就迎刃而解了。 |
| 22 | + |
| 23 | +为了解决这些痛点,我们在开发 HagiCode 时做了一个关键的设计决策:构建一个 Vault 系统作为统一的知识存储抽象层。这个决定带来的变化,可能比想象的还要大——稍后具体说。 |
| 24 | + |
| 25 | +## 关于 HagiCode |
| 26 | + |
| 27 | +本文分享的方案来自在 [HagiCode](https://hagicode.com) 项目中的实践经验。HagiCode 是一个基于 OpenSpec 工作流的 AI 代码助手,它的核心理念是让 AI 不仅会"说",更会"做"——能够直接操作代码仓库、执行命令、运行测试。GitHub:[github.com/HagiCode-org/site](https://github.com/HagiCode-org/site) |
| 28 | + |
| 29 | +在开发过程中,我们发现 AI 助手需要频繁访问用户的各类学习资源:代码仓库、笔记文档、配置文件等。如果每次都要用户手动提供,体验就太糟糕了。这促使设计了 Vault 系统。 |
| 30 | + |
| 31 | +## 核心设计 |
| 32 | + |
| 33 | +### 多类型支持 |
| 34 | + |
| 35 | +HagiCode 的 Vault 系统支持四种类型,分别对应不同的使用场景: |
| 36 | + |
| 37 | +| 类型 | 用途 | 典型场景 | |
| 38 | +|------|------|----------| |
| 39 | +| `folder` | 通用文件夹类型 | 临时学习资料、草稿 | |
| 40 | +| `coderef` | 专门用于临摹代码项目 | 系统化学习某个开源项目 | |
| 41 | +| `obsidian` | 与 Obsidian 笔记软件集成 | 现有笔记库的复用 | |
| 42 | +| `system-managed` | 系统自动管理 | 项目配置、提示词模板等 | |
| 43 | + |
| 44 | +其中 `coderef` 类型是 HagiCode 中最常用的,它为临摹代码项目提供了标准化的目录结构和 AI 可读的元数据描述。为什么要专门设计这个类型?因为临摹一个开源项目不是简单的"下载代码",需要同时管理代码本身、学习笔记、配置文件等多种内容,`coderef` 把这些都规范好了。 |
| 45 | + |
| 46 | +### 持久化存储机制 |
| 47 | + |
| 48 | +Vault 的注册表以 JSON 格式持久化存储到文件系统: |
| 49 | + |
| 50 | +```csharp |
| 51 | +_registryFilePath = Path.Combine(absoluteDataDir, "personal-data", "vaults", "registry.json"); |
| 52 | +``` |
| 53 | + |
| 54 | +这个设计看似简单,实则经过深思熟虑: |
| 55 | + |
| 56 | +**简单可靠**。JSON 格式人类可读,便于调试和手动修改。当系统出现问题时,可以直接打开文件查看状态,甚至手动修复——这在开发阶段特别有用。 |
| 57 | + |
| 58 | +**降低依赖**。文件系统存储避免了数据库的复杂性。不需要额外安装和配置数据库服务,降低了系统复杂度和维护成本。 |
| 59 | + |
| 60 | +**并发安全**。使用 `SemaphoreSlim` 确保多线程安全。在 AI 代码助手的场景下,可能会有多个操作同时访问 vault 注册表,需要做好并发控制。 |
| 61 | + |
| 62 | +### AI 上下文集成 |
| 63 | + |
| 64 | +系统的核心能力在于能够自动将 vault 信息注入到 AI 提案的上下文中: |
| 65 | + |
| 66 | +```typescript |
| 67 | +export function buildTargetVaultsText( |
| 68 | + vaults: VaultForText[], |
| 69 | + template: VaultPromptTemplate = DEFAULT_VAULT_PROMPT_TEMPLATE, |
| 70 | +): string { |
| 71 | + const readOnlyVaults = vaults.filter((vault) => vault.accessType === 'read'); |
| 72 | + const editableVaults = vaults.filter((vault) => vault.accessType === 'write'); |
| 73 | + |
| 74 | + const sections = [ |
| 75 | + buildVaultSection(readOnlyVaults, template.reference), |
| 76 | + buildVaultSection(editableVaults, template.editable), |
| 77 | + ].filter(Boolean); |
| 78 | + |
| 79 | + return `\n\n### ${template.heading}\n\n${sections.join('\n')}`; |
| 80 | +} |
| 81 | +``` |
| 82 | + |
| 83 | +这样 AI 助手就能自动理解可用的学习资源,无需用户每次手动提供上下文。这个设计让 HagiCode 的体验变得特别自然——告诉 AI "帮我分析 React 的并发渲染",AI 就能自动找到之前注册的 React 学习 vault,而不是一遍遍贴代码。 |
| 84 | + |
| 85 | +### 访问控制机制 |
| 86 | + |
| 87 | +系统将 vault 分为两种访问类型: |
| 88 | + |
| 89 | +- **reference(只读)**:AI 仅用于分析和理解,不能修改内容 |
| 90 | +- **editable(可编辑)**:AI 可以根据任务需要修改内容 |
| 91 | + |
| 92 | +这种区分让 AI 知道哪些内容是"只读参考",哪些是"可以动手改的",避免了误操作风险。比如注册了一个开源项目的 vault 作为学习材料,肯定不希望 AI 随手修改里面的代码——那就标记为 `reference`。但如果是自己的项目 vault,就可以标记为 `editable`,让 AI 帮着改代码。 |
| 93 | + |
| 94 | +## 实践指南 |
| 95 | + |
| 96 | +### CodeRef Vault 的标准化结构 |
| 97 | + |
| 98 | +对于 coderef 类型的 vault,系统提供了一套标准化的目录结构: |
| 99 | + |
| 100 | +``` |
| 101 | +my-coderef-vault/ |
| 102 | +├── index.yaml # vault 元数据描述 |
| 103 | +├── AGENTS.md # AI 助手的操作指南 |
| 104 | +├── docs/ # 存放学习笔记和文档 |
| 105 | +└── repos/ # 通过 Git 子模块管理临摹的代码仓库 |
| 106 | +``` |
| 107 | + |
| 108 | +这个结构的设计理念是什么? |
| 109 | + |
| 110 | +**docs/** 存放学习笔记,用 Markdown 格式记录对代码的理解、架构分析、踩坑经验。这些笔记不仅自己看,AI 也能读懂——在处理相关任务时会自动参考。 |
| 111 | + |
| 112 | +**repos/** 通过 Git 子模块管理临摹的仓库,而不是直接复制代码。这样做有两个好处:一是保持与上游同步,一个 `git submodule update` 就能拿到最新代码;二是节省空间,多个 vault 可以引用同一个仓库的不同版本。 |
| 113 | + |
| 114 | +**index.yaml** 包含 vault 的元数据,让 AI 助手快速理解用途和内容。相当于给 vault 写了个"自我介绍",AI 第一次见到就知道这是干嘛的。 |
| 115 | + |
| 116 | +**AGENTS.md** 是专门写给 AI 助手看的指南,说明如何处理 vault 中的内容。可以在这里告诉 AI:"分析这个项目时重点关注性能优化相关的代码"或者"不要修改测试文件"。 |
| 117 | + |
| 118 | +### 创建和使用 Vault |
| 119 | + |
| 120 | +创建一个 CodeRef vault 很简单: |
| 121 | + |
| 122 | +```typescript |
| 123 | +const createCodeRefVault = async () => { |
| 124 | + const response = await VaultService.postApiVaults({ |
| 125 | + requestBody: { |
| 126 | + name: "React Learning Vault", |
| 127 | + type: "coderef", |
| 128 | + physicalPath: "/Users/developer/vaults/react-learning", |
| 129 | + gitUrl: "https://github.com/facebook/react.git" |
| 130 | + } |
| 131 | + }); |
| 132 | + |
| 133 | + // 系统会自动: |
| 134 | + // 1. 克隆 React 仓库到 vault/repos/react |
| 135 | + // 2. 创建 docs/ 目录用于笔记 |
| 136 | + // 3. 生成 index.yaml 元数据 |
| 137 | + // 4. 创建 AGENTS.md 指南文件 |
| 138 | + |
| 139 | + return response; |
| 140 | +}; |
| 141 | +``` |
| 142 | + |
| 143 | +然后在 AI 提案中引用这个 vault: |
| 144 | + |
| 145 | +```typescript |
| 146 | +const proposal = composeProposalChiefComplaint({ |
| 147 | + chiefComplaint: "帮我分析 React 的并发渲染机制", |
| 148 | + repositories: [ |
| 149 | + { id: "react", gitUrl: "https://github.com/facebook/react.git" } |
| 150 | + ], |
| 151 | + vaults: [ |
| 152 | + { |
| 153 | + id: "react-learning", |
| 154 | + name: "React Learning Vault", |
| 155 | + type: "coderef", |
| 156 | + physicalPath: "/vaults/react-learning", |
| 157 | + accessType: "read" // AI 只能读取,不能修改 |
| 158 | + } |
| 159 | + ], |
| 160 | + quickRequestText: "重点关注 fiber 架构和 scheduler 实现" |
| 161 | +}); |
| 162 | +``` |
| 163 | + |
| 164 | +### 典型使用场景 |
| 165 | + |
| 166 | +**场景一:系统化学习开源项目** |
| 167 | + |
| 168 | +创建一个 CodeRef vault,通过 Git 子模块管理目标仓库,在 `docs/` 目录记录学习笔记。AI 可以同时访问代码和笔记,提供更精准的分析。在学习某个模块时写的笔记,AI 后续分析相关代码时会自动参考——就像有个"助手"记住了之前的思考。 |
| 169 | + |
| 170 | +**场景二:复用 Obsidian 笔记库** |
| 171 | + |
| 172 | +如果已经在用 Obsidian 管理笔记,直接把现有的 vault 注册到 HagiCode 中就行。AI 可以直接访问知识库,无需手动复制粘贴。这个功能特别实用,很多人都有积累多年的笔记库,接入之后 AI 就能"读"懂知识体系。 |
| 173 | + |
| 174 | +**场景三:跨项目知识复用** |
| 175 | + |
| 176 | +多个 AI 提案可以引用同一个 vault,实现知识的跨项目复用。比如创建了一个"设计模式学习 vault",里面记录了各种设计模式的笔记和代码示例。无论在分析哪个项目,AI 都能参考这个 vault 中的内容——知识不用重复积累。 |
| 177 | + |
| 178 | +### 路径安全机制 |
| 179 | + |
| 180 | +系统严格校验路径,防止路径穿越攻击: |
| 181 | + |
| 182 | +```csharp |
| 183 | +private static string ResolveFilePath(string vaultRoot, string relativePath) |
| 184 | +{ |
| 185 | + var rootPath = EnsureTrailingSeparator(Path.GetFullPath(vaultRoot)); |
| 186 | + var combinedPath = Path.GetFullPath(Path.Combine(rootPath, relativePath)); |
| 187 | + if (!combinedPath.StartsWith(rootPath, StringComparison.OrdinalIgnoreCase)) |
| 188 | + { |
| 189 | + throw new BusinessException(VaultRelativePathTraversalCode, |
| 190 | + "Vault file paths must stay inside the registered vault root."); |
| 191 | + } |
| 192 | + return combinedPath; |
| 193 | +} |
| 194 | +``` |
| 195 | + |
| 196 | +这确保了所有文件操作都在 vault 的根目录范围内,防止恶意路径访问。安全这块不能马虎,AI 助手要操作文件系统,必须把边界划清楚。 |
| 197 | + |
| 198 | +## 注意事项 |
| 199 | + |
| 200 | +使用 HagiCode Vault 系统时,有几点需要特别注意: |
| 201 | + |
| 202 | +1. **路径安全**:确保自定义路径在允许的范围内,否则系统会拒绝操作。这是为了防止误操作和潜在的安全风险。 |
| 203 | + |
| 204 | +2. **Git 子模块管理**:CodeRef vault 推荐使用 Git 子模块而非直接复制代码。好处前面说过——保持同步、节省空间。只是子模块有自己的使用方式,第一次使用可能需要熟悉一下。 |
| 205 | + |
| 206 | +3. **文件预览限制**:系统限制文件大小(256KB)和数量(500个),超大文件需分批处理。这个限制是为了性能考虑,如果遇到超大文件,可以手动拆分或者用其他方式处理。 |
| 207 | + |
| 208 | +4. **诊断信息**:创建 vault 会返回诊断信息,失败时可用于调试。遇到问题时先看诊断信息,大部分情况下都能找到线索。 |
| 209 | + |
| 210 | +## 总结 |
| 211 | + |
| 212 | +HagiCode 的 Vault 系统本质上是在解决一个简单但深刻的问题:如何让 AI 助手理解和使用本地知识资源。 |
| 213 | + |
| 214 | +通过统一的存储抽象层、标准化的目录结构、自动化的上下文注入,实现了"一次注册,处处复用"的知识管理方式。创建一个 vault 后,无论是学习笔记、代码仓库还是文档资料,AI 都能自动访问和理解。 |
| 215 | + |
| 216 | +这种设计带来的体验提升是明显的。不再需要手动复制代码片段、重复解释背景信息——AI 助手就像一个真正了解项目情况的同事,能够基于已有知识提供更有价值的帮助。 |
| 217 | + |
| 218 | +本文分享的 Vault 系统,正是开发 HagiCode 过程中实际踩坑、实际优化出来的方案。如果觉得这套设计有价值,说明工程实力还不错——那么 HagiCode 本身也值得关注一下。 |
| 219 | + |
| 220 | +## 参考资料 |
| 221 | + |
| 222 | +- HagiCode GitHub:[github.com/HagiCode-org/site](https://github.com/HagiCode-org/site) |
| 223 | +- HagiCode 官网:[hagicode.com](https://hagicode.com) |
| 224 | +- 30 分钟实战演示:[www.bilibili.com/video/BV1pirZBuEzq/](https://www.bilibili.com/video/BV1pirZBuEzq/) |
| 225 | +- Docker Compose 安装指南:[docs.hagicode.com/installation/docker-compose](https://docs.hagicode.com/installation/docker-compose) |
| 226 | +- Desktop 桌面端快速安装:[hagicode.com/desktop/](https://hagicode.com/desktop/) |
| 227 | + |
| 228 | +如果本文对你有帮助: |
| 229 | +- 来 GitHub 给个 Star:[github.com/HagiCode-org/site](https://github.com/HagiCode-org/site) |
| 230 | +- 访问官网了解更多:[hagicode.com](https://hagicode.com) |
| 231 | +- 观看实战演示视频:[www.bilibili.com/video/BV1pirZBuEzq/](https://www.bilibili.com/video/BV1pirZBuEzq/) |
| 232 | +- 一键安装体验:[docs.hagicode.com/installation/docker-compose](https://docs.hagicode.com/installation/docker-compose) |
| 233 | +- Desktop 桌面端快速安装:[hagicode.com/desktop/](https://hagicode.com/desktop/) |
| 234 | + |
| 235 | +公测已开始,欢迎安装体验。 |
| 236 | + |
| 237 | +## 版权说明 |
| 238 | + |
| 239 | +感谢您的阅读,如果您觉得本文有用,欢迎点赞、收藏和分享支持。 |
| 240 | +本内容采用人工智能辅助协作,最终内容由作者审核并确认。 |
| 241 | +- 本文作者: [newbe36524](https://www.newbe.pro) |
| 242 | +- 原文链接: [https://docs.hagicode.com/blog/2026-04-10-vault-system-ai-knowledge-base/](https://docs.hagicode.com/blog/2026-04-10-vault-system-ai-knowledge-base/) |
| 243 | +- 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处! |
0 commit comments