DB-GPT 图数据文件解剖:以 graphrag-mini.md 为例理解 GraphRAG 知识图谱构建与检索链路
2026/9/14 9:31:42 网站建设 项目流程

DB-GPT 图数据文件解剖:以 graphrag-mini.md 为例理解 GraphRAG 知识图谱构建与检索链路

【免费下载链接】DB-GPTopen-source agentic AI data assistant for the next generation of AI + Data products.项目地址: https://gitcode.com/GitHub_Trending/db/DB-GPT

本篇技术指南以 DB-GPT 仓库中的测试数据文件 examples/test_files/graphrag-mini.md 为解剖样本,完整讲解它作为 GraphRAG 测试语料的数据结构设计、与真实知识库文档 examples/test_files/graphrag-test.md 的关系,以及它在知识图谱构建、社区摘要(Community Summary)和多模态检索中的实际作用。读完本文,你将掌握 DB-GPT 中 Markdown 知识图谱数据文件应如何组织,理解 TuGraph 图存储上"三元组图谱 + 文档结构图"双图构建与检索的完整链路,并能够直接运行仓库自带的 GraphRAG 端到端示例进行验证。

一、graphrag-mini.md 是什么:GraphRAG 的"最小可运行语料"

在 DB-GPT 中,examples/test_files/graphrag-mini.md 并不是普通的产品文档,而是一份经过刻意设计的GraphRAG 测试数据集。它被 examples/rag/graph_rag_example.py 两个测试用例直接引用为知识来源:

@pytest.mark.asyncio async def test_naive_graph_rag(): await __run_graph_rag( knowledge_file="examples/test_files/graphrag-mini.md", chunk_strategy="CHUNK_BY_SIZE", knowledge_graph=__create_naive_kg_connector(), question="What's the relationship between TuGraph and DB-GPT ?", ) @pytest.mark.asyncio async def test_community_graph_rag(): await __run_graph_rag( knowledge_file="examples/test_files/graphrag-mini.md", chunk_strategy="CHUNK_BY_MARKDOWN_HEADER", knowledge_graph=__create_community_kg_connector(), question="What's the relationship between TuGraph and DB-GPT ?", )

注意上面两个用例刻意使用了两种不同的分块策略

  • CHUNK_BY_SIZE:按固定大小切块,适合朴素知识图谱(BuiltinKnowledgeGraph)的测试;
  • CHUNK_BY_MARKDOWN_HEADER:按 Markdown 标题层级切块,这是社区摘要知识图谱(CommunitySummaryKnowledgeGraph)的推荐方式。

从源码结构看,这份文件是"完整版"图数据文件 examples/test_files/graphrag-test.md 的精简子集,其内容可以拆成三块(下文逐块剖析)。

二、解析语料结构:三元组、图谱文本与项目简介

2.1 用"可解析三元组"表达图结构

graphrag-mini.md的开头部分采用了一组结构化三元组行来编码图谱,例如:

Entities: (TuGraph-family/tugraph-db#github_repo) (vesoft-inc/nebula#github_repo) (PaddlePaddle/Paddle#github_repo) ... Relationships: (TuGraph-family/tugraph-db#common_developer#vesoft-inc/nebula#common_developer count 10) (eosphoros-ai/DB-GPT#belong_to#eosphoros-ai#belong_to)

这种(主体, 谓词, 客体)的元组表达法,恰好与 DB-GPT 三元组抽取器的输出格式完全对齐。查看三元组抽取的实现 packages/dbgpt-ext/src/dbgpt_ext/rag/transformer/triplet_extractor.py,其中 Prompt 明确要求 LLM 以(subject, predicate, object)的形式输出,解析时通过正则r"\((.*?)\)"提取每行括号内容、再按逗号切分为三个字段:

for line in text.split("\n"): for match in re.findall(r"\((.*?)\)", line): splits = match.split(",") parts = [split.strip() for split in splits if split.strip()] if len(parts) == 3: parts = [p.strip("`~!@#$%^&*()-=+[]\\{}|;':\",./<>?·!¥&*()—【】、「」;‘’:“”,。、《》?") for p in parts] triplets.append(tuple(parts))

也就是说,examples/test_files/graphrag-mini.md 中手写的三元组与TripletExtractor生成的图谱采用同一种数据契约,这保证了语料即使被重新分块、重新抽取,也能稳定地回填进图数据库。

2.2 语料中的语义关系解读

文件中出现的谓词具有明确的语义:

谓词语义示例
common_developer两个项目共享开发者,count 表示共同开发者数量(TuGraph-family/tugraph-db#common_developer#eosphoros-ai/DB-GPT#common_developer count 6)
belong_to项目归属某组织(eosphoros-ai/DB-GPT#belong_to#eosphoros-ai#belong_to)
github_repo/github_organization实体类型标注(apache/brpc#github_repo)
Star/PR/push/open_pr/code_review社区与贡献关系(完整版中)(China#Star#eosphoros-ai/DB-GPT#Star count 1612)

这些关系正是 TuGraph 生态图谱分析工具 OSGraph 的输出格式。可以看出graphrag-mini.md直接继承了 graphrag-test.md 中DB-GPT 项目生态图谱TuGraph DB 项目生态图谱两个小节的数据。

2.3 图谱文本段:供社区摘要的实体-关系叙述

graphrag-mini.md的后半部分还有两段纯文本段落:"# TuGraph简介" 与 "# DB-GPT简介",例如:

TuGraph图数据库由蚂蚁集团与清华大学联合研发,构建了一套包含图存储、图计算、图学习、图研发平台的完善的图技术体系…… DB-GPT是一个开源的AI原生数据应用开发框架(AI Native Data App Development framework with AWEL(Agentic Workflow Expression Language) and Agents)。目的是构建大模型领域的基础设施……

这两段既是给 LLM 做实体-关系抽取的原始素材,也是 GraphRAG 中"社区摘要(Community Summary)"机制的天然支撑——这正是test_community_graph_rag使用CHUNK_BY_MARKDOWN_HEADER的原因:以#标题为界切出的 chunk 天然对应"TuGraph 简介 / DB-GPT 简介"这样的语义单元。

三、GraphRAG 数据构建链路:从文件到图数据库

3.1 读取与分块:Markdown 加载器

文件通过KnowledgeFactory.from_file_path()加载,命中 Markdown 知识类 packages/dbgpt-ext/src/dbgpt_ext/rag/knowledge/markdown.py:

def support_chunk_strategy(cls) -> List[ChunkStrategy]: return [ ChunkStrategy.CHUNK_BY_SIZE, ChunkStrategy.CHUNK_BY_MARKDOWN_HEADER, ChunkStrategy.CHUNK_BY_SEPARATOR, ] @classmethod def default_chunk_strategy(cls) -> ChunkStrategy: return ChunkStrategy.CHUNK_BY_MARKDOWN_HEADER

分块策略的枚举定义位于 packages/dbgpt-core/src/dbgpt/rag/knowledge/base.py:CHUNK_BY_SIZE默认chunk_size=512chunk_overlap=50,使用递归字符切分器;CHUNK_BY_MARKDOWN_HEADER使用MarkdownHeaderTextSplitter,会保留标题层级信息写入 chunk 的 metadata(形如{"Header0": ..., "Header1": ..., "source": ...}),这正是后续文档结构图得以构建的基础。

3.2 双图构建:三元组图谱 + 文档结构图

加载入口位于 examples/rag/graph_rag_example.py 的__run_graph_rag,通过EmbeddingAssembler.aload_from_knowledge(index_store=knowledge_graph, retrieve_strategy=RetrieverStrategy.GRAPH)触发图索引。

社区摘要知识图谱的实现 packages/dbgpt-ext/src/dbgpt_ext/storage/knowledge_graph/community_summary.py 中,aload_document依次执行三步:

async def aload_document(self, chunks, file_id=None): if not self.vector_name_exists(): self._graph_store_adapter.create_graph(self._graph_name) await self._aload_document_graph(chunks) # ① 文档结构图 await self._aload_triplet_graph(chunks, file_id) # ② 三元组图谱 await self._community_store.build_communities( batch_size=self._community_summary_batch_size ) # ③ 社区摘要 return [chunk.chunk_id for chunk in chunks]

① 文档结构图(Document Structure Graph)_aload_document_graph利用 chunk metadata 中的标题层级,为每个 chunk 建立父子关系(document -> include -> chunkchunk -> include -> chunk)以及顺序关系(chunk -> next -> chunk)。它构建了"文档"与"原始文本片段"之间的可追溯结构,使得 GraphRAG 回答问题时能够引用原文。这部分逻辑在_load_chunks中通过比对相邻 chunk 的Header0/Header1/...元数据链完成。

② 三元组图谱(Triplets Graph)_aload_triplet_graph调用GraphExtractor.batch_extract(),由 LLM 从每个 chunk 中抽取(subject, predicate, object)三元组并写入 TuGraph;若开启了相似度检索(enable_similarity_search),还会对三元组做向量化并随图存储。当文档结构图启用时,每条边会附加_chunk_id属性,同时建立chunk -> include -> entity关联——这就是"图谱节点可回指原文"的实现细节。

③ 社区摘要(Community Summary)CommunitySummarizer对图进行社区发现,将关系紧密的实体子图聚合成社区,并为每个社区生成摘要存入向量库(Chroma),用于回答"全局性问题"(global search)。

3.3 朴素 vs 社区摘要:两种图连接器

示例中出现了两类图连接器(KG connector):

  • BuiltinKnowledgeGraph(朴素版):仅做关键词抽取 + 三元组抽取 + 图搜索,见 packages/dbgpt-ext/src/dbgpt_ext/storage/knowledge_graph/knowledge_graph.py。其检索逻辑asimilar_search_with_scores先由KeywordExtractor抽取关键词,再用explore_trigraph扩展子图,最终把子图文本拼进 Prompt。
  • CommunitySummaryKnowledgeGraph(社区摘要版):继承朴素版并叠加文档结构图、社区摘要、向量相似度、Text2GQL 等能力。两者的区别正是示例中两个测试用例分别对应"朴素 GraphRAG"与"社区 GraphRAG"的原因。

四、检索与问答链路:图检索器的工作方式

图检索器实现于 packages/dbgpt-ext/src/dbgpt_ext/rag/retriever/graph_retriever/graph_retriever.py,GraphRetriever.retrieve()的调度逻辑如下:

  1. 若开启文本搜索(TEXT_SEARCH_ENABLED),先尝试由TextBasedGraphRetriever生成图查询语句(Text2GQL);
  2. 抽取用户问题的关键词(KeywordExtractor);
  3. 依据是否开启向量相似度检索(SIMILARITY_SEARCH_ENABLED),决定用KeywordBasedGraphRetriever(关键词子图扩展)还是VectorBasedGraphRetriever(向量召回);
  4. 三元组子图命中后,再用DocumentGraphRetriever从文档结构图回捞对应的原始文本 chunk,保证答案"有出处";
  5. 社区摘要与图谱结果最终由HYBRID_SEARCH_PT模板拼装成上下文,交给 LLM 生成带引用依据的回答。

在该 Prompt 模板(见 community_summary.py 的HYBRID_SEARCH_PT)中,明确要求模型区分[Context](社区摘要)、[Knowledge Graph](三元组子图)、[Original Text From RAG](文档结构图回捞的原文)三类信息源,这正是 GraphRAG 相比纯向量 RAG 在可解释性与可溯源上的核心差异。

五、端到端运行验证:如何使用这份语料

5.1 环境准备

参考官方图谱应用手册 docs/docs/cookbook/rag/graph_rag_app_develop.md(中文版位于 docs/i18n/zh-CN/docusaurus-plugin-content-docs/current/cookbook/rag/graph_rag_app_develop.md):

  1. 安装依赖(--extra "graph_rag"等扩展);
  2. 启动 TuGraph(Bolt 默认端口 7687):拉取tugraph/tugraph-runtime-centos7(版本 ≥ 4.5.1)镜像并运行容器;
  3. 配置 LLM(示例使用gpt-4o-mini,通过OPENAI_API_KEY环境变量注入)。

5.2 配置 TuGraph 连接

.env中配置(对应示例文件头部的注释说明):

GRAPH_STORE_TYPE=TuGraph TUGRAPH_HOST=127.0.0.1 TUGRAPH_PORT=7687 TUGRAPH_USERNAME=admin TUGRAPH_PASSWORD=73@TuGraph GRAPH_COMMUNITY_SUMMARY_ENABLED=True TRIPLET_GRAPH_ENABLED=True DOCUMENT_GRAPH_ENABLED=True KNOWLEDGE_GRAPH_CHUNK_SEARCH_TOP_SIZE=5 KNOWLEDGE_GRAPH_EXTRACTION_BATCH_SIZE=20 COMMUNITY_SUMMARY_BATCH_SIZE=20

这些环境变量的读取逻辑可以直接在 community_summary.py 与 graph_retriever.py 中找到印证。若需开启向量相似度检索,可追加:

SIMILARITY_SEARCH_ENABLED=True KNOWLEDGE_GRAPH_EMBEDDING_BATCH_SIZE=20 KNOWLEDGE_GRAPH_SIMILARITY_SEARCH_TOP_SIZE=5 KNOWLEDGE_GRAPH_SIMILARITY_SEARCH_RECALL_SCORE=0.3

5.3 运行示例

pytest -s examples/rag/graph_rag_example.py

运行后会依次执行test_naive_graph_ragtest_community_graph_rag,两者均以graphrag-mini.md为知识源,并向 LLM 提问:

What's the relationship between TuGraph and DB-GPT ?

回答会基于从 TuGraph 中检索到的三元组子图(例如(TuGraph-family/tugraph-db)-[common_developer]->(eosphoros-ai/DB-GPT))生成,从而直接验证这份语料中编码的"TuGraph 与 DB-GPT 存在共同开发者与生态关联"这一核心事实。

5.4 在 Web 界面上使用

完整版语料 examples/test_files/graphrag-test.md 同时被官方文档用作 Web 端 GraphRAG 演示数据:在知识库界面选择"知识图谱(Knowledge Graph)"类型创建知识库、上传该 Markdown 文件,系统默认按 Markdown 标题自动切块并建图,随后即可在聊天页面对图谱发起全局(global)或局部(local)检索问答。文档中给出的索引性能对比显示,DB-GPT 的 GraphRAG 管线在相同输入下(42631 个 Doc Tokens)可产出 734 节点 / 1064 边的三元组图谱与 76 节点 / 1090 边的文档结构图,并附有与 Microsoft GraphRAG 的索引耗时与 Token 消耗对照——这些数据来自官方手册记录,可作为评估参考,具体表现随模型与环境而异。

六、进阶:从 mini 到完整语料

理解 graphrag-mini.md 之后,建议进一步研读完整版 graphrag-test.md。两者关系如下:

维度graphrag-mini.mdgraphrag-test.md
定位最小可运行测试语料Web 演示 / 性能测试完整语料
三元组图谱仅"项目生态图谱"两类(DB-GPT、TuGraph DB)增加社区图谱、贡献图谱,及 TuGraph Analytics、RocksDB、Apache Flink 等多项目数据
文本段TuGraph / DB-GPT 两段简介增加 TuGraph DB 特性、编译安装、OSGraph、ChatTuGraph 等完整介绍
适用场景pytest单元级验证全局搜索 / 局部搜索 / 索引与查询性能测试

完整版中(China#Star#eosphoros-ai/DB-GPT#Star count 1612)这类社区关系数据,让"社区贡献对比"类全局问题(例如官方文档中的"DB-GPT社区和TuGraph社区在社区贡献、社区生态、开发者的这几个方面的联系和区别分别是什么?")能够通过社区摘要 + 子图检索得到有据可查的回答,这也正是 GraphRAG 全局检索与局部检索两种模式的典型演练场景。

结语

examples/test_files/graphrag-mini.md 用最小的篇幅覆盖了 DB-GPT GraphRAG 的完整数据契约:手写三元组 ↔ LLM 抽取三元组、Markdown 标题层级 ↔ 文档结构图、生态图谱文本 ↔ 社区摘要。它既是 examples/rag/graph_rag_example.py 的回归测试语料,也是理解"三元组图谱 + 文档结构图 + 社区摘要"三支柱架构的最佳入门样本。开发者可以从它出发,参考 docs/docs/cookbook/rag/graph_rag_app_develop.md 将其替换为自己的领域数据,快速搭建具备可溯源、可解释能力的企业级知识图谱问答应用。

【免费下载链接】DB-GPTopen-source agentic AI data assistant for the next generation of AI + Data products.项目地址: https://gitcode.com/GitHub_Trending/db/DB-GPT

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询