RAGFlow 主要解决文档检索和生成中的准确性问题。
MIRIX 则是一个 多代理个人助理框架,基于 LLM 的多代理记忆系统。

Chunk

🚀 流程实例:以一份 PDF 财务报告为例

假设用户向 RAGFlow 上传了一份 2024 年 Q1 的公司财务报告 PDF,并希望提问相关数据。整个流程分解如下:

阶段 概念/操作 解释 (前因后果)
I. 前因:原始数据 原始文档 (Source Document) 一份完整的、非结构化或半结构化的 PDF 报告,包含封面、目录、多页文本、表格、图表等。
II. 核心:切块 (Chunking) Chunking 过程 RAGFlow 的核心工作。它使用预先选择的切块模板(例如,针对表格的模板)来解析 PDF,并执行以下操作:
1. 深度理解: 识别出表格的边界、标题和每行数据。
2. 智能切分: 将表格的一行数据或一个独立的段落切分成一个Chunk
III. 后果 1:Chunk 结果 Chunk (切块) 例如,PDF 中一个关于“营收数据”的表格行,被转化为一个 Chunk。这个 Chunk 不仅仅包含表格数据,RAGFlow 还会附加上下文(比如表格的标题、它所属的章节)以增加语义完整性。
IV. 后果 2:嵌入 (Embedding) Embedding (向量化) 嵌入模型将上一步生成的每个 Chunk 文本转化为一个高维向量
V. 最终用途:检索 (Retrieval) 向量存储 (Vector Store) 所有的 Chunk 向量被存储在 ElasticsearchInfinity 中。
当用户提问(如:“一季度软件服务的营收是多少?”)时,问题也会被向量化,然后在向量存储中快速找到语义最相似的 Chunk(包含“一季度”、“软件服务”、“营收”信息的 Chunk)。

🔍 结论:Chunk 的作用

Chunk 的质量直接决定了 RAG 的可用性。

  • 如果 Chunk 太大: 它可能包含太多不相关的信息,稀释了关键语义,导致检索不精确。
  • 如果 Chunk 太小: 它可能破坏一个完整的语义单元(例如,将表格的一行数据分成了两半),导致 LLM 无法获得完整上下文来生成准确的答案。

RAGFlow 强调切块模板可视化干预,就是为了让用户能最大限度地优化这个 Chunking 过程,从而确保 LLM 接收到的信息是高质量且完整的。


多路召回(Multiple Recall)?

实例解释:查找“销售额”

我们以一个包含公司年报的 RAGFlow 知识库为例。

假设用户提出了一个问题:

用户查询: “2023 年 Q4 软件服务的营收是多少?”

1. 单一召回的局限性

如果只使用向量召回(语义搜索),系统可能会出现偏差:

  • 问题: 用户问的是“营收”,但向量模型可能会检索到语义相似的词,如“利润”、“净收入”等,而错过了精确包含“营收”这个关键词的表格数据。
  • 结果: 找到了很多关于公司财务情况的定性描述(文本),但没有找到精确的数字(表格)。

2. 多路召回的运作方式

RAGFlow 的多路召回会同时发起至少三种类型的查询:

召回路径 (Path) 策略类型 作用和搜索目标 检索结果(示例 Chunk)
路径一 向量召回 (Vector Recall) 侧重语义相似度。将用户查询向量化,搜索所有语义上最接近“2023 年 Q4 软件服务”的 Chunks。 Chunk A (文本描述): “2023 年第四季度,我们的软件服务增长势头强劲,是核心收入驱动力…”
路径二 关键词召回 (Keyword Recall) 侧重精确匹配。在 Elasticsearch 中搜索精确包含 “2023”、“Q4”、“软件服务”、“营收” 等关键词的 Chunks。 Chunk B (表格行): "软件服务
路径三 结构化召回 (Structured Recall) 侧重结构化信息。针对被 RAGFlow 识别的表格问答结构,执行特定的结构查询(如果支持)。 Chunk C (表格元数据): 直接从识别的表格中定位到 2023 Q4 对应的“软件服务”行。

3. 结果融合与重排 (Fusion and Re-ranking)

最后一步,系统会对这三条路径返回的全部 Chunks 进行统一处理

  1. 融合 (Fusion): 将所有路径的结果合并到一个列表中。
  2. 重排 (Re-ranking): 使用一个更强大的模型或算法(例如,混合评分算法)对合并后的 Chunks 再次进行排序。

通过这个过程,即使关键词召回(路径二)找到了最准确的数字表格,它也能确保最终被送给 LLM 的信息列表中,精确包含答案的 Chunk B 能排在最前面。

最终结果: LLM 接收到最相关的 Chunks (包含精确的 1.2 亿美元数据),从而生成一个准确且有数据支撑的回答。

Ollama IPEX-LLM Xinference

部署本地大模型是目前非常热门的话题,Ollama、Xinference、IPEX-LLM 实际上处于大模型部署生态中不同的“生态位”,而 Triton 则属于工业级的“重武器”。

为了让你更直观地理解,我们可以把部署大模型比作**“开一家餐厅(提供模型服务)”**。


一、 三者角色的核心区别

1. Ollama:极简的“自动售货机”
  • 定位: 面向开发者和个人用户的极简桌面级工具。

  • 特点:

    • 傻瓜式: 下载 -> 安装 -> ollama run llama3,一键搞定。
    • 轻量: 主要依赖 GGUF 格式(量化模型),对显存要求低,CPU 也能跑得不错。
    • 生态: 社区非常活跃,很多 WebUI、IDE 插件都首选支持 Ollama。
  • 局限: 主要是为了跑 LLM(对话模型),虽然也支持 Embedding,但对多模态、分布式推理、微调的支持不如专业的全面。

2. Xinference (Xorbits Inference):全能的“连锁自助餐厅”
  • 定位: 面向企业级开发和数据科学家的全能型推理框架。

  • 特点:

    • 大一统: 不仅支持 LLM,还原生支持 Embedding(向量模型)、Rerank(重排序模型)、Image(绘图)、Audio(语音)。做 RAG(知识库)应用时,这一个框架就能把所有模型服务都包圆了。
    • 后端灵活: 它像一个“中介”,底层可以自动调用 vLLM、CTranslate2、GGUF 等不同的推理引擎。
    • 分布式: 支持多机多卡,如果你有两台电脑,想连起来跑一个大模型,Xinference 原生支持。
  • 局限: 安装和配置比 Ollama 稍微复杂一点点(需要 Python 环境),资源占用相对高一些。

3. IPEX-LLM (Intel Extension for PyTorch):专属的“发动机加速器”
  • 定位: Intel 硬件专用的加速库。

  • 特点:

    • 它不是一个服务器: 严格来说,它不是像 Ollama 那样直接给你提供 API 的服务软件,而是一个库(Library)
    • 化腐朽为神奇: 它的作用是让 PyTorch 模型在 Intel 的 CPU(如酷睿 Ultra)、集成显卡(Intel Arc 核显)和 独立显卡 上跑得飞快。
    • 兼容性: 你可以在 Ollama 或 Xinference 的底层使用 IPEX-LLM 来加速(如果你的电脑是 Intel 芯片)。
  • 局限: 如果你用的是 NVIDIA (N卡) 或 AMD 显卡,这个跟你没关系。


二、 它们与 NVIDIA Triton 的关系

Triton Inference Server (NVIDIA) 是这里的“老大哥”,属于工业级/数据中心级的“中央厨房”。

  • 关系:

    • Ollama/Xinference 是为了易用性而设计的,它们牺牲了一些极致的并发性能,换取了“好部署、好管理”。
    • Triton 是为了极致吞吐量稳定性设计的。
  • 主要区别:

    • Triton 的强项: 动态批处理(Dynamic Batching,同时处理几百个人的请求)、多模型并发、支持 TensorRT 极致加速。它通常用于像 ChatGPT 官网、京东客服这种高并发的生产环境。
    • Triton 的缺点: 配置极其痛苦(写 config.pbtxt),学习曲线陡峭。对于本地单用户来说,用 Triton 属于“杀鸡用牛刀”,而且这把牛刀还很重,拿不动。

三、 实际使用场景与选择建议

为了帮你选择,我构建了几个典型的实际场景:

场景 A:程序员/学生,想在 MacBook 或 游戏本上试玩 Llama3,写代码辅助
  • 选择:Ollama
  • 理由: 你不需要配置 Python 环境,不想折腾依赖库。下载完就能用,配合各类插件(如 VSCode 的 Continue 插件)无缝集成。
场景 B:你需要开发一个 RAG(企业知识库)应用
  • 选择:Xinference
  • 理由: RAG 不仅需要对话模型,还需要 Embedding 模型把文档变成向量,需要 Rerank 模型优化搜索结果。Xinference 可以用一套 API 同时启动这三种模型,管理起来非常方便,而且兼容 OpenAI 格式 API,代码改动小。
场景 C:你的公司买了一批 Intel 的服务器,或者是新的 Intel Core Ultra 笔记本
  • 选择:IPEX-LLM (作为底层)
  • 理由: 如果直接用普通的 PyTorch 或 Ollama 的默认后端,Intel 显卡可能无法调用或速度很慢。你需要安装集成了 IPEX-LLM 的 Ollama 版本,或者在代码中 import ipex_llm,才能榨干 Intel 硬件的性能。
场景 D:你需要在生产环境上线一个服务,预计每秒有 1000 人同时访问
  • 选择:Triton (配合 vLLM 或 TensorRT-LLM)
  • 理由: 这种时候 Ollama 会卡死,Xinference 可能也会有瓶颈。你需要 Triton 强大的调度能力和显存管理能力来保证高并发下的低延迟。

总结对照表

特性 Ollama Xinference IPEX-LLM Triton
核心定位 个人/开发者工具 全栈模型部署框架 Intel 硬件加速库 工业级推理服务器
上手难度 ⭐ (极简) ⭐⭐ (简单) ⭐⭐⭐ (需改代码/配置) ⭐⭐⭐⭐⭐ (困难)
模型支持 主打 LLM (GGUF) LLM + 图片 + 音频 + 向量 PyTorch 模型 所有主流 AI 框架
硬件倾向 Apple Silicon, NV卡, CPU NV卡 (推荐), CPU Intel CPU/GPU 专用 NVIDIA GPU 专用
适合场景 本地测试、AI 助手 搭建复杂 AI 应用 (RAG) Intel 设备加速 高并发生产环境

一句话建议:
如果你是个人玩,闭眼选 Ollama;如果你要搞开发做系统,选 Xinference;如果你是 Intel 硬件受害者(或受益者),务必带上 IPEX-LLM;如果你要抗住高并发流量,再去研究 Triton

数据集和核心文件系统

实例说明:一个文件,两个数据集

假设您有一个包含 2024 年 Q1 和 Q2 销售数据的 PDF 文件,文件名为 Sales_Report_2024.pdf

步骤 操作 核心文件系统 数据集 A (市场分析) 数据集 B (财务检索)
1. 上传 Sales_Report_2024.pdf 上传到 RAGFlow。 原始文件被安全存储在这里。 - -
2. 链接 A 将文件链接数据集 A(用于市场分析)。 原始文件不变。 持有文件的引用。使用 “Q&A 切块模板”“中英文嵌入模型” 进行切块和向量化。 -
3. 链接 B 将文件链接数据集 B(用于财务检索)。 原始文件不变。 持有文件的引用 持有文件的引用。使用 “表格切块模板”“财务专业嵌入模型” 进行切块和向量化。
4. 检索 用户在 RAGFlow 中选择数据集 A 或 B 进行提问。 原始文件不变。 中英文向量空间中搜索 Q&A 风格的 Chunks。 财务向量空间中搜索表格风格的 Chunks。

结果的优势:

  1. 高效性: 原始文件只存储了一次(在核心文件系统)。
  2. 灵活性: 同一个文件可以应用不同的 RAG 策略(不同的切块模板和嵌入模型)来适应不同的业务需求。
  3. 安全性: 如果您决定删除数据集 A,只会删除 A 中生成的切块和向量,原始文件仍保留在核心文件系统中,可以继续供数据集 B 使用。

Chunk,layout, 框

这是一个非常好的问题,因为这是理解 RAGFlow 这种深度文档理解型 RAG 引擎的关键。

我们通过一个具体的合同文件实例,来清晰区分 Layout 模型 检测出的“框”和最终的 Chunk (切块)


📄 实例:合同文件中的一个条款和表格

假设我们有一个 PDF 格式的合同文件,其中包含一个条款和一张相关的简单表格。

1. Layout 模型:检测“框” (结构边界)

Layout 模型 的工作是纯粹的机器视觉任务,它像一个高效的机器人视觉系统,只关注文档在页面上的物理排版结构边界

Layout 模型检测出的“框” (Boxes) 目的(机器视觉) 核心问题
条款文本框 识别这是一个“文本段落”区域。 “这个区域的边界在哪里?”
表格标题框 识别这是表格的“标题”或“标签”。 “这是什么类型的元素?”
表格行/单元格框 识别表格中每个单元格的内容和边界。 “这个表格是如何分割的?”

结果: Layout 模型输出了一堆带有坐标的“框”,告诉 RAGFlow 哪里是标题,哪里是正文,哪里是表格。

2. Chunking (切块):创建“语义单元”

Chunking 过程(由 RAGFlow 的切块模板驱动)是一个知识工程任务,它使用 Layout 模型的结果作为输入,目标是创建具有完整语义的知识片段 (Chunk)

RAGFlow 切块的“语义单元” (Chunk) 目的(知识工程) 核心问题
Chunk 1:条款文本 将整个条款文本作为一个独立 Chunk。 “这个段落的语义是什么?”
Chunk 2:表格行 1 关键区别点: 它会结合表格标题该行内容,创建一个 Chunk。 “如何让这个 Chunk 独立地回答问题?”

核心区别实例

假设表格内容是:

产品 价格 交付日期
软件授权 $10000 2025/12/31
❌ 错误的切块(简单画框)

如果 Chunk 只是简单地复制表格行 1 的内容 “软件授权 | $10000 | 2025/12/31”,那么检索时 LLM 就会困惑:这是什么的价格?

✅ RAGFlow 智能切块(语义关联)

RAGFlow 的切块模板会利用 Layout 模型的结构信息,生成一个语义丰富的 Chunk

Chunk Text (用于 Embedding): “这是合同附件 3 中的表格行。产品:软件授权,价格:10000 美元,交付日期:2025 年 12 月 31 日。”


🌟 总结:从“框”到“Chunk”的转变

特征对比 Layout 模型检测出的“框” RAGFlow 最终的 “Chunk”
本质 物理结构边界(像素和坐标)。 逻辑语义单元(文本和上下文)。
作用 输入:提供文档的排版指导。 输出:用于向量化和检索的最小知识单位。
内容 孤立的文本或数据。 融合了上下文和结构信息的完整语句。
目标 识别**“是什么元素”**。 确保 Chunk 能够独立回答**“为什么”“是什么意思”**。

结论: Layout 模型画出的“框”是 RAGFlow 智能切块的原材料,而 Chunk 才是经过 RAGFlow 知识工程加工后的“成品”,这个成品具有完整的语义,可以直接交给 LLM 使用。

2. 什么是关键词索引(Full-Text/Keyword Index)?

关键词索引是支撑多路召回(Multiple Recall) 中的全文搜索那一路的关键。

实例:关键词索引

假设 RAGFlow 处理了您的 Chunk:

Chunk 文本 关键词索引中的记录 召回机制
Chunk Text: “核心产品营收 软件服务 2024 Q1 1.2 亿…” 核心产品营收软件服务2024Q11.2亿 用户查询 “2024 Q1 软件营收” 时,系统在 关键词索引 中进行精确匹配,找到包含这四个词的 Chunk,并给予高分。

作用: 确保当用户使用精准词语(如日期、产品名称、特定术语)提问时,系统能迅速且准确地找到对应的 Chunk。这是对向量召回(语义搜索) 的有效补充。


3. 手动修改 Chunk 文本具体指什么?

手动修改主要有三种形式,旨在修复机器切块的边界错误语义缺失

手动干预类型 实例 为什么需要(机器不智能)
1. 边界修正(合并/拆分) 机器切分错误: 机器将一个完整的句子:“公司今年决定…(换行)…重点投资 AI 领域。”切成了两个 Chunk。
人工操作: 双击第一个 Chunk,将第二个 Chunk 的文本复制过来,合并成一个完整的句子。
机器擅长视觉分析,但对复杂的跨页、跨段的语义衔接判断容易出错。
2. 上下文补充 机器切分结果: 一个表格 Chunk 只有数据,没有标题。
人工操作: 手动在 Chunk 文本开头添加:“以下是 2024 年 Q1 软件服务的营收数据。”
确保每个 Chunk 语义自洽。如果 Chunk 缺失关键上下文,LLM 可能会误解数据。
3. 元数据/关键词注入 Chunk 内容: 描述了公司的“Llama 3 部署项目”。
人工操作: 双击 Chunk,手动添加关键词/标签:“大模型”、“关键项目”、“战略级”。
增强检索效果。许多关键词(如“战略级”)并未在文本中,但用户会用它来搜索。

4. 人工干预:太不智能?浪费时间?用户体验不好?

您的顾虑是完全正确的。在理想情况下,我们希望机器完全自动化,但这在处理非结构化文档时是一个现实的取舍

🤖 为什么 RAGFlow 仍然需要人工干预?

RAGFlow 已经比许多简单的 RAG 工具“智能”得多(因为它有 Layout 模型和多种切块模板)。但是,它仍然无法完美处理所有情况:

  1. 复杂排版: 许多公司报告使用自定义的、不规则的排版,机器很难理解这种人为设计的上下文
  2. 知识盲区: 机器无法知道哪些信息对您和您的团队是最重要的、哪些词语是您的团队内部用来搜索的行话(例如,“A 计划” 实际上指的是 “核心战略项目 2025”)。
  3. 最终准确性要求: 对于企业级应用,例如法律或财务咨询,99.99% 的准确率是必须的。即使是 1% 的切块错误,也可能导致客户收到错误信息。

⚖️ 智能、效率与准确性的平衡

RAGFlow 提供的可视化和干预功能,不是为了取代自动化,而是为了实现 “自动化 + 专家知识校准”

  • RAGFlow (自动化): 负责 95% 的工作,大大提高效率。
  • 用户 (人工干预): 只需检查那 5% 的复杂或关键信息,并注入专业的知识和上下文,确保最终知识库的最高准确率和检索效果

因此,虽然手动干预会浪费少量时间,但其带来的检索准确率(尤其是对关键知识)的提升是巨大的,最终保证了用户的信任和更好的问答体验

这是一个非常好的问题,因为 DLR (Document Layout Recognition)Layout 模型 是同一个概念体系中的不同术语,它们之间存在着强烈的联系,几乎可以视为同一件事。

让我们来详细解释 DLR 的含义,并通过实例说明它与 Layout 模型的关系。


1. DLR (Document Layout Recognition) 的含义

DLR(文档布局识别) 是一种计算机视觉和文档智能技术,其核心任务是理解和解析文档的视觉和逻辑结构

核心目标

DLR 的目标是识别文档页面上的每一个元素,并确定它们之间的关系和功能。它回答了以下问题:

  1. 这个区域是做什么用的? (例如:标题、正文段落、脚注、图片说明)
  2. 这些区域之间的关系是什么? (例如:哪个标题属于哪个段落?这个表格属于哪个章节?)
  3. 阅读顺序是什么? (例如:从左到右,从上到下,或者在多栏布局中如何跳转)

实例:年报的 DLR

假设 RAGFlow 正在处理一份 PDF 格式的公司年报

DLR 识别出的元素 对应的布局识别结果 对 RAGFlow 的价值
视觉元素 页面中央的粗体大字是主标题;右下角的小字是页码;左侧一栏是目录;右侧是正文 RAGFlow 知道哪些文本是重要的(标题),哪些是需要忽略的(页码、页眉)。
逻辑结构 识别出“执行摘要”是一个一级标题;紧随其后的三个段落是其正文内容;接下来的“财务表现”是另一个一级标题 RAGFlow 可以确保切块(Chunking)时,来自“执行摘要”段落的文本,会带着**“执行摘要”的上下文和元数据**。

2. DLR 和 Layout 模型的关系

在 RAGFlow 的语境中,以及整个 AI 文档处理领域:

Layout 模型是实现 DLR 任务所使用的“工具”或“模型”。

术语 含义 角色
DLR (文档布局识别) 任务/目标:识别并理解文档的结构和语义。 目的:我们想要做什么。
Layout 模型 (如 DeepDoc) 工具/技术:实现 DLR 任务的深度学习模型。 手段:我们用什么技术来做。

它们是一回事吗?

  • 在操作层面,当技术人员说“模型正在进行 Layout 检测”时,他们通常指的就是在执行 DLR 任务
  • RAGFlow 提到的 DeepDoc 就是一个执行 DLR、OCR 和 TSR 任务的视觉模型(Layout Model)

总结 RAGFlow 的数据提取任务

RAGFlow 提供的 DeepDoc 选项,实际上执行了三个相互关联的任务:

  1. OCR (Optical Character Recognition): 字符识别(将图片中的文字转化为可编辑文本)。
  2. TSR (Table Structure Recognition): 表格结构识别(识别表格的行、列和单元格关系)。
  3. DLR (Document Layout Recognition): 文档布局识别(识别标题、段落、列表、图表等文档的逻辑结构)。

这三个任务的结果共同作为输入,指导 RAGFlow 的 Chunking(切块) 引擎,确保切块是语义完整、结构准确的。

“Page Rank”(页面权重/数据集优先级)

如果您的聊天助手从“数据集 A (2024 年新闻)”和“数据集 B (2023 年新闻)”中获取信息,但您希望优先使用 2024 年的新闻,那么这个功能就非常有用。

评分机制(Scoring mechanism)

这段是最核心的技术解释,说明 Page Rank 如何影响最终的检索结果。

If you configure a chat assistant’s similarity threshold to 0.2, only chunks with a hybrid score greater than 0.2 x 100 = 20 will be retrieved and sent to the chat model for content generation. This initial filtering step is crucial for narrowing down relevant information.

【前置知识:混合得分与阈值】

  • RAGFlow 使用混合得分(Hybrid Score) 来评估 Chunk 的相关性(结合了向量相似度和关键词权重)。
  • 阈值作用: 如果相似度阈值设置为 0.20.20.2,则只有混合得分高于 0.2×100=200.2 \times 100 = 200.2×100=20 的 Chunk 才能进入下一步处理。

If you have assigned a page rank of 1 to dataset A (2024 news) and 0 to dataset B (2023 news), the final hybrid scores of the retrieved chunks will be adjusted accordingly. A chunk retrieved from dataset A with an initial score of 50 will receive a boost of 1×100=1001 \times 100 = 1001×100=100 points, resulting in a final score of 50+1×100=15050 + 1 \times 100 = 15050+1×100=150. In this way, chunks retrieved from dataset A will always precede chunks from dataset B.

【Page Rank 提升机制】

  • 提升计算: 提升的分数是 Page Rank 值 ×100\times 100×100
  • 实例:
    • 数据集 A (Page Rank=1): 初始得分为 505050 的 Chunk,最终得分 = 50+(1×100)=150=\ 50 + (1 \times 100) = 150= 50+(1×100)=150
    • 数据集 B (Page Rank=0): Page Rank 为 0,得分不变,仍为 505050
  • 效果: 通过这种直接分数叠加的方式,Page Rank 值越高的 Chunk,其最终得分也会越高,从而在最终的检索列表中获得优先排序(如示例中,数据集 A 的 Chunk 会排在数据集 B 的 Chunk 之前)。

Auto-keyword Auto-question

场景实例:客服问答手册

假设 RAGFlow 正在处理一份关于“耳机保修政策”的文档,并且我们已经将其切块(Chunking)。

📄 原始知识片段 (Chunk)

Chunk ID 原始文本
C-501 “在正常的磨损和使用条件下,所有 TWS 耳机产品提供自购买之日起 12 个月的有限保修。保修范围不包括人为损坏或液体接触。”

1. 自动关键词(Auto-keyword)的作用

这个功能用于纠正错误增强检索准确性。它通过 LLM 为 Chunk 添加同义词相关术语

💡 解决的问题:同义词和术语不匹配

用户可能会使用非官方术语提问。

用户查询 原始 Chunk C-501 Auto-keyword 增强 检索结果
“耳塞坏了能修吗?” Chunk 文本:没有“耳塞”、“修”等词。检索可能失败或排名靠后。 LLM 添加耳塞维修免费更换1年质保 成功! 查询词匹配了 LLM 生成的关键词 维修耳塞,Chunk 得分提高,被检索出来。
Auto-keyword 运作方式

LLM 接收 C-501 原始文本,并基于语义生成 3-5 个关键词(假设配置值是 3-5)。这些关键词被添加到 Chunk 的元数据中,增强了关键词索引。


2. 自动问题(Auto-question)的作用

这个功能用于提高用户查询的匹配度,尤其适用于 FAQ 和政策文档。它通过 LLM 为 Chunk 预设可能的问题

💡 解决的问题:用户提问形式的多样性

用户可能会以不同的方式提问相同的问题。

用户查询 原始 Chunk C-501 Auto-question 增强 检索结果
“进水保修吗?” Chunk 文本:只提到“液体接触”。 LLM 添加产品进水是否在保修范围内?人为损坏是否能享受免费维修? 成功! 用户查询的向量与 LLM 生成的问题的向量高度相似,Chunk 被检索出来。
Auto-question 运作方式

LLM 接收 C-501 原始文本,并基于内容生成 1-2 个典型问题(假设配置值是 1-2)。这些问题被向量化后,存储在向量索引中。当用户提问时,系统会拿用户的提问向量去匹配这些自动生成的问题向量,从而实现更强大的语义匹配。


🎯 总结:为什么要使用这两个功能?

功能 核心作用 提升维度 成本(警告)
Auto-keyword 弥补词汇差异:添加同义词、术语。 关键词召回 增加索引时间和 Token 消耗。
Auto-question 弥补句式差异:添加用户可能提出的问题。 向量召回/语义匹配 增加索引时间和 Token 消耗。

这两个功能虽然增加了索引时间和成本,但对于复杂的、用户提问方式多变的场景(如客服 FAQ、技术文档),它们能显著提高 LLM 找到正确信息的概率,从而提升最终问答的准确率和用户体验。


Excel2HTML

场景实例:复杂财务报表

假设您的 RAGFlow 数据集中包含一个复杂的 Excel 文件,其中包含一张年度预算与实际支出对比表,并且有合并单元格来表示大类。

📄 原始 Excel 表格片段

部门 项目类别 (合并单元格) 2024 年预算 (USD) 2024 年实际支出 (USD)
研发部 (合并单元格) 软件授权 50,000 48,000
人力成本 100,000 105,000

1. 禁用 Excel2HTML:键值对表示(Garbled/弄乱)

如果 Excel2HTML 被禁用,RAGFlow 会尝试将表格信息转换为简单的键值对来处理,但它很难处理合并单元格和多层结构。

❌ RAGFlow 生成的 Chunk(禁用 Excel2HTML)

Chunk Text (用于 Embedding):
“部门: 软件授权, 项目类别: 50,000, 2024 年预算 (USD): 48,000, 2024 年实际支出 (USD): 研发部, 软件授权: 100,000, 2024 年预算 (USD): 105,000”

问题:

  • 信息丢失: “研发部”这个关键信息错位了,它被当作了后面一行的数据。
  • 语义混乱: “软件授权”和“人力成本”失去了它们作为“项目类别”的上下文,键值对的结构被打破,整个文本变得难以理解(garbled)
  • LLM 无法理解: 当用户提问“研发部的人力成本是多少?”时,LLM 检索到的 Chunk 是一团乱麻,无法给出正确答案。

2. 启用 Excel2HTML:HTML 表格表示(结构保留)

如果 Excel2HTML 被启用,RAGFlow 会将表格转换为 HTML 格式的文本,HTML 格式能完美保留合并单元格和多列的复杂结构

✅ RAGFlow 生成的 Chunk(启用 Excel2HTML)

Chunk Text (用于 Embedding):

<table>
  <tr><td rowspan="2">研发部</td><td>软件授权</td><td>50,000</td><td>48,000</td></tr>
  <tr><td>人力成本</td><td>100,000</td><td>105,000</td></tr>
</table>

(在发送给 LLM 之前,这个 HTML 通常会被转化为可读的 Markdown 或更结构化的文本。)

优势:

  • 结构清晰: HTML 标签(如 rowspan="2")清晰地定义了“研发部”这个标签涵盖了下面两行数据。
  • LLM 理解: 当这段结构化文本发送给 LLM 时,LLM 可以通过其强大的推理能力,准确地理解这是一个表格,并且知道“人力成本”属于“研发部”。
  • 准确检索: 用户提问“研发部的人力成本是多少?”时,LLM 可以从这段结构化文本中准确提取出 $105,000

结论

方式 适用场景 结果
禁用 Excel2HTML (键值对) 简单、只有两列数据的表格。 复杂表格会弄乱(garbled),影响问答准确性。
启用 Excel2HTML (HTML 表格) 复杂表格(合并单元格、多列等)。 保留结构,确保 LLM 能够准确理解和利用表格数据进行问答。

简而言之,启用 Excel2HTML 就像是给 RAGFlow 提供了一个表格的“蓝图”,而不是一堆散乱的零件,从而解决了复杂表格的解析难题。


TOC

为了让你直观理解 “提取目录(TOC)” 功能的价值,我们用两个非常具体的场景来对比 “普通 RAG”“开启 TOC 增强的 RAG” 的区别。

场景一:员工手册(解决“上下文缺失”问题)

假设你有一份 100 页的公司《员工手册》,里面有两个章节都提到了“请假流程”和“审批人”,但一个是针对普通病假,一个是针对长期停薪留职

文档结构(目录):

  • 第 3 章:日常考勤与病假

    • 3.1 申请流程:(内容:向直属经理申请,审批需 1 天)
  • 第 8 章:长期停薪留职

    • 8.1 申请流程:(内容:向 HR 总监申请,审批需 7 天)
用户的提问:“请假审批需要多久?”

1. 普通 RAG(无 TOC):

  • 检索过程: 系统在文档中切块搜索,可能只找到了切片 A:“审批需 1 天” 和切片 B:“审批需 7 天”。
  • 由于切块很小,切片里可能没有包含“第 3 章”或“第 8 章”的标题信息。
  • LLM 的回答: “根据文档,审批可能需要 1 天,也可能需要 7 天。”(模棱两可,甚至可能把两个混淆,告诉用户病假要找 HR 总监)。

2. 开启 TOC 增强的 RAGFlow:

  • 索引阶段: LLM 已经识别出目录结构,并在切片中打上了标签。

    • 切片 A 标记为:[Context: 第3章 日常考勤与病假]
    • 切片 B 标记为:[Context: 第8章 长期停薪留职]
  • 检索与回答:

    • LLM 能够清晰地看到全局上下文。
  • LLM 的回答: “这取决于您请假的类型。如果是日常病假,根据第 3 章,审批需 1 天;如果是长期停薪留职,根据第 8 章,审批需 7 天。”

  • 价值点: 消除了歧义,精准定位信息的适用范围。


场景二:设备维修手册(解决“切块碎片化”问题)

假设你有一份复杂的《精密仪器维修指南》,其中某一节是关于“故障排查”的,步骤非常长,跨越了多个切块(Chunk)。

文档结构(目录):

  • 第 5 章:发动机故障

    • 5.2 无法启动排查步骤:

      • (段落 1):检查电源连接…
      • (段落 2):检查保险丝…
      • (段落 3):如果上述无效,重置控制板…
用户的提问:“设备无法启动怎么办?”

1. 普通 RAG(无 TOC):

  • 检索过程: 系统通过关键词匹配,可能只找到了“无法启动”匹配度最高的**(段落 1)**。
  • 由于 RAG 的切块限制(比如限制了 500 个字符),(段落 2)和(段落 3)因为没有包含“无法启动”这个关键词,或者距离太远,被丢弃了。
  • LLM 的回答: “请检查电源连接。”(回答不完整,用户试了没用就卡住了)。

2. 开启 TOC 增强的 RAGFlow:

  • 检索过程:

    1. 系统首先检索到了(段落 1)。
    2. 关键步骤(TOC 补充): 系统查看目录结构,发现(段落 1)属于 “5.2 无法启动排查步骤” 这一小节。
    3. 系统自动补全该小节下的所有内容,把(段落 2)和(段落 3)也一起抓取过来,即使它们的关键词匹配度不高。
  • LLM 的回答: “您可以按顺序尝试以下步骤:1. 检查电源连接;2. 检查保险丝;3. 如果都无效,请重置控制板。”

  • 价值点: 保证了逻辑的完整性,防止解决方因切片被截断而“断章取义”。


总结:TOC 增强的核心价值

你可以把普通的 RAG 想象成**“只给你看书里的几句话”,而 TOC 增强则是“不仅给你看那几句话,还告诉你这几句话在目录的哪个位置,并把这一整章的内容都拿给你看”**。

维度 普通 RAG RAGFlow (TOC 增强)
识别能力 见树木不见森林(只看碎片) 既见树木又见森林(知道碎片属于哪一章)
回答质量 容易张冠李戴(把A章节的结论安在B问题上) 逻辑严密,指代清晰
完整性 容易丢失步骤或后续条件 能够根据目录补全缺失的上下文步骤
代价 便宜、快 费钱(Token消耗大)、慢(需要 LLM 预处理)

因此,这个功能对于法律法规、技术文档、复杂的财务报告等逻辑结构性极强的文档,价值巨大。

RAGFlow 实现 TOC(目录)增强功能的“整个链条”,在逻辑上分为两个核心阶段:数据入库阶段(Indexing Phase)检索问答阶段(Retrieval Phase)

这是一个典型的 “重预处理(Heavy Pre-processing),优检索(Smart Retrieval)” 的架构。

以下是完整的技术实现链条:


第一阶段:数据入库与解析 (Indexing Phase)

这是最消耗资源的一步,也是“TOC 增强”的核心地基。

1. 基础解析 (Raw Parsing)
  • 输入: 用户上传 PDF、Word 等文档。
  • 动作: 系统读取文件,提取出纯文本和基础布局信息。
2. 目录提取 (LLM TOC Extraction) —— 关键步骤
  • 动作: 系统将文档内容(或前几页/结构化信息)发送给配置好的 LLM(大模型)

  • Prompt 逻辑: 系统会提示 LLM:“阅读这份文档,分析其层级结构,提取出标准的目录树(JSON 格式),包含章节标题和对应的层级关系。”

  • 产出: 一个结构化的**目录树(TOC Tree)**对象。

    • 例如:{ "Chapter 1": { "range": "p1-p5" }, "Chapter 2": { "sub_node": ... } }
3. 切片与元数据注入 (Chunking & Injection) —— 改变了数据的形状
  • 动作: 系统按照常规方式对文本进行切片(Chunking)。

  • 增强逻辑: 在生成切片的同时,系统会将切片与刚才提取的 目录树 进行映射。

  • 数据变形:

    • 普通 Chunk: 内容:...审批流程需3天...

    • TOC 增强后的 Chunk:

      • Content: [Header: 第3章 财务制度 - 3.1 报销流程] ...审批流程需3天... (直接修改文本,注入上下文)
      • Metadata: { "toc_id": "node_3_1", "chapter_title": "财务制度" } (添加元数据标签)
4. 向量化与存储 (Vectorization & Storage)
  • 动作: 将带有目录上下文的 Chunk 转化为向量(Embeddings),并存入向量数据库(如 Elasticsearch/Infinity)。

第二阶段:检索与上下文重组 (Retrieval Phase)

这是用户提问时发生的实时处理过程。

1. 混合检索 (Hybrid Search)
  • 输入: 用户提问“报销要多久?”
  • 动作: 系统在数据库中进行关键词搜索和向量搜索。
  • 结果: 找到若干个零散的 Chunks(例如找到了 Chunk A、Chunk C)。
2. 目录聚合与补全 (TOC Aggregation) —— 关键步骤

这是 TOC 功能发挥“缝合怪”作用的地方:

  • 识别: 系统检查命中的 Chunk A 和 Chunk C 的元数据,发现它们都属于 toc_id: node_3_1(即“第3章-3.1节”)。
  • 判断: 系统判定用户的意图可能涉及整个 3.1 节的逻辑。
  • 补全(Expansion): 系统不再只返回 A 和 C,而是利用 toc_id 索引,把该节点下缺失的 Chunk B 也一起拉取出来
  • 重组: 将 A -> B -> C 按顺序拼合,还原成完整的“第 3.1 节”段落。
3. LLM 生成回答 (Generation)
  • 输入: 经过重组的、逻辑连贯的完整章节内容,而非碎片化的句子。
  • 动作: 发送给 Chat Model。
  • 效果: LLM 能够理解“因为是第3章,所以是财务报销”,并且由于 Chunk B 被补全了,中间的逻辑断点被接上了。

为什么这个链条会消耗大量资源?

从上面的流程可以看出:

  1. Token 消耗(索引时): 在第一阶段,需要把文档喂给 LLM 去生成目录。如果文档有 500 页,这 500 页都要被 LLM “读”一遍,Token 费用很高。
  2. 计算延迟(索引时): 普通解析只是切分字符串,毫秒级;TOC 解析需要等待 LLM 推理,速度慢很多。
  3. 上下文窗口(检索时): 在第二阶段,因为系统自动补全了缺失的 Chunk(把整个章节都拉进来了),发送给对话模型的 Prompt 长度会显著增加,导致推理变慢,且更容易触碰 LLM 的上下文窗口限制。

总结

这个功能的本质是:利用 LLM 的理解能力,在数据入库时构建“地图”(TOC),在检索迷路时利用“地图”找回丢失的拼图。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐