我之前帮朋友调过一套 RAGFlow 知识库,从部署到跑通检索流程,前后踩了不少坑。最近看到 RAGFlow 更新到 v0.27.1,社区里问检索流程的人也越来越多,干脆把这套东西从原理到实操完整梳理一遍。这篇文章不聊虚的,直接讲清楚:一个文档从上传到知识库,到你问问题、系统给出带引用的答案,中间到底发生了什么,每一步有哪些关键参数和配置,以及我实际调试中遇到的那些坑。
1. 先把 RAGFlow 检索流程的整体架构摸清楚
1.1 RAGFlow 不是普通的知识库,它把检索流程拆成了五层
很多刚接触 RAG(检索增强生成)的朋友,一开始都会把“知识库”理解成一个简单的“文档仓库 + 向量数据库”,以为把 PDF 传上去、切块、embedding,然后用户提问时做一次相似度搜索就完事了。
RAGFlow 的定位不太一样。从项目早期版本开始,它就强调“深度文档理解”,也就是说,它不仅要把文档切成文本块,还要把文档的版面结构、表格关系、段落层级都解析出来,再进入检索链路。整个检索流程,我习惯把它拆成五层:
- 解析层(DeepDoc):处理 PDF、Word、Excel、PPT 等格式,识别版面、标题、表格、图片中的文字;
- 分块层(Chunking):把解析后的结构化内容切分成适合检索和生成的知识单元;
- 索引层(Embedding):将文本块向量化,同时保留全文索引,构建混合检索的基础;
- 召回层(Retrieval):用户提问后,用向量检索与全文检索同时召回候选文档片段;
- 重排与生成层(Rerank + LLM):对召回结果进行精排,把最相关的内容交给大模型组织答案,并附上引用来源。
这个五层结构,是理解 RAGFlow 检索流程的关键。你调任何参数、排查任何问题,本质上都是在和这五层打交道。比如你觉得回答不准,问题可能出在解析层把表格内容搞乱了,也可能出在分块层把上下文切断了,还可能出在重排层没有把最关键的片段顶到最前面。
1.2 一次完整检索请求的调用链拆解
我们用一个实际场景来看整个流程:假设你想让 RAGFlow 回答“公司报销制度里差旅住宿的上限是多少”,而知识库里已经上传了一份《差旅管理制度.pdf》。
- 你输入问题后,RAGFlow 先对问题做一次 embedding,把自然语言转换成向量;
- 系统同时把原问题交给全文检索引擎(如 Elasticsearch 或内置的全文索引),做关键词匹配;
- 两路召回结果汇合,经过分数融合,得到一个候选片段列表;
- 这个候选列表传入 Rerank 模型,Rerank 会逐条计算“问题-片段”的相关性分数,重新排序;
- 排序后的 Top N 片段加上原始问题,一起拼进 Prompt,发送给 LLM;
- LLM 生成答案,并标注每个答案片段对应的知识库引用。
整个链路走下来,用户体验就是“问一个问题,得到一段有出处的回答”。但你作为搭建者,必须清楚每一步的输入输出是什么,否则遇到问题很难定位。我在实操中最大的体会是,RAGFlow 的检索流程和其他同类工具最大的区别在于:它默认把“引用溯源”作为检索流程的一部分来设计,而不是后补的一个功能。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 文档解析与分块:检索质量的第一道分水岭
2.1 DeepDoc 解析:为什么版面分析比文字提取更关键
很多人上来就跳过解析,直接把文档扔给文本切割器,这是最致命的错误。RAGFlow 内置的 DeepDoc 模块,说白了一点:它不只是“把 PDF 里的字读出来”,而是“读懂 PDF 的排版”。
举个例子,一份 PDF 里有一个跨页的表格,表格上方是标题,右侧是备注。普通的 PDF 解析库会按照阅读顺序把文字一行一行抽出来,结果表格数据、标题、备注全混在一起。DeepDoc 做的是先做版面检测,识别出“这是表格区块”
