RAGFlow/RAG 从文档解析到混合检索的完整链路

发布时间:2026/6/6 23:54:18

RAGFlow/RAG 从文档解析到混合检索的完整链路 1. RAGFlow采用ragflow v0.25.6从github上拉取源码然后拉取镜像用docker compose启动注意默认启动后会自动拉取tiktoken但内网环境无法联网可以从外网下载然后拷贝到内网同时tiktoken文件挂载到容器时直接放在ragflow根目录下即可environment: - TIKTOKEN_CACHE_DIR/ragflow - DATA_GYM_CACHE_DIR/ragflow volumes: - ./ragflow-logs:/ragflow/logs # - ./nginx/ragflow.conf:/etc/nginx/conf.d/ragflow.conf # - ./nginx/proxy.conf:/etc/nginx/proxy.conf # - ./nginx/nginx.conf:/etc/nginx/nginx.conf - ./service_conf.yaml.template:/ragflow/conf/service_conf.yaml.template - ./entrypoint.sh:/ragflow/entrypoint.sh - ./tiktoken_cache/9b5ad71b2ce5302211f9c61530b329a4922fc6a4:/ragflow/9b5ad71b2ce5302211f9c61530b329a4922fc6a4:rw2. Eembedding公司内网采用gte-Qwen2-7B-instruct模型该模型的默认请求参数为prompt。默认请求链接为curl -X POST http://10.0.17.56:50000/api/hirain/pmtggtt/api/embeddings ^ -H Content-Type: application/json ^ -H Authorization: Bearer a0d3cc35475f43c4b5f17b562123cb6b ^ -d {\model\:\gte-Qwen2-7B-instruct\,\prompt\:\网络管理模块 BusOff 后应该设计哪些测试点\}但是无法直接集成到ragflow中所以在10.99.0.38服务器上启动一个embedding_adapter.py该文件使用fastapi的方式将请求参数中的prompt转换为input以便于直接集成到RAGFlow中。启动命令为pip install fastapi uvicorn requests uvicorn embedding_adapter:app --host 0.0.0.0 --port 18080/********************** embedding_adapter.py **********************/ from typing import List, Union, Any, Dict import requests from fastapi import FastAPI, Header, HTTPException from pydantic import BaseModel INNER_EMBEDDING_URL http://10.0.17.56:50000/api/hirain/pmtggtt/api/embeddings INNER_API_KEY a0d3cc35475f43c4b5f17b562123cb6b DEFAULT_MODEL gte-Qwen2-7B-instruct app FastAPI(titleEmbedding Adapter for RAGFlow) class EmbeddingRequest(BaseModel): model: str DEFAULT_MODEL input: Union[str, List[str]] encoding_format: str float def call_inner_embedding(text: str, model: str) - List[float]: payload { model: model, prompt: text, } resp requests.post( INNER_EMBEDDING_URL, headers{ Content-Type: application/json, Authorization: fBearer {INNER_API_KEY}, }, jsonpayload, timeout120, ) resp.raise_for_status() data resp.json() embedding data.get(embedding) if not embedding: raise RuntimeError(f内部 embedding 接口返回空 embedding: {data}) if not isinstance(embedding, list): raise RuntimeError(f内部 embedding 返回格式不是 list: {data}) return embedding app.get(/v1/models) def list_models() - Dict[str, Any]: return { object: list, data: [ { id: DEFAULT_MODEL, object: model, owned_by: hirain, } ], } app.post(/v1/embeddings) def create_embeddings(req: EmbeddingRequest): try: inputs req.input if isinstance(req.input, list) else [req.input] data [] total_tokens 0 for idx, text in enumerate(inputs): embedding call_inner_embedding(texttext, modelreq.model) data.append( { object: embedding, index: idx, embedding: embedding, } ) total_tokens len(text) return { object: list, data: data, model: req.model, usage: { prompt_tokens: total_tokens, total_tokens: total_tokens, }, } except Exception as e: raise HTTPException(status_code500, detailstr(e)) app.get(/health) def health(): return {status: ok}经过转发之后emdedding的链接变为curl -X POST http://10.99.0.38:18080/v1/embeddings ^ -H Content-Type: application/json ^ -H Authorization: Bearer a0d3cc35475f43c4b5f17b562123cb6b ^ -d {\model\:\gte-Qwen2-7B-instruct\,\input\:\网络管理模块 BusOff 后应该设计哪些测试点\}同时也可直接集成进RAGFlow的OpenAI-API-Compatible模型中注将embedding_adapter.py设置为开机自启动的服务APP_DIR$(pwd) UVICORN_BIN$(readlink -f $(command -v uvicorn)) RUN_USER$(whoami) sudo tee /etc/systemd/system/embedding-adapter.service /dev/null EOF [Unit] DescriptionEmbedding Adapter for RAGFlow Afternetwork-online.target Wantsnetwork-online.target [Service] Typesimple User$RUN_USER WorkingDirectory$APP_DIR ExecStart$UVICORN_BIN embedding_adapter:app --host 0.0.0.0 --port 18080 Restartalways RestartSec5 EnvironmentPYTHONUNBUFFERED1 [Install] WantedBymulti-user.target EOF sudo systemctl daemon-reload sudo systemctl enable --now embedding-adapter.service systemctl status embedding-adapter.service3. Reranker公司内网采用bge-reranker-v2-m3模型可直接集成进RAGFlow。测试命令为curl -X POST http://10.0.17.56:50000/api/hirain/pmtggtt/v1/rerank ^ -H Content-Type: application/json ^ -H Authorization: Bearer 7f80770a1ccd45dda39f481d183a4322 ^ -d {\model\:\bge-reranker-v2-m3\,\query\:\什么是RAG\,\documents\:[\RAG是一种结合检索和生成的技术。\,\今天天气很好。\,\向量数据库可以用于相似度检索。\],\top_n\:3}4. RAGFow内置pipelineRAGFlow 官方说明从 v0.17.0 开始PDF 的DeepDoc 数据抽取任务和chunking method解耦PDF parser 用于 OCR、TSR、DLR 等视觉抽取任务chunking method 决定怎么切块概念RAGFlow 里对应作用PDF 解析器 / PDF parserDeepDoc、Naive、MinerU、Docling、OpenDataLoader、第三方视觉模型负责从 PDF 中提取文本、表格、版面、OCR 内容等文档解析方法 / Chunking method / TemplateGeneral、QA、Resume、Manual、Table、Paper、Book、Laws、Presentation、Picture、One、Tag 等负责把解析出来的内容按不同业务语义切成 chunk并建立向量/全文索引在 RAGFlow v0.25.6 创建知识库时看到的General / QA / Resume / Manual / Table / Paper ...主要是内置分块方法也就是 API 里的chunk_method。而在某些分块方法下面看到的PDF Parser / PDF 解析器 General / Naive / Docling / DeepDOC / MinerU ...是解析器选择更准确说是PDF 怎么先被解析成文本、表格、图片、版面结构。二者关系原始文件 ↓ PDF 解析器 / 文档解析器 ↓ 解析后的文本、表格、图片、结构 ↓ chunk_method 分块方法 ↓ chunk ↓ embedding ↓ indexing所以PDF 解析器解决文件怎么读出来 chunk_method 解决读出来的内容怎么切成 chunk内置pipeline主要解决把“文档入库处理流程”从固定内置 chunk method扩展成可配置、可编排的解析流水线传统内置 chunk_method 上传文档 → RAGFlow 按固定方法解析/切片/embedding Pipeline 上传文档 → 按你配置的 Parser 组件和后续流程处理 → chunk → embedding → indexing4.1 PDF解析器PDF 解析器/选项属于什么主要解决什么优点缺点适合场景General / DeepDOCPDF 解析/版面识别通用 PDF 解析、布局、OCR、表格识别RAGFlow 默认集成度高复杂规范文档仍可能切乱普通 PDF、Word/PDF 混合知识库Naive简单 PDF 文本抽取直接提取文本不强调版面理解快、简单、稳定表格、图片、复杂排版效果差文本型 PDF、无复杂表格图形的资料Docling文档转换框架PDF 转结构化内容包含布局/表格结构识别对结构化转换友好依赖环境、速度和部署复杂度需验证复杂 PDF、表格多、想转 Markdown/结构化文档MinerU外部 PDF parserOCR、版面、表格、公式、图片抽取复杂 PDF 解析能力强适合先转 Markdown需要额外部署/配置AUTOSAR PDF、标准文档、扫描件、图表多的文件4.1.1 DeepDocDeepDoc 是 RAGFlow 内置的文档理解 / 文档解析能力。它主要负责把原始文件解析成可用于 RAG 的内容包括PDF 版面识别 OCR 表格结构识别 图片 / 文本块识别 文档结构解析RAGFlow 官方 FAQ 里解释RAGFlow 解析文档比普通 LangChain loader 慢是因为它会做 layout analysis、table structure recognition、OCR 等文档预处理任务这些就是 DeepDoc 这类内置文档解析能力承担的工作。所以 DeepDoc 位于文件 → 文本 / 表格 / 版面结构这一层。它不负责embedding rerank chat 回答 向量检索4.1.2 MinerUMinerU 是外部 PDF 解析器。RAGFlow 从 v0.22.0 开始把 MinerU 作为可选 PDF parser 集成进来。官方文档明确说RAGFlow 只是 MinerU 的 remote clientRAGFlow 调用 MinerU API 解析 PDF然后读取 MinerU 返回的文件。也就是说接入 MinerU 后是这个结构RAGFlow ↓ 调用 HTTP API MinerU API Server ↓ 解析 PDF 返回 Markdown / JSON / zip 等解析结果 ↓ RAGFlow 继续切片、embedding、索引MinerU 本身是面向文档内容抽取的开源方案目标是处理 OCR、layout detection、公式识别、复杂 PDF 内容抽取等问题。MinerU后端MinerU 的上层功能都是“把 PDF/图片/Office 文档解析成 Markdown/JSON”但底层可以选择不同的推理后端来完成版面识别、OCR、表格、公式、VLM 解析等任务。简单说同一个 PDF ↓ MinerU ↓ 可选不同 backend pipeline / transformers / vLLM / http-client ↓ 输出 Markdown / JSON / 图片 / 中间结果后端是什么核心逻辑适合场景资源要求优点缺点pipeline传统视觉/OCR流水线后端使用小模型/规则流程完成版面分析、OCR、公式、表格等解析普通 PDF、扫描件、RAG 数据入库、内网 CPU 环境、资源有限环境可 CPU 跑官方说明如果设备不满足 GPU 要求可指定-b pipeline纯 CPU 运行推荐 RAM 16GB更建议 32GB。(OpenDataLab)稳定、可控、幻觉少适合批量生产解析结果对复杂图文、跨页表格、图片理解能力不如 VLM速度受 CPU/GPU 影响vlm-transformers本地 Transformers 方式跑 VLM用 HuggingFace Transformers 直接加载视觉语言模型做文档理解单机验证、小批量解析、没有 vLLM 部署经验但有 GPU通常需要 NVIDIA GPU建议8GB 显存安装依赖相对简单但推理吞吐一般部署链路相对直观不需要额外 vLLM 服务并发能力弱长文档慢显存占用高生产吞吐不如 vLLMvlm-vllm-engine本地 vLLM 加速 VLM 推理用 vLLM 作为 VLM 推理引擎提高吞吐和并发高并发解析、批量 PDF、服务化部署、多 GPU 推理官方扩展文档说明 vLLM 适合 Volta 及之后架构显卡建议8GB VRAM安装mineru[core,vllm]。(OpenDataLab)吞吐高、适合服务化、多 GPU 更好扩展环境要求高CUDA、驱动、vLLM 版本容易踩坑vlm-http-client轻量客户端连接远端 VLM 服务本地 MinerU 不加载大模型只通过 HTTP 调远端 OpenAI-compatible VLM 服务边缘机器、CPU 机器、RAGFlow 容器、内网统一模型服务、GPU 集中部署本地只需 CPU 网络远端服务承担 GPU。官方说可安装轻量mineru包连接 OpenAI-compatible server。(OpenDataLab)本地资源占用最低适合把 GPU 服务集中部署依赖网络和远端服务稳定性吞吐受远端服务限制hybrid-auto-engine混合后端本地自动选择/编排 pipeline VLM文本抽取、结构化解析和 VLM 能力结合对准确率要求高同时希望减少纯 VLM 幻觉需要本地较强 GPU官方默认 backend 当前是hybrid-auto-engine。(OpenDataLab)准确率高兼顾原生文本抽取与 VLM 理解部署复杂度、资源消耗高于 pipelinehybrid-http-client混合后端的远程调用模式本地做部分轻量处理重模型能力走远端 OpenAI-compatible 服务企业内网集中部署 MinerU/VLM 服务多客户端接入本地比 auto-engine 轻远端需要 GPU。官方说明hybrid-http-client用--url连接 OpenAI-compatible backend。(OpenDataLab)适合集中式部署客户端资源低依赖远端服务、网络、API 兼容性4.2 内置分块方法UI 名称API 值主要含义典型使用场景分片方式大意是否适合 AUTOSAR 规范Generalnaive通用分块方法普通 PDF、Word、Markdown、说明文档按 delimiter、token 数、段落等通用规则切片可用于快速验证但不适合精细 AUTOSAR 语义切片QAqa问答对分块FAQ、问答知识库、客服知识通常按问题-答案对组织 chunk不适合 AUTOSAR 标准正文适合你后续整理测试 FAQManualmanual手动分块人工维护 chunk、少量高价值知识不依赖自动切片偏人工维护如果你手动管理 chunk可以用但更推荐 empty document Add chunkTabletable表格类分块Excel、CSV、参数表、映射表按表格结构处理尽量保留行列关系适合配置参数表、NRC 映射表但不适合整本 AUTOSAR PDFPaperpaper论文类分块学术论文 PDF按论文结构如摘要、章节、参考文献等处理不适合 AUTOSARBookbook书籍类分块书籍、长篇章节型材料按章节/段落结构切可用于长文档但 AUTOSAR 仍建议自定义语义切片Lawslaws法律条文类分块法规、标准条款按条、款、项组织与 AUTOSAR 需求条款有点像但未必能识别 SWS/RS 语义Oneone整篇一个 chunk很短的文档、单页说明整个文档作为一个 chunk不适合长 AUTOSAR 文档Picturepicture图片类文档图片、图像知识偏图片/OCR/图文处理不适合标准主文档PresentationpresentationPPT 类分块PPT、演示材料按 slide 切片不适合 AUTOSAR PDFEmailemail邮件类分块邮件归档按邮件结构、主题、正文处理不适合Tagtag标签集方法通过标签知识库辅助分类/标注和 tag set 配合可作为后续增强不适合作为主切片Resume未在官方 v0.25.6 API 枚举中确认简历类模板/分支功能可能项简历、候选人资料可能按教育、经历、技能等结构切不适合 AUTOSAR5. Autosar AP文档解析切分方法从准确性的角度整个过程不再采用RAGFlow自带的方法解析采用外部MinerU的方法切片采用自己编写脚本的方法对文档切分具体细则参考 AUTOSAR AP 文档切分方法说明6. Autosar CP文档解析切分方法从准确性的角度整个过程不再采用RAGFlow自带的方法解析采用外部MinerU的方法切片采用自己编写脚本的方法对文档切分具体细则参考 AUTOSAR CP 文档切分方法说明7. 不选择reranker模型时RAGFlow靠什么回答问题没选 reranker 时RAGFlow 不会再用 reranker 做二次重排它主要使用基础检索排序最终相似度 向量相似度 关键词相似度 的加权组合RAGFlow 配置里有similarity_threshold vector_similarity_weight top_n top_k rerank_id官方文档说明vector_similarity_weight是vector cosine similarity 的权重默认是0.3也就是说如果没有 reranker排序主要依赖向量相似度和关键词相似度的加权结果。不选 reranker 时的检索链路大致是这样用户问题 ↓ 问题 embedding ↓ 向量检索计算 query 向量和 chunk 向量相似度 ↓ 关键词检索计算 query 关键词和 chunk 文本 / important_keywords / tag_kwd 的匹配 ↓ 按 similarity_threshold 过滤 ↓ 按综合 similarity 排序 ↓ 取 top_n 个 chunk 放进 LLM 上下文 ↓ LLM 生成回答其中vector_similarity_weight 0.3可以理解为向量相似度占 30% 关键词相似度占 70%这对 AUTOSAR 场景反而通常更合适因为这时查询经常是SWS_PduR_00216 RS_Nm_00051 PduR_Transmit CanSM_RequestComMode E_NOT_OK这些都是强关键词、强 ID、强符号检索。默认不选 reranker有时会比选 reranker 更稳。8. 添加reranker模型后问答效果更差rerank 不是必然提升效果它只是对第一阶段召回结果重新排序如果 reranker 不适合你的 query 类型、chunk 结构或领域文本反而会把正确 chunk 排下去。RAGFlow 的知识库问答配置里rerank_id是可配置项同时还有similarity_threshold、vector_similarity_weight、top_n、top_k等检索参数其中top_k是参与向量余弦计算的 chunk 数默认示例是 1024vector_similarity_weight表示向量相似度权重另一部分是关键词相似度权重可能的原因1.1 你的问题是 ID / API / 错误码型reranker 不一定擅长1.2 reranker 模型和 embedding / 文档语言不匹配1.3 top_n 太小reranker 把长尾正确证据裁掉了1.4 similarity_threshold 过滤过早1.5 chunk 太“结构化”reranker 更喜欢说明性文字现有的 chunk 有些是表格、字段、枚举、错误码不是自然问答风格。reranker 可能更喜欢 section background 或说明性段落因为它们语义更流畅但对生成测试用例未必是最关键证据。

相关新闻