
1. 为什么 Milvus 做 RAG 时N8N 和 dify 总让人纠结如果你正在用 Milvus 搭 RAG大概率会卡在同一个岔路口工作流到底用 N8N 还是 dify这两个工具都能连大模型、都能接向量库但底层思路完全不同。N8N 是通用自动化编排工具能连几百种服务和 APIAI 只是它众多节点里的一类dify 是专为生成式 AI 应用设计的平台内置 LLM 连接、提示词管理、知识库流水线开箱即用程度更高。我试过把同一份 Milvus 集合分别接到两套流程里感受非常直接N8N 像给你一盒乐高什么都能拼但每块砖要自己找dify 像给你一套已经拼好 70% 的模型你只需要补关键零件。选哪个取决于你要的是“完全可控”还是“快速上线”。这篇会先讲清楚 Milvus 在 RAG 里的角色再给出两套可复制的 docker-compose 与工作流骨架最后用具体命令验证召回率。你跟着做能直接判断自己的场景该选谁。2. Milvus 在 RAG 链路里到底负责什么RAG 的核心链路是文档切块 → 嵌入模型转向量 → 存入向量库 → 用户提问转向量 → 向量库召回 Top-K → 拼进提示词交给 LLM。Milvus 负责的是第四、五步也就是“存”和“召回”。它不生成内容也不管你怎么编排流程。所以 N8N 和 dify 的差异本质是“谁来做编排层”。Milvus 只要求两件事集合的维度与嵌入模型输出一致索引的 metric_type 与调用方默认匹配。N8N 封装的 Milvus 节点默认用 L2如果你建集合时选了 COSINE插入就可能失败。dify 的知识库配置里可以显式选度量方式容错稍好但同样要对齐维度。理解这一点后面选型就不会被“哪个更火”带偏。3. 前置准备TaoToken 接入与模型 Key无论选 N8N 还是 dify你都需要一个能调 LLM 和嵌入模型的入口。我这边统一用 TaoToken 做模型接入层它兼容 OpenAI 风格的接口N8N 和 dify 都能直接填。先去官网 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 注册然后在控制台创建 API Key。控制台地址是 https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_contentconsoleutm_campaignrewrite Key 管理页在 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi-keysutm_campaignrewrite 。拿到 Key 后基础地址填 https://taotoken.net/api 不要加 UTM。嵌入模型和对话模型可以分别选比如嵌入用通用 embedding 模型对话选支持 Tools 的模型。如果你后面要长期跑编码类 Agent可以看 Coding Planhttps://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding-planutm_campaignrewrite 。注意Milvus 集合维度必须和嵌入模型输出维度一致。建集合前先确认模型维度别建完再改改维度等于重建。4. 两套可复制部署N8N 与 dify 的 docker-compose4.1 Milvus 独立部署 compose先起 Milvus这是两套方案共用的底座。下载官方 standalone composewget https://github.com/milvus-io/milvus/releases/download/v2.5.4/milvus-standalone-docker-compose.yml -O docker-compose.yml docker compose up -d docker ps -a启动后确认三个容器milvus-standalone、milvus-minio、milvus-etcd。默认端口 19530 是 gRPC9091 是 metrics。再起 Attu 管理面板docker run -d -p 8000:3000 -e MILVUS_URL你的服务器IP:19530 registry.cn-hangzhou.aliyuncs.com/xy-zy/attu:v2.5浏览器打开服务器IP:8000登录后创建 Collection。维度填嵌入模型维度metric_type 选 L2索引选 IVF_FLAT 或 HNSW 都行先跑通再调优。4.2 N8N 部署 composeN8N 用 Docker 起注意N8N_SECURE_COOKIEfalse否则非 HTTPS 访问会卡登录version: 3.8 services: n8n: image: n8nio/n8n:latest container_name: n8n ports: - 5678:5678 environment: - N8N_SECURE_COOKIEfalse - N8N_HOST你的服务器IP - N8N_LISTEN_ADDRESS0.0.0.0 - N8N_PORT5678 volumes: - n8n_data:/home/node/.n8n volumes: n8n_data:docker compose up -d后访问IP:5678初始化管理员账户。N8N 的优势在这里体现它可以直接在节点里填 Milvus 地址、TaoToken 的 API 地址和 Key不需要改配置文件。4.3 dify 部署 composedify 官方 compose 较重包含 api、worker、web、db、redis、weaviate 等。如果你已经用 Milvus可以在 dify 的环境变量里把向量库指向 Milvus而不是用它自带的 weaviate。核心片段services: api: image: langgenius/dify-api:latest environment: - VECTOR_STOREmilvus - MILVUS_URIhttp://你的服务器IP:19530 - MILVUS_TOKEN - MILVUS_COLLECTION_NAMEdify_ragdify 的知识库流水线是可视化的上传文档后自动切块、嵌入、入库你只需要在模型供应商里填 TaoToken 的 base_url 和 Key。它的编排层是“应用”概念聊天助手、Agent、工作流都有模板。5. 工作流骨架N8N JSON 与 dify 配置对照5.1 N8N 两阶段工作流骨架N8N 的 RAG 要拆成两个工作流。第一阶段做向量化{ nodes: [ {name: Manual Trigger, type: n8n-nodes-base.manualTrigger}, {name: Milvus Insert, type: n8n/n8n-nodes-langchain.vectorStoreMilvus}, {name: Embeddings, type: n8n/n8n-nodes-langchain.embeddingsOpenAi}, {name: Document Loader, type: n8n/n8n-nodes-langchain.documentDefaultDataLoader}, {name: Text Splitter, type: n8n/n8n-nodes-langchain.textSplitterRecursiveCharacterTextSplitter} ] }连接顺序Manual Trigger → Document Loader → Text Splitter → Embeddings → Milvus Insert。Embeddings 节点里 base_url 填https://taotoken.net/apiKey 填你的 TaoToken Key。第二阶段做检索对话Chat Trigger → AI Agent → 挂 Chat ModelTaoToken 对话模型 Simple Memory Vector Store Tool指向同一个 Milvus Collection 和嵌入模型。AI Agent 的系统提示词里明确告诉它“先查向量库再回答”。5.2 dify 配置对照dify 里不需要写 JSON直接在“知识库”上传文档选 Milvus 作为向量库嵌入模型选 TaoToken 提供的 embedding。然后在“应用”里建一个 Chatflow把知识库挂到 LLM 节点的上下文里。dify 会自动处理召回和拼接你调的是 Top-K 和 score 阈值。对照下来N8N 的自由度体现在你能精确控制每个节点的输入输出甚至可以在召回后加一层重排dify 的自由度体现在应用层的提示词编排和发布渠道但底层检索链路是封装好的。6. 验证请求与召回率检查部署完别急着下结论先用命令验证 Milvus 里到底有没有数据、召回准不准。查集合统计curl -X POST http://你的服务器IP:19530/v2/vectordb/collections/describe \ -H Content-Type: application/json \ -d {collectionName: your_collection}更直接的是用 Attu 面板看 entity 数量。如果上传了 10 个文档块集合里应该有 10 条向量。没有的话检查嵌入节点是否报错、维度是否匹配。召回率验证准备 5 个你知道答案的问题分别走 N8N 和 dify 的对话入口看返回内容是否命中原文。如果召回为空先调大 Top-K再检查 metric_type。N8N 的 Milvus 节点如果建集合时用了 COSINE插入会静默失败这是最常见的坑。想单独验证模型对话效果可以用模型对话页快速测https://taotoken.net/model-chat?utm_sourcetaotoken_aicg_blog_endutm_contentmodel-chatutm_campaignrewrite 。接入文档在 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 里面有各语言的调用示例。7. 本篇常见错排查报错一Milvus 插入失败提示 metric type 不匹配。N8N 默认 L2建集合时选了 COSINE。解决重建集合选 L2或在 dify 里显式指定度量方式。报错二嵌入维度不一致。集合建了 768 维嵌入模型输出 1024 维。解决先查模型文档确认维度重建集合。报错三N8N 登录卡住或 cookie 报错。没设N8N_SECURE_COOKIEfalse。解决加环境变量重启。报错四dify 连不上 Milvus。MILVUS_URI写成了localhost但 dify 在容器里localhost 指向容器自身。解决填宿主机 IP 或 compose 服务名。报错五召回结果为空但集合有数据。查询向量和入库向量用的不是同一个嵌入模型。解决两阶段必须用同一个模型和同一个 TaoToken Key。8. 选型结论与下一步回到最初的问题Milvus 做 RAGN8N 和 dify 怎么选如果你要的是多系统集成、非 AI 任务也要串进来、想完全掌控检索链路选 N8N。它的学习曲线陡但每一层都透明适合做技术验证和复杂自动化。如果你要的是快速上线一个问答应用、知识库管理可视化、不想碰底层检索参数选 dify。它把 Milvus 的接入封装好了你专注在提示词和应用逻辑上。两者不冲突我现在的做法是dify 跑面向用户的问答应用N8N 跑后台的数据同步和定时向量化任务共用同一个 Milvus 集合。这样既快又不丢控制权。长期跑编码类 Agent 的话Coding Plan 比按量更划算https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding-planutm_campaignrewrite 。Claude Code 接入参考https://taotoken.net/claude-code?utm_sourcetaotoken_aicg_blog_endutm_contentclaudecodeutm_campaignrewrite 。先把 Milvus 集合建对再把嵌入模型对齐剩下的编排层选谁都不会翻车。