我为什么要给自己做一个本地 AI 知识库?
系列:《从 0 打造我的本地 AI 知识库:Obsidian + Ollama + Milvus + RAG + MCP + Agent》
本文是第 01 篇。

最近在学习 Java、JVM、MySQL、Redis、Spring AI、RAG、Agent、MCP 的过程中,我越来越明显地感觉到一个问题:
知识越来越多,但真正能被我"找回来"的知识却越来越少。
以前学习技术,我的方式基本是:
text
看到一篇文章
↓
收藏
↓
看完
↓
感觉自己学会了
↓
过几天
↓
忘了
↓
重新搜索
后来开始使用 Obsidian,我把大量学习笔记整理成 Markdown。
情况确实改善了。
但是新的问题又出现了:
笔记越来越多以后,怎么快速找到真正需要的内容?
于是我开始思考:
能不能把自己的 Obsidian 知识库和本地大模型连接起来?
我希望最终做到这样:
text
我问 AI:
"MVCC 为什么需要 Undo Log?"
↓
AI 搜索我的知识库
↓
找到我以前整理的 MySQL MVCC 笔记
↓
把相关内容交给大模型
↓
结合我的笔记回答问题
这样,我的笔记就不再只是"存储文件"。
而是变成了一个真正可以被 AI 使用的个人知识库。
一、我想做的到底是什么?
先不急着讲 RAG、Embedding、Milvus、MCP 这些概念。
先看最终效果。
我希望以后打开自己的 AI 知识库,可以直接问:
MySQL 的 MVCC 是什么?
AI 不只是凭自己的训练数据回答。
而是优先从我的知识库中寻找:
text
MySQL
├── 索引
├── 事务
├── MVCC
├── 锁
└── Buffer Pool
找到相关笔记以后,再交给大模型。
最终回答:
text
根据你的 MySQL 笔记:
MVCC 是 Multi-Version Concurrency Control,
即多版本并发控制。
InnoDB 主要通过 Undo Log 和 Read View
实现 MVCC......
......
这和普通的聊天机器人有一个很大的区别:
它回答的是"我的知识"。
二、为什么选择 Obsidian?
我选择 Obsidian,并不是因为它本身有多"AI"。
恰恰相反。
我看中的是它非常简单的一点:
笔记本质上就是 Markdown 文件。
例如我的笔记:
text
MySQL MVCC.md
打开以后就是普通文本:
markdown
# MySQL MVCC
MVCC 是 Multi-Version Concurrency Control,
即多版本并发控制。
InnoDB 通过 Undo Log 和 Read View 实现 MVCC。
MVCC 可以在保证事务隔离性的同时,
减少读操作和写操作之间的锁竞争。
这意味着:
text
Obsidian
↓
Markdown
↓
Python
↓
AI
中间没有特别复杂的格式转换。
AI 可以直接读取这些 Markdown 文件。
所以我最终希望:
text
Obsidian = 我的知识存储层
而不是让 AI 替我保存知识。
三、为什么还需要本地 AI?
其实现在已经有很多在线 AI 产品。
为什么还要自己搭?
我的原因主要有三个。
1. 数据掌握在自己手里
我的学习笔记里面会包含:
- Java 学习笔记
- 面试题
- 项目设计
- 技术方案
- 工作总结
- 代码
- 创作素材
- 小说设定
这些内容我希望能够长期保存在自己的电脑上。
因此我希望:
text
我的知识
↓
我的硬盘
↓
我的 AI
而不是完全依赖某一个在线服务。
四、第二个原因:我想真正搞懂 AI
如果只是使用 ChatGPT,我可以直接问:
什么是 Embedding?
但是我真正想知道的是:
text
文本
↓
Embedding
↓
向量
↓
向量数据库
↓
相似度搜索
↓
RAG
↓
大模型
这些东西到底是怎么工作的?
所以这个项目对我来说不只是一个工具。
它也是一个AI 学习实验场。
我会通过真正把系统搭起来,逐渐搞懂:
- LLM
- Embedding
- Vector
- Vector Database
- RAG
- Chunk
- Metadata
- Retrieval
- Prompt
- MCP
- Tool
- Agent
而不是只背这些概念。
五、第三个原因:我的电脑并不算强
我的机器是一台:
text
MacBook Pro 13"
Apple M1
16GB Unified Memory
这意味着我不能像服务器一样随便运行几十 GB、上百 GB 的大模型。
所以我反而想尝试一个问题:
一台普通的 M1 16GB Mac,到底能不能搭出一个真正能用的本地 AI 知识库?
这也是这个系列比较有意思的地方。
我的目标不是:
"我要跑最大的模型。"
而是:
在有限硬件下,把整个 AI 系统真正跑起来。
六、我的第一版技术方案
目前我的思路非常简单。
先用:
text
Ollama
负责运行本地模型。
然后使用:
text
Qwen3.5 9B
作为主要的大语言模型。
使用:
text
Qwen3-Embedding 0.6B
把我的 Markdown 笔记转换成向量。
然后使用:
text
Milvus Lite
保存这些向量,并进行相似度搜索。
整体结构:
text
我的电脑
│
┌───────────┴───────────┐
│ │
Obsidian Ollama
│ │
Markdown ┌────┴────┐
│ │ │
│ Qwen3.5 Embedding
│ │ 0.6B
│ │ │
└──────────────→ RAG ←───────┘
│
Milvus
│
▼
AI回答
当然,这只是第一版。
后面还会继续加入:
text
Chunk
Metadata
自动索引
MCP
Agent
最终希望变成:
text
Obsidian
↕
Markdown
↕
MCP
↕
Agent
↕
RAG
↕
Milvus
↕
Embedding
↕
Qwen3.5
七、RAG 在这里到底负责什么?
这里先简单理解。
假设我有 10,000 篇 Markdown 笔记。
我问:
MySQL 的 MVCC 如何实现?
大模型不可能每次都把我的 10,000 篇笔记全部读一遍。
所以需要一个"搜索系统"。
这就是 RAG 中的 Retrieval。
大概过程:
text
用户问题
"MVCC 如何实现?"
↓
把问题转换成向量
↓
去 Milvus 搜索
↓
找到最相关的几个知识片段
↓
交给大模型
↓
生成答案
所以可以先把 RAG 理解成:
先搜索知识,再让 AI 根据搜索结果回答。
八、Embedding 又是什么?
这是我在真正做这个项目以后,第一个觉得特别有意思的东西。
例如:
text
MySQL 的 MVCC 是什么?
Embedding 模型可以把它转换成一组数字:
text
[-0.0655,
-0.0861,
-0.0121,
...
]
我的实际测试中:
text
向量维度:1024
也就是说:
text
一句话
↓
Embedding
↓
1024维向量
那么另外一句:
text
InnoDB 的多版本并发控制机制是什么?
也可以转换成一个 1024 维向量。
然后比较两个向量之间的相似程度。
于是计算机就能够判断:
text
"MVCC 是什么?"
≈
"InnoDB 的多版本并发控制机制是什么?"
这就是后面实现语义搜索的基础。
这一部分我会在后面的文章里单独展开。
九、为什么需要 Milvus?
有了向量以后,还需要一个地方保存它们。
比如我的知识库有:
text
Java → 500篇
MySQL → 300篇
Redis → 200篇
JVM → 300篇
AI → 500篇
如果以后变成几千甚至几万篇笔记,就需要专门的向量检索系统。
所以我选择:
Milvus。
第一阶段并没有直接部署一个复杂的 Milvus 集群,而是使用:
text
Milvus Lite
直接在本地运行。
最终:
text
Markdown
↓
Embedding
↓
1024维向量
↓
Milvus
以后用户输入问题:
text
问题
↓
Embedding
↓
Milvus
↓
找到最相似的知识
十、我希望这个项目最终做到什么程度?
第一阶段,我只想做到:
text
Markdown
↓
Embedding
↓
Milvus
↓
搜索
↓
Qwen3.5
↓
回答
然后逐渐升级。
V1:能搜索
text
Obsidian
↓
Embedding
↓
Milvus
↓
Vector Search
V2:能问答
text
用户问题
↓
RAG
↓
Qwen3.5
↓
答案
V3:自动同步
text
修改 Markdown
↓
自动检测
↓
重新 Embedding
↓
更新 Milvus
V4:接入 MCP
text
AI
↓
MCP
↓
Obsidian
让 AI 可以:
text
搜索笔记
读取笔记
创建笔记
修改笔记
V5:Agent
最终希望能够直接告诉 AI:
"帮我整理一下最近学习的 MySQL MVCC,并生成一篇新的 Obsidian 笔记。"
然后 AI 自己完成:
text
搜索相关知识
↓
读取已有笔记
↓
分析
↓
整理
↓
生成
↓
写入 Obsidian
这时候,它才真正开始像一个:
我的个人 AI 知识助手
十一、整个项目的学习路线
所以接下来这个系列不会一上来就讲复杂 Agent。
而是从最基础的东西一点一点往上搭。
text
01 为什么做本地 AI 知识库
↓
02 Ollama 本地 AI 环境
↓
03 Embedding
↓
04 Milvus
↓
05 向量搜索
↓
06 完整 RAG
↓
07 Chunk
↓
08 自动索引 Markdown
↓
09 Metadata
↓
10 RAG 优化
↓
11 接入真实 Obsidian
↓
12 自动同步
↓
13 MCP
↓
14 MCP Server
↓
15 AI 修改 Obsidian
↓
16 RAG + MCP + Agent
↓
17 个人 AI 知识助手
↓
18 完整项目总结
十二、写在最后
做这个项目之前,我对很多 AI 概念其实都是:
"听过,但是没有真正跑过。"
比如:
text
Embedding
Milvus
RAG
Chunk
MCP
Agent
看文章的时候感觉都懂。
但真正自己写代码以后,会发现:
"看懂"和"做出来"完全是两回事。
比如第一次用 Milvus 搜索时,我就遇到了:
text
Collection 'knowledge_base'
is in state 'released'
这种问题。
而解决问题的过程,反而让我真正理解了:
向量数据库到底是怎么工作的。
所以我决定把这个项目完整记录下来。
不追求一开始就做得多复杂。
而是:
text
能跑
↓
理解
↓
优化
↓
扩展
↓
最终做成真正能用的系统
如果最终成功,我希望得到的不只是一个 AI 工具。
而是一套属于自己的:
「本地 AI + 个人知识库 + RAG + MCP + Agent」系统。
下一篇
《在 M1 Mac 上搭建 Ollama:我的本地 AI 模型到底应该怎么选?》
下一篇会直接开始动手:
text
M1 16GB
↓
安装 Ollama
↓
选择模型
↓
Qwen3.5 9B
↓
Qwen3-Embedding 0.6B
↓
第一次运行本地大模型
并且会解释一个非常现实的问题:
16GB 内存的 Mac,到底应该跑多大的本地模型?