|
在构建 RAG(检索增强生成)系统时,光有文档远远不够,一份结构清晰、可被理解的知识库才是模型“打怪升级”的关键。很多解析方案只是简单提取文字,忽略了段落、标题、表格、图表等结构信息,导致内容碎片化、上下文丢失,检索结果不准、回答效果不佳。 最终喂给大模型的是一堆“看不懂”的无结构输入,Attention 无法聚焦重点,RAG 效果自然大打折扣。如果你也遇到这些坑,不妨给自己点个赞:你已经意识到——RAG 的上限,其实从文档解析那一刻就已经被决定了。 “我的模型效果一直上不去,明明检索到的文档内容很丰富,却总回答跑题?” “别急,也许问题就在文档解析这一环,花再多预算也补不回高质量‘燃料’。”
本篇文章,我们以EasyDoc为切入,深度实测其在不同模式下对多种文档的解析效果,并结合示例代码、JSON 输出样例及RAG 架构接入指南,全面解读为什么它堪称“RAG项目首选解析工具”。 EasyDoc 是一款强大的多模态文档处理 API,能够将杂乱无章的非结构化文档,精准转化为层次分明的结构化 JSON,使文档资产天然适配各类 LLM 应用。 专为 LLM 工作流而生,EasyDoc 为模型推理、微调与上下文优化提供高质量输入数据,是构建强健 AI 系统的理想底座。 EasyDoc提供三个模式以满足不同需求:Lite模式、Pro模式和Premium模式,其中Premium模式尤其擅长处理富含表格、图表和复杂布局的文档。如下面表格所示。 此外,EasyDoc主要输出结构化的JSON,因为对于AI应用和后续编程处理来说,这是最通用和最高效的格式。EasyDoc输出的JSON信息足够丰富,开发者如果需要,可以基于JSON结果将部分结构化数据转换成Markdown用于特定的展示目的。 ?? “开发者友好,开箱即用” 开发者如何集成EasyDoc?EasyDoc提供简洁明了的REST API。开发者可以轻松地将文档发送到对应模式(Lite, Pro, Premium)的API接口,并接收结构化的JSON结果。接下来,我以解析企业财报为案例,提供相应的文档和示例代码,帮助开发者快速上手。API 集成实战:3 步让你的项目接入 EasyDoc。 注册并获取 API Key
核心步骤:登录官网 → 注册账号 → 邮箱激活 → 获取api-key。 EasyDoc默认已经内置 $10 免费额度(Lite 模式最多可处理 5000 页,Pro+Lite 模式 2000 页,另赠送 500 页 Premium 模式体验),让你无门槛快速上手。 接下来创建api-key。 调用示例,提供了3种模式。 Lite 模式 curl--location--requestPOST'https://api.easydoc.sh/api/v1/parse'\--header'api-key:YOUR_API_KEY'\--form'file=@"./sample.pdf"'\--form'mode="lite"'题与语义标签。 Pro 模式 curl--location--requestPOST'https://api.easydoc.sh/api/v1/parse'\--header'api-key:YOUR_API_KEY'\--form'file=@"./report.docx"'\--form'mode="pro"' Premium 模式 curl--location--requestPOST'https://api.easydoc.sh/api/v1/parse'\--header'api-key:YOUR_API_KEY'\--form'file=@"./complex-table.pdf"'\--form'mode="premium"' 接下来,使用Python代码进行贵州茅台半年报PDF的解析。 #!/usr/bin/env python3 # -*- coding: utf-8 -*- # @Time : 2025/4/20 11:53 # @File : demo.py # @Software: PyCharm importrequests importos importargparse
defparse_pdf_with_easydoc(api_key,file_path,mode="premium"): """ 使用 EasyDoc API 解析 PDF 文件。
参数: api_key (str): 你的 EasyDoc API 密钥 file_path (str): PDF 文件的路径 mode (str): 解析模式,默认为 "premium"
返回: dict: API 的解析响应 """ url ="https://api.easydoc.sh/api/v1/parse"
# 检查文件是否存在 if notos.path.isfile(file_path): raiseFileNotFoundError(f"文件未找到:{file_path}")
# 准备请求的文件和数据 files = { 'file': (os.path.basename(file_path),open(file_path,'rb'),'application/pdf') }
data = { 'mode': mode }
headers = { 'api-key': api_key }
try: response = requests.post(url,headers=headers,files=files,data=data) response.raise_for_status() # 对于 4XX/5XX 响应抛出异常 returnresponse.json() exceptrequests.exceptions.RequestExceptionase: print(f"向 EasyDoc API 发送请求时出错:{e}") return None finally: # 确保关闭文件 files['file'][1].close()
defmain(): parser = argparse.ArgumentParser(description='使用 EasyDoc API 解析 PDF') parser.add_argument('--api-key',required=False,help='你的 EasyDoc API 密钥') parser.add_argument('--file',required=False,help=' DF 文件路径') parser.add_argument('--mode',default='premium',choices=['lite','pro','premium'], help='解析模式(standard 或 premium)') parser.add_argument('--output',help='输出文件路径(JSON 格式)')
args = parser.parse_args()
# 解析 PDF args.api_key ="Nju7CvHclRCoKvGeIPajAfZhIOpV3Xr2" args.file ="茅台半年报.pdf" args.output ="result.json" result = parse_pdf_with_easydoc(args.api_key,args.file,args.mode)
ifresult: print(" DF 解析成功!")
# 如果指定了输出文件,则保存结果 ifargs.output: importjson withopen(args.output,'w',encoding='utf-8')asf: json.dump(result,f,ensure_ascii=False,indent=2) print(f"结果已保存到{args.output}")
if__name__ =="__main__": main()
运行代码进行任务提交: 添加成功之后,可以在EasyDoc平台看到任务列表:根据task_id获取解析结果 #!/usr/bin/env python3 # -*- coding: utf-8 -*- # @Time : 2025/4/20 12:08 # @File : demo2.py # @Software: PyCharm importrequests importtime importjson
defget_parse_result(api_key,task_id,max_retries=10,retry_interval=5): """ 根据 task_id 获取解析结果。
参数: api_key (str): 你的 EasyDoc API 密钥 task_id (str): 解析任务的ID max_retries (int): 最大重试次数,默认为10 retry_interval (int): 重试间隔(秒),默认为5
返回: dict: 解析结果 """ url =f"https://api.easydoc.sh/api/v1/parse/{task_id}/result"
headers = { 'api-key': api_key }
retries =0 whileretries < max_retries: try: response = requests.get(url,headers=headers) response.raise_for_status() result = response.json()
# 检查任务状态 if notresult.get('success'): print(f"获取结果失败:{result.get('errMessage')}") return None
task_status = result.get('data',{}).get('task_status')
iftask_status =="SUCCESS": returnresult eliftask_status =="ERROR": print(f"解析任务出错") returnresult eliftask_statusin[" ENDING"," ROGRESSING"]: print(f"任务状态:{task_status},等待{retry_interval}秒后重试...") time.sleep(retry_interval) retries +=1 else: print(f"未知任务状态:{task_status}") returnresult
exceptrequests.exceptions.RequestExceptionase: print(f"获取解析结果时出错:{e}") retries +=1 time.sleep(retry_interval)
print(f"达到最大重试次数 ({max_retries}),无法获取结果") return None
result = get_parse_result( api_key="Nju7CvHclRCoKvGeIPajAfZhIOpV3Xr2", task_id="parse_952cb465-cbe1-4e49-ab01-d06dde9288a1" ) print(result) withopen("easydoc_result.json","w",encoding="utf-8")asf: json.dump(result,f,ensure_ascii=False,indent=4)
EasyDoc真正做到“让 AI 秒懂文档”,将复杂混乱的文档一键转为“AI 能读懂的结构化 JSON”,让 RAG 系统的检索准确率与生成质量双双大幅提升。
复杂文档如何一键结构化?图表+表格也不怕!
图形理解
表格理解
层次分析
分栏表格理解
分栏图形理解-柱状图
分栏图形理解-折线图

层次理解
跨页表格合并
? “RAG 必备预处理器” EasyDoc 是实现高质量检索增强生成(RAG)的关键第一步。通过保留标题、段落、列表、表格等结构信息,它显著提升向量检索的相关性与召回精度,为 LLM 提供更聚焦的上下文,从而提升回答质量。 EasyDoc作为AI驱动的文档解析工具。它能将多种文档格式(如PDF、图片)转换成结构化的JSON数据。 与基础OCR不同,EasyDoc能深度理解文档的布局、文本、表格乃至图表,使得输出数据非常适合AI应用(如RAG、知识库构建、数据提取、报告分析)。 在RAG应用的测评中,面对“宁德时代的相对指数表现如何?”这一问题,模型不仅给出了较为准确的回答,还提供了对应的文档引用,增强了结果的可追溯性与可信度。
同样地,我们在RAG问答应用中测试了EasyDoc在图表理解方面的表现。如图所示,其在表格数据的提取与总结方面同样展现出显著优势,能够高效且精准地识别和提炼关键信息。? “超越 OCR 的理解力”不止识字,EasyDoc 能真正“读懂”文档。它准确识别表格的行列逻辑、合并单元格、图文混排内容,甚至能够解析图表结构,远超传统 OCR 所能达到的语义理解能力。 EasyDoc可以处理各种常见文件格式(.doc,.docx,.ppt,.pptx,.txt,.pdf)。 ? “复杂文档,一网打尽”面对跨页报表、嵌套图表、图文混排报告等高复杂度文档,EasyDoc 依然稳定输出结构清晰的结果。无论是科研论文、财务报表还是产品白皮书,它都能轻松应对。 这是EasyDoc的一大核心优势,尤其是Premium模式,目前推广期间每个新用户送500页免费额度!它运用先进的AI和视觉技术,不仅能从单元格提取文本,更能理解真实的表格结构——行、列、表头乃至合并单元格。它还能智能处理跨页的表格,并在JSON输出中将它们逻辑上拼接完整。 |