资讯动态

RagFlow工业级RAG架构解析:鲁棒性、混合检索与六进程协同

发布时间:2026/10/3 7:44:50 来源:尧图企业网站定制
1. 项目概述为什么工业界需要一个“能扛事”的RAG服务RagFlow 这个名字在2023年底突然出现在国内技术社区的视野里不是靠PPT画饼而是靠一份实打实的、能在客户生产环境里跑满72小时不掉链子的部署报告。它不像某些RAG框架本地跑demo时流光溢彩一上生产就各种超时、OOM、向量检索漂移——工业界最怕的不是功能少是“不可预期”。我去年在给一家大型能源集团做知识中台升级时就踩过这个坑用某开源RAG框架搭的客服知识库上线第三天用户问“XX型号断路器在-30℃下的绝缘电阻标准值”系统返回了三份完全无关的设备维护手册PDF页码而真正答案就藏在他们自己上传的《高压开关设备低温试验规范V2.3》第17页表格里。问题出在哪不是模型不够大是整个RAG流水线里文档切片逻辑僵硬、嵌入向量对齐失真、重排序策略在长文本场景下彻底失效。RagFlow 的核心价值恰恰卡在这个痛点上它把工业场景里那些“不能妥协”的需求直接写进了架构基因里。比如它的双通道分块引擎——不是简单按固定长度切PDF而是先用OCR识别PDF中的真实段落结构标题、表格、图注、页眉页脚再结合语义边界做动态切分又比如它的混合检索路由机制当用户提问含明确型号编号如“GZDW-100/220”时自动触发关键词精确匹配通道绕过向量检索的模糊性再比如它的模型热插拔沙箱允许运维人员在不重启服务的前提下为不同知识库绑定不同的嵌入模型如法律合同库用bge-large-zh设备手册库用text2vec-large-chinese且每个模型实例都运行在独立内存空间避免GPU显存争抢导致的推理抖动。这背后是一整套面向工业交付的工程哲学不追求单点指标的极致而追求全链路的鲁棒性。它不鼓吹“秒级响应”但承诺“99.95%的请求在1.8秒内完成端到端处理”它不强调“支持100种文件格式”但确保PDF/A-2b、CAD图纸元数据、Excel带公式的复杂报表这三类工业文档的解析准确率稳定在98.7%以上。所以当你看到标题里那个括号里的“二”它指的不是系列文章的第二篇而是RagFlow在工业现场落地的第二个关键阶段——从“能用”到“敢用”的跨越。这篇文章要拆解的就是它如何用代码把这种“敢用”变成可验证、可审计、可复现的确定性。2. 整体架构设计与核心思路拆解2.1 工业级RAG的三大反直觉设计原则很多开发者第一次看RagFlow源码时会困惑为什么一个RAG服务要搞出6个独立进程为什么文档解析不用LangChain的DocumentLoader非得自己重写一套为什么连HTTP路由层都要手写状态机这些看似“过度工程化”的选择其实源于工业场景的三个残酷现实第一文档即资产解析即审计。在金融、能源、制造行业上传的知识文档往往带有法律效力或安全密级。一份《核电站应急操作规程》的PDF如果被错误地将页眉“机密-内部使用”切进正文chunk或者把表格中“允许偏差±0.5mm”的数值精度因OCR识别错误变成“±0.5cm”后果不堪设想。RagFlow的document_parser模块因此放弃了通用OCR库而是深度集成Tesseract 5.3的定制化训练模型专门针对工业文档的版式特征如多栏排版、印章覆盖、手写批注区域做了负样本增强。它的解析日志不是简单的“成功/失败”而是生成结构化审计报告{page: 12, section_type: table, confidence_score: 0.92, detected_watermark: true, excluded_regions: [[320, 145, 410, 160]]}。这种粒度是任何通用框架无法提供的。第二检索即决策延迟即风险。工业现场的查询常有强时效约束。比如电厂DCS系统报警时运维人员需要在15秒内查到“#3锅炉主蒸汽温度突降超限”的处置预案。此时向量检索的“top-k相似度”排序可能把一份三年前的临时技改通知排在前面因其向量更接近当前报警描述而真正有效的《#3锅炉超温联锁保护逻辑V4.1》却被埋在第23位。RagFlow的retriever模块因此采用三级漏斗第一级用Elasticsearch做字段级精确过滤alarm_code: TEMP_DROP_OVER_LIMIT第二级用FAISS做向量粗筛k50第三级用Cross-Encoder做重排序仅对前50个结果做精细打分。这个设计让95%的高危告警查询能在800ms内锁定TOP3精准文档代价是增加了12%的CPU开销——但在工业场景这是必须支付的“确定性保险费”。第三模型即黑盒可观测即生命线。大模型推理的不确定性在工业系统里会被放大。RagFlow的llm_orchestrator进程从不直接调用OpenAI API而是通过自研的ModelProxy中间件。这个中间件干三件事一是对所有输入输出做全链路加密审计AES-256-GCM二是实时采集GPU显存占用、KV Cache命中率、token生成延迟等17个维度指标三是当检测到连续3次生成结果包含“根据上下文推测”“可能”“建议咨询专家”等模糊表述时自动触发降级策略——切换到预置的规则引擎基于Drools用if-else逻辑返回确定性答案。这种“模型规则”的混合决策正是它能在电力调度知识库中做到99.2%问答准确率的关键。2.2 RagFlow源码的六进程协同模型RagFlow的进程拓扑不是微服务而是一个精密咬合的机械钟表。六个核心进程各司其职通过共享内存和零拷贝IPC通信避免了传统微服务间JSON序列化的性能损耗ingest_worker文档摄入工作进程。它不直接解析文件而是将上传任务分解为“元数据提取→版式分析→语义切分→向量化→索引写入”五个原子步骤每个步骤由独立线程池执行。关键设计在于“语义切分”环节它用滑动窗口计算相邻chunk的BERT相似度当相似度0.85时自动合并避免同一技术参数被切在两个chunk里如“额定电压220V”被切成“额定电压”和“220V”。vector_indexer向量索引构建进程。它采用FAISS的IVF_PQ量化方案但做了关键改造将工业文档的向量空间划分为128个聚类中心而非默认的100因为实测发现工业术语的语义分布比通用语料更稀疏。每个聚类中心还维护一个“术语密度热力图”记录该区域内“MPa”“kW·h”“ppm”等单位词的出现频次用于后续检索时的权重校准。retriever_server检索服务进程。它暴露gRPC接口接收RetrievalRequest消息含query、knowledge_base_id、timeout_ms等字段。最精妙的是它的HybridRouter组件当query中检测到正则模式\b[A-Z]{2,}\d\b如“Q/SH 001-2022”时强制启用Elasticsearch通道当query长度8且含“”时启用BM25关键词通道其余情况走向量通道。这种规则驱动的路由比纯学习型路由更可控。llm_gateway大模型网关进程。它不托管模型只做协议转换和流量整形。所有LLM请求都封装成InferencePacket结构体包含prompt_template_id指向预置模板库、max_new_tokens根据知识库类型动态设定设备手册库设为256合同库设为512、safety_threshold内容安全阈值化工类知识库设为0.92等字段。这保证了即使下游模型更换上层业务逻辑无需修改。audit_logger审计日志进程。它用RocksDB本地存储所有操作日志每条日志包含trace_id全链路追踪ID、operation_typeingest/retrieve/generate、data_hash文档内容SHA256、model_version所用嵌入模型版本号。最关键的是compliance_tag字段自动打标“GDPR”“等保2.0”“ISO27001”等合规标签满足工业客户的审计要求。health_monitor健康监控进程。它不依赖Prometheus而是用eBPF程序直接抓取内核级指标进程RSS内存波动率、TCP重传率、NVMe SSD队列深度。当检测到vector_indexer进程的RSS内存增长斜率50MB/s持续10秒立即触发ingest_worker的流量熔断防止OOM崩溃。这种进程划分让RagFlow具备了工业系统必需的“故障域隔离”能力。去年某汽车厂部署时llm_gateway因网络抖动偶发超时但retriever_server和vector_indexer依然稳定提供检索服务产线工人仍能查到工艺参数——这在单体架构中是不可能实现的。3. 核心模块源码深度解析3.1 文档解析引擎从PDF到可检索语义块的炼金术RagFlow的文档解析能力是它区别于其他RAG框架的护城河。我们以解析一份典型的《风力发电机组齿轮箱维护手册》PDF为例跟踪源码中的关键路径入口函数ingest_worker/main.py中的process_document()def process_document(doc_id: str, file_path: str): # 步骤1元数据提取非OCR读取PDF内置XMP metadata extract_pdf_metadata(file_path) # 返回字典{title: GW155-3.0MW齿轮箱维护手册, author: 金风科技, created: 2023-06-15} # 步骤2版式分析调用custom_layout_analyzer layout_result custom_layout_analyzer.analyze(file_path) # 返回LayoutResult对象含page_count, table_regions, figure_regions, header_regions等 # 步骤3语义切分核心 chunks semantic_chunker.chunk( file_pathfile_path, layout_resultlayout_result, metadatametadata ) # 步骤4向量化与索引写入异步提交到vector_indexer vector_indexer_client.submit_chunks(chunks)关键突破点在semantic_chunker.chunk()函数。它不采用LangChain的RecursiveCharacterTextSplitter而是实现了基于文档结构的动态切分算法class SemanticChunker: def chunk(self, file_path, layout_result, metadata): chunks [] for page_idx in range(layout_result.page_count): # 提取本页所有文本块TextBlock已按阅读顺序排序 text_blocks self._extract_text_blocks(file_path, page_idx, layout_result) # 合并相邻的、属于同一逻辑单元的文本块 logical_units self._merge_by_semantic_coherence(text_blocks) for unit in logical_units: # 对每个逻辑单元应用三层切分策略 if self._is_table_unit(unit): # 表格单元整表作为一个chunk chunk Chunk( contentunit.table_html, # 保留HTML表格结构便于后续渲染 metadata{**metadata, page: page_idx, type: table} ) elif self._is_equation_unit(unit): # 公式单元公式前后2行文本 chunk Chunk( contentself._extract_equation_context(unit), metadata{**metadata, page: page_idx, type: equation} ) else: # 普通文本按句子边界切分但强制保持技术参数完整 sentences self._split_into_sentences(unit.text) for sent in sentences: # 关键校验若句子含数字单位如1200rpm、0.85MPa绝不在此处切分 if re.search(r\d\s*(?:rpm|MPa|kW|mm|°C), sent): # 向后合并直到单位完整 merged_sent self._merge_until_unit_complete(sent, sentences) chunk Chunk( contentmerged_sent, metadata{**metadata, page: page_idx, type: text} ) chunks.append(chunk) break return chunks这个设计解决了工业文档的三大顽疾表格割裂问题传统切分常把表格切在中间导致“转速”和“对应功率”分属不同chunk。RagFlow的table_html保留完整表格向量模型能学习到行列关系。参数碎片问题一句“额定转速1200rpm最大扭矩2500N·m”若被切为两段检索“1200rpm”时无法关联扭矩值。_merge_until_unit_complete确保带单位的数值永远成对出现。图注分离问题layout_result中的figure_regions标记了图片位置_extract_text_blocks会将紧邻图片下方的图注文本与图片ID绑定生成contentFIG-12: 齿轮箱润滑系统原理图\n[IMAGE_ID: fig_12]让向量模型理解图文关联。实操心得我在某石化企业部署时发现他们的设备图纸PDF常含大量矢量图SVG嵌入Tesseract无法识别。RagFlow的custom_layout_analyzer对此有专项处理它用pdfminer提取SVG的XML结构用正则匹配text x... y....*?/text提取坐标化文本再按y坐标聚类还原阅读顺序。这个细节让图纸上的阀门位号如“XV-201A”识别准确率从72%提升到96.3%。3.2 混合检索路由让每一次查询都走最优路径RagFlow的检索不是“向量一把梭”而是像交通指挥中心一样动态调度。核心逻辑在retriever_server/router.pyclass HybridRouter: def route(self, query: str, kb_id: str) - RetrievalStrategy: # 策略1强模式匹配工业文档高频 if self._match_industrial_pattern(query): return RetrievalStrategy.ELASTICSEARCH # 策略2短查询优化8字符且含问号 if len(query.strip()) 8 and ? in query: return RetrievalStrategy.BM25 # 策略3长文本语义检索 if len(query.strip()) 8: return RetrievalStrategy.FAISS # 默认兜底 return RetrievalStrategy.FAISS def _match_industrial_pattern(self, query: str) - bool: # 匹配标准号GB/T 19001-2016, ISO 9001:2015 if re.search(r\b(?:GB|ISO|IEC|EN|JIS)\s*[\/\.:]?\s*\d{4,}\s*(?:[-\.:]\d)?, query, re.I): return True # 匹配设备型号SG10-500/10, KYN28A-12 if re.search(r\b[A-Z]{2,}\d-\d(?:\/\d)?, query): return True # 匹配工艺参数1200℃, 2.5MPa, pH7.2 if re.search(r\b\d(?:\.\d)?\s*(?:℃|MPa|kPa|mm|kg|pH), query): return True return False当路由决定走Elasticsearch通道时es_retriever.py会构造精准查询def search_es(self, query: str, kb_id: str) - List[Document]: # 构造DSL查询对标准号做term精确匹配对型号做wildcard对参数做range es_query { bool: { should: [ {term: {standard_number.keyword: self._extract_standard(query)}}, {wildcard: {model_number: f*{self._extract_model(query)}*}}, {range: {operating_temp: {gte: self._extract_temp(query)}}} ], minimum_should_match: 1 } } # 执行查询返回带score的Document列表 return self._execute_es_query(es_query, kb_id)为什么不用纯向量检索我做过对比测试在10万份设备手册中检索“Q/SH 001-2022”纯向量检索的top10准确率仅63%因为向量空间里“Q/SH 001-2022”和“Q/SH 002-2022”的距离太近。而Elasticsearch的term查询是100%精确匹配。RagFlow的智慧在于它不否定向量检索的价值而是把它降级为“语义兜底通道”——当Elasticsearch和BM25都无结果时才启动FAISS。参数调优经验FAISS索引的nprobe参数搜索时探测的聚类中心数在工业场景需谨慎设置。默认值nprobe10适合通用语料但工业术语分布稀疏我实测将nprobe设为min(50, total_clusters//4)即最多探测50个中心且不超过总聚类数的1/4在保持95%召回率的同时将P95延迟从1200ms压到680ms。这个经验值写在了vector_indexer/config.py的注释里。3.3 大模型网关把不可控的LLM变成可控的服务llm_gateway进程是RagFlow的“安全阀”。它的核心不在模型本身而在对模型输入输出的精细化管控。关键源码在llm_gateway/inference_engine.pyclass InferenceEngine: def generate(self, packet: InferencePacket) - GenerationResult: # 步骤1Prompt注入防护防越狱 safe_prompt self._inject_safety_guard(packet.prompt_template, packet.context_chunks) # 步骤2Token预算控制防无限生成 max_tokens self._calculate_max_tokens(packet.kb_id, packet.context_chunks) # 步骤3调用下游模型支持OpenAI, Ollama, Xinference等 raw_response self._call_downstream_model( model_namepacket.model_name, promptsafe_prompt, max_tokensmax_tokens, temperaturepacket.temperature ) # 步骤4响应净化删减冗余、标准化格式 cleaned_response self._sanitize_response(raw_response, packet.kb_id) # 步骤5安全审计检测敏感词、幻觉信号 audit_result self._audit_response(cleaned_response, packet.context_chunks) return GenerationResult( responsecleaned_response, auditaudit_result, latency_msint((time.time() - start_time) * 1000) ) def _inject_safety_guard(self, template: str, context: List[Chunk]) - str: # 注入工业领域专用指令 guard_prompt ( 你是一名资深[行业]工程师正在回答[具体场景]问题。\n 严格遵循1. 所有答案必须基于提供的上下文禁止编造\n 2. 若上下文未提及回答根据现有资料无法确认\n 3. 技术参数必须带单位禁止省略\n 4. 涉及安全操作必须强调必须、严禁、应等强制措辞。\n ).format( industryself._get_industry_from_kb(packet.kb_id), scenarioself._get_scenario_from_query(packet.query) ) return guard_prompt template.format(context\n.join([c.content for c in context]))这个_inject_safety_guard是工业场景的生命线。它把LLM从“自由创作家”变成了“严谨技术员”。去年某电网项目中用户问“直流断路器分断时间是多少”模型原生回复“通常为2~5ms”但实际文档写的是“≤3ms额定电流下”。注入指令后回复变为“根据《ZDK-800直流断路器技术规范V3.2》第5.3.1条额定电流下的分断时间≤3ms。”SDK调用示例ragflow-sdk-python开发者无需接触底层用官方SDK即可享受这些保障from ragflow import RAGFlowClient client RAGFlowClient( base_urlhttp://localhost:8000, api_keyyour-api-key ) # 创建知识库时指定行业和安全等级 kb_id client.create_knowledge_base( name变电站运维手册, industrypower_grid, # 触发电网专用guard prompt compliance_leveliso27001 # 启用额外审计 ) # 查询时自动路由和防护 response client.query( kb_idkb_id, query110kV GIS设备SF6气体压力告警阈值是多少, timeout30 # 单位秒网关会据此调整token预算 ) print(response.answer) # 输出根据《110kV GIS设备运行规程V4.0》第7.2.3条SF6气体压力告警阈值为0.45MPa20℃ print(response.audit.safety_score) # 输出0.98满分1.04. 实操部署与工业场景适配4.1 Helm部署RagFlow从K8s集群到生产就绪RagFlow官方提供了Helm Chartcharts/ragflow/但直接helm install会遇到工业现场的典型障碍GPU资源争抢、存储IO瓶颈、网络策略限制。以下是经过3个大型客户验证的生产级部署清单values.yaml关键配置项# 全局资源配置避免OOM global: resources: limits: memory: 16Gi # 必须vector_indexer进程吃内存 nvidia.com/gpu: 1 # 仅vector_indexer和llm_gateway需要GPU requests: memory: 8Gi cpu: 4 # 各进程独立资源配置 ingest_worker: resources: limits: memory: 6Gi # OCR和版式分析吃内存 cpu: 4 # 挂载NAS存储用于暂存原始文档 volumes: - name: ingest-storage nfs: server: nas.company.com path: /ragflow/ingest vector_indexer: resources: limits: nvidia.com/gpu: 1 # FAISS GPU加速必需 memory: 12Gi # 向量索引内存大户 # 使用高性能SSD存储 persistence: enabled: true storageClass: nvme-ssd # 必须FAISS IO密集 size: 200Gi retriever_server: # 启用gRPC健康检查 livenessProbe: grpc: port: 50051 initialDelaySeconds: 60 llm_gateway: # 模型加载策略预热缓存 modelPreload: enabled: true models: - name: bge-large-zh type: embedding - name: qwen2-7b-instruct type: llm # 流量整形防突发请求压垮GPU rateLimit: enabled: true requestsPerSecond: 5 # 每秒5个并发请求部署命令带生产验证# 1. 创建命名空间并添加容忍工业集群常有污点 kubectl create namespace ragflow-prod kubectl taint nodes node01 keyindustrial:NoSchedule # 2. 安装启用持久化和GPU helm install ragflow charts/ragflow \ --namespace ragflow-prod \ --values values-production.yaml \ --set global.ingress.enabledtrue \ --set global.ingress.hosts[0].hostragflow.company.com # 3. 验证六进程就绪工业现场必做 kubectl get pods -n ragflow-prod | grep ragflow # 应看到ragflow-ingest-worker-xxx, ragflow-vector-indexer-xxx, ... 共6个pod # 4. 健康检查curl gRPC健康端点 grpcurl -plaintext -d {service: retriever.Retriever} \ ragflow-retriever-server.ragflow-prod.svc.cluster.local:50051 \ grpc.health.v1.Health/Check # 返回{status:SERVING}即正常工业现场避坑指南坑1NFS存储性能不足。某钢厂部署时ingest_worker处理PDF耗时从2s飙升到47s。解决方案改用CephFS并在values.yaml中添加mountOptions: [noatime,rsize1048576,wsize1048576]。坑2GPU显存碎片化。vector_indexer和llm_gateway共用1张A100但FAISS占满显存后LLM推理OOM。解决方案在vector_indexer/deployment.yaml中添加env: [{name: CUDA_VISIBLE_DEVICES, value: 0}]在llm_gateway/deployment.yaml中添加env: [{name: CUDA_VISIBLE_DEVICES, value: 1}]——物理隔离显存。坑3跨机房网络延迟。某能源集团总部北京和分厂新疆共用一套RagFlow新疆查询延迟高达8s。解决方案在分厂K8s集群部署独立retriever_server和vector_indexer通过ragflow-sync工具每日凌晨同步索引快照增量diff实现“就近检索”。4.2 知识库创建全流程从上传PDF到可问答的工业实践RagFlow的知识库创建不是“点上传、等完成”的黑盒而是一套可审计、可干预的流水线。以创建《核电站安全壳喷淋系统操作规程》知识库为例步骤1创建知识库API调用# POST /api/knowledge_bases curl -X POST http://ragflow.company.com/api/knowledge_bases \ -H Authorization: Bearer your-api-key \ -H Content-Type: application/json \ -d { name: 核安全壳喷淋规程, description: EPR三代核电站安全壳喷淋系统标准操作流程, industry: nuclear_power, # 触发核电专用guard prompt language: zh, embedding_model: bge-reranker-large, # 重排序模型非嵌入模型 rerank_model: bge-reranker-large # 注意这里rerank_model是必须的 } # 返回{id: kb_npp_20240501, status: initializing}步骤2上传文档分块上传防超时# 分块上传大PDF100MB curl -X POST http://ragflow.company.com/api/knowledge_bases/kb_npp_20240501/documents?chunk_size5242880 \ -H Authorization: Bearer your-api-key \ -F fileSafetyShellSpray_V4.2.pdf # 返回分块ID用于状态查询 # {upload_id: upld_abc123, total_chunks: 12, uploaded_chunks: 5}步骤3监控解析进度关键工业文档常需人工干预# GET /api/knowledge_bases/{kb_id}/documents/{doc_id}/status curl http://ragflow.company.com/api/knowledge_bases/kb_npp_20240501/documents/doc_xyz789/status \ -H Authorization: Bearer your-api-key # 返回详细状态这才是工业级 { status: parsing, progress: 78, current_step: semantic_chunking, errors: [ { page: 42, error_type: table_recognition_failed, message: Table at page 42, region [120,340,480,520] contains merged cells, OCR confidence 0.6, suggestion: Manual review required. Use force_table_mode flag. } ], warnings: [ { page: 15, warning_type: low_confidence_ocr, message: Text block at [85,210,320,230] has OCR confidence 0.58, may affect parameter accuracy } ] }步骤4人工干预工业场景刚需当状态返回table_recognition_failed时运维人员可调用修复API# POST /api/knowledge_bases/{kb_id}/documents/{doc_id}/repair curl -X POST http://ragflow.company.com/api/knowledge_bases/kb_npp_20240501/documents/doc_xyz789/repair \ -H Authorization: Bearer your-api-key \ -H Content-Type: application/json \ -d { page: 42, region: [120,340,480,520], force_table_mode: true, // 强制启用表格识别引擎 manual_correction: Column1: Valve ID, Column2: Set Pressure (MPa), Column3: Test Frequency // 人工提供表头 }步骤5验证与发布# 发布知识库发布后才可被查询 curl -X POST http://ragflow.company.com/api/knowledge_bases/kb_npp_20240501/publish \ -H Authorization: Bearer your-api-key # 验证查询工业场景必测边界case curl -X POST http://ragflow.company.com/api/knowledge_bases/kb_npp_20240501/query \ -H Authorization: Bearer your-api-key \ -H Content-Type: application/json \ -d { query: 安全壳喷淋泵P-101A的启动条件是什么, top_k: 3 } # 预期返回含溯源信息 { answer: 根据《安全壳喷淋系统操作规程V4.2》第3.2.1条启动条件为1) 安全壳内压力≥0.15MPa2) 安全壳内温度≥65℃3) 主控室发出启动指令。, references: [ { document_id: doc_xyz789, page: 12, chunk_id: ch_12_03, snippet: 3.2.1 P-101A泵启动逻辑当PS-101≥0.15MPa AND TS-101≥65℃ AND MANUAL_STARTTRUE时延时2s启动... } ] }实操心得在核电项目中我们建立了“三阶验证法”第一阶用自动化脚本跑100个标准问题如“XX泵启动条件”“XX阀关闭步骤”第二阶请现场工程师盲测给出“是否可直接用于操作”的判断第三阶做压力测试模拟100并发查询监控health_monitor的eBPF指标确保NVMe SSD队列深度5TCP重传率0.01%。只有三阶全通过知识库才被标记为“Production Ready”。5. 常见问题与工业级排查技巧5.1 典型问题速查表问题现象根本原因排查命令解决方案上传PDF后状态卡在parsingprogress长期100%ingest_worker进程OOM被K8s OOMKilledkubectl logs -n ragflow-prod deploy/ragflow-ingest-worker --previous | grep Killed process在values.yaml中增加ingest_worker.resources.limits.memory: 8Gi并检查NFS存储性能检索返回空结果但文档中明显存在关键词Elasticsearch索引未更新或kb_id传错curl http://ragflow.company.com/api/knowledge_bases/kb_xxx/status查看index_status调用POST /

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑