企业知识库构建实战:Obsidian + Git + Blog 工作流
写在前面:这篇文章源于 2026-03 月的真实项目需求。我们在部署 OpenClaw3 到 K8s 集群时,遇到了知识管理的核心问题:如何让 AI Agent 在会话重启后保持上下文连续性?如何隔离个人记忆和工作记忆?如何实现知识的版本控制和协作共享?本文是我作为项目架构师的完整设计思路和实战记录。
一、背景:为什么需要企业知识库?
1.1 真实场景
场景 1:AI Agent 会话中断后的上下文丢失
1 2 3 4
| 2026-03-10 21:00 - 用户 John 开始部署 OpenClaw 到 K8s 2026-03-10 21:30 - 网络中断,会话结束 2026-03-10 22:00 - John 重新连接 ❌ Agent: "你好,有什么可以帮你?" ← 完全不记得之前的事
|
场景 2:多用户记忆混淆
1 2 3
| 用户 A: "我的 K8s 集群部署在 10.0.0.81" 用户 B: "帮我看看我的集群配置" ❌ Agent 把用户 A 的配置给了用户 B ← 记忆泄露
|
场景 3:知识无法沉淀
1 2 3
| 项目结束后,所有经验都在聊天记录里 新员工入职,需要重新踩一遍所有的坑 ❌ 知识无法复用,团队效率低下
|
1.2 核心需求
| 需求 |
说明 |
优先级 |
| 持久化存储 |
会话重启后记忆不丢失 |
P0 |
| 安全隔离 |
不同用户/项目的记忆隔离 |
P0 |
| 版本控制 |
知识可追溯、可回滚 |
P0 |
| 协作共享 |
团队知识可共享 |
P1 |
| 易于检索 |
快速找到所需知识 |
P1 |
| 自动化同步 |
减少手动操作 |
P2 |
1.3 技术选型
| 方案 |
优点 |
缺点 |
最终选择 |
| 数据库存储 |
结构化、查询快 |
不易读、难协作 |
❌ |
| Notion/语雀 |
易用、协作好 |
数据在云端、API 受限 |
❌ |
| Obsidian + Git |
本地优先、版本控制、易读 |
需要 Git 基础 |
✅ |
最终选择:Obsidian + Git + Blog
理由:
- ✅ 数据本地存储(安全、可控)
- ✅ Git 版本控制(可追溯、可回滚)
- ✅ Markdown 格式(易读、易写)
- ✅ 支持双向链接(知识关联)
- ✅ 可发布为博客(知识共享)
二、架构设计:三层记忆结构
2.1 整体架构
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| ┌─────────────────────────────────────────────────────────┐ │ 企业知识库架构 │ ├─────────────────────────────────────────────────────────┤ │ │ │ ┌──────────────┐ ┌──────────────┐ │ │ │ 全局记忆层 │ │ 项目记忆层 │ │ │ │ MEMORY.md │ │ projects/ │ │ │ │ SOUL.md │ │ └─ P1_XXX/ │ │ │ │ AGENTS.md │ │ └─ memory│ │ │ └──────────────┘ └──────────────┘ │ │ ↓ ↓ │ │ ┌──────────────────────────────────────────┐ │ │ │ Git 版本控制 + 同步机制 │ │ │ └──────────────────────────────────────────┘ │ │ ↓ ↓ │ │ ┌──────────────┐ ┌──────────────┐ │ │ │ 每日记忆层 │ │ 技能记忆层 │ │ │ │ memory/ │ │ skills/ │ │ │ │ YYYY-MM-DD │ │ └─ XXX/ │ │ │ │ │ │ └─ SKILL │ │ │ └──────────────┘ └──────────────┘ │ │ │ └─────────────────────────────────────────────────────────┘
|
2.2 三层记忆详解
第一层:全局记忆(Global Memory)
位置:~/workspace/
文件:
SOUL.md - Agent 身份定义
AGENTS.md - 工作规范
TOOLS.md - 工具配置
USER.md - 用户信息
MEMORY.md - 长期记忆
HEARTBEAT.md - 心跳任务
特点:
- ✅ 所有会话共享
- ✅ 变更频率低
- ✅ 需要谨慎修改
示例:
1 2 3 4 5 6 7 8 9 10
| # MEMORY.md
## John - John 的爱犬叫"金刚",体力很好(曾一起跑过 15 公里)。 - John 偏好在 Feishu 直接收到结果,不希望每次去服务器查看。
## Critical Lessons - **文件删除必须确认** - 安全红线 - **关键事项必须先请示** - 工作规范 - **已具备的技能直接使用** - 不要重复造轮子
|
第二层:项目记忆(Project Memory)
位置:~/workspace/obsidian-sync/projects/{项目}/memory.md
文件:
memory.md - 项目特定上下文
skills/ - 项目专用技能
docs/ - 项目文档
特点:
示例:
1 2 3 4 5 6 7 8 9 10 11
| # P4_Blog memory.md
## 发布计划 - 频率:3 篇/周(周二/四/六) - 发布时间:08:00 自动发布 - 最后一篇:2026-03-11
## 待办文章 - [ ] TrailSync 项目实战 - [ ] Agent 工具调用最佳实践 - [ ] RAG 架构设计
|
第三层:每日记忆(Daily Memory)
位置:~/workspace/memory/YYYY-MM-DD.md
文件:
- 每日自动创建
- 记录当天重要事件
- 定期归档到 MEMORY.md
特点:
- ✅ 按天隔离
- ✅ 自动清理(30 天)
- ✅ 防止 MEMORY.md 过大
示例:
1 2 3 4 5 6 7 8 9 10 11 12 13
| # 2026-03-11
## 重要事件 - 09:00 创建 TrailSync 项目(H5 位置共享) - 10:00 完成前端 + 后端 + 部署配置(1,548 行代码) - 11:00 部署到 K8s(镜像拉取失败,需 GitLab 仓库) - 12:00 为 9 篇文章添加 OpenClaw 关键词 - 12:30 修正 2 篇文章发布日期(避免未来时间)
## 待办 - [ ] 创建 GitLab 仓库 trailsync-backend - [ ] 配置 CI/CD 自动构建镜像 - [ ] 合并 MR #53 和 #54
|
2.3 记忆加载策略
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
|
def load_memory(session_context): """加载记忆""" global_memory = load_global_memory() if session_context.get('project'): project_memory = load_project_memory( session_context['project'] ) else: project_memory = {} daily_memory = load_daily_memory( days=2 ) merged = { **global_memory, **project_memory, **daily_memory } return merged
|
三、Git 同步机制
3.1 仓库结构
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| obsidian-sync/ ← Git 仓库根目录 ├── .git/ ├── memory/ # 全局记忆(双向同步) │ ├── MEMORY.md │ ├── SOUL.md │ ├── AGENTS.md │ └── YYYY-MM-DD.md ├── projects/ # 项目记忆(双向同步) │ ├── P3_OpenClaw_Extension/ │ ├── P4_Blog/ │ └── P7_TrailSync/ ├── 01_Incoming/ # 输入层(单向:Obsidian→OpenClaw) ├── 02_Docs/ # 文档层(双向同步) ├── 03_Assets/ # 资产层(双向同步) └── 04_Generated/ # 生成层(单向:OpenClaw→Obsidian)
|
3.2 同步规则
| 目录 |
同步方向 |
说明 |
| memory/ |
双向 |
Obsidian ↔ OpenClaw |
| projects/ |
双向 |
项目间共享 |
| 01_Incoming/ |
单向 |
Obsidian → OpenClaw |
| 02_Docs/ |
双向 |
文档协作 |
| 03_Assets/ |
双向 |
图片/附件 |
| 04_Generated/ |
单向 |
OpenClaw → Obsidian |
3.3 Git 工作流
1 2 3 4 5 6 7 8 9 10 11 12 13
| git pull origin main
git add . git commit -m "feat: 更新内容" git push origin main
git pull --rebase
git add . git rebase --continue
|
3.4 自动化同步脚本
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| #!/bin/bash
WORKSPACE=~/workspace REPO_URL=http://192.168.100.191:9910/crystalcreator/obsidian-sync.git
cd $WORKSPACE git pull origin main
git status
if [[ $(git status --porcelain) ]]; then git add . git commit -m "auto: 同步记忆 $(date +%Y-%m-%d_%H:%M:%S)" git push origin main fi
find memory/ -name "*.md" -mtime +30 -delete
|
四、安全隔离策略
4.1 用户隔离
问题:多用户共享 OpenClaw 时,记忆不能混淆
方案:
1 2 3 4 5 6 7 8 9 10
| memory/ ├── users/ │ ├── user_a/ │ │ ├── MEMORY.md │ │ └── daily/ │ └── user_b/ │ ├── MEMORY.md │ └── daily/ └── shared/ └── projects/
|
实现:
1 2 3 4 5 6 7 8 9 10 11
| def get_user_memory(user_id): """获取用户记忆""" user_path = f"memory/users/{user_id}/MEMORY.md" if not os.path.exists(user_path): os.makedirs(os.path.dirname(user_path)) with open(user_path, 'w') as f: f.write(f"# User Memory: {user_id}\n") return load_markdown(user_path)
|
4.2 项目隔离
问题:不同项目的配置不能混用
方案:
1 2 3 4 5 6 7 8 9 10 11
| projects: P3_OpenClaw_Extension: memory: projects/P3_OpenClaw_Extension/memory.md skills: projects/P3_OpenClaw_Extension/skills/ access: [john, alice] P4_Blog: memory: projects/P4_Blog/memory.md skills: projects/P4_Blog/skills/ access: [john]
|
4.3 敏感信息保护
问题:API 密钥、密码不能明文存储
方案:
1 2 3 4 5 6 7 8 9 10 11
| # ❌ 错误做法 MEMORY.md: - Aliyun API Key: sk-sp-c35236a57fff40f2afea663e9472bbd9
# ✅ 正确做法 MEMORY.md: - Aliyun API Key: 已配置(见 openclaw-secrets)
openclaw-secrets: - 使用 K8s Secret 存储 - 或通过环境变量注入
|
五、实战案例:OpenClaw 记忆系统
5.1 项目背景
项目名称:OpenClaw3 K8s 部署
时间:2026-03-09 ~ 2026-03-11
挑战:
- 部署过程复杂(5 小时,10+ 个问题)
- 配置项繁多(openclaw.json、Secret、ConfigMap)
- 需要跨会话协作(John 晚上部署,第二天继续)
5.2 记忆系统应用
阶段 1:部署前准备
创建项目记忆:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| # projects/P3_OpenClaw_Extension/memory.md
## K8s 部署信息 - 集群:10.0.0.81 (ksmaster1/2/3) - 命名空间:openclaw - PVC:openclaw-data-pvc (200Gi) - 镜像:hb.test/crystalforge/openclaw-cn-base:1.0.3-feishu
## 配置信息 - Feishu AppID: cli_a9278e8369b89bc6 - Aliyun Model: bailian/qwen3.5-plus - API Key: 已配置(见 openclaw-secrets)
## 待办 - [ ] 创建 PVC - [ ] 部署 Pod - [ ] 配置 Feishu - [ ] 测试消息
|
阶段 2:部署过程记录
每日记忆:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| # memory/2026-03-10.md
## OpenClaw K8s 部署
### 21:00 - 开始部署 - 创建 PVC:成功 - 创建 Secret:成功
### 21:30 - 问题 1:Pod Pending - 原因:PVC 调度失败 - 解决:简化为单 PVC 方案
### 22:00 - 问题 2:ImagePullBackOff - 原因:Harbor 认证失败 - 解决:从 infraInfo.txt 获取正确密码
### 22:30 - 问题 3:CrashLoopBackOff - 原因:openclaw.json 配置错误 - 解决:通过临时 Pod 更新配置
### 23:00 - 部署成功 - Pod Running (1/1) - Feishu 连接成功
|
阶段 3:经验沉淀
更新全局记忆:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| # MEMORY.md
## OpenClaw K8s 部署(2026-03-10)
### 关键决策 - **单 PVC Scheme**: 多个 PVC 导致调度失败;单 PVC 稳定 ✅ - **No ConfigMap Override**: 防止只读配置问题 ✅ - **kubectl cp for Config Updates**: heredoc 导致 JSON 腐败 ✅ - **Memory Limit 4Gi**: 防止 OOMKilled (2Gi 失败) ✅
### 配置文件更新方法 ```bash kubectl run config-updater --rm -i --restart=Never \ --image=busybox -n openclaw \ --overrides='...' kubectl cp /tmp/openclaw.json openclaw/config-updater:/data/openclaw.json kubectl delete pod config-updater -n openclaw
|
踩坑记录
- ConfigMap 覆盖导致只读 → 改用 PVC
- heredoc 导致 JSON 腐败 → 改用 kubectl cp
- 内存 2Gi OOM → 改为 4Gi
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| ---
## 六、最佳实践
### 6.1 记忆编写规范
**✅ 推荐做法**:
```markdown # 清晰的标题 ## 2026-03-11 OpenClaw K8s 部署
# 结构化内容 - **问题**: Pod Pending - **原因**: PVC 调度失败 - **解决**: 简化为单 PVC
# 代码块标注语言 ```bash kubectl get pods
|
重要信息加粗
关键决策: 单 PVC Scheme
1 2 3 4 5 6 7 8 9 10 11
| **❌ 避免做法**:
```markdown # 模糊的标题 ## 今天的事情
# 大段文字 今天下午遇到了一个问题,大概是这样的...
# 无语言标注
|
kubectl get pods
1 2 3
| # 关键信息不明显 单 PVC Scheme 比较稳定
|
6.2 记忆维护流程
每日维护(5 分钟):
1 2 3 4 5 6 7 8 9 10
| cat memory/$(date +%Y-%m-%d).md
echo "## 15:00 - 完成 XX 功能" >> memory/$(date +%Y-%m-%d).md
git add memory/$(date +%Y-%m-%d).md git commit -m "daily: $(date +%Y-%m-%d)" git push
|
每周维护(15 分钟):
1 2 3 4 5 6
| cat memory/2026-W11-*.md
|
每月维护(30 分钟):
1 2 3 4 5 6
| mv memory/2026-02-*.md memory/archive/2026-02/
|
6.3 记忆检索技巧
按关键词检索:
1 2 3 4 5
| grep -r "K8s" memory/ projects/*/memory.md
grep -l "2026-03-10" memory/*.md
|
按时间检索:
1 2 3 4 5
| ls -lt memory/ | head -7
cat memory/2026-03-{11,10,09,08,07,06,05}.md
|
按项目检索:
1 2 3 4 5
| cat projects/P4_Blog/memory.md
ls projects/P4_Blog/skills/
|
七、踩坑记录
7.1 问题 1:记忆文件过大
现象:
1
| MEMORY.md 达到 500KB,加载时间 >5 秒
|
原因:
- 所有历史记忆都堆积在 MEMORY.md
- 没有定期归档
解决:
1 2 3 4 5
| # 方案:三层分离
1. MEMORY.md - 仅保留长期记忆(<100KB) 2. memory/YYYY-MM-DD.md - 每日记忆(30 天) 3. memory/archive/ - 历史归档
|
效果:
- MEMORY.md 从 500KB 降到 50KB
- 加载时间从 5 秒降到 0.5 秒
7.2 问题 2:Git 冲突频繁
现象:
原因:
- Obsidian 和 OpenClaw 同时修改同一文件
- 没有同步机制
解决:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
|
git pull --rebase
git add . git commit -m "auto: 更新" git push
git pull --rebase
git add . git commit -m "manual: 更新" git push
|
效果:
7.3 问题 3:敏感信息泄露
现象:
原因:
解决:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| # 方案:分级存储
L1 - 公开信息: - 直接写在 MEMORY.md - 可推送到 Git
L2 - 敏感信息: - 写在 openclaw-secrets - K8s Secret 存储 - 不推送到 Git
L3 - 机密信息: - 使用加密工具(SOPS) - 仅授权人员可解密
|
效果:
八、工具推荐
8.1 Obsidian 插件
| 插件 |
用途 |
推荐度 |
| Git |
Git 集成 |
⭐⭐⭐⭐⭐ |
| Templater |
模板引擎 |
⭐⭐⭐⭐ |
| Daily Notes |
每日笔记 |
⭐⭐⭐⭐⭐ |
| Calendar |
日历视图 |
⭐⭐⭐⭐ |
| Search |
高级搜索 |
⭐⭐⭐⭐ |
8.2 自动化脚本
脚本 1:每日记忆创建
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| #!/bin/bash
TODAY=$(date +%Y-%m-%d) FILE="memory/${TODAY}.md"
if [ ! -f "$FILE" ]; then cat > "$FILE" <<EOF # ${TODAY}
## 重要事件
## 待办 - [ ]
## 学习笔记
EOF git add "$FILE" git commit -m "chore: 创建 ${TODAY} 记忆" git push fi
|
脚本 2:记忆归档
1 2 3 4 5 6 7 8 9 10 11 12
| #!/bin/bash
ARCHIVE_DIR="memory/archive/$(date +%Y-%m)" mkdir -p "$ARCHIVE_DIR"
find memory/ -name "*.md" -mtime +30 -exec mv {} "$ARCHIVE_DIR/" \;
git add "$ARCHIVE_DIR" git commit -m "chore: 归档旧记忆" git push
|
九、总结
9.1 核心收获
1. 三层记忆架构
- 全局记忆:长期、共享
- 项目记忆:中期、隔离
- 每日记忆:短期、自动清理
2. Git 同步机制
- 版本控制:可追溯、可回滚
- 协作共享:团队知识沉淀
- 自动化:减少手动操作
3. 安全隔离
- 用户隔离:防止记忆混淆
- 项目隔离:配置不混用
- 敏感信息:分级存储
9.2 适用场景
推荐使用:
- ✅ AI Agent 知识管理
- ✅ 个人知识体系
- ✅ 团队项目协作
- ✅ 技术文档沉淀
不推荐使用:
- ❌ 实时性要求高(用数据库)
- ❌ 大规模并发(用专业 KM 系统)
- ❌ 强结构化数据(用 Notion/语雀)
9.3 后续优化
短期(1 个月):
中期(3 个月):
长期(6 个月):
十、相关链接
作者:John
创建时间:2026-03-11
最后更新:2026-03-11
文档版本:v1.0