96SEO 2026-02-19 11:48 2
href="https://www.cnblogs.com/ljbguanli/p/19623444"

aria-level="2">DeepSeek+LangGraph构建企业级多模态RAG:从PDF繁琐解析到Agentic智能检索全流程实战
id="content_views">
摘要:
传统的文本RAG(检索增强生成)在面对包含复杂表格、图片和多栏排版的PDF文档时往往力不从心。
本文将带你从零开始,基于 Unstructured
PaddleOCR 实现“结构解析重建法”,将复杂的PDF逆向转化为高质量的Markdown文档;并结合 DeepSeek 大模型与 LangGraph 智能体框架,构建一个具备自我修正能力的
引擎。
本文包含完整的环境配置、核心代码实现及架构原理解析。
引言:RAG系统的“最后一公里”难题
随着大模型(LLM)技术的普及,RAG(检索增强生成)已成为企业知识库落地的主流方案。
然而,在实际开发中,开发者往往会撞上一堵墙:数据清洗。
企业内部存在大量
文档,这些文档不仅仅是纯文本,还包含了:
跨页的表格
复杂的流程图与截图
多栏排版与页眉页脚
传统的 PyPDF2 或简单的
方案只能提取出破碎的文本流,丢失了文档的结构信息(如标题层级、表格对应的行列关系)。
这种“垃圾进(Garbage
无法回答基于表格数据或图片内容的问题。
本文将介绍一种工业级的解决方案:结构解析重建法,并结合最新的
理念,打造一个真正好用的多模态检索系统。
什么是“结构解析重建法”?
所谓“结构解析重建”,本质上是对原始
文档进行分层解析,将其中的 标题、段落、表格、图片、公式 等元素逐一抽取,并依据其在文档中的位置和语义关系重新组织,最终转化为一种适合
理解的结构化格式——Markdown。
Markdown
天然支持标题层级(#)、表格(|---|)、图片引用(![])和代码块,是
技术栈选型
文档解析:Unstructured(基于
OCR)。
向量存储:FAISS + OpenAI
等模型)。
编排框架:LangChain + LangGraph(构建有状态的循环智能体)。
大模型:DeepSeek-V3(高性价比,推理能力强)。
安装避坑指南:
Windows
用户:如果安装
Tools。
模型下载:首次运行
PaddleOCR
时会自动下载检测和识别模型,请确保网络通畅。
第二阶段:多模态PDF深度解析(核心)
这一部分是整个系统的基石。
我们将把一个非结构化的
UnstructuredLoader
我们使用 UnstructuredLoader 的 hi_res(高分辨率)模式,结合
UnstructuredLoader(file_path=file_path,strategy="hi_res",
关键:启用高分辨率模式,进行版面分析infer_table_structure=True,
HTML/结构化数据ocr_languages="chi_sim+eng",
loader_local.lazy_load():docs_local.append(doc)
此时,docs_local 中的每个对象都包含了:
page_content:
包含坐标(coordinates)、页码(page_number)、元素类别(category,如
元素提取与可视化验证
为了确认解析是否准确(有没有把表格切碎,有没有把标题识别成正文),我们可以编写一个可视化函数,将识别框绘制在
segments):"""在PDF页面上绘制元素识别框"""pix
segment["coordinates"]["points"]layout_w
segment["coordinates"]["layout_width"]layout_h
segment["coordinates"]["layout_height"]scaled_points
facecolor="none")ax.add_patch(rect)#
fontsize=8)plt.axis("off")plt.show()
plot_pdf_with_boxes(pdf_doc.load_page(page_num
逆向工程:将PDF重组为Markdown
这是本文最精华的部分。
我们将利用 fitz 提取高、清图片,利用 Unstructured 提取文本结构,最后拼接成一个完整的
partition_pdf(filename=pdf_path,infer_table_structure=True,strategy="hi_res",ocr_languages="chi_sim+eng",ocr_engine="paddleocr"
enumerate(page.get_images(full=True),
f"page{page_index}_img{img_idx}.png"img_path
img_filename)pix.save(img_path)image_map[page_index].append(img_path)
"Subheader"]:md_lines.append(f"##
html2text(el.metadata.text_as_html)md_lines.append(md_table
简单策略:如果该位置识别到了Image元素,我们将该页未插入过的图片按顺序插入#
inserted_images:md_lines.append(f"\n")inserted_images.add(img_path)#
Markdown,构建向量库就变得简单且高效了。
我们将使用 MarkdownHeaderTextSplitter 来按章节切分,这样可以最大限度保留上下文语义。
langchain_community.vectorstores
import
OpenAIEmbeddings(model="text-embedding-3-small",
或其他兼容模型#
MarkdownHeaderTextSplitter(headers_to_split_on=headers_to_split_on)
md_splits
markdown_splitter.split_text(md_content)
print(f"文档已切分为
FAISS.from_documents(md_splits,
vector_store.save_local("my_rag_index")
print("✅
生成。
如果检索结果不好,系统就瞎编。
AgenticRAG(代理式RAG) 是一个闭环:检索
->
生成。
我们将使用 LangGraph 来实现这个智能工作流。
6.1
初始化模型与工具
langchain_community.vectorstores
OpenAIEmbeddings(model="text-embedding-3-small")
FAISS.load_local("my_rag_index",
allow_dangerous_deserialization=True)
vector_store.as_retriever(search_kwargs={"k":
create_retriever_tool(retriever,name="retrieve_docs",description="搜索并返回知识库中的相关文档片段。
",
init_chat_model(model=MODEL_NAME,
动作:
Grade
(打分员):判断检索到的文档是否有用。
Rewrite
(改写员):如果文档没用,重写用户问题。
Generate
(生成员):根据文档回答问题。
GradeDoc(BaseModel):"""文档相关性评分"""binary_score:
str
Field(description="文档是否与问题相关,'yes'
'no'")
generate_query_or_respond(state:
MessagesState):"""决策节点:直接回答还是调用工具检索?
"""#
await
llm.bind_tools([retriever_tool]).ainvoke(state["messages"])return
{"messages":
"rewrite_question"]:"""评分节点:决定下一步是生成答案还是重写问题"""question
获取检索结果(通常是工具调用的输出)tool_messages
for
f"""你是一个文档评估员。
请判断以下检索到的文档是否包含回答用户问题所需的信息。
文档内容:
{context}用户问题:
llm.with_structured_output(GradeDoc)result
await
result.binary_score.lower().startswith("y"):return
"rewrite_question"
MessagesState):"""重写节点:优化查询语句"""question
state["messages"][0].contentmsg
[{"role":
"你是一个提示词专家。
请重写用户的问题,使其更容易被向量数据库检索到,聚焦于关键词。
"},{"role":
"user",
MessagesState):"""生成节点:最终回复"""#
System
llm.ainvoke(state["messages"])return
{"messages":
(Graph)
将上述节点连接起来,形成工作流。
class="language-python">workflow
添加节点
workflow.add_node("decision_maker",
workflow.add_node("retrieve_tool",
rewrite_question)
workflow.add_node("answer_generator",
generate_answer)
workflow.add_conditional_edges("decision_maker",
route_tool_trigger)
workflow.add_conditional_edges("retrieve_tool",
grade_documents)
workflow.add_edge("answer_generator",
END)
"__main__":asyncio.run(main())
7.
总结与展望
通过本文的实战,我们成功搭建了一套企业级的多模态
RAG
系统。
数据层:利用 Unstructured + PaddleOCR 攻克了
Markdown。
存储层:利用 MarkdownHeaderTextSplitter 实现了基于语义的精准切分。
认知层:利用 DeepSeek + LangGraph 构建了具备反思能力的
RAG“查不到乱回答”的问题。
未来优化方向:
多模态
Embedding:目前我们只是将图片路径存入
模型直接对图片进行向量化,实现“以文搜图”。
GraphRAG:在向量检索的基础上引入知识图谱,处理跨文档的复杂推理问题。
class="post-meta-container">
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback