Skip to content

Hermes搭RAG知识检索:Obsidian+Ollama+ChromaDB本地语义搜索搭建

2026年4月29日

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 调用

关键技术决策

  1. 本地运行:数据不出机器,Ollama和ChromaDB都跑在本机
  2. 增量更新:只向量化改动的文件,不是每次全量扫
  3. 统一查询入口:不管来自Obsidian还是独立wiki,都走同一个查询脚本
  4. 语义而非关键字:搜"怎么抗风险"能匹配到"杠铃策略""反脆弱"

核心代码

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, 向量化

不要孤军奋战啦!

加入微信群一起学习交流 AI

与大神一起使用 OpenClaw、Hermes、Claude Code、Seedance 2.0、GPT-Image-2 等

微信公众号

扫码关注微信公众号
私信 "加群",将自动获取微信群二维码

探索 AI 世界,掌握智能未来