如何使用minerU来实现文档的上传处理
下面是一个基于 FastAPI 框架使用 MinerU 和本地 Qwen 模型实现文档处理全流程的示例代码。这个方案实现了“文档上传、内容解析、文本分块、向量化与存储ES”的功能闭环。️ 技术架构说明该方案的组件选择和连接方式如下Web框架 (FastAPI)用于接收文档上传请求和管理API。文档解析 (MinerU)核心解析引擎将PDF、Word等文档转换为包含表格、公式的结构化Markdown/JSON数据。嵌入模型 (本地Qwen)使用阿里巴巴的Qwen系列模型通过sentence-transformers在本地将文本块转换为向量。向量数据库 (Elasticsearch)作为统一的存储和检索引擎存储向量、原始文本和元数据并支持高效的向量相似度搜索。 环境准备首先确保已安装以下核心依赖并启动了Elasticsearch服务。pipinstallfastapi uvicorn python-multipart mineru-next-dev elasticsearch sentence-transformers注意根据你的硬件环境sentence-transformers会自动选择CPU或GPU运行。Qwen模型文件较大首次运行时会自动下载。 完整代码实现 (main.py)importosimportuuidimportshutilfromtypingimportListfromfastapiimportFastAPI,File,UploadFile,HTTPExceptionfrompydanticimportBaseModel# MinerU 相关frommineruimportMinerUfrommineru.utilsimportMinerUConfig# 文本分块fromlangchain_text_splittersimportRecursiveCharacterTextSplitter# 本地Embedding模型fromsentence_transformersimportSentenceTransformer# Elasticsearch 向量存储fromelasticsearchimportElasticsearch,helpers appFastAPI(titleRAG Knowledge Base API)# 1. 配置与初始化 # 存储路径UPLOAD_DIR./uploaded_filesOUTPUT_DIR./parsed_outputos.makedirs(UPLOAD_DIR,exist_okTrue)os.makedirs(OUTPUT_DIR,exist_okTrue)# 初始化MinerUminer_configMinerUConfig()minerMinerU(configminer_config)# 初始化本地Embedding模型 (以Qwen系列为例选择合适的模型)# 可选: Qwen/Qwen-1_8B-Embedding, Qwen/Qwen-7B-Embedding 等embedding_model_nameQwen/Qwen-1_8B-Embeddingprint(f正在加载本地Embedding模型:{embedding_model_name}...)embedding_modelSentenceTransformer(embedding_model_name)print(模型加载完成。)# 初始化文本分块器text_splitterRecursiveCharacterTextSplitter(chunk_size800,chunk_overlap150,separators[\n\n,\n,。,,,,, ,],)# 初始化Elasticsearch客户端ES_URLhttp://localhost:9200# 请替换为你的ES地址ES_INDEX_NAMEknowledge_basees_clientElasticsearch(ES_URL)# 检查并创建索引如果不存在ifnotes_client.indices.exists(indexES_INDEX_NAME):# 定义索引映射包含向量字段mapping{mappings:{properties:{text:{type:text},metadata:{type:object,enabled:True},embedding:{type:dense_vector,dims:1536,# Qwen-1.8B-Embedding 的向量维度index:True,similarity:cosine,}}}}es_client.indices.create(indexES_INDEX_NAME,bodymapping)print(fES索引 {ES_INDEX_NAME} 创建成功。)else:print(fES索引 {ES_INDEX_NAME} 已存在。)# 2. 核心处理函数 defparse_document(file_path:str)-List[str]: 使用MinerU解析文档返回文本块列表。 # 设置输出路径output_pathos.path.join(OUTPUT_DIR,f{uuid.uuid4()}.md)# 调用MinerU进行解析# miner.parse 方法会解析文档并返回结果这里假设它生成Markdown文件# 实际API可能略有不同请参考MinerU官方文档miner.parse(file_path,output_pathoutput_path)# 读取解析后的Markdown内容withopen(output_path,r,encodingutf-8)asf:raw_textf.read()# 清理文本并分块# 注意MinerU 输出的是结构良好的Markdown直接分块即可docs[{page_content:raw_text,metadata:{source:file_path}}]chunkstext_splitter.split_documents(docs)# 返回文本内容列表和元数据return[{text:chunk.page_content,metadata:chunk.metadata}forchunkinchunks]defstore_in_es(chunks:List[dict]): 将文本块向量化后批量存入Elasticsearch。 actions[]forchunkinchunks:textchunk[text]metadatachunk[metadata]# 生成向量embeddingembedding_model.encode(text).tolist()# 准备ES文档action{_index:ES_INDEX_NAME,_source:{text:text,metadata:metadata,embedding:embedding,}}actions.append(action)# 批量写入ESifactions:success,failedhelpers.bulk(es_client,actions,stats_onlyTrue)print(f成功写入{success}条记录, 失败{failed}条。)returnsuccessreturn0# 3. API 接口 classProcessResponse(BaseModel):request_id:strfile_name:strchunk_count:intstatus:strmessage:strapp.post(/upload/,response_modelProcessResponse)asyncdefupload_and_process(file:UploadFileFile(...)): 上传文档并自动完成解析、分块、向量化和存储。 # 生成请求IDrequest_idstr(uuid.uuid4())# 1. 保存上传文件file_pathos.path.join(UPLOAD_DIR,f{request_id}_{file.filename})try:withopen(file_path,wb)asbuffer:shutil.copyfileobj(file.file,buffer)exceptExceptionase:raiseHTTPException(status_code500,detailf文件保存失败:{str(e)})# 2. 调用MinerU进行解析和分块try:chunksparse_document(file_path)exceptExceptionase:# 清理已上传文件os.remove(file_path)raiseHTTPException(status_code500,detailf文档解析失败:{str(e)})ifnotchunks:os.remove(file_path)raiseHTTPException(status_code400,detail文档解析后未产生任何文本块。)# 3. 向量化并存入EStry:stored_countstore_in_es(chunks)exceptExceptionase:# 即使存储失败也保留解析结果供排查raiseHTTPException(status_code500,detailf数据存储失败:{str(e)})# 清理临时文件可选# os.remove(file_path)returnProcessResponse(request_idrequest_id,file_namefile.filename,chunk_countstored_count,statussuccess,message文档处理完成已存入知识库。)# 4. 启动脚本 if__name____main__:importuvicorn uvicorn.run(app,host0.0.0.0,port8000) 关键实现要点MinerU 集成代码中通过miner.parse(file_path, output_pathoutput_path)调用MinerU进行解析。MinerU支持多种格式PDF、DOCX、PPTX等并会输出结构化的Markdown保留了表格、标题等关键信息。本地Embedding模型选择在初始化SentenceTransformer时你可以选择不同的Qwen模型。Qwen/Qwen-1_8B-Embedding是一个轻量级选择适合在消费级GPU上运行如果硬件允许Qwen/Qwen-7B-Embedding能提供更好的向量表示质量。注意需要根据选择的模型在ES索引映射中正确设置dims向量维度。Elasticsearch索引配置代码中为embedding字段设置了dense_vector类型并指定了相似度算法为cosine。这为后续进行语义检索奠定了基础。生产环境中你可以根据数据量级调整分片和副本数。 运行与测试启动服务python main.py服务将在http://127.0.0.1:8000启动自动生成的API文档在http://127.0.0.1:8000/docs。测试API使用curl或Postman发送POST请求curl-XPOST-Ffile/path/to/your/document.pdfhttp://127.0.0.1:8000/upload/成功后会返回处理结果包括存储的文本块数量。这个示例提供了一个可直接运行的起点。并可以根据实际的文档类型如扫描件、复杂表格调整MinerU的解析参数或根据业务需求优化分块策略。部署时建议参考MinerU官方文档进行更详细的配置例如使用precision模式处理长文档。

相关新闻

新e选烤火罩最后提醒:选烤火罩的3个关键动作

新e选烤火罩最后提醒:选烤火罩的3个关键动作

总结一下,买烤火罩别只看价格,核心看3点:有没有正规环保检测报告、面料工艺是不是锁色防水、生产厂家是不是专业品牌。新e选烤火罩在这3点上都达标,而且用户反馈的耐用性很强,正常使用能维持3-5年,算下来每…

2026/7/5 14:32:34阅读更多 →
Si4732与PIC18F97J94数字广播接收方案设计与优化

Si4732与PIC18F97J94数字广播接收方案设计与优化

1. 为什么选择Si4732与PIC18F97J94这对黄金组合 在数字广播接收领域,芯片选型直接决定了终端产品的音质上限。Si4732这颗来自Silicon Labs的DSP数字调谐器芯片,凭借其全频段覆盖(AM/FM/SW/LW)和高达114dB的信噪比,成为…

2026/7/5 14:32:34阅读更多 →
TVA与具身智能的结构性关联(10)

TVA与具身智能的结构性关联(10)

前沿技术介绍:AI智能体视觉(TVA,Transformer-based Vision Agent)是依托Transformer架构与“因式智能体”理论所构建的颠覆性工业视觉技术,属于“物理AI” 领域的一种全新技术形态,完成了从“虚拟世界”到“…

2026/7/5 14:32:34阅读更多 →
深度解析Lit高性能Web组件渲染引擎的5大核心架构优势

深度解析Lit高性能Web组件渲染引擎的5大核心架构优势

深度解析Lit高性能Web组件渲染引擎的5大核心架构优势 【免费下载链接】lit Lit is a simple library for building fast, lightweight web components. 项目地址: https://gitcode.com/GitHub_Trending/li/lit Lit是一个用于构建快速、轻量级Web组件的现代JavaScript库&…

2026/7/5 17:32:52阅读更多 →
Python开发AI Agent:从环境配置到生产部署全指南

Python开发AI Agent:从环境配置到生产部署全指南

1. AI Agent开发全景解析:为什么选择Python?在智能体开发领域,Python正以惊人的速度成为事实标准语言。根据2023年PyPL指数显示,Python在AI领域的采用率高达78%,远超其他语言。这种优势源于其丰富的生态体系&#xff1…

2026/7/5 17:32:52阅读更多 →
OpenAI Responses Starter App扩展开发:如何添加新的AI工具和功能

OpenAI Responses Starter App扩展开发:如何添加新的AI工具和功能

OpenAI Responses Starter App扩展开发:如何添加新的AI工具和功能 【免费下载链接】openai-responses-starter-app Starter app to build with the OpenAI Responses API 项目地址: https://gitcode.com/gh_mirrors/op/openai-responses-starter-app OpenAI …

2026/7/5 17:32:52阅读更多 →
three.quarks加载与导出:JSON格式与QuarksLoader使用详解

three.quarks加载与导出:JSON格式与QuarksLoader使用详解

three.quarks加载与导出:JSON格式与QuarksLoader使用详解 【免费下载链接】three.quarks Three.quarks is a general purpose particle system / VFX engine for three.js 项目地址: https://gitcode.com/GitHub_Trending/th/three.quarks three.quarks是一款…

2026/7/5 17:32:52阅读更多 →
pysimdjson:Python中最快的JSON解析库终极指南

pysimdjson:Python中最快的JSON解析库终极指南

pysimdjson:Python中最快的JSON解析库终极指南 【免费下载链接】pysimdjson Python bindings for the simdjson project. 项目地址: https://gitcode.com/gh_mirrors/py/pysimdjson 🚀 想要在Python中实现极速JSON解析?pysimdjson正是…

2026/7/5 17:32:52阅读更多 →
Self-Refine架构设计:FEEDBACK-REFINE循环的完整实现

Self-Refine架构设计:FEEDBACK-REFINE循环的完整实现

Self-Refine架构设计:FEEDBACK-REFINE循环的完整实现 【免费下载链接】self-refine LLMs can generate feedback on their work, use it to improve the output, and repeat this process iteratively. 项目地址: https://gitcode.com/gh_mirrors/se/self-refine …

2026/7/5 17:27:52阅读更多 →
从GitHub安全案例解析常见漏洞与防护实践

从GitHub安全案例解析常见漏洞与防护实践

1. 项目概述:从GitHub Trending看安全实战 最近在GitHub Trending上看到一个项目,叫 skills4/skills ,它因为一些安全漏洞案例被大家讨论。这其实是一个挺典型的场景:一个旨在展示或教授某种技能的仓库,本身却成了安…

2026/7/5 0:01:08阅读更多 →
MLT 2026启示:因果推理与概率建模驱动下一代LLM应用

MLT 2026启示:因果推理与概率建模驱动下一代LLM应用

# MLT 2026启示:因果推理与概率建模驱动下一代LLM应用## 一、背景与挑战:从“黑箱预测”到“可信推理”2026年6月,第7届机器学习与趋势国际会议(MLT 2026)将在悉尼召开。会议议程中,“因果与可解释机器学习…

2026/7/5 0:01:08阅读更多 →
通达OA SQL注入漏洞深度剖析:从手工注入到自动化利用与防御

通达OA SQL注入漏洞深度剖析:从手工注入到自动化利用与防御

1. 项目概述与漏洞背景最近在梳理一些历史OA系统的安全风险时,通达OA v11.6版本中的一个老漏洞又进入了我的视线。这个漏洞位于/general/bi_design/appcenter/report_bi.func.php文件中,是一个典型的SQL注入点。虽然这个漏洞的利用方式看起来并不复杂&am…

2026/7/5 0:01:08阅读更多 →
从GitHub安全案例解析常见漏洞与防护实践

从GitHub安全案例解析常见漏洞与防护实践

1. 项目概述:从GitHub Trending看安全实战 最近在GitHub Trending上看到一个项目,叫 skills4/skills ,它因为一些安全漏洞案例被大家讨论。这其实是一个挺典型的场景:一个旨在展示或教授某种技能的仓库,本身却成了安…

2026/7/5 0:01:08阅读更多 →
MLT 2026启示:因果推理与概率建模驱动下一代LLM应用

MLT 2026启示:因果推理与概率建模驱动下一代LLM应用

# MLT 2026启示:因果推理与概率建模驱动下一代LLM应用## 一、背景与挑战:从“黑箱预测”到“可信推理”2026年6月,第7届机器学习与趋势国际会议(MLT 2026)将在悉尼召开。会议议程中,“因果与可解释机器学习…

2026/7/5 0:01:08阅读更多 →
通达OA SQL注入漏洞深度剖析:从手工注入到自动化利用与防御

通达OA SQL注入漏洞深度剖析:从手工注入到自动化利用与防御

1. 项目概述与漏洞背景最近在梳理一些历史OA系统的安全风险时,通达OA v11.6版本中的一个老漏洞又进入了我的视线。这个漏洞位于/general/bi_design/appcenter/report_bi.func.php文件中,是一个典型的SQL注入点。虽然这个漏洞的利用方式看起来并不复杂&am…

2026/7/5 0:01:08阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/5 1:30:27阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/5 3:48:10阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/5 3:48:09阅读更多 →