RAG系列:解析優化 - 使用 Doc2X 將 PDF 高效轉換為 Markdown
引言
在構建高質量的企業級的智能問答系統的過程中,如何高效精準地處理企業已有的海量文檔是大部分開發者亟待解決的核心痛點。有了高效精準的文檔解析能力,才能夠構建高質量的知識庫和高效的信息檢索系統,這樣 LLM 才能給用戶更準確更全面的回答。
在RAG系列(七):解析優化 - 不同文件類型統一轉換成Markdown中我們介紹了一款開源的文檔解析工具 - MinerU,今天再給大家介紹一款優秀強大的文檔解析產品 - Doc2X[1]。
Doc2X 簡介
Doc2X 是一款專為開發者設計的強大文檔解析產品。
Doc2X 提供 RESTful API 與 SDK 工具包,支持多種開發語言與框架,讓您輕松將文檔處理功能嵌入現有系統,方便快捷地實現將 PDF、掃描件、圖片等多種格式的文檔精準轉換為 Markdown、LaTeX、HTML、Word 等結構化或半結構化格式的能力。
強大的功能特性
- 市面上類似的文檔解析產品,絕大部分公式識別做的不好(尤其是行內和復雜公式),而 Doc2X 則處于領先水平;
- Doc2X 對表格識別適配優秀,甚至支持識別表格里面的圖片和合并跨頁表格等;
- Doc2X 對于多欄識別的閱讀順序還原效果優異;
- Doc2X 適配范圍廣相當通用,涵蓋財研報、論文、教輔、專利等等;
- 更具體的效果對比可以參考:Doc2x-v1 競品分析(mathpix、庖丁PDFlux、pix2text、合合信息TextIn、騰訊云大模型知識引擎文檔解析)[2]
友好的操作界面
當然,除了提供了快速集成的 API 之外,Doc2X 還提供了友好的操作界面,可以讓你在頁面上快速完成文檔解析,解析完成之后可以對照著原文檔進行編輯,確保準確性。
無縫集成主流工具
Doc2X 已成功接入 FastGPT、CherryStudio、扣子(國內版)等知名知識庫和 AI 應用構建平臺。開發者可以直接在這些平臺中利用 Doc2X 的強大解析能力,快速搭建和優化自己的知識庫應用。
Doc2X 解析效果
從 Doc2X 的解析結果來看,Doc2X PDF 轉 Markdown 的整體效果是比較出色的,大家可以根據自己的文檔情況去試用看看效果。
我還是拿《2024少兒編程教育行業發展趨勢報告.pdf》這個文檔進行解析,相比于 MinerU ,在以下幾方面 Doc2X 做的更出色:
1. 支持多級標題的解析(MinerU 只支持一級標題解析);
2. 表格識別能力比較強,圖片中的表格基本準確識別出來,而且基本沒有錯位(MinerU 存在無法識別或表格錯位問題);
3. 對于多欄識別的閱讀順序還原效果優異(MinerU 對于多欄識別出現了混亂)。
Doc2X API 集成
Doc2X RESTful API 的 Base URL 是 https://v2.doc2x.noedgeai.com,API 調用流程如下:
Doc2X API 文檔[3]https://noedgeai.feishu.cn/wiki/Q8QIw3PT7i4QghkhPoecsmSCnG1
接口鑒權
首先需要獲取到 API Key(類似于sk-xxx
),API Key 獲取網址:https://open.noedgeai.com/。
獲取之后,在 HTTP 請求頭加入:
Authorization: Bearer sk-xxx
文件預上傳
推薦使用該接口, 有更快的上傳速度,大文件上傳接口,文件大小<=1GB。
請求示例:
import json
import time
import requests as rq
base_url = "https://v2.doc2x.noedgeai.com"
secret = "sk-xxx"
def preupload():
url = f"{base_url}/api/v2/parse/preupload"
headers = {
"Authorization": f"Bearer {secret}"
}
res = rq.post(url, headers=headers)
if res.status_code == 200:
data = res.json()
if data["code"] == "success":
return data["data"]
else:
raise Exception(f"get preupload url failed: {data}")
else:
raise Exception(f"get preupload url failed: {res.text}")
upload_data = preupload()
print(upload_data)
返回示例:
{
"code": "success",
"data": {
"uid": "0192d745-5776-7261-abbd-814df3af3449",
"url": "https://doc2x-pdf.oss-cn-beijing.aliyuncs.com/tmp/0192d745-5776-7261-abbd-814df3af3449.pdf?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=LTAI5tS7hV6uXXVzcpk3EGfX%2F20241029%2Fcn-beijing%2Fs3%2Faws4_request&X-Amz-Date=20241029T075458Z&X-Amz-Expires=600&X-Amz-SignedHeaders=host&X-Amz-Signature=f731ea8fe4efdd7c727c210034bdcf1a63436c74b295db68f9648efdce576a91"
}
}
獲取到 url 之后,使用 HTTP PUT 方法上傳文件到返回結果中的 url 字段,然后使用/api/v2/parse/status
接口輪詢結果,使用的是阿里云的oss,具體速度取決于您的網速(海外用戶速度可能上傳失敗)。
import json
import time
import requests as rq
base_url = "https://v2.doc2x.noedgeai.com"
secret = "sk-xxx"
def put_file(path: str, url: str):
withopen(path, "rb") as f:
res = rq.put(url, data=f) # body為文件二進制流
if res.status_code != 200:
raise Exception(f"put file failed: {res.text}")
defget_status(uid: str):
url = f"{base_url}/api/v2/parse/status?uid={uid}"
headers = {
"Authorization": f"Bearer {secret}"
}
res = rq.get(url, headers=headers)
if res.status_code == 200:
data = res.json()
if data["code"] == "success":
return data["data"]
else:
raise Exception(f"get status failed: {data}")
else:
raise Exception(f"get status failed: {res.text}")
url = upload_data["url"]
uid = upload_data["uid"]
put_file("test.pdf", url)
whileTrue:
status_data = get_status(uid)
print(status_data)
if status_data["status"] == "success":
result = status_data["result"]
withopen("result.json", "w") as f:
json.dump(result, f)
break
elif status_data["status"] == "failed":
detail = status_data["detail"]
raise Exception(f"parse failed: {detail}")
elif status_data["status"] == "processing":
# processing
progress = status_data["progress"]
print(f"progress: {progress}")
time.sleep(3)
文件預上傳流程圖如下:
請求導出文件
通過/api/v2/parse/status
接口輪詢結果完成之后,需要通過 /api/v2/convert/parse
接口觸發導出文件任務。
請求示例:
import requests
import json
url = "https://v2.doc2x.noedgeai.com/api/v2/convert/parse"
headers = {
"Authorization": "Bearer sk-xxx",
"Content-Type": "application/json",
}
data = {
"uid": "01920000-0000-0000-0000-000000000000",
"to": "md",
"formula_mode": "normal",
"filename": "my_markdown.md",
}
response = requests.post(url, headers=headers, data=json.dumps(data))
print(response.text)
返回示例:
// 進行中
{
"code": "success",
"data": {
"status": "processing",
"url": ""
}
}
導出獲取結果
通過/api/v2/convert/parse
接口觸發導出文件任務后,需要通過/api/v2/convert/parse/result
接口輪詢導出文件任務狀態,成功之后會返回文件 URL。
請求示例:
import requests
url = 'https://v2.doc2x.noedgeai.com/api/v2/convert/parse/result?uid=01920000-0000-0000-0000-000000000000'
headers = {'Authorization': 'Bearer sk-xxx'}
response = requests.get(url, headers=headers)
print(response.text)
返回示例:
{
"code":"success",
"data":{
"status":"success",
"url":"https://doc2x-backend.s3.cn-north-1.amazonaws.com.cn/objects/01927a3a-eeb0-74f6-a539-ca35916b772e5/convert_tex_none.zip?X-Amz-Algorithm=AWS4-HMACSHA256&X-Amz-Credential=AKIATKXFISLI52PK3HTP%2F20241011%2Fcn-north-1%2Fs3%2Faws4request&X-Amz-Date=20241011075617Z&X-Amz-Expires=300&X-Amz-SignedHeaders=host&&x-id=GetobjectX-Amz-Signature=05bdd04a668e9924c5fd361999728cee35aaefb2087334a403f6ebf5ba93f786f"
}
}
下載文件
從/api/v2/convert/parse/result
接口獲得文件 URL 后就可以通過 HTTP GET 方法請求 URL 來下載文件。
請求示例:
import requests
response = requests.get("https://doc2x-backend.s3.cn-north-1.amazonaws.com.cn/objects/01927a3a-eeb0-74f6-a539-ca35916b772e5/convert_tex_none.zip?X-Amz-Algorithm=AWS4-HMACSHA256&X-Amz-Credential=AKIATKXFISLI52PK3HTP%2F20241011%2Fcn-north-1%2Fs3%2Faws4request&X-Amz-Date=20241011075617Z&X-Amz-Expires=300&X-Amz-SignedHeaders=host&&x-id=GetobjectX-Amz-Signature=05bdd04a668e9924c5fd361999728cee35aaefb2087334a403f6ebf5ba93f786f")
with open('downloaded_file.zip', 'wb') as f:
f.write(response.content)
結語
本文給大家再介紹了一款優秀強大的文檔解析產品 - Doc2X,通過實踐表明 Doc2X 確實具有優秀的表現,可以作為大家在建設文檔解析系統的候選工具,也期望通過我的介紹能給大家提供更多的選擇和思路。
引用鏈接
[1]
Doc2X: https://noedgeai.com/
[2]
Doc2x-v1 競品分析(mathpix、庖丁PDFlux、pix2text、合合信息TextIn、騰訊云大模型知識引擎文檔解析): https://noedgeai.feishu.cn/wiki/K1NGwjuuqiI9nukgapEcUAALnLh?from=from_copylink
[3]
Doc2X API 文檔: https://noedgeai.feishu.cn/wiki/Q8QIw3PT7i4QghkhPoecsmSCnG1