1. 为什么 Hermes 智能体要接 Dify 知识库,以及模型通道为什么必须换
Hermes 智能体本身是一个能调用工具、执行多步任务的 Agent 框架,它擅长的是"调度"和"推理",但它默认不带企业私有知识。Dify 知识库则是一个把 PDF、Word、Markdown 切块、向量化、可检索的知识底座。把两者拼起来,Hermes 负责"想和做",Dify 负责"记得准",这就是当前很多团队在做的本地化 RAG 智能体方案。
真正卡住大多数人的不是 Docker 装不上,而是模型调用通道。Hermes 在推理时要访问 LLM,Dify 在建立知识库索引时要访问 Embedding 和 Rerank 模型,这两条链路如果各自指向不同的、不稳定的 endpoint,联调时就会出现"知识库检索正常但 Hermes 回答跑偏"或者"索引一直处理中"的怪现象。把 endpoint 统一改到 TaoToken 之后,LLM、Embedding、Rerank 三类模型走同一个入口,Key 和 Base URL 只需维护一份,排障时变量少了一大半。
这篇内容适合三类人:正在本地部署 Hermes 的开发者、已经跑起 Dify 但知识库检索效果差的同学、以及想把 Agent 和知识库串成一条链路的工程团队。下面从环境准备一路写到联调验证,所有配置片段都可以直接复制。
我试过把 Dify 的 Embedding 指向本地 Ollama、LLM 指向另一家 API,结果知识库索引和 Hermes 回答的语义空间对不上,检索出来的片段经常答非所问。后来统一走 TaoToken 的 endpoint,问题才收敛。所以这篇的重点会放在"通道统一"这件事上。
2. TaoToken 前置准备:拿到 Base URL、API Key 和 Model ID
在动 Docker 之前,先把模型通道准备好。TaoToken 提供的是 OpenAI 兼容接口,也就是说 Hermes 和 Dify 里凡是让你填 OpenAI Base URL 和 API Key 的地方,都可以直接用它。
你需要准备三样东西:
第一是 Base URL。TaoToken 的 API 入口是https://taotoken.net/api,注意这里不要加任何多余路径,OpenAI 兼容客户端会自动拼接/v1/chat/completions这类后缀。如果你在 Dify 里选的是 OpenAI 供应商,Base URL 就填这个。
第二是 API Key。登录控制台后在 API Keys 页面创建,格式通常是sk-开头的一串字符。这个 Key 同时给 Hermes 和 Dify 用,省得管理多份凭证。
第三是 Model ID。这是最容易出错的地方。TaoToken 上不同模型的 ID 不一样,比如对话模型、Embedding 模型、Rerank 模型各有各的标识。你需要在模型列表里确认你要用的具体 ID,而不是想当然地填gpt-4或text-embedding-ada-002。填错 Model ID 的典型报错是 404 或者model not found。
提示:把 Base URL、API Key、Model ID 三个值先写在一个临时文本里,后面 Dify 和 Hermes 都要反复用到。建议命名成
TAOTOKEN_BASE_URL、TAOTOKEN_API_KEY、TAOTOKEN_LLM_MODEL、TAOTOKEN_EMBED_MODEL、TAOTOKEN_RERANK_MODEL,避免混淆。
如果你还没创建 Key,可以先去控制台生成一个。模型对话能力可以先用对话页面验证一下 Key 是否可用,确认能正常返回再往下走。对于长期跑编码和 Agent 任务的场景,Coding Plan 的额度模型会更划算,这个后面 CTA 部分再说。
这一步不需要装任何东西,纯粹是把凭证备齐。很多人跳过这步直接装 Docker,结果联调时才发现 Key 没权限或者 Model ID 写错,回头返工更费时间。
3. 可复制配置:Dify 与 Hermes 的 endpoint 改造片段
这一节是全文的核心,所有片段都可以直接复制。先改 Dify,再改 Hermes,顺序不要反,因为 Hermes 的工具需要 Dify 的 dataset ID。
3.1 Dify 的模型供应商配置
Dify 部署起来后,进入"设置 → 模型供应商",选择 OpenAI 兼容类型(不同版本叫法可能是 OpenAI-API-compatible)。填入以下参数:
{ "provider": "openai_api_compatible", "base_url": "https://taotoken.net/api", "api_key": "sk-你的TaoToken密钥", "models": [ { "model": "你的LLM-Model-ID", "model_type": "llm" }, { "model": "你的Embedding-Model-ID", "model_type": "text-embedding" }, { "model": "你的Rerank-Model-ID", "model_type": "rerank" } ] }如果你更习惯用环境变量方式,可以在~/dify/docker/.env里追加:
# TaoToken 统一模型通道 TAOTOKEN_BASE_URL=https://taotoken.net/api TAOTOKEN_API_KEY=sk-你的TaoToken密钥 TAOTOKEN_LLM_MODEL=你的LLM-Model-ID TAOTOKEN_EMBED_MODEL=你的Embedding-Model-ID TAOTOKEN_RERANK_MODEL=你的Rerank-Model-ID改完.env后需要docker compose up -d让容器重新读取。注意 Dify 的模型供应商配置在数据库里也有一份,Web 界面填过的以界面为准,环境变量主要用于初始化。
3.2 Hermes 的模型 endpoint 配置
Hermes 的模型配置在~/.hermes/.env里。找到 LLM 相关的段落,改成:
# Hermes LLM 通道指向 TaoToken OPENAI_BASE_URL=https://taotoken.net/api OPENAI_API_KEY=sk-你的TaoToken密钥 OPENAI_MODEL=你的LLM-Model-ID有些 Hermes 版本用的是LLM_BASE_URL和LLM_API_KEY这种命名,你按实际字段名替换即可,值是一样的。关键是 Base URL 必须是https://taotoken.net/api,不要写成https://taotoken.net/api/v1,否则会拼成/api/v1/v1/chat/completions导致 404。
3.3 Hermes 的 Dify 知识库工具配置
在~/.hermes/.env末尾追加 Dify 知识库的连接信息:
# Dify 知识库 DIFY_BASE_URL=http://localhost DIFY_API_KEY=dataset-你的知识库APIKey DIFY_DATASET_ID=你的知识库ID如果 Hermes 和 Dify 不在同一台机器,DIFY_BASE_URL换成 Dify 服务器的实际 IP,比如http://10.0.0.5。这里的三件套是 Base URL、API Key、Dataset ID,缺一不可。
3.4 三件套对照表
| 组件 | Base URL | Key | Model ID / Dataset ID |
|---|---|---|---|
| Hermes LLM | https://taotoken.net/api | sk-xxx | 你的LLM-Model-ID |
| Dify LLM | https://taotoken.net/api | sk-xxx | 你的LLM-Model-ID |
| Dify Embedding | https://taotoken.net/api | sk-xxx | 你的Embedding-Model-ID |
| Dify Rerank | https://taotoken.net/api | sk-xxx | 你的Rerank-Model-ID |
| Hermes→Dify | http://localhost | dataset-xxx | 你的Dataset-ID |
这张表建议截图保存,排障时逐行核对,能省掉大量猜测。
4. 验证请求:从知识库检索到 Hermes 联调成功
配置改完不代表通了,必须逐层验证。顺序是:先验 Dify 知识库 API,再验 Hermes 的 LLM 通道,最后验 Hermes 调用知识库工具。
4.1 验证 Dify 知识库检索接口
用 curl 直接打 Dify 的 retrieve 接口,确认 API Key 和 Dataset ID 有效:
curl -X POST "http://localhost/v1/datasets/你的DatasetID/retrieve" \ -H "Authorization: Bearer dataset-你的知识库APIKey" \ -H "Content-Type: application/json" \ -d '{ "query": "数据库运维安全有哪些风险", "retrieval_model": { "search_method": "hybrid_search", "top_k": 3, "score_threshold_enabled": false, "reranking_enable": true } }'预期返回是一个 JSON,里面有records数组,每个元素包含segment.content和score。如果返回records为空,说明知识库还没索引完或者查询词和文档不匹配;如果返回 401,是 Key 问题;返回 404,是 Dataset ID 写错。
4.2 验证 Hermes 的 LLM 通道
在 Hermes 的 CLI 里直接问一个不涉及知识库的问题,比如"用一句话解释什么是向量检索"。如果 Hermes 能正常回答,说明OPENAI_BASE_URL和OPENAI_API_KEY配置正确。如果报 401,检查 Key;报 404,检查 Base URL 是否多了/v1;报model not found,检查 Model ID。
4.3 验证 Hermes 调用知识库工具
在 Hermes 对话里输入:
帮我从知识库搜索一下数据库运维安全的风险点Hermes 应该自动触发dify_knowledge_search工具,返回知识库里的相关片段,然后结合这些片段生成回答。成功的标志是回答里出现了你文档里的具体内容,而不是泛泛而谈。
4.4 验证 Embedding 和 Rerank 是否生效
回到 Dify 的知识库详情页,点"召回测试",输入一个测试问题。如果返回的片段按相关性排序,且分数有区分度,说明 Embedding 和 Rerank 都在工作。如果所有片段分数一样,通常是 Rerank 没生效,检查 Rerank Model ID 是否填对。
注意:Dify 的召回测试和 Hermes 的工具调用是两条独立链路,前者验证知识库本身,后者验证 Agent 集成。两条都通过,才算真正联调成功。
5. 本篇常见错排查:401、local proxy failed、reading choices、OAuth
联调阶段最容易撞上的就是下面这几类报错,逐个对照处理。
5.1 401 Unauthorized
出现在 Hermes 或 Dify 调用模型时。原因通常是 API Key 无效、过期,或者 Key 前面多了空格。检查~/.hermes/.env和 Dify 模型供应商里的 Key 是否一致,重新复制一遍。如果 Key 是从控制台复制的,注意不要带上换行符。
5.2 local proxy failed
这个报错通常出现在 Hermes 启动时,提示本地代理连接失败。原因是环境里残留了HTTP_PROXY或HTTPS_PROXY变量,指向了一个不存在的本地端口。检查~/.hermes/.env和 shell 的~/.bashrc,把http_proxy、https_proxy、all_proxy这几行注释掉或删除,然后重新加载环境。
5.3 reading choices 相关报错
典型信息是error reading choices或choices field missing。这说明模型返回的 JSON 结构不符合 OpenAI 格式,常见于 Base URL 填错导致请求打到了非兼容接口。确认 Base URL 是https://taotoken.net/api,且 Model ID 是对话模型而不是 Embedding 模型。用 Embedding 模型去调 chat 接口,返回结构里就没有choices。
5.4 OAuth 相关报错
如果 Hermes 或 Dify 提示 OAuth token 失效,通常是因为你之前配置过某个需要 OAuth 的供应商,残留了旧的 token 文件。检查~/.hermes/下是否有auth.json或credentials.json,如果有且不再使用,重命名备份后重启 Hermes。对于 Codex 类工具,auth.json里的字段要和当前 Base URL、Key、Model ID 三件套一致,不一致就会反复触发 OAuth 流程。
5.5 知识库检索返回空
不是报错但结果不对。先确认文档索引状态是"已完成",再检查检索模式。如果用的是"全文检索",中文分词可能不理想,换成"混合检索"并开启 Rerank。Top K 设成 3 到 5 通常效果最好,太大反而引入噪声。
5.6 排障速查表
| 报错 | 最可能原因 | 处理 |
|---|---|---|
| 401 | Key 无效/带空格 | 重新复制 Key |
| local proxy failed | 残留代理变量 | 删除 proxy 环境变量 |
| reading choices | Base URL 或 Model ID 错 | 核对三件套 |
| OAuth 失效 | 旧 token 残留 | 清理 auth.json |
| 检索为空 | 索引未完成/模式不对 | 换混合检索+Rerank |
排障时建议打开 Hermes 的 debug 日志,能看到实际发出的请求 URL 和 payload,比猜快得多。
6. 把通道固定下来:长期跑 Agent 的配置建议
联调通过只是开始,真正要跑起来还得考虑稳定性。我的做法是把所有 endpoint 收敛到一份.env,Hermes 和 Dify 都从这份文件读,避免两处配置漂移。Dify 那边如果 Web 界面和.env冲突,以界面为准,但界面改完记得同步回.env做备份。
对于需要长期跑编码和 Agent 任务的场景,模型调用量会持续增长,按量计费的成本不好预估。TaoToken 的 Coding Plan 提供的是包月额度,适合这种持续调用的模式,你可以去了解一下是否匹配你的用量。如果只是偶尔验证模型效果,用模型对话页面就够了。
最后留一个实用技巧:每次改完配置,先跑一遍第 4 节的三个验证请求,全绿了再让 Hermes 接真实任务。这样能把配置问题和业务问题分开,排障效率高很多。知识库的文档更新后,记得在 Dify 里重新索引,否则 Hermes 检索到的还是旧内容。