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 向量被存储在 Elasticsearch 或 Infinity 中。 当用户提问(如:"一季度软件服务的营收是多少?")时,问题也会被向量化,然后在向量存储中快速找到语义最相似的 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 进行统一处理:
- 融合 (Fusion): 将所有路径的结果合并到一个列表中。
- 重排 (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。 |
结果的优势:
- 高效性: 原始文件只存储了一次(在核心文件系统)。
- 灵活性: 同一个文件可以应用不同的 RAG 策略(不同的切块模板和嵌入模型)来适应不同的业务需求。
- 安全性: 如果您决定删除数据集 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 亿..." | 核心、产品、营收、软件、服务、2024、Q1、1.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 模型和多种切块模板)。但是,它仍然无法完美处理所有情况:
- 复杂排版: 许多公司报告使用自定义的、不规则的排版,机器很难理解这种人为设计的上下文。
- 知识盲区: 机器无法知道哪些信息对您和您的团队是最重要 的、哪些词语是您的团队内部用来搜索的行话(例如,"A 计划" 实际上指的是 "核心战略项目 2025")。
- 最终准确性要求: 对于企业级应用,例如法律或财务咨询,99.99% 的准确率是必须的。即使是 1% 的切块错误,也可能导致客户收到错误信息。
⚖️ 智能、效率与准确性的平衡
RAGFlow 提供的可视化和干预 功能,不是为了取代自动化,而是为了实现 "自动化 + 专家知识校准":
- RAGFlow (自动化): 负责 95% 的工作,大大提高效率。
- 用户 (人工干预): 只需检查那 5% 的复杂或关键信息,并注入 专业的知识和上下文,确保最终知识库的最高准确率和检索效果。
因此,虽然手动干预会浪费少量时间 ,但其带来的检索准确率(尤其是对关键知识)的提升 是巨大的,最终保证了用户的信任和更好的问答体验。
这是一个非常好的问题,因为 DLR (Document Layout Recognition) 和 Layout 模型 是同一个概念体系中的不同术语,它们之间存在着强烈的联系,几乎可以视为同一件事。
让我们来详细解释 DLR 的含义,并通过实例说明它与 Layout 模型的关系。
1. DLR (Document Layout Recognition) 的含义
DLR(文档布局识别) 是一种计算机视觉和文档智能技术,其核心任务是理解和解析文档的视觉和逻辑结构。
核心目标
DLR 的目标是识别文档页面上的每一个元素,并确定它们之间的关系和功能。它回答了以下问题:
- 这个区域是做什么用的? (例如:标题、正文段落、脚注、图片说明)
- 这些区域之间的关系是什么? (例如:哪个标题属于哪个段落?这个表格属于哪个章节?)
- 阅读顺序是什么? (例如:从左到右,从上到下,或者在多栏布局中如何跳转)
实例:年报的 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 选项,实际上执行了三个相互关联的任务:
- OCR (Optical Character Recognition): 字符识别(将图片中的文字转化为可编辑文本)。
- TSR (Table Structure Recognition): 表格结构识别(识别表格的行、列和单元格关系)。
- DLR (Document Layout Recognition): 文档布局识别(识别标题、段落、列表、图表等文档的逻辑结构)。
这三个任务的结果共同作为输入,指导 RAGFlow 的 Chunking(切块) 引擎,确保切块是语义完整、结构准确的。