Qwen-Agent 文档解析指南:把 PDF 和 Word 变成可检索的知识块
【免费下载链接】Qwen-AgentAgent framework and applications built upon Qwen>=3.0, featuring Function Calling, MCP, Code Interpreter, RAG, Chrome extension, etc.项目地址: https://gitcode.com/GitHub_Trending/qw/Qwen-Agent
Qwen-Agent 的文档解析能力基于 DocParser 工具实现,它能把 PDF、Word 等 9 种格式的文件提取出文本与表格,再切分成带元数据的语义块。配合框架自带的 RAG 问答 Agent,一份厚文档可以直接接进问答系统。本文面向第一次接触该项目的开发者,讲清楚如何用它解析文档、解析链路里发生了什么,以及有哪些可调整的参数。
📄 场景切入:行业研报的文档问答
策略团队做周报时,通常要对着 120 页的 PDF 研报,外加几份 Word 和 Excel 格式的季度数据。传统做法是人工:Ctrl+F 定位段落,把关键数据复制粘贴到新文档里做横向对比,表格一多就容易串行漏行。更底层的卡点是:LLM 的上下文再大也装不下几百页原文,必须先把文档切成可检索的片段,模型才能"读得完、找得到"。
DocParser 解决的正是这个"切"的动作。它把各种格式的文档统一转换成同一种块结构:每个块都带正文、token 数和来源文件、标题等元数据,可以直接喂给下游的检索与问答模块,不需要为每种格式单独写一套处理逻辑。
图:Qwen-Agent 解析 PDF 后,针对论文内容直接提问"这篇论文的结论是什么"并给出回答
⚡ Qwen-Agent 文档解析快速上手:安装依赖与首次解析
先装依赖。文档解析属于 rag 可选依赖,一条命令即可:
pip install -U "qwen-agent[gui,rag]"如果还需要跑 WebUI 或改源码,可以看 README.md 里的完整安装说明。解析本身不依赖模型服务;只有后面接 RAG 问答时,才需要配置 DASHSCOPE_API_KEY 或自建模型端点。
最小示例是直接调用 DocParser 工具:
from qwen_agent.tools.doc_parser import DocParser parser = DocParser() record = parser.call({'url': './docs/2025_q3_report.pdf'}) print(record['title']) # 文档中提取出的标题 print(len(record['raw'])) # 切分出的块数 print(record['raw'][0]['metadata']) print(record['raw'][0]['content'][:100])返回值是一个 dict:url、title,以及 raw 分块列表,每块含 content、token、metadata 三个字段。想跳过手工调用、直接得到一个可问答的 bot,参考 examples/assistant_rag.py 和 examples/parallel_doc_qa.py,后者还带一个 Gradio WebUI。
🔍 文档解析流程拆解:从文件到可检索知识块
整条解析链路在 qwen_agent/tools/doc_parser.py 与 qwen_agent/tools/simple_doc_parser.py 中,可以拆成四步:
- 格式识别:按扩展名判断文件类型,支持 pdf/docx/pptx/txt/html/csv/tsv/xlsx/xls 共 9 种;传入 http(s) 链接时会先下载到本地工作区再解析。
- 内容提取与清洗:Word 中的表格被转成 markdown 管道符文本,PDF 文本里的 CID、十六进制占位等噪声被清理掉,输出"页 → 段落"的统一结构。
- 语义分块:先统计全文 token 数。若不超过 max_ref_token(默认 20000),整篇文档就是一个块;否则按段落逐个累加,累到 parser_page_size(默认 500)就切一刀。超长的段落先按句子边界(". " 或"。")拆开,相邻块之间还保留最多 150 字符的重复内容,避免切点处语义被截断。
- 元数据标注与缓存:每个块标注 source、title、chunk_id,整条记录写入本地缓存。缓存键由 sha256(url) 与分块大小组成,同一文件第二次读取直接命中缓存。
⚙️ Qwen-Agent 文档解析进阶用法:块大小、缓存、批量
块大小、缓存、批量:参数速查与自定义分块
参数通过构造器传入,也可以用环境变量 QWEN_AGENT_DEFAULT_MAX_REF_TOKEN、QWEN_AGENT_DEFAULT_PARSER_PAGE_SIZE 全局覆盖:
| 参数 | 默认值 | 作用 |
|---|---|---|
| max_ref_token | 20000 | 全文 token 数不超过它时,整篇作为一个块 |
| parser_page_size | 500 | 每个块的目标 token 数 |
| url | — | 本地路径或可下载的 http(s) 链接 |
缓存目录默认在工作区下的 tools/doc_parser,构造器里传 'path' 可以改到自定义位置。
自定义分块:split_doc_to_chunk 是公开方法。如果文档结构固定(比如研报固定有"摘要 / 行业综述 / 公司分析"),可以继承 DocParser,先按章节标题切段,再对每段调用父类逻辑做 token 累加,这样每个块就对应一个完整章节。
批量处理:框架提供了 parallel_exec,见 qwen_agent/utils/parallel_executor.py:
from qwen_agent.tools.doc_parser import DocParser from qwen_agent.utils.parallel_executor import parallel_exec parser = DocParser({'parser_page_size': 1000}) def parse(path): return parser.call({'url': path}) results = parallel_exec(parse, ['./a.pdf', './b.docx'], max_workers=2)❓ Qwen-Agent 文档解析常见问题
- 同一份文档二次解析没有变快→ 原因:缓存键由 sha256(url) 与分块大小组成,路径写法或参数一变缓存就失效 → 处理:调用时保持 url 与 parser_page_size 一致。
- 提取出的表格不是结构化表格对象→ 原因:Word、Excel 的表格统一被转成 markdown 管道符文本存放 → 处理:需要列语义时自行按行、列拆字段,或直接把表格文本送问答。
- 中文文档的块切分点生硬→ 原因:超长段落只按 ". " 和"。"两个句子分隔符切分 → 处理:继承 DocParser 重写 split_doc_to_chunk,按自己的章节规则分块。
写在最后
Qwen-Agent 的文档解析做的事并不复杂:把各种格式的文件统一成"块 + 元数据",让长文档第一次变得可定位、可检索。分块策略与重叠机制都暴露在公开方法里,按自己文档的结构去调,通常比堆更多模型参数更见效。你手边哪类长文档,是最想先接进这套链路的?
【免费下载链接】Qwen-AgentAgent framework and applications built upon Qwen>=3.0, featuring Function Calling, MCP, Code Interpreter, RAG, Chrome extension, etc.项目地址: https://gitcode.com/GitHub_Trending/qw/Qwen-Agent
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考