Pathway RAG 文档解析器全景解析:从 Utf8Parser 到 TwelveLabsVideoParser 的实现原理与配置实战
Pathway RAG 文档解析器全景解析从 Utf8Parser 到 TwelveLabsVideoParser 的实现原理与配置实战【免费下载链接】pathwayPython ETL framework for stream processing, real-time analytics, LLM pipelines, and RAG.项目地址: https://gitcode.com/GitHub_Trending/pa/pathway在 PathwayPython 流处理 ETL 框架的 RAG检索增强生成流水线中文档解析器Parser负责把 PDF、PPTX、图片、视频、纯文本等原始字节转换为结构化的(text, metadata)分块列表供后续的切分、嵌入与索引组件消费。本文基于仓库文档docs/2.developers/7.templates/40.rag-customization/30.parsers.md与源码python/pathway/xpacks/llm/parsers.py逐类剖析 8 个内置解析器的定位差异、关键参数、默认行为与 YAML 配置写法并结合测试用例说明各解析器的可验证边界帮助你在构建 RAG 索引时按数据类型准确选型。解析器总览按数据类型选型文档中列出的全部解析器及其适用数据类型如下与 parsers.py 中定义的类一一对应名称适用数据说明DoclingParserPDF 表格 图片基于 docling 库从 PDF 提取结构化内容可用视觉 LLM 解析图片ImageParser图片将图片转为文本描述并可按 Pydantic schema 提取结构化信息PaddleOCRParserPDF 表格 图片基于 PaddleOCR 库提取 PDF 与图片中的结构化内容PypdfParserPDF基于 pypdf 库提取 PDF 文本可选文本清理SlideParser幻灯片用视觉 LLM 从 PPTX 与 PDF 幻灯片中提取信息TwelveLabsVideoParser视频用 TwelveLabs Pegasus 视频理解模型把视频转为富文本描述UnstructuredParser文本 表格基于 Unstructured 库解析多种文档类型Utf8Parser文本解码 UTF-8 编码的文本所有解析器都继承自pw.UDF调用方式统一为parser(字节列)返回一列(text, metadata)对的列表。这一契约可以从 parsers.py 顶部注释直接确认该模块的定位就是接收原始字节、返回文本分块及其元数据的函数库。Utf8Parser最轻量的字节解码器Utf8Parser的职责是把 UTF-8 编码的字节解码为可读字符串作为 RAG 流水线的入口清洗步骤。输入为bytes时执行contents.decode(utf-8)输出[(文本, {})]——元数据固定为空字典输入已经是str时原样返回不做任何修改。这一点有专门的测试用例验证test_parsers.py 中test_utf8parser与test_utf8parser_on_strings分别用含波兰语字符与 emoji 的 pangramPójdź, kińże tę chmurność w głąb flaszy .验证了 bytes 与 str 两种输入都能无损还原。此外源码中保留了ParseUtf8这一弃用别名类会在实例化时发出弃用警告建议直接使用Utf8Parser。UnstructuredParser五种分块模式与字符级切分UnstructuredParser复用 Unstructured 库的分区partition能力支持 PDF、HTML、Word 等多种文档类型开箱即用且速度表现良好。但文档同时提示了它的开源局限文档与表格抽取性能有所折损、依赖较旧且不够精细的视觉 Transformer 模型并且不支持图片抽取。构造参数从构造函数parsers.py L115-L133可见完整参数集chunking_mode分块模式默认singlepartition_kwargs透传给 Unstructuredpartition函数的额外参数post_processors应用于所有抽取文本的回调列表chunking_kwargs透传给chunk_elements/chunk_by_title的额外参数cache_strategy缓存策略。五种分块模式文档说明UnstructuredParser支持五种分块模式源码_chunk方法逐一实现了它们basic按 Unstructured 的 basic 分块策略把文本切分为长度小于max_characters经chunking_kwargs传入的块并支持用new_after_n_chars作为软阈值控制块长by_title类似 basic但额外按章节/页面边界切分得到结构更整齐的块同样通过chunking_kwargs配置elements把文档拆成 Unstructured 的同质元素Title、NarrativeText、Footer、ListItem等。文档明确不推荐用于 PDF 等复杂数据源更适合元素需要逐一分离的简单输入paged把同一页上的所有元素聚合为一个块适合内容按页清晰分隔的文档。源码实现parsers.py L210-L228按page_number归组元素文本并用_combine_metadata合并元数据single把全部元素聚合成一个大块适合配合 Pathway 自身的切分策略或其他自定义切分方案使用。使用示例Python 与 YAMLPython 代码与文档示例一致from pathway.xpacks.llm.parsers import UnstructuredParser parser UnstructuredParser( chunking_modeby_title, chunking_kwargs{ max_characters: 3000, # 每个块字符数的硬上限 new_after_n_chars: 2000, # 每个块字符数的软上限 }, ) result data_sources.with_columns(parsedparser(data_sources.data))模板 YAML 配置写法$parser: !pw.xpacks.llm.parsers.UnstructuredParser chunking_mode: by_title chunking_kwargs: max_characters: 3000 # 每个块字符数的硬上限 new_after_n_chars: 2000 # 每个块字符数的软上限一个关键限制需要注意Unstructured 的分块是基于字符数而非 token 数的因此无法精确控制每个块在上下文窗口中占用的 token 上限。此外源码中还有一个值得了解的错误处理细节__wrapped__捕获 Unstructured 的UnsupportedFileFormatError后重新抛出FileFormatOrDependencyError并附带提示——该错误可能意味着缺少libmagic依赖可通过apt-get install libmagic1Linux或brew install libmagicmacOS安装见 parsers.py L272-L287。DoclingParser面向 PDF 的结构感知分块DoclingParser封装 docling 库的DocumentConverter并扩展了用视觉 LLM 解析 PDF 内图片的能力。文档推荐在需要从 PDF 中同时提取文本、表格和图片时使用它。它提供结构感知分块表格与图片被拆成独立块所有列表项合并为一个块每个块顶部附加 markdown 标题、底部附加对应说明文字表格/图片的 caption。表格解析docling或llm二选一两种策略通过table_parsing_strategy参数选择docling默认对 PDF 中的表格跑 Docling OCR将其转换为 markdown 格式llm把表格渲染成图片发给支持 OpenAI 同接口的多模态 LLM 解析设为None则完全不解析表格。从构造函数parsers.py L448-L466可以看到默认流水线选项do_table_structure随table_parsing_strategy联动开关do_ocr默认关闭images_scale默认为 2表格结构选项TableStructureOptions默认do_cell_matchingTrue、modefast。这些默认值都可以用pdf_pipeline_options覆盖例如{table_structure_options: {mode: accurate}}或{do_formula_enrichment: True, image_scale: 1.5}OCR 选项、图片分类、代码 OCR、科学公式增强等均在此层配置参照 docling 的PdfPipelineOptions。图片解析与分块开关image_parsing_strategyllm时解析器检出文档中的图片、交给多模态 LLM如 GPT-4o生成描述并把描述嵌入 markdown 输出关闭时图片以占位符替代。实现上parsers.py L626-L662图片的 base64 会收集后一次性批量发给 LLM生成的描述作为CAPTION文本项挂回文档树。另有一个重要参数chunk默认True启用时使用 Pathway 改造版_HybridChunker见 python/pathway/xpacks/llm/_parser_utils.py做结构分块——图片与表格各自独立成块、带相似元数据的块会合并、表格直接转 markdown 而非行列三元组设为False时整个文档返回为单个块。文档也提示该分块器目前不感知块长度无论按字符还是 token 衡量仅按结构切分。示例Pythonfrom pathway.xpacks.llm.parsers import DoclingParser from pathway.xpacks.llm.llms import OpenAIChat multimodal_llm OpenAIChat(modelgpt-4o-mini) parser DoclingParser( image_parsing_strategyllm, multimodal_llmmultimodal_llm, pdf_pipeline_options{ # 用它覆盖我们用 docling 解析 PDF 的默认选项 do_formula_enrichment: True, image_scale: 1.5, ) )模板 YAML 配置写法注意视觉模型通过变量引用注入$multimodal_llm: !pw.xpacks.llm.llms.OpenAIChat model: gpt-4o-mini $parser: !pw.xpacks.llm.parsers.DoclingParser parse_images: True multimodal_llm: $multimodal_llm pdf_pipeline_options: do_formula_enrichment: True image_scale: 1.5PypdfParser轻量 PDF 文本抽取PypdfParser基于 pypdf 库逐页调用extract_text()是成本最低的 PDF 文本方案。文档提醒它可能不适合表格抽取且不支持图片抽取。两个构造参数apply_text_cleanup默认True做三步文本清理——_clean_text_lines去除行首空白、_remove_empty_space压缩连续空格、_replace_newline_with_space_if_lower在下一行以小写字母开头时把换行替换为空格以提升可读性cache_strategy缓存策略。输出粒度为每页一个块元数据包含page_number。测试用例 test_parsers.py L82-L106 用 fpdf 现场生成含 Lorem ipsum 文本的 PDF断言抽取结果与原文完全相等验证了extract_text 清理链路的正确性。PaddleOCRParser本地 OCR 方案PaddleOCRParser基于 PaddleOCR 库可从 PDF 与图片中抽取结构化内容。安装依赖时CPUpip install paddlepaddle3.2.0GPU按 PaddlePaddle 官方安装说明操作。核心参数构造函数 parsers.py L1203-L1212pipelinePaddle 流水线对象目前支持PaddleOCR与PPStructureV3两种不传时默认构造PPStructureV3且默认关闭表格识别、文档方向分类、纠偏、印章/公式/图表识别、区域检测等全部附加模块见_default_pipelineparsers.py L1258-L1270。源码注释说明复杂版式文档建议用PPStructureV3提升精度简单文档可用PaddleOCR只提文本、可能更快concatenate_pages默认False是否把多页文档合并为单一输出intermediate_image_format默认jpgPDF 转图片的中间格式考虑速度与内存max_image_size默认 15 MB与downsize_horizontal_width默认 1920图片尺寸约束cache_strategy、async_mode默认batch_async。运行流程从_normalize_inputparsers.py L1272-L1311可以看出用detect_filetype判定类型PPT/PPTX 先转 PDFPDF 用 pdf2image 转图片其他按图片打开随后逐页跑 OCRPPStructureV3结果按页取 markdown 再用concatenate_markdown_pages拼接PaddleOCR结果按rec_texts拼接。Python 版本限制构造函数对 Python 3.14 直接抛出RuntimeError因为 paddlepaddle 尚未发布对应 wheelparsers.py L1214-L1223。这一点有测试覆盖test_parsers.py L109-L115 断言在 3.14 上实例化会报 paddlepaddle does not publish packages。pyproject.toml 中对paddleocr[doc-parser] 3.3.1, 4.0.0也加了python_version 3.14的条件依赖。ImageParser视觉 LLM 描述 schema 结构化抽取ImageParser把.png/.jpg等图片转为多模态 LLM 生成的文本描述并可按预定义的 Pydantic schema 从图中抽取结构化信息。关键参数parsers.py L715-L729llm支持图片输入的 LLM不传则默认用DEFAULT_VISION_MODEL的 OpenAIChatparse_prompt解析提示词detail_parse_schemaPydantic schema提供后会第二次调用 LLM 抽取信息None则跳过该步include_schema_in_text默认False把抽取出的 schema 数据拼进文本描述有助于检索downsize_horizontal_width默认 1280、max_image_size默认 15 MB超宽图片会按maybe_downscale缩小run_modeparallel/sequential、retry_strategy默认指数退避、最多 6 次、cache_strategy。底层机制文档指出解析一次图片会对 LLM 发起两次请求——第一次用给定 prompt 生成基础描述第二次用 instructor 库按detail_parse_schema抽取结构化信息可选。源码中对应parse_fn描述与parse_image_details_fnschema 抽取两条执行路径。文档中的实战示例把一张柯基图片放入./dogs目录后用以下流水线解析并抽取breed/surroundings/color三个字段from pydantic import BaseModel from pathway.xpacks.llm.llms import OpenAIChat from pathway.xpacks.llm.parsers import ImageParser data_sources pw.io.fs.read( ./dogs, formatbinary, modestatic, ) chat OpenAIChat(modelgpt-4o-mini) # 定义想从图片中抽取的信息 class DogDetails(BaseModel): breed: str surroundings: str color: str prompt Please provide a description of the image. parser ImageParser( llmchat, parse_promptprompt, detail_parse_schemaDogDetails, ) result data_sources.select(parsedparser(data_sources.data))写入 JSON 后得到描述 结构化抽取的(text, metadata)组合{ parsed: [ [ The image shows a happy Corgi dog running in a grassy area. The Corgi has a reddish-brown and white coat, a fluffy tail, and its tongue is out, giving it a cheerful expression. Its ears are perked up, and it appears to be wearing a red collar. The background is slightly blurred, emphasizing the dog in motion., { breed: Pembroke Welsh Corgi, surroundings: outdoors in a grassy area, color: tan and white } ] ] }SlideParser幻灯片转图片后交给视觉 LLMSlideParser面向 PPTX 与 PDF 幻灯片处理流程__wrapped__parsers.py L962-L1028是用detect_filetype判定类型PPTX 先经_convert_pptx_to_pdf转 PDF用 pdf2image 把 PDF 渲染为图片intermediate_image_format默认jpgimage_size默认 (1280, 720)图片转 base64 后交给视觉 LLM 描述每页内容与 ImageParser 相同支持detail_parse_schema二次抽取。每页输出的元数据包含b64_image、image_page、tot_pages以及可选的 schema 抽取字段。参数语义llm、parse_prompt、detail_parse_schema、include_schema_in_text、run_mode、retry_strategy、cache_strategy与 ImageParser 一致。源码 docstring 明确标注了许可要求该类需要 Pathway Live Data Framework Scale 账户许可构造时会调用_check_entitlements(advanced-parser)校验parsers.py L895。TwelveLabsVideoParser视频 RAG 的入口TwelveLabsVideoParser用 TwelveLabs Pegasus 视频理解模型把视频转成富文本描述使视频输出可以像其他解析器产物一样被切分、嵌入、索引从而构建 Video RAG 流水线检索侧建议搭配把文本嵌入到同一多模态空间的MarengoEmbedder使用。依赖与环境需要twelvelabsSDKpip install pathway[twelvelabs]pyproject.toml 中该 extra 要求twelvelabs 1.2.8与 TwelveLabs API keykey 未显式传入时从TWELVELABS_API_KEY环境变量读取。输入限制Pegasus 接受 4 秒到 2 小时、不超过 2 GB、任意 FFmpeg 支持容器的视频分辨率 360x360 到 5184x2160。源码中 2 GB 上限在上传前由解析器本地拦截_PEGASUS_MAX_VIDEO_BYTESparsers.py L1405-L1407其余限制由 TwelveLabs API 强制执行。生产建议解析一个视频要数分钟且按 TwelveLabs 计费因此推荐cache_strategypw.udfs.DiskCache()持久化结果避免每次重启重新解析全部视频并用on_errorskip让单个坏视频不阻塞整条流水线。完整参数parsers.py L1487-L1505prompt发给 Pegasus 的指令默认是一段面向 RAG 的通用描述提示词默认模型pegasus1.5model默认pegasus1.5、api_key、max_tokens默认 2048、temperature默认Nonevideo_format默认mp4上传资源的文件名扩展名asset_poll_interval默认 5 秒/asset_timeout默认 600 秒资产就绪轮询与超时delete_assets默认True分析完成后删除上传的资产避免资产列表膨胀设为False时元数据会带出twelvelabs_asset_id供复用或排查capacity默认无上限、retry_strategy默认指数退避 4 次重试按视频粒度、先于on_error生效、on_errorraise/skipasync_mode默认batch_async下微批会等待批内全部视频完成对于分钟级解析耗时fully_async让流水线在解析期间继续推进更合适。使用示例Pythonimport pathway as pw from pathway.xpacks.llm.parsers import TwelveLabsVideoParser videos pw.io.fs.read(./videos, formatbinary, modestreaming) parser TwelveLabsVideoParser( cache_strategypw.udfs.DiskCache(), # 重启时不重新解析视频 on_errorskip, # 单个坏视频不应阻塞流水线 ) result videos.select(parsedparser(videos.data))模板 YAML 配置$parser: !pw.xpacks.llm.parsers.TwelveLabsVideoParser on_error: skip cache_strategy: !pw.udfs.DiskCache与 SlideParser 一样该解析器需要 Scale 许可构造函数调用_check_entitlements(advanced-parser)parsers.py L1506。选型建议与公共机制小结结合文档描述与源码实现选型可按以下思路收敛纯文本字节→Utf8ParserPDF 只要文本、追求轻量→PypdfParser每页一块、含page_number元数据无表格/图片PDF 要文本 表格 图片→DoclingParser结构感知分块可选视觉 LLM 解析图文或PaddleOCRParser本地 OCR无外部模型调用注意 Python 3.14 不可用图片→ImageParserPPTX/PDF 幻灯片→SlideParser需 Scale 许可视频→TwelveLabsVideoParser需pathway[twelvelabs]依赖与 API key需 Scale 许可通用文档HTML/Word/PDF 内置分块→UnstructuredParser注意其为字符级分块无法精确控制 token 上限。从源码结构还可以归纳出几个各解析器共享的机制视觉类解析器Image/Slide/Docling/TwelveLabs都通过_prepare_executor支持batch_async/fully_async两种执行模式并普遍默认指数退避重试cache_strategy是跨解析器的统一缓存入口而所有解析器的输出都统一为list[tuple[str, dict]]保证下游切分、嵌入、索引组件可以用同一种方式消费。测试层面test_parsers.py 覆盖了Utf8Parserbytes/str 双路径、PypdfParser端到端文本还原与PaddleOCRParser的 3.14 版本守卫可作为验证本地行为的参考基线。【免费下载链接】pathwayPython ETL framework for stream processing, real-time analytics, LLM pipelines, and RAG.项目地址: https://gitcode.com/GitHub_Trending/pa/pathway创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考