Appearance
Hermes搭RAG知识检索:Obsidian+Ollama+ChromaDB本地语义搜索搭建
核心痛点不是找不到文件,是想不起当时是怎么想的。用Hermes Agent + Obsidian + Ollama + ChromaDB搭建本地RAG,让所有笔记能用自然语言「问」出来。
为什么需要这个?
市面知识管理方案全都有硬伤:
| 方案 | 问题 |
|---|---|
| 文件夹分类 | 一个笔记可能同时属于多个主题,放哪都不对 |
| 标签系统 | 标签越加越多,最后忘了打了什么标签 |
| 全文搜索 | 搜"杠铃策略"找不到写过"塔勒布·杠铃"的那篇 |
| 纯人工记忆 | 不是20岁了,记不住 |
方案架构
Markdown 笔记库 (Obsidian)
↓
vectorize-leonhe.py (向量化脚本)
↓
Ollama qwen3-embedding:4b (生成 embedding)
↓
ChromaDB ~/vector_db/wiki (向量存储)
↓
query-wiki.py (语义查询) → Hermes Agent 调用关键技术决策
- 本地运行:数据不出机器,Ollama和ChromaDB都跑在本机
- 增量更新:只向量化改动的文件,不是每次全量扫
- 统一查询入口:不管来自Obsidian还是独立wiki,都走同一个查询脚本
- 语义而非关键字:搜"怎么抗风险"能匹配到"杠铃策略""反脆弱"
核心代码
1. 向量化脚本
python
# ~/.hermes/scripts/vectorize-leonhe.py
def clean_markdown(content: str) -> str:
"""去掉 frontmatter、wikilinks、图片、URL,保留纯文本"""
# 去掉 YAML frontmatter
if content.startswith("---"):
end = content.find("---", 3)
if end > 0:
content = content[end+3:]
# 去掉 [[wikilinks]] 但保留文字
content = re.sub(r'\[\[([^\]|]+?)\]\]', r'\1', content)
# 清理空格
return content.strip()为什么这么清理?
- YAML frontmatter是元数据,搜标题不该匹配到tags字段
- wikilinks是链接语法,你要搜的是内容,不是
[[杠铃策略]]这个字符串
2. Ollama Embedding API
python
def get_embedding(text: str) -> list:
response = requests.post(
"http://localhost:11434/api/embed",
json={
"model": "qwen3-embedding:4b",
"input": text
}
)
return response.json()["embeddings"][0]3. ChromaDB增量存储
python
def store_embeddings(chunks, filepath, collection):
"""增量更新,只处理改动过的文件"""
existing_ids = set(collection.get()["ids"])
new_ids = set(chunk["id"] for chunk in chunks)
# 删除已不存在的旧chunk
stale = existing_ids - new_ids
if stale:
collection.delete(ids=list(stale))
# 只添加新的chunk
to_add = [c for c in chunks if c["id"] not in existing_ids]
if to_add:
collection.add(
documents=[c["text"] for c in to_add],
metadatas=[c["metadata"] for c in to_add],
ids=[c["id"] for c in to_add]
)4. 语义查询入口
python
# query-wiki.py
def query_wiki(question: str, n_results: int = 5) -> list:
query_embedding = get_embedding(question)
results = collection.query(
query_embeddings=[query_embedding],
n_results=n_results
)
return results["documents"][0]接入Hermes Agent
在Hermes的 SKILL.md 或自定义工具中配置查询入口:
yaml
# ~/.hermes/tools/wiki-query.yaml
name: wiki_query
description: 从个人笔记库语义搜索相关笔记内容
function:
command: python3 ~/.hermes/scripts/query-wiki.py "{query}"
args:
query: string之后就可以对Hermes说:"帮我查一下我之前关于反脆弱的笔记",它会自动语义检索到相关笔记。
效果
| 搜索方式 | 效果 |
|---|---|
| 关键字搜索"杠铃策略" | ❌ 只匹配到标题包含的笔记 |
| 语义搜索"怎么抗风险" | ✅ 能匹配到"杠铃策略""反脆弱""黑天鹅"等多篇笔记 |
| 搜索结果"理解笔记思路" | ✅ 直接问出当时怎么想的,不只是找到文件 |
总结
这套方案的核心价值:
| 特点 | 说明 |
|---|---|
| 纯本地 | 数据不出机器,隐私安全 |
| 增量更新 | 效率高,不重复处理 |
| 语义搜索 | 问想法而非搜文件名 |
| Hermes集成 | 自然语言当查询入口 |
从此再也不用担心笔记写成"数字遗物"了。
关键词:Hermes RAG, 知识管理, Obsidian, Ollama, ChromaDB, 语义搜索, 本地RAG, 向量化
