☰
Hermes Agent LLM Wiki 技术应用:用 Skill Config 把 Obsidian Markdown 笔记接成可检索知识库
2026/10/17 20:46:36 网站建设 项目流程

1. 从散落笔记到可对话知识库:Hermes Agent LLM Wiki 要解决的真实问题

如果你用 Obsidian 记了半年以上笔记,大概率会遇到同一个尴尬:笔记越写越多,真正要用的时候却找不到。你记得自己写过某个概念,但想不起放在哪个文件夹、用了什么标题;你搜关键词,出来二十条结果,还得一条条点开看哪条才是当时那条完整记录。更麻烦的是,笔记之间没有关联,A 笔记里提到的结论,B 笔记里其实有反例,但你永远不会同时看到它们。

Hermes Agent 的 LLM Wiki 场景,就是冲着这个问题来的。它把 Obsidian 里的 Markdown 笔记当作语料,通过 Skill Config 定义检索与问答技能,让 Agent 能按主题调取笔记内容,最终把一堆散落的.md文件变成一个可以对话的知识库。你问它「我之前关于向量检索的笔记里,对 HNSW 和 IVF 的取舍是怎么记的」,它会去读你的笔记、定位相关页面、综合出答案,并且告诉你答案来自哪几个文件。

这套东西适合谁?三类人最合适。第一类是长期用 Obsidian 做研究笔记的人,笔记量在几百篇以上,靠文件夹和标签已经管不住了。第二类是需要把团队文档、会议记录、项目资料接成问答入口的人,希望 Agent 能按主题调取而不是全文搜索。第三类是想搞清楚 LLM Wiki 和传统 RAG 区别的技术人,想亲手跑一遍 Ingest、Query、Lint 三个核心操作。

LLM Wiki 和传统 RAG 的核心差异在于:RAG 每次查询都从头检索原始文档片段,拼进上下文让模型生成;LLM Wiki 则是让 LLM 先把原始资料编译成结构化的 Wiki 页面,查询时读的是已经编译好的知识,而不是原始碎片。前者是「每次现查」,后者是「先建好再查」。这个差异决定了 LLM Wiki 更适合长期积累、需要交叉引用的知识场景,而 RAG 更适合一次性问答。

下面我会从 Obsidian 目录约定开始,给出可复制的 Skill Config 片段,然后演示一次从提问到引用笔记的完整验证流程,最后把常见的报错和排查方法列清楚。整个过程你都可以跟着做。

2. TaoToken 前置准备:给 Hermes Agent 配好模型入口

Hermes Agent 本身是一个 Agent 框架,它需要一个能调用的模型服务来完成 Ingest 时的摘要生成、Query 时的答案综合、Lint 时的矛盾检测。这些操作对模型的上下文长度和指令遵循能力有要求,尤其是 Ingest 阶段,一次可能要读入几千字的笔记并输出结构化的 Wiki 页面。

我用的方案是通过 TaoToken 接入模型。TaoToken 提供 OpenAI 兼容的 API 接口,Hermes Agent 的模型配置里填上 Base URL 和 API Key 就能用。官网在 https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,API 端点是 https://taotoken.net/api ,注意 API 地址不带 UTM 参数。

先拿到 API Key。登录后进控制台,在 API Keys 页面创建一个新的 Key,复制出来。这个 Key 后面要填进 Hermes 的配置里,别弄丢。控制台地址是 https://taotoken.net/console?utm_source=taotoken_aicg_blog_end&utm_content=console&utm_campaign=rewrite ,API Keys 页面是 https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=api-keys&utm_campaign=rewrite 。

拿到 Key 之后,需要确认你要用哪个模型。LLM Wiki 的 Ingest 和 Query 对模型能力有要求,建议选上下文窗口大、指令遵循好的模型。你可以在模型对话页面先试一下,地址是 https://taotoken.net/chat?utm_source=taotoken_aicg_blog_end&utm_content=model-chat&utm_campaign=rewrite ,随便问几个需要综合多段信息的问题,看看输出质量。

Hermes Agent 的模型配置通常放在~/.hermes/config.yaml或者项目目录下的config.yaml。你需要填三个东西:Base URL、API Key、Model ID。Base URL 填https://taotoken.net/api,API Key 填刚才复制的,Model ID 填你在模型对话页面确认可用的模型名。

这里有个容易踩的坑:Hermes 的配置里,模型相关的字段可能分散在model和provider两个 section 下。如果你只填了model.name没填provider.base_url,请求会打到默认端点然后 401。所以下面这段配置你要完整复制,不要只抄一半。

# ~/.hermes/config.yaml model: name: "your-model-id" # 替换成你在模型对话页确认的 Model ID provider: "openai-compatible" base_url: "https://taotoken.net/api" api_key: "sk-xxxxxxxxxxxx" # 替换成你的 API Key max_tokens: 8192 temperature: 0.3 # Ingest 阶段建议低温度,保证结构化输出稳定 # Skill Config 部分,LLM Wiki 的路径配置 skills: config: wiki: path: "~/wiki" # LLM Wiki 的根目录,后面会详细讲目录结构

如果你用的是 Coding Plan 或者需要长期跑 Agent 任务,可以考虑 Coding Plan 方案,地址是 https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=coding-plan&utm_campaign=rewrite 。不过对于 LLM Wiki 这种偏知识管理的场景,按量调用也够用。

配置写完之后,跑一下hermes config show确认配置被正确读取。如果输出里能看到你填的 base_url 和 model name,说明前置准备完成。如果报错说找不到配置文件,检查一下你是不是在正确的用户目录下执行的命令。

还有一个细节:Hermes Agent 的 Skill Config 支持变量注入,wiki.path这个值会在技能执行时被注入到上下文里。如果你把路径写成相对路径,比如./wiki,那么它相对于 Hermes 的工作目录解析,而不是相对于配置文件。所以建议直接写绝对路径,避免后面 Ingest 的时候找不到目录。

3. 可复制配置:Obsidian 目录约定与 Skill Config 片段

这一节是整篇的核心,你要照着做的是两件事:第一,把 Obsidian 的笔记目录整理成 LLM Wiki 能识别的结构;第二,写一份 Skill Config,告诉 Agent 怎么检索和问答。

先说目录约定。LLM Wiki 的三层结构是 Raw Sources、Wiki Pages、Schema Config。对应到 Obsidian,我建议这样组织:

~/wiki/ ├── raw/ # 原始来源层,不可变 │ ├── articles/ # 网页剪藏、文章 │ ├── papers/ # 论文、PDF 转的 Markdown │ └── notes/ # 你自己的原始笔记 ├── wiki/ # Wiki 页面层,Agent 拥有和维护 │ ├── entities/ # 实体页:工具、人物、项目 │ ├── concepts/ # 概念页:方法论、原理 │ ├── comparisons/ # 对比页:A vs B │ └── queries/ # 查询结果页:归档的问答 ├── SCHEMA.md # Schema 配置层,定义结构和约定 ├── index.md # 内容目录 └── log.md # 操作日志

这个结构的关键在于raw/和wiki/的分离。raw/放你的原始 Obsidian 笔记,Agent 只读不改;wiki/放 Agent 编译出来的结构化页面,Agent 可以创建和更新。你的 Obsidian Vault 可以直接指向~/wiki,这样你在 Obsidian 里能看到 Agent 生成的所有 Wiki 页面,Graph View 也能用。

Obsidian 的 Markdown 元数据约定,主要是 YAML frontmatter。每个 Wiki 页面开头要有:

--- title: 页面标题 created: 2026-04-20 updated: 2026-04-20 type: entity | concept | comparison | query tags: [tag1, tag2] sources: [raw/notes/source-name.md] ---

type字段决定页面放在哪个子目录,tags用于检索过滤,sources指回原始笔记。这个约定要写进SCHEMA.md,Agent 每次生成页面时会照着填。

然后是 Skill Config。Hermes Agent 的 Skill Config 接口允许你定义技能的配置变量,LLM Wiki 技能会读取wiki.path来定位知识库根目录。下面是一份完整的配置片段,你可以直接复制到config.yaml里:

skills: config: wiki: path: "/home/yourname/wiki" # 绝对路径,替换成你的实际路径 raw_dir: "raw" # 相对于 path 的子目录 wiki_dir: "wiki" schema_file: "SCHEMA.md" index_file: "index.md" log_file: "log.md" max_ingest_pages: 15 # 单次 Ingest 最多更新多少个 Wiki 页面 query_top_k: 5 # Query 时最多读取多少个相关页面 lint_checks: # 启用哪些 Lint 检查 - orphan_pages - dead_wikilinks - contradictions - missing_pages - unlinked_mentions - incomplete_metadata - empty_sections - stale_index

如果你用的是 JSON 格式的配置(有些 Hermes 版本支持),等价写法是:

{ "skills": { "config": { "wiki": { "path": "/home/yourname/wiki", "raw_dir": "raw", "wiki_dir": "wiki", "schema_file": "SCHEMA.md", "index_file": "index.md", "log_file": "log.md", "max_ingest_pages": 15, "query_top_k": 5, "lint_checks": [ "orphan_pages", "dead_wikilinks", "contradictions", "missing_pages", "unlinked_mentions", "incomplete_metadata", "empty_sections", "stale_index" ] } } } }

配置里的max_ingest_pages是个保护机制。一次 Ingest 可能触及十几个 Wiki 页面,如果超过这个数,Agent 会先问你确认再批量更新,避免它一口气改太多页面你来不及检查。query_top_k控制 Query 时读多少个页面,设太大上下文会爆,设太小可能漏掉相关信息,5 是个比较稳的起点。

SCHEMA.md的内容也要写清楚,它是 Agent 的行为准则。至少要包含:领域定义、文件命名规则、frontmatter 格式、标签分类表、更新策略。标签分类表尤其重要,它防止标签泛滥。比如你定义tags只能从[llm, retrieval, vector-db, agent, tooling]里选,Agent 就不会自己造新标签。

Obsidian 那边,建议装两个插件配合:Dataview 用来查询 frontmatter,Graph View 用来看知识结构。Dataview 的查询可以写在任意笔记里,比如列出所有type: concept且tags包含retrieval的页面。这样你在 Obsidian 里也能按结构化方式浏览 Agent 生成的内容。

配置写完之后,跑一次hermes config show确认skills.config.wiki被正确加载。如果输出里能看到你填的路径和参数,说明配置生效。接下来就可以进入验证环节了。

4. 验证请求:从提问到引用笔记的完整流程

配置好之后,最直接的验证方式是跑一次完整的 Ingest 加 Query。我拿一个真实场景来演示:假设你在raw/notes/下有一篇关于向量检索的笔记,文件名是vector-search-notes.md,内容里提到了 HNSW 和 IVF 两种索引的取舍。你想让 Agent 把这篇笔记编译成 Wiki 页面,然后通过提问来验证它能不能正确引用。

第一步,启动 Hermes Agent。在终端里执行hermes,你会看到欢迎界面和可用工具列表。确认note-taking: obsidian这个技能在列表里,说明 Obsidian 相关的技能已经加载。

第二步,触发 Ingest。在 Hermes 的对话里输入:

/llm-wiki 把 raw/notes/vector-search-notes.md 编译进知识库

Agent 会读取这个文件,然后按照SCHEMA.md的约定生成 Wiki 页面。它可能会创建wiki/concepts/vector-search.md作为概念页,更新index.md把新页面加进去,在log.md里追加一条 Ingest 记录。如果这篇笔记里提到了 HNSW 和 IVF,它可能还会创建wiki/entities/hnsw.md和wiki/entities/ivf.md两个实体页,并在概念页里用[[hnsw]]和[[ivf]]建立链接。

Ingest 完成后,Agent 会告诉你它创建或更新了哪些页面。你可以在 Obsidian 里打开~/wiki这个 Vault,看到新生成的页面。检查一下 frontmatter 是否完整,sources字段是否指回了raw/notes/vector-search-notes.md。

第三步,验证 Query。在 Hermes 里输入一个需要综合笔记内容的问题:

HNSW 和 IVF 在我的笔记里是怎么对比的?各自的适用场景是什么?

Agent 会先读index.md定位相关页面,然后深入读取wiki/concepts/vector-search.md以及它链接的实体页,最后综合出答案。关键看两点:答案里有没有引用具体的 Wiki 页面,以及引用是否准确。

一个正常的输出应该类似这样:

根据你的笔记,HNSW 和 IVF 的对比可以总结为: HNSW([[hnsw]])适合对召回率要求高、可以接受较高内存占用的场景。 它的图结构在查询时能快速收敛,但构建索引的时间较长。 IVF([[ivf]])适合数据量大、内存受限的场景。它通过聚类把向量 分到不同的桶里,查询时只扫描部分桶,速度快但召回率会有损失。 来源:wiki/concepts/vector-search.md,wiki/entities/hnsw.md, wiki/entities/ivf.md

如果你看到这样的输出,说明 Query 流程跑通了。Agent 不仅回答了问题,还告诉你答案来自哪几个页面,这就是 LLM Wiki 和普通搜索的区别:它读的是已经编译好的结构化知识,而不是原始笔记的碎片。

第四步,验证 Lint。输入:

/llm-wiki 对知识库做一次健康检查

Agent 会跑 Lint 流程,检查孤立页面、死链接、矛盾声明、缺失页面等。输出会列出发现的问题,比如「wiki/entities/hnsw.md没有入链」或者「wiki/concepts/vector-search.md里提到了[[faiss]]但该页面不存在」。你可以根据这些提示去补充或修正。

整个验证流程跑下来,你应该能感受到 LLM Wiki 的工作方式:Ingest 把原始笔记编译成结构化页面,Query 读编译后的知识回答问题,Lint 维护知识库的健康。这三个操作构成了一个闭环,用得越久,知识库越完整。

如果你在 Query 阶段发现 Agent 没有引用到某篇笔记,先检查那篇笔记有没有被 Ingest 过。LLM Wiki 只读wiki/目录下的页面,不会直接去raw/里搜。所以原始笔记必须先经过 Ingest 编译,才能被 Query 检索到。

5. 本篇常见错排查:401、local proxy failed、reading choices、OAuth

这一节把 LLM Wiki 场景下最容易遇到的几个报错列出来,每个都给出原因和解决方法。这些报错我在配置过程中都实际碰到过,你照着排查能省不少时间。

401 Unauthorized

这是最常见的报错,通常出现在 Ingest 或 Query 触发模型调用的时候。原因有三个可能:API Key 填错了、Base URL 填错了、或者 Key 没有对应模型的权限。

排查步骤:先确认config.yaml里的api_key字段是不是完整的 Key,有没有多余的空格。然后确认base_url是https://taotoken.net/api,注意结尾不要多加/v1或者/chat/completions,Hermes 会自己拼路径。最后去模型对话页面确认你填的 Model ID 是可用的,有些模型需要单独开通。

如果三个都确认没问题还是 401,跑一下hermes config show看实际加载的配置是什么。有时候你改了配置文件但 Hermes 读的是另一个位置的配置,比如项目目录下的config.yaml覆盖了用户目录下的。

local proxy failed

这个报错通常出现在 Hermes 尝试连接模型端点的时候。原因可能是网络配置问题,或者 Base URL 写成了本地地址。

排查步骤:确认base_url是https://taotoken.net/api而不是http://localhost:xxxx之类的本地地址。如果你之前配过本地模型服务,检查一下配置有没有被覆盖。另外确认你的网络能正常访问外部 API,可以在终端里跑curl -I https://taotoken.net/api看看能不能通。

reading choices 报错

这个报错通常长这样:Error reading choices from response或者cannot read property 'choices' of undefined。原因是模型返回的响应格式不符合 OpenAI 兼容格式,Hermes 解析不了。

排查步骤:先确认你用的 Model ID 是 OpenAI 兼容的。有些模型返回的格式不一样,Hermes 可能处理不了。去模型对话页面试一下同一个 Model ID,看返回是否正常。如果模型对话页面正常但 Hermes 报错,可能是 Hermes 版本和 API 格式不匹配,检查一下 Hermes 的版本,必要时升级。

还有一种情况是max_tokens设得太小,模型返回被截断,JSON 不完整导致解析失败。把max_tokens调到 8192 或更高试试。

OAuth 相关报错

如果你在配置里用了 OAuth 认证而不是 API Key,可能会遇到OAuth token expired或者OAuth flow failed。LLM Wiki 场景建议直接用 API Key,比 OAuth 简单稳定。

排查步骤:如果你确实需要用 OAuth,确认 token 没过期,重新走一遍授权流程。如果不需要 OAuth,把配置里的 OAuth 相关字段删掉,只保留api_key。

Ingest 后 Query 找不到内容

这个不是报错,但很常见。你 Ingest 了一篇笔记,Query 的时候 Agent 却说找不到。原因通常是 Ingest 没有真正写入wiki/目录,或者index.md没有更新。

排查步骤:去~/wiki/wiki/目录下看看有没有新生成的.md文件。如果没有,说明 Ingest 失败了,检查raw/目录下的源文件路径是否正确。如果有文件但 Query 找不到,检查index.md里有没有把新页面加进去。LLM Wiki 的 Query 流程是先读index.md定位,如果 index 没更新,Agent 就找不到新页面。

Skill Config 不生效

你改了config.yaml里的skills.config.wiki,但 Agent 还是用默认路径。原因是 Hermes 可能缓存了配置,或者配置文件的优先级不对。

排查步骤:跑hermes config show看实际加载的值。如果显示的还是默认值,检查配置文件的路径和格式。有些 Hermes 版本要求 Skill Config 放在特定的 section 下,比如skills.config而不是skill_config。确认你的配置结构和文档一致。

CC Switch / Cline MCP / Codex auth.json 相关

如果你同时用 CC Switch 或者 Cline 的 MCP 功能,可能会遇到配置冲突。这三个工具都需要 Base URL、API Key、Model ID 三件套,如果它们指向不同的端点,会出现有的工具能用有的不能用的情况。

排查步骤:确认每个工具的配置里,Base URL 都是https://taotoken.net/api,API Key 是同一个,Model ID 是各自确认可用的。Codex 的auth.json里如果填了错误的端点,会导致 Codex 调用失败但 Hermes 正常。检查~/.codex/auth.json或者项目目录下的auth.json,确认字段值正确。

把上面这些排查一遍,大部分配置问题都能解决。如果还是不行,去接入文档页面看看有没有更新的配置说明,地址是 https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=doc&utm_campaign=rewrite 。

6. 把笔记接成知识库之后:持续维护与下一步

跑通 Ingest、Query、Lint 之后,你的 Obsidian 笔记就已经接成了一个可对话的知识库。但这只是开始,LLM Wiki 的价值在于持续积累。每次你往raw/里丢新笔记,跑一次 Ingest,知识库就厚一层。Query 的时候 Agent 能综合的信息就多一分。

维护上有几个习惯值得养成。第一,Ingest 之后花两分钟检查 Agent 生成的页面,看看 frontmatter 填得对不对,链接建得合不合理。Agent 不是每次都完美,早期多检查能帮它校准。第二,定期跑 Lint,把孤立页面和死链接清理掉。知识库越大,Lint 越重要。第三,Query 出来的好答案,让 Agent 归档成wiki/queries/下的页面。这样下次问类似问题,它能直接读归档的答案,不用重新综合。

如果你想让 Agent 长期跑知识管理任务,比如定时 Ingest 新笔记、自动 Lint,可以考虑 Coding Plan 方案,地址是 https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=coding-plan&utm_campaign=rewrite 。对于需要频繁调用模型的场景,这个方案比按量计费更划算。

Claude Code 用户如果想把 LLM Wiki 接进自己的编码工作流,可以参考 ClaudeCodeAnthropic 的接入方式,地址是 https://taotoken.net/claude-code-anthropic?utm_source=taotoken_aicg_blog_end&utm_content=claudecode&utm_campaign=rewrite 。核心还是那三件套:Base URL 填https://taotoken.net/api,API Key 用你创建的,Model ID 选确认可用的。

最后说一个我自己的经验:LLM Wiki 刚跑起来的时候,别急着把几百篇笔记全 Ingest 进去。先拿十篇左右试水,看看 Agent 生成的页面质量、Query 的准确度、Lint 的误报率。调整SCHEMA.md和 Skill Config 到满意了,再批量导入。这样你能在早期发现配置问题,而不是等知识库大了再返工。

知识库这东西,用起来才有价值。你把它接好之后,试着每天问它一个问题,慢慢就会形成习惯。散落的笔记变成可对话的知识库,这个转变本身就会改变你记笔记的方式——你会更愿意写,因为你知道写进去的东西真的能被用起来。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询