不倾向使用 RAGflow 而选择直接基于 Milvus 进行定制化开发,核心原因在于定位差异和深度
不臃肿,流程定制化,测试调优掌控力高
定制需求:
定位完全不同(组件 vs. 框架)
- Milvus 是基础的向量数据库(基础设施层),只负责存取和比对向量。
- RAGflow 是端到端的 RAG 编排框架/应用。它打包了文档解析、切分、向量化和检索全流程。事实上,RAGflow 底层也需要依赖 Elasticsearch、Milvus 或其他向量库来存储数据。
双层检索架构与 Text2SQL 的深度定制
- 你的系统设计了高度定制化的 Milvus (语义泛化) + PostgreSQL + Text2SQL (精准业务查询) 双链路,并且有独特的业务混合策略(如“70%商品名+30%语义”的定制排序)。
- RAGflow 这种开箱即用的框架主要强项在于纯文档的深度解析(Deep Document Understanding,如图表、PDF排版还原)。它很难无缝且灵活地嵌入极其定制化的关系型数据库逻辑(Text2SQL)和动态权重配置中。
系统集成度与控制力
- 从代码结构(纯 Java/Spring Boot,拥有自身的
pipeline/、鉴权、aop和各类业务 Controller)可以看出,系统需要极高的工程控制力。
- 直接调用 Milvus Client,你可以将 RAG 的每一步(如意图探测、调用特定的 Embedding 模型、自研的 Redis 语义缓存降级策略)完全融入现有的微服务架构中,方便后续的性能调优和压测监控。而引入 RAGflow 等同于引入了一个复杂的“系统黑盒”,调试和二次开发成本极高。
1 Embedding 与检索优化
1.1 向量化模型
使用 BAAI/bge-m3 模型:
检索参数调优
1 2 3 4 5
| RetrieveArgs args = new RetrieveArgs(); args.setSimilarityThreshold(0.2); args.setVectorSimilarityWeight(0.7); args.setTopK(5); args.setRerankId("BAAI/bge-reranker-v2-m3");
|
参数说明:
- similarityThreshold:过滤低相似度结果
- vectorSimilarityWeight:向量搜索vs关键词搜索的权重比
- topK:控制返回数量
- rerankId:使用专门的重排序模型提升相关性
[[embedding]]还有
1.2 混合检索
1.3 reranker
1.4 检索参数调优
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81
| public class RetrievalOptimizer {
public RetrieveArgs getHighPrecisionArgs(String question) {
RetrieveArgs args = new RetrieveArgs();
args.setQuestion(question);
args.setSimilarityThreshold(0.5);
args.setVectorSimilarityWeight(0.8);
args.setTopK(3);
args.setRerankId(rerankId);
return args;
}
public RetrieveArgs getHighRecallArgs(String question) {
RetrieveArgs args = new RetrieveArgs();
args.setQuestion(question);
args.setSimilarityThreshold(0.2);
args.setVectorSimilarityWeight(0.7);
args.setTopK(10);
args.setRerankId(rerankId);
return args;
}
public RetrieveArgs getBalancedArgs(String question) {
RetrieveArgs args = new RetrieveArgs();
args.setQuestion(question);
args.setSimilarityThreshold(0.3);
args.setVectorSimilarityWeight(0.7);
args.setTopK(5);
args.setRerankId(rerankId);
return args;
}
}
|
2 问题重写
用户在对话中常使用代词、省略等口语化表达,直接检索效果不佳
3 知识库
- QA文档(QaDocChunk):问答对格式
- 格式:Q: 问题\nA: 答案
- 特点:
- 结构化存储
- 快速精确匹配
- 适合FAQ场景
- 支持批量Excel导入
- 商品文档(GoodDoc):
- 商品标题、参数、图片、URL。结构化商品数据。
- 支持从商品详情页自动抓取
- 额外文档(ExtraDocChunk):
- 通用知识库,存储非结构化的通用知识,灵活详细说明
- 支持纯文本、多列Excel
使用 EasyExcel 实现流式读取,支持大文件。
性能优化要点:
- 流式读取:使用 EasyExcel 避免大文件OOM
- 批量处理:每100行等待一次,防止Future列表过大
- 并发写入:使用专用线程池并发调用RAGFlow API
- 错误处理:记录每行错误,不影响整体导入
- 事务分离:删除操作在主事务,导入操作异步执行
4 RAG flow
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215
| ┌─────────────────────────────────────────────────────────────────┐
│ RAG 完整工作流 │
│ │
│ 用户问题 │
│ │ │
│ ▼ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ 1. 问题预处理与重写 (QuestionRewriteHandler) │ │
│ │ - 补全代词指代(如"它"→"这个商品") │ │
│ │ - 补充省略主语 │ │
│ │ - 结合历史上下文 │ │
│ └────────────────────┬────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ 2. 并行多知识库检索 │ │
│ │ ┌──────────────────┐ ┌──────────────────┐ │ │
│ │ │ 通用知识库 │ │ 商品知识库 │ │ │
│ │ │ (QA Document) │ │ (Extra Document) │ │ │
│ │ │ - 售后政策 │ │ - 商品参数 │ │ │
│ │ │ - 常见问题 │ │ - 使用说明 │ │ │
│ │ │ - 流程说明 │ │ - 故障代码 │ │ │
│ │ └────────┬─────────┘ └────────┬─────────┘ │ │
│ │ │ │ │ │
│ │ │ [并发执行,约1-2秒] │ │ │
│ │ │ │ │ │
│ │ └───────────┬───────────┘ │ │
│ └───────────────────────┼─────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ 3. 向量检索 (RAGFlow Retrieval API) │ │
│ │ ┌─────────────────────────────────────────────┐ │ │
│ │ │ Embedding Model: BAAI/bge-m3 │ │ │
│ │ │ - 向量维度: 1024 │ │ │
│ │ │ - 序列长度: 8192 tokens │ │ │
│ │ │ - 多语言支持 (中/英/日/韩) │ │ │
│ │ └─────────────────────────────────────────────┘ │ │
│ │ │ │
│ │ 检索参数配置: │ │
│ │ - similarity_threshold: 0.2 (相似度阈值) │ │
│ │ - vector_similarity_weight: 0.7 (向量权重) │ │
│ │ - top_k: 5 (每文档返回5个最相关块) │ │
│ │ - keyword: false (禁用纯关键词搜索) │ │
│ └────────────────────┬────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ 4. 重排序 (Reranker) │ │
│ │ Model: BAAI/bge-reranker-v2-m3 │ │
│ │ - 对初步检索结果进行精排 │ │
│ │ - 提升最相关文档的排名 │ │
│ │ - 过滤噪音文档 │ │
│ └────────────────────┬────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ 5. 知识块聚合与格式化 │ │
│ │ ┌───────────────────────────────────────────────┐ │ │
│ │ │ ## 知识库分类说明 │ │ │
│ │ │ 【通用知识库】- 通用售后政策、流程... │ │ │
│ │ │ 【商品知识库】- 当前商品相关信息... │ │ │
│ │ │ │ │ │
│ │ │ ## 【通用知识库】 │ │ │
│ │ │ Chunk 1: 退货政策说明... │ │ │
│ │ │ Chunk 2: 发货时间规定... │ │ │
│ │ │ │ │ │
│ │ │ ## 【商品知识库】 │ │ │
│ │ │ Chunk 1: 商品A参数:尺寸... │ │ │
│ │ │ Chunk 2: 商品A故障代码E01... │ │ │
│ │ └───────────────────────────────────────────────┘ │ │
│ └────────────────────┬────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ 6. 构建增强 Prompt │ │
│ │ ┌───────────────────────────────────────────────┐ │ │
│ │ │ System Prompt (来自数据库 Prompts 表) │ │ │
│ │ │ + 知识库上下文 (Retrieval Results) │ │ │
│ │ │ + 历史对话 (Recent 5-10 messages) │ │ │
│ │ │ + 当前问题 (Rewritten Question) │ │ │
│ │ └───────────────────────────────────────────────┘ │ │
│ └────────────────────┬────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ 7. LLM 生成回答 │ │
│ │ - 多提供商自动故障转移 │ │
│ │ - 支持模型: │ │
│ │ * yuboar-gpt-4.1-mini (主力) │ │
│ │ * poloai-gpt-4o-mini (备用) │ │
│ │ * chatapi-gpt-4.1-nano (备用) │ │
│ │ - 超时时间: 10秒 │ │
│ │ - 冷却时间: 5分钟 │ │
│ └────────────────────┬────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ 8. 后处理 │ │
│ │ - 关键词替换 (敏感词过滤) │ │
│ │ - 格式化输出 │ │
│ │ - 日志记录 │ │
│ └────────────────────┬────────────────────────────────┘ │
│ │ │
│ ▼ │
│ 最终客服回复 │
└─────────────────────────────────────────────────────────────────┘
|
RAGFlow 是一个开源的 RAG 引擎,提供完整的文档管理、向量化、检索和重排序功能。
大多数 RAG 工具只是简单地把文本切块(Chunking),而 RAGFlow 会先“看懂”文件的排版(比如识别 PDF 里的表格、图片、标题层级),从而保证喂给 AI 的数据是结构清晰的。
这里做一个对比:
| 功能点 |
LangChain / 普通 RAG |
RAGFlow |
| PDF 表格处理 |
通常是一团乱码或直接忽略 |
核心优势,能识别表格结构并还原 |
| 文档分块 |
机械地按字符数切分(如每500字切一刀) |
智能分块,按语义、段落、页面结构切分 |
| 原文溯源 |
很难定位到 PDF 具体位置 |
提供可视化的 PDF 查看器,高亮显示引用段落 |
| 部署难度 |
纯代码库,需自己写后端 |
完整的系统,带 UI、数据库和中间件,部署较重 |
| RAGFlow 这类工具的出现,标志着 RAG 技术正在从“极客的代码片段”走向“企业级基础设施”。可以看作造好的轮子。 |
|
|
- 门槛骤降: 以前做 RAG,你需要懂 Python,会用 LangChain,懂向量数据库,还得自己写 PDF 解析脚本。现在,一个不懂代码的行政人员,只要对着 RAGFlow 界面点几下,就能搭建一个“公司规章制度问答助手”。
- 标准统一: 大规模使用的前提是标准化。RAGFlow 把“文档解析 -> 切片 -> 向量化 -> 检索 -> 排序”这一套流程标准化了