RAG系列:解析優(yōu)化 - 使用 Doc2X 將 PDF 高效轉(zhuǎn)換為 Markdown
引言
在構(gòu)建高質(zhì)量的企業(yè)級(jí)的智能問答系統(tǒng)的過程中,如何高效精準(zhǔn)地處理企業(yè)已有的海量文檔是大部分開發(fā)者亟待解決的核心痛點(diǎn)。有了高效精準(zhǔn)的文檔解析能力,才能夠構(gòu)建高質(zhì)量的知識(shí)庫和高效的信息檢索系統(tǒng),這樣 LLM 才能給用戶更準(zhǔn)確更全面的回答。
在RAG系列(七):解析優(yōu)化 - 不同文件類型統(tǒng)一轉(zhuǎn)換成Markdown中我們介紹了一款開源的文檔解析工具 - MinerU,今天再給大家介紹一款優(yōu)秀強(qiáng)大的文檔解析產(chǎn)品 - Doc2X[1]。
Doc2X 簡介
Doc2X 是一款專為開發(fā)者設(shè)計(jì)的強(qiáng)大文檔解析產(chǎn)品。
Doc2X 提供 RESTful API 與 SDK 工具包,支持多種開發(fā)語言與框架,讓您輕松將文檔處理功能嵌入現(xiàn)有系統(tǒng),方便快捷地實(shí)現(xiàn)將 PDF、掃描件、圖片等多種格式的文檔精準(zhǔn)轉(zhuǎn)換為 Markdown、LaTeX、HTML、Word 等結(jié)構(gòu)化或半結(jié)構(gòu)化格式的能力。
官網(wǎng):https://noedgeai.com/
強(qiáng)大的功能特性
- 市面上類似的文檔解析產(chǎn)品,絕大部分公式識(shí)別做的不好(尤其是行內(nèi)和復(fù)雜公式),而 Doc2X 則處于領(lǐng)先水平;
- Doc2X 對(duì)表格識(shí)別適配優(yōu)秀,甚至支持識(shí)別表格里面的圖片和合并跨頁表格等;
- Doc2X 對(duì)于多欄識(shí)別的閱讀順序還原效果優(yōu)異;
- Doc2X 適配范圍廣相當(dāng)通用,涵蓋財(cái)研報(bào)、論文、教輔、專利等等;
- 更具體的效果對(duì)比可以參考:Doc2x-v1 競品分析(mathpix、庖丁PDFlux、pix2text、合合信息TextIn、騰訊云大模型知識(shí)引擎文檔解析)[2]
友好的操作界面
當(dāng)然,除了提供了快速集成的 API 之外,Doc2X 還提供了友好的操作界面,可以讓你在頁面上快速完成文檔解析,解析完成之后可以對(duì)照著原文檔進(jìn)行編輯,確保準(zhǔn)確性。
無縫集成主流工具
Doc2X 已成功接入 FastGPT、CherryStudio、扣子(國內(nèi)版)等知名知識(shí)庫和 AI 應(yīng)用構(gòu)建平臺(tái)。開發(fā)者可以直接在這些平臺(tái)中利用 Doc2X 的強(qiáng)大解析能力,快速搭建和優(yōu)化自己的知識(shí)庫應(yīng)用。
Doc2X 解析效果
從 Doc2X 的解析結(jié)果來看,Doc2X PDF 轉(zhuǎn) Markdown 的整體效果是比較出色的,大家可以根據(jù)自己的文檔情況去試用看看效果。
我還是拿《2024少兒編程教育行業(yè)發(fā)展趨勢報(bào)告.pdf》這個(gè)文檔進(jìn)行解析,相比于 MinerU ,在以下幾方面 Doc2X 做的更出色:
1. 支持多級(jí)標(biāo)題的解析(MinerU 只支持一級(jí)標(biāo)題解析);
2. 表格識(shí)別能力比較強(qiáng),圖片中的表格基本準(zhǔn)確識(shí)別出來,而且基本沒有錯(cuò)位(MinerU 存在無法識(shí)別或表格錯(cuò)位問題);
3. 對(duì)于多欄識(shí)別的閱讀順序還原效果優(yōu)異(MinerU 對(duì)于多欄識(shí)別出現(xiàn)了混亂)。
Doc2X API 集成
Doc2X RESTful API 的 Base URL 是 https://v2.doc2x.noedgeai.com,API 調(diào)用流程如下:
Doc2X API 文檔[3]https://noedgeai.feishu.cn/wiki/Q8QIw3PT7i4QghkhPoecsmSCnG1
接口鑒權(quán)
首先需要獲取到 API Key(類似于sk-xxx
),API Key 獲取網(wǎng)址:https://open.noedgeai.com/。
獲取之后,在 HTTP 請(qǐng)求頭加入:
Authorization: Bearer sk-xxx
文件預(yù)上傳
推薦使用該接口, 有更快的上傳速度,大文件上傳接口,文件大小<=1GB。
請(qǐng)求示例:
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 方法上傳文件到返回結(jié)果中的 url 字段,然后使用/api/v2/parse/status
接口輪詢結(jié)果,使用的是阿里云的oss,具體速度取決于您的網(wǎng)速(海外用戶速度可能上傳失敗)。
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為文件二進(jìn)制流
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)
文件預(yù)上傳流程圖如下:
請(qǐng)求導(dǎo)出文件
通過/api/v2/parse/status
接口輪詢結(jié)果完成之后,需要通過 /api/v2/convert/parse
接口觸發(fā)導(dǎo)出文件任務(wù)。
請(qǐng)求示例:
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)
返回示例:
// 進(jìn)行中
{
"code": "success",
"data": {
"status": "processing",
"url": ""
}
}
導(dǎo)出獲取結(jié)果
通過/api/v2/convert/parse
接口觸發(fā)導(dǎo)出文件任務(wù)后,需要通過/api/v2/convert/parse/result
接口輪詢導(dǎo)出文件任務(wù)狀態(tài),成功之后會(huì)返回文件 URL。
請(qǐng)求示例:
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 方法請(qǐng)求 URL 來下載文件。
請(qǐng)求示例:
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)
結(jié)語
本文給大家再介紹了一款優(yōu)秀強(qiáng)大的文檔解析產(chǎn)品 - Doc2X,通過實(shí)踐表明 Doc2X 確實(shí)具有優(yōu)秀的表現(xiàn),可以作為大家在建設(shè)文檔解析系統(tǒng)的候選工具,也期望通過我的介紹能給大家提供更多的選擇和思路。
引用鏈接
[1]
Doc2X: https://noedgeai.com/
[2]
Doc2x-v1 競品分析(mathpix、庖丁PDFlux、pix2text、合合信息TextIn、騰訊云大模型知識(shí)引擎文檔解析): https://noedgeai.feishu.cn/wiki/K1NGwjuuqiI9nukgapEcUAALnLh?from=from_copylink
[3]
Doc2X API 文檔: https://noedgeai.feishu.cn/wiki/Q8QIw3PT7i4QghkhPoecsmSCnG1