从PDF到智能问答:我用多模态GraphRAG搭建知识库问答系统,效果惊艳!
本文介绍了如何搭建一个完整的多模态知识库问答系统解决传统RAG在文档解析和检索质量上的痛点。通过MinerU解析文档、LangExtract抽取信息、构建Neo4j知识图谱和Milvus向量索引结合LangChain Agent实现多跳推理最终通过FastAPI和React呈现结果。该系统支持多格式文档解析、知识图谱构建、向量检索和混合问答前端注重交互体验后端保证可扩展性与可观测性数据层同时支撑语义检索与关系推理。在做知识库问答被以下问题卡了很久。文档解析扫描 PDF、表格、图文混排都容易出错OCR 后的数据依然不稳定。检索质量复杂对比问题经常召回偏题内容关键信息缺失回答自然不可靠。我意识到传统 RAG 更像“语义匹配”缺少“关系理解”。所以我搭了这套多模态 GraphRAGMinerU 负责解析知识图谱建关系Agentic-RAG 做多跳推理。需求是什么一个完整的多模态知识库问答系统。支持多格式文档解析、知识图谱构建、向量检索、混合问答。多模态 GraphRAG 系统演示截图见文章末尾。系统设计的核心目标是前端保证交互体验后端保证可扩展与可观测数据层同时支撑语义检索与关系推理。下面进入具体架构。架构设计系统架构数据输入PDF、CSV、Docx 等多格式索引构建MinerU/OCR 解析 → LangExtract 抽取 → Chunk 切分 KG 建图 → VectorStore 与 Neo4j 双存问答Agent 并行查向量与图检索片段与问题拼成 Prompt大模型生成回答。数据流多源文档 → MinerU解析 → LangExtract抽取 → Neo4j/Milvus/MinIO存储 → 混合检索 → LangChain Agent → FastAPI → React。控制流Claude Code 贯穿编排 · Figma Make驱动前端 · Celery调度异步 · Redis缓存加速 · 可观测性全链路覆盖。要点双索引语义向量 图结构与 RAG 拼接兼顾多模态解析与 Graph RAG。分层架构多模态 GraphRAG 系统架构图从下至上分为五层各层技术栈及功能如下数据管道层最底层— 多源数据入口支持 PDF、HTML、Doc、Image 等多格式MinerU 负责文档解析与 OCR 处理LangExtract 进行实体、关系、事件、属性抽取最终将数据写入存储层存储层— Neo4j 构建知识图谱支持路径推理Milvus / pgvector 提供向量索引与语义召回能力MinIO / S3 用于文件分片管理Redis 用于缓存与会话管理编排层— LangChain Agent 实现工具调用与推理链路编排采用 ReAct 策略混合检索引擎融合 Keyword、Vector、Graph 三种检索方式Celery Redis 负责任务调度、异步队列与失败重试服务层— FastAPI 提供路由与中间件支持遵循 OpenAPI Spec 规范Auth 鉴权基于 Token 实现 RBAC 权限控制核心功能包括上传、解析、抽取、检索、问答 API前端层最顶层— Figma Make 用于原型生成与交互基线定义React SPA 负责页面渲染与状态管理支持 Mock → 真实 API 过渡端到端数据流向多模态 GraphRAG 的端到端数据流向从原始文档输入到最终前端展示的完整链路。经历以下步骤① 多源文档输入来源支持 PDF、Word、图片、网页等多种格式的文档作为系统的数据入口。② MinerU 多模态解析功能对输入的文档进行深度解析。细节包括版面分析Layout Analysis、表格识别、公式识别以及图片提取。③ LangExtract 智能提取功能从解析后的内容中提取关键信息。细节识别实体Entity、关系Relation、属性Attribute并将数据结构化。④ 图谱 向量双路存储数据在此处分为两路并行存储构建混合索引。左路结构化语义存入 Neo4j 知识图谱重点在于实体、关系以及图遍历能力。右路语义向量存入 Milvus 向量库重点在于嵌入Embedding和近似最近邻ANN搜索。⑤ LangChain 混合检索 QA结合了图谱遍历与向量召回最后进行重排Rerank生成高质量的问答结果。⑥ FastAPI 服务输出处理路由、鉴权、中间件逻辑以及异步任务处理将处理好的数据封装为 API 接口。⑦ React 前端渲染利用组件化代码进行最终的页面渲染。为什么这样设计先画图再填坑搭系统之前我做了个初稿文档进来 → OCR 解析 → 向量检索 → LLM 回答。跟市面上大多数 RAG 系统没区别。后来踩了坑才明白这套架构解决不了问答质量问题——向量检索本质上还是找最像的文本片段不懂实体不懂关系。所以我重新设计了架构加入了知识图谱这一层文档输入 → MinerU 多模态解析 → LangExtract 实体抽取 → Neo4j图数据库 Milvus向量库双存储 → LangChain Agent 混合检索 → FastAPI → React 前端三层存储的设计思路存储作用选型理由Neo4j知识图谱图遍历推理实体关系一目了然支持多跳查询Milvus向量库语义召回ANN 检索快适合海量embeddingMinIO文件对象存储PDF/图片原始文件分片管理一开始想过只搭 Neo4j后来发现实体抽取的文本片段也需要做语义检索单靠图数据库不够用。加了 Milvus 之后问答召回质量明显提升。编排层用 LangChain Agent最开始手写过一轮检索逻辑后来切到 LangChain 是因为工具调用链太长——查实体、查邻居、查路径、合并结果手写容易出 bug换工具调试成本太高。LangChain 的 ReAct 策略天然适合这种多工具协作的场景。为什么不直接用现成框架LangChain/LangGraph 搭过效果一般主要卡在文档解析和图谱构建这两个环节没有现成方案必须自己接 MinerU 和 LangExtract。与其绕远路不如直接从底层接。与传统 RAG 区别有朋友问这套方案跟普通 RAG 相比核心区别在哪直观对比传统 RAG多模态 GraphRAG检索方式语义向量匹配向量 知识图谱混合理解层次文本片段相似度实体关系推理多跳问答弱容易答偏强可做关系路径推导索引内容chunks 文本块实体 关系 原始文本适用场景简单问答需要推理的复杂问题最典型的例子是这个问题❝“这份技术方案里A 公司的产品相比 B 公司有什么优势”传统 RAG 召回的可能是两个产品各自的描述片段LLM 硬比出一段话不一定准确。但 GraphRAG 的做法是先找到 A 公司产品实体 → 找它的性能指标节点 → 再找 B 公司产品的对应指标 → 做节点级别的比较回答有据可查。这也是为什么我在实体抽取阶段要把关系类型抽准确——图谱里如果关系是性能优于还是价格低于直接决定回答方向。核心实现从 PDF 到智能问答的完整 pipeline整个系统分为三个串联的模块数据依次流经PDF 文件 ↓MinerU 云端解析 → content_list.json ↓text_assembler 格式转换 → 每页纯文本 .txt ↓LangExtract DeepSeek 实体抽取 → 实体 共现边 ↓kg_builder 图谱构建 → KGNode KGEdgeNeo4j / NetworkX ↓LangChain ReAct Agent 多跳问答 → 最终回答1. 文档解析MinerU 打通多模态解析是整个链路的第一个瓶颈。之前试过 pdfminer、PyMuPDF扫描件和表格都是硬伤。后来换成 MinerU云端 API 调用版面分析 表格识别 OCR 一套带走解析质量直接上一个台阶。(MinerU 也支持私有化部署)MinerU 的解析结果不能直拼喂给 LLM还需要一步 text_assembler 做格式转换。MinerU 云端 API 解析完成后会生成content_list.json描述文档每一页的每一个 block{ content_list: [ { page_number: 0, blocks: [ { type: title, content: GraphRAG: Graph-based Retrieval Augmented Generation }, { type: text, content: Large language models excel at natural language tasks... }, { type: table, content: | Method | R10 | MRR10 |\n| -- | -- | -- |, rows: 3, cols: 3 }, { type: image, content: , bbox: [0.1, 0.2, 0.5, 0.6] } ] } ]}type区分 title / text / table / image 四类 blocktext_assembler 据此做内容过滤和格式还原最终输出每页一个.txt文件供下游 LangExtract 使用def assemble_from_content_list(content_list_path: str, output_dir: str) - list[str]: with open(content_list_path, r, encodingutf-8) as f: data json.load(f) output_files [] for page in data[content_list]: page_text for block in page[blocks]: if block[type] text: page_text block[content].strip() \n\n elif block[type] table: # 表格转扁平文本保留行列结构 page_text flatten_table(block) \n\n elif block[type] title: # 标题加特殊标记便于下游识别文档结构 page_text f[TITLE] {block[content]} [/TITLE]\n\n output_path os.path.join(output_dir, fpage_{page[page_number]:04d}.txt) with open(output_path, w, encodingutf-8) as out: out.write(page_text.strip()) output_files.append(output_path) return output_files两个关键参数language指定文档主语言默认zh影响 OCR 准确率model选v2支持更多格式。实测中文文档解析速度约 3-5 秒/页OCR 识别率在 95% 以上。MinerU 支持的原始输入文件格式:支持格式清单格式扩展名说明PDF.pdf核心能力 — 文本型 / 扫描型 / 混合型均支持Word.doc ,.docx旧版和新版 Word 文档PowerPoint.ppt , .pptx旧版和新版演示文稿图片.png,.jpg,.jpeg单页图片文档支持 EXIF 方向自动校正HTML.html需指定MinerU-HTML模型版本输入限制约束项限制值单文件最大体积200 MB单文件最大页数600 页云端 API 每日免费额度2,000 页最高优先级超出部分降低优先级OCR 语言支持MinerU 内置 OCR 引擎支持109 种语言可通过language参数指定文档主语言默认zh中文。常用语言代码代码语言代码语言zh中文en英文ja日文ko韩文fr法文de德文2. 实体抽取LangExtract DeepSeekLangExtract 是一个面向 LLM 的结构化信息抽取框架你给它原文和抽取 schema它返回可直接落库的结构化结果实体、关系、属性。这里不用纯 prompt 正则是因为格式漂移后正则很容易失效schema 化输出在稳定性和可落库性上更可靠。text_assembler 输出的每页纯文本再送进 LangExtract DeepSeekdeepseek-v3-flash做实体抽取逐步转换成知识图谱。实体类型体系是踩过坑才定下来的。最开始只分了人名/机构名/地名三类技术文档一跑就傻眼了——“GraphRAG”、“Transformer” 这样的词全被归进地名明显不对。后来扩到五类类型说明示例TECHNOLOGY技术、框架、工具、算法GraphRAG, Transformer, PyTorchCONCEPT抽象概念、理论、方法论retrieval-augmented generationPERSON人名Yoshua BengioORGANIZATION机构、公司名Microsoft ResearchLOCATION地点San Francisco加了之后图谱密度从 0.3 升到 1.8问答召回也好多了。Prompt 设计也是反复调出来的。第一个版本只说抽取实体输出格式乱七八糟——同一个词在相邻两段里被标注成不同类型。后来加了 few-shot examples 才好Example:Input: GraphRAG uses knowledge graphs to enhance retrieval.Output: [{text:GraphRAG,type:TECHNOLOGY},{text:knowledge graphs,type:CONCEPT}]Example:Input: Retrieval-augmented generation combines retrieval with generation.Output: [{text:Retrieval-augmented generation,type:CONCEPT}]关系边的生成策略也换过一次。最初想让 LLM 输出一对一对的关系但不稳定——LLM 要么漏掉关系要么自己编不存在的关系。后来换了个思路只抽实体不抽关系同一页出现的任意两个实体自动生成一条CO_OCCURS_IN共现边。这是一个简化策略但足够实用——共现本身就隐含语义关联下游图检索可以通过共现边发现相关实体。extract_prompt 从以下文本中抽取实体和关系输出 JSON 格式文本{chunk_text}要求- 实体包含名称、类型TECHNOLOGY/CONCEPT/PERSON/ORGANIZATION/LOCATION、置信度- 关系包含源实体、目标实体、关系类型、证据文本- 只抽取高置信度内容低置信度忽略response deepseek.chat.completions.create( modeldeepseek-v4-flash, messages[{role: user, content: extract_prompt}])3. Agentic-RAG 问答LangChain Agent 做多跳推理这是最复杂的一块。问答不是「问一句答一句」那么简单实际问题是多跳的——比如这个方案为什么比竞品好需要① 先找到方案实体 → ② 找它的技术指标 → ③ 再找竞品对应指标 → ④ 做比较。LangChain Agent 在这里做检索编排ReAct 策略让 Agent 自己决定下一步该用什么工具# 核心工具集tools [ search_entities, # 按名称搜索实体返回匹配节点及其类型、页面信息 get_neighbors, # 获取节点的邻居节点hops 参数控制扩展度数 get_entities_by_type, # 按类型筛选所有实体TECHNOLOGY/CONCEPT/PERSON/ORGANIZATION/LOCATION describe_graph, # 获取图谱概览节点数、边数、类型分布]agent create_react_agent(llm, tools)result agent.invoke({question: question})以问题“GraphRAG 和传统 RAG 的核心区别是什么”为例Agent 的推理过程Step 1: search_entities(GraphRAG) → [GraphRAG: TECHNOLOGY, page0, degree39]Step 2: get_neighbors(graphrag-node-id, hops2) → [knowledge graphs: CONCEPT, retrieval-augmented generation: CONCEPT, Neo4j: TECHNOLOGY, Milvus: TECHNOLOGY]Step 3: get_entities_by_type(CONCEPT) → [retrieval-augmented generation, knowledge graphs, ...]Step 4: describe_graph() → Graph has 142 nodes, 780 edges, types: TECHNOLOGY(40), CONCEPT(68), ...综合以上信息Agent 推理生成回答。每轮问答平均调用 4-6 次工具实测延迟 8-15 秒取决于图谱规模和模型响应速度。回答质量比纯向量 RAG 高很多尤其在需要关系推理的问题上。效果跑起来什么样系统跑起来之后我用deepseek-v4.pdf58 页做了完整测试索引阶段文档解析约 4 分钟58 页含表格和图片实体抽取约 8 分钟2256 个节点132096 条边图谱规模TECHNOLOGY 269 个、CONCEPT 969 个、PERSON 940 个……问答阶段简单问题直接召回3-5 秒复杂多跳问题10-20 秒工具调用次数平均 4-6 次/问答效果最明显的是这类问题❝“列出文档里所有涉及 DeepSeek V4 的方案介绍并说明它们之间的关系”之前用传统 RAG 搜出来的是零散段落现在 GraphRAG 直接给你一张关系网络图实体类型、关联路径一目了然。系统展示首页文档管理上传文档后进入索引流程Dashboard 右下角会实时显示索引进度parsing → extracting → indexing等待完成即可。知识图谱索引完成后进入知识图谱页面可以看到文档中抽取的实体以力导向图形式展示点击节点可查看详情和邻居关系。智能问答在智能问答页面输入问题系统会调用 LangChain Agent 做多跳推理返回回答、工具调用链路和引用的实体节点。搜索支持按实体名称或类型搜索快速定位文档中的关键信息。实战步骤10 步搭完整系统这套系统从零到一落地全过程在 Claude Code 中完成。以下是每一步的核心产出和目标Step 1 · 确定知识图谱框架选定 LangExtract 作为实体抽取后端克隆源码并详细分析其输入输出规范生成langextract_specification.md明确 LangExtract 与文本模型、多模态模型、向量库/图数据库的交互方式。Step 2 · 确定解析模块选定 MinerU 作为文档解析引擎详细阅读官方 API 文档确认支持的输入格式和输出规范生成mineru_specification.md明确 MVP 测试所需配置和 API Token 获取方式。Step 3 · 建立 MinerU MVP 测试流程在mineru_mvp/下创建独立测试项目使用uv做环境隔离编写本地文件上传 → MinerU 云端解析 → 解析结果本地存储的完整 Pipeline验证端到端可用性。Step 4 · 构建 LangExtract MVP 流程在langextract_src/下创建独立测试项目同样使用uv隔离环境接入 DeepSeek APIdeepseek-v4-flash验证从模拟文本输入到结构化信息输出的完整链路生成langextract_specification-v1.0.md。Step 5 · MinerU 与 LangExtract 对接— 将 MinerU 的解析输出content_list.json接入 LangExtract 的文本输入打通本地 PDF → MinerU 解析 → LangExtract 抽取 → 知识图谱结构化数据的完整 Bridge Pipeline生成bridge_pipeline_specification-v1.0.md。Step 6 · 前端可视化基于 Bridge Pipeline 的输出数据规范设计并实现一个可交互的 Web 单页面支持上传 PDF、自动解析、查看抽取的实体数据以及知识图谱的 D3.js 力导向图展示。Step 7 · 构建 Agentic-RAG 问答流程接入 LangChain MCP 获取最新版本规范基于 Bridge Pipeline 的数据格式构建 LangChain Agent接入 LangChain 的 ReAct 策略和 4 个工具search_entities、get_neighbors、get_entities_by_type、describe_graph完成提问 → 多跳推理 → 生成回答的完整 MVP生成agentic_rag_specification-v1.0.md。Step 8 · 设计后端架构与产品原型通过 Plan 模式基于已生成的规范文档设计 FastAPI 后端架构25 个 API 端点同时规划 React 前端产品原型5 个页面生成backend_service_specification-v1.0.md和frontend_design_specification-v1.0.md最终输出标准 PRD 文档。Step 9 · 开始构建项目搭建项目规范CLAUDE.md将前后端代码分别放入frontend/和backend/目录.env文件管理所有外部配置并加入.gitignore后端使用uv创建独立虚拟环境基于规范文档生成完整的后端服务代码并完成接口测试。Step 10 · 前后端集成和联调编写各层 CLAUDE.md 说明启动命令将前端所有 Mock API 替换为真实后端接口逐个进行集成测试如遇接口未开发情形不自主扩展后端仅在前端页面打上未开发标识。❝完整的 Claude Code 提示词和源码有需要的可以私信我获取。技术选型开发与辅助工具Claude Code Cursor模型Minimax-M2.7核心架构前端ReactFigma Make后端FastAPI LangChain解析MinerU LangExtract存储Neo4j Milvus最后对于正在迷茫择业、想转行提升或是刚入门的程序员、编程小白来说有一个问题几乎人人都在问未来10年什么领域的职业发展潜力最大答案只有一个人工智能尤其是大模型方向当下人工智能行业正处于爆发式增长期其中大模型相关岗位更是供不应求薪资待遇直接拉满——字节跳动作为AI领域的头部玩家给硕士毕业的优质AI人才含大模型相关方向开出的月基础工资高达5万—6万元即便是非“人才计划”的普通应聘者月基础工资也能稳定在4万元左右。再看阿里、腾讯两大互联网大厂非“人才计划”的AI相关岗位应聘者月基础工资也约有3万元远超其他行业同资历岗位的薪资水平对于程序员、小白来说无疑是绝佳的转型和提升赛道。如果你还不知道从何开始我自己整理一套全网最全最细的大模型零基础教程我也是一路自学走过来的很清楚小白前期学习的痛楚你要是没有方向还没有好的资源根本学不到东西下面是我整理的大模型学习资源希望能帮到你。扫码免费领取全部内容最后1、大模型学习路线2、从0到进阶大模型学习视频教程从入门到进阶这里都有跟着老师学习事半功倍。3、 入门必看大模型学习书籍文档.pdf书面上的技术书籍确实太多了这些是我精选出来的还有很多不在图里4、AI大模型最新行业报告2026最新行业报告针对不同行业的现状、趋势、问题、机会等进行系统地调研和评估以了解哪些行业更适合引入大模型的技术和应用以及在哪些方面可以发挥大模型的优势。5、面试试题/经验【大厂 AI 岗位面经分享107 道】【AI 大模型面试真题102 道】【LLMs 面试真题97 道】6、大模型项目实战配套源码适用人群四阶段学习规划共90天可落地执行第一阶段10天初阶应用该阶段让大家对大模型 AI有一个最前沿的认识对大模型 AI 的理解超过 95% 的人可以在相关讨论时发表高级、不跟风、又接地气的见解别人只会和 AI 聊天而你能调教 AI并能用代码将大模型和业务衔接。大模型 AI 能干什么大模型是怎样获得「智能」的用好 AI 的核心心法大模型应用业务架构大模型应用技术架构代码示例向 GPT-3.5 灌入新知识提示工程的意义和核心思想Prompt 典型构成指令调优方法论思维链和思维树Prompt 攻击和防范…第二阶段30天高阶应用该阶段我们正式进入大模型 AI 进阶实战学习学会构造私有知识库扩展 AI 的能力。快速开发一个完整的基于 agent 对话机器人。掌握功能最强的大模型开发框架抓住最新的技术进展适合 Python 和 JavaScript 程序员。为什么要做 RAG搭建一个简单的 ChatPDF检索的基础概念什么是向量表示Embeddings向量数据库与向量检索基于向量检索的 RAG搭建 RAG 系统的扩展知识混合检索与 RAG-Fusion 简介向量模型本地部署…第三阶段30天模型训练恭喜你如果学到这里你基本可以找到一份大模型 AI相关的工作自己也能训练 GPT 了通过微调训练自己的垂直大模型能独立训练开源多模态大模型掌握更多技术方案。到此为止大概2个月的时间。你已经成为了一名“AI小子”。那么你还想往下探索吗为什么要做 RAG什么是模型什么是模型训练求解器 损失函数简介小实验2手写一个简单的神经网络并训练它什么是训练/预训练/微调/轻量化微调Transformer结构简介轻量化微调实验数据集的构建…第四阶段20天商业闭环对全球大模型从性能、吞吐量、成本等方面有一定的认知可以在云端和本地等多种环境下部署大模型找到适合自己的项目/创业方向做一名被 AI 武装的产品经理。硬件选型带你了解全球大模型使用国产大模型服务搭建 OpenAI 代理热身基于阿里云 PAI 部署 Stable Diffusion在本地计算机运行大模型大模型的私有化部署基于 vLLM 部署大模型案例如何优雅地在阿里云私有部署开源大模型部署一套开源 LLM 项目内容安全互联网信息服务算法备案…扫码免费领取全部内容3、这些资料真的有用吗这份资料由我和鲁为民博士(北京清华大学学士和美国加州理工学院博士)共同整理现任上海殷泊信息科技CEO其创立的MoPaaS云平台获Forrester全球’强劲表现者’认证服务航天科工、国家电网等1000企业以第一作者在IEEE Transactions发表论文50篇获NASA JPL火星探测系统强化学习专利等35项中美专利。本套AI大模型课程由清华大学-加州理工双料博士、吴文俊人工智能奖得主鲁为民教授领衔研发。资料内容涵盖了从入门到进阶的各类视频教程和实战项目无论你是小白还是有些技术基础的技术人员这份资料都绝对能帮助你提升薪资待遇转行大模型岗位。这份完整版的大模型 AI 学习资料已经上传CSDN朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】