


朴素GraphRAG

朴素的GraphRAG链路
社区摘要增强链路
2.1文本块记忆

async defextract(self, text: str, limit: Optional[int] = None)->List:
# load similar chunks
chunks =await self._chunk_history.asimilar_search_with_scores(
text, self._topk, self._score_threshold
)
history =[
f"Section {i + 1}:\n{chunk.content}"for i, chunk inenumerate(chunks)
]
context ="\n".join(history)if history else""
try:
# extract with chunk history
returnawaitsuper()._extract(text, context, limit)
finally:
# save chunk to history
await self._chunk_history.aload_document_with_limit(
[Chunk(content=text, metadata={"relevant_cnt":len(history)})],
self._max_chunks_once_load,
self._max_threads,
)
## 角色
你是一个知识图谱工程专家,非常擅长从文本中精确抽取知识图谱的实体(主体、客体)和关系,并能对实体和关系的含义做出恰当的总结性描述。
## 技能
### 技能 1: 实体抽取
--请按照如下步骤抽取实体--
1. 准确地识别文本中的实体信息,一般是名词、代词等。
2. 准确地识别实体的修饰性描述,一般作为定语对实体特征做补充。
3. 对相同概念的实体(同义词、别称、代指),请合并为单一简洁的实体名,并合并它们的描述信息。
4. 对合并后的实体描述信息做简洁、恰当、连贯的总结。
### 技能 2: 关系抽取
--请按照如下步骤抽取关系--
1. 准确地识别文本中实体之间的关联信息,一般是动词、代词等。
2. 准确地识别关系的修饰性描述,一般作为状语对关系特征做补充。
3. 对相同概念的关系(同义词、别称、代指),请合并为单一简洁的关系名,并合并它们的描述信息。
4. 对合并后的关系描述信息做简洁、恰当、连贯的总结。
### 技能 3: 关联上下文
- 关联上下文来自与当前待抽取文本相关的前置段落内容,可以为知识抽取提供信息补充。
- 合理利用提供的上下文信息,知识抽取过程中出现的内容引用可能来自关联上下文。
- 不要对关联上下文的内容做知识抽取,而仅作为关联信息参考。
- 关联上下文是可选信息,可能为空。
## 约束条件- 如果文本已提供了图结构格式的数据,直接转换为输出格式返回,不要修改实体或ID名称。-尽可能多的生成文本中提及的实体和关系信息,但不要随意创造不存在的实体和关系。
- 确保以第三人称书写,从客观角度描述实体名称、关系名称,以及他们的总结性描述。
- 尽可能多地使用关联上下文中的信息丰富实体和关系的内容,这非常重要。
- 如果实体或关系的总结描述为空,不提供总结描述信息,不要生成无关的描述信息。
- 如果提供的描述信息相互矛盾,请解决矛盾并提供一个单一、连贯的描述。-实体和关系的名称或者描述文本出现#和:字符时,使用'_'字符替换,其他字符不要修改。-避免使用停用词和过于常见的词汇。## 输出格式
Entities:
(实体名#实体总结)
...
Relationships:
(来源实体名#关系名#目标实体名#关系总结)
...## 参考案例
--案例仅帮助你理解提示词的输入和输出格式,请不要在答案中使用它们。--
输入:
```
[上下文]:
Section 1:
菲尔・贾伯的大儿子叫雅各布・贾伯。
Section 2:
菲尔・贾伯的小儿子叫比尔・贾伯。
...
[文本]:
菲尔兹咖啡由菲尔・贾伯于1978年在加利福尼亚州伯克利创立。因其独特的混合咖啡而闻名,菲尔兹已扩展到美国多地。他的大儿子于2005年成为首席执行官,并带领公司实现了显著增长。
```
输出:
```
Entities:
(菲尔・贾伯#菲尔兹咖啡创始人)
(菲尔兹咖啡#加利福尼亚州伯克利创立的咖啡品牌)
(雅各布・贾伯#菲尔・贾伯的大儿子)
(美国多地#菲尔兹咖啡的扩展地区)
Relationships:
(菲尔・贾伯#创建#菲尔兹咖啡#1978年在加利福尼亚州伯克利创立)
(菲尔兹咖啡#位于#加利福尼亚州伯克利#菲尔兹咖啡的创立地点)
(菲尔・贾伯#拥有#雅各布・贾伯#菲尔・贾伯的大儿子)
(雅各布・贾伯#管理#菲尔兹咖啡#在2005年担任首席执行官)
(菲尔兹咖啡#扩展至#美国多地#菲尔兹咖啡的扩展范围)
```
----
请根据接下来[上下文]提供的信息,按照上述要求,抽取[文本]中的实体和关系数据。
[上下文]:
{history}
[文本]:
{text}
[结果]:
图社区发现与总结
async defbuild_communities(self):
# discover communities
community_ids =await self._community_store_adapter.discover_communities()
# summarize communities
communities =[]
for community_id in community_ids:
community =await self._community_store_adapter.get_community(community_id)
graph = community.data.format()
ifnot graph:
break
community.summary =await self._community_summarizer.summarize(graph=graph)
communities.append(community)
logger.info(
f"Summarize community {community_id}: "f"{community.summary[:50]}..."
)
# truncate then save new summaries
await self._meta_store.truncate()
await self._meta_store.save(communities)
## 角色
你非常擅长知识图谱的信息总结,能根据给定的知识图谱中的实体和关系的名称以及描述信息,全面、恰当地对知识图谱子图信息做出总结性描述,并且不会丢失关键的信息。
## 技能
### 技能 1: 实体识别
- 准确地识别[Entities:]章节中的实体信息,包括实体名、实体描述信息。
- 实体信息的一般格式有:
(实体名)
(实体名:实体描述)
(实体名:实体属性表)
### 技能 2: 关系识别
- 准确地识别[Relationships:]章节中的关系信息,包括来源实体名、关系名、目标实体名、关系描述信息,实体名也可能是文档ID、目录ID、文本块ID。
- 关系信息的一般格式有:
(来源实体名)-[关系名]->(目标实体名)
(来源实体名)-[关系名:关系描述]->(目标实体名)
(来源实体名)-[关系名:关系属性表]->(目标实体名)
### 技能 3: 图结构理解
--请按照如下步骤理解图结构--
1. 正确地将关系信息中的来源实体名与实体信息关联。
2. 正确地将关系信息中的目标实体名与实体信息关联。
3. 根据提供的关系信息还原出图结构。
### 技能 4: 知识图谱总结
--请按照如下步骤总结知识图谱--
1. 确定知识图谱表达的主题或话题,突出关键实体和关系。
2. 使用准确、恰当、简洁的语言总结图结构表达的信息,不要生成与图结构中无关的信息。
## 约束条件
- 不要在答案中描述你的思考过程,直接给出用户问题的答案,不要生成无关信息。
- 确保以第三人称书写,从客观角度对知识图谱表达的信息进行总结性描述。
- 如果实体或关系的描述信息为空,对最终的总结信息没有贡献,不要生成无关信息。
- 如果提供的描述信息相互矛盾,请解决矛盾并提供一个单一、连贯的描述。
- 避免使用停用词和过于常见的词汇。
## 参考案例
--案例仅帮助你理解提示词的输入和输出格式,请不要在答案中使用它们。--
输入:
```Entities:
(菲尔・贾伯#菲尔兹咖啡创始人)
(菲尔兹咖啡#加利福尼亚州伯克利创立的咖啡品牌)
(雅各布・贾伯#菲尔・贾伯的儿子)
(美国多地#菲尔兹咖啡的扩展地区)
Relationships:
(菲尔・贾伯#创建#菲尔兹咖啡#1978年在加利福尼亚州伯克利创立)
(菲尔兹咖啡#位于#加利福尼亚州伯克利#菲尔兹咖啡的创立地点)
(菲尔・贾伯#拥有#雅各布・贾伯#菲尔・贾伯的儿子)
(雅各布・贾伯#担任#首席执行官#在2005年成为菲尔兹咖啡的首席执行官)
(菲尔兹咖啡#扩展至#美国多地#菲尔兹咖啡的扩展范围)
```
输出:
```
菲尔兹咖啡是由菲尔・贾伯在1978年于加利福尼亚州伯克利创立的咖啡品牌。菲尔・贾伯的儿子雅各布・贾伯在2005年接任首席执行官,领导公司扩展到了美国多地,进一步巩固了菲尔兹咖啡作为加利福尼亚州伯克利创立的咖啡品牌的市场地位。
```
----
请根据接下来[知识图谱]提供的信息,按照上述要求,总结知识图谱表达的信息。
[知识图谱]:
{graph}
[总结]:

async defasimilar_search_with_scores(
self,
text,
topk,
score_threshold: float,
filters: Optional[MetadataFilters] = None,
)->List[Chunk]:
# global search: retrieve relevant community summaries
communities =await self._community_store.search_communities(text)
summaries =[
f"Section {i + 1}:\n{community.summary}"
for i, community inenumerate(communities)
]
context ="\n".join(summaries)if summaries else""
# local search: extract keywords and explore subgraph
keywords =await self._keyword_extractor.extract(text)
subgraph = self._graph_store.explore(keywords, limit=topk).format()
logger.info(f"Search subgraph from {len(keywords)} keywords")
ifnot summaries andnot subgraph:
return[]
# merge search results into context
content = HYBRID_SEARCH_PT_CN.format(context=context, graph=subgraph)
return[Chunk(content=content)]
## 角色
你非常擅长结合提示词模板提供的[上下文]信息与[知识图谱]信息,准确恰当地回答用户的问题,并保证不会输出与上下文和知识图谱无关的信息。
## 技能
### 技能 1: 上下文理解
- 准确地理解[上下文]提供的信息,上下文信息可能被拆分为多个章节。
- 上下文的每个章节内容都会以[Section]开始,并按需进行了编号。
- 上下文信息提供了与用户问题相关度最高的总结性描述,请合理使用它们。
### 技能 2: 知识图谱理解
- 准确地识别[知识图谱]中提供的[Entities:]章节中的实体信息和[Relationships:]章节中的关系信息,实体和关系信息的一般格式为:
```* 实体信息格式:-(实体名)-(实体名:实体描述)-(实体名:实体属性表)
* 关系信息的格式:-(来源实体名)-[关系名]->(目标实体名)-(来源实体名)-[关系名:关系描述]->(目标实体名)-(来源实体名)-[关系名:关系属性表]->(目标实体名)
```
- 正确地将关系信息中的实体名/ID与实体信息关联,还原出图结构。
- 将图结构所表达的信息作为用户提问的明细上下文,辅助生成更好的答案。
## 约束条件
- 不要在答案中描述你的思考过程,直接给出用户问题的答案,不要生成无关信息。
- 若[知识图谱]没有提供信息,此时应根据[上下文]提供的信息回答问题。
- 确保以第三人称书写,从客观角度结合[上下文]和[知识图谱]表达的信息回答问题。
- 若提供的信息相互矛盾,请解决矛盾并提供一个单一、连贯的描述。
- 避免使用停用词和过于常见的词汇。
## 参考案例```
[上下文]:
Section 1:
菲尔・贾伯的大儿子叫雅各布・贾伯。
Section 2:
菲尔・贾伯的小儿子叫比尔・贾伯。
[知识图谱]:
Entities:
(菲尔・贾伯#菲尔兹咖啡创始人)
(菲尔兹咖啡#加利福尼亚州伯克利创立的咖啡品牌)
(雅各布・贾伯#菲尔・贾伯的儿子)
(美国多地#菲尔兹咖啡的扩展地区)
Relationships:
(菲尔・贾伯#创建#菲尔兹咖啡#1978年在加利福尼亚州伯克利创立)
(菲尔兹咖啡#位于#加利福尼亚州伯克利#菲尔兹咖啡的创立地点)
(菲尔・贾伯#拥有#雅各布・贾伯#菲尔・贾伯的儿子)
(雅各布・贾伯#担任#首席执行官#在2005年成为菲尔兹咖啡的首席执行官)
(菲尔兹咖啡#扩展至#美国多地#菲尔兹咖啡的扩展范围)
```
----
接下来的[上下文]和[知识图谱]的信息,可以帮助你回答更好地用户的问题。
[上下文]:
{context}
[知识图谱]:
{graph}
体验与测试
3.1环境初始化
docker pull tugraph/tugraph-runtime-centos7:4.3.2
docker run -d -p 7070:7070 -p 7687:7687 -p 9090:9090 --name tugraph tugraph/tugraph-runtime-centos7:4.3.2 lgraph_server -d run --enable_plugin true

上传文档

3.3知识库问答

3.4性能测试

4.1引入文档结构
一般的GraphRAG链路在处理语料时,首先将文档拆分为文本块,并抽取每块文本的实体和关系信息。然而这种处理方式会导致实体与文档结构之间的关联信息丢失。文档结构本身蕴含了重要的层级关系,可以为知识图谱检索提供重要的上下文信息。另外,保留文档结构有助于数据的溯源,为问题答案提供更为可靠的依据。

带文档结构的知识图谱
另外,如果需要进一步细化知识图谱中的数据来源粒度,需要在关系上保留具体的来源文档ID和文本块ID。检索阶段时,可以将知识图谱子图中关系边涉及到的文档和文本块详情一并提供给LLM上下文,避免知识抽取过程导致的文档细节内容丢失的问题。
4.2改进知识抽取
除了在之前文档提到的借助于专有的知识抽取微调模型,让特定领域的知识抽取更加高效(比如OneKE[16])。借助于智能体引入记忆和反思机制,可以进一步提升知识抽取的准确性。比如AgentRE[17]框架可以解决在复杂场景中关系抽取面临的关系类型多样、实体间关系模糊等问题。

4.3使用高维图特征
受限于LLM本身对图结构的理解能力,直接基于抽取后知识图谱做问答并不一定能获得可靠的答案。为了让知识图谱的数据可以更好地被LLM所理解,借助于图计算领域的技术,为知识图谱赋予更多样化的高维图特征,协助LLM理解图谱数据,进一步改善问答质量。相比于LLM,图算法在性能和可靠性上有明显优势。
具体的手段包括但不仅限于:
二跳图特征:最直接的图特征计算方式,提供节点的邻居信息,如节点公共邻居、邻居聚合指标等。
路径特征:借助于图上路径算法,描述节点间的连通特征,如最短路径、DFS/BFS、随机游走等。
社区特征:聚合相似节点集合,描述节点间的同质特征,进一步提供社区摘要,如LPA、Louvain、Leiden等。
重要性特征:描述节点的重要程度,辅助提取关键信息,如PageRank、节点聚集系数等。
4.4增强存储格式
前边提到,融合索引可以作为改进QFS问答质量的一种技术选型。融合索引已逐步成为数据库和大数据产品的重要技术发展路线,它可以有效地打通大数据和大模型领域,基于一套数据存储,提供多样化的查询分析支持。
主流的索引格式包括但不限于:
表索引:提供传统的关系型数据查询与分析能力,实现基于表数据的过滤、分析、聚合等能力。
图索引:提供关联数据分析能力以及图迭代算法,实现基于图数据的高维分析与洞察。
向量索引:提供向量化存储与相似性查询能力,扩展数据检索的多样性。
全文索引:提供基于关键词的文档查询能力,扩展数据检索的多样性。
其他:例如多模态数据的索引,如图片、音频、视频等。
4.5自然语言查询
基于自然语言查询中关键词的知识图谱召回,只能做粗粒度的检索,无法精确地利用查询文本中的条件、聚合维度等信息做精确检索,也无法回答不包含具体关键词的泛化查询问题,因此正确地理解用户问题意图,并生成准确的图查询语句就十分有必要。而对用户问题的意图识别和图查询生成,最终都离不开智能体解决方案。大多数情况下,我们需要结合对话的环境和上下文信息,甚至需要调用外部工具,执行多步推理,以辅助决策生成最理想的图查询语句。
TuGraph当前在DB-GPT-Hub[18]项目中提供了完整的Text2GQL[19]解决方案,其中GQL(tugraph-analytics)语料以及Cypher(tugraph-db)语料在CodeLlama-7b-instruct模型上微调后,文本相似度及语法正确性准确率达到 92% 以上,后续这块能力会逐步集成到GraphRAG框架中。
Language | Dataset | Model | Method | Similarity | Grammar |
base | 0.769 | 0.703 | |||
Cypher (tugraph-db)[20] | TuGraph-DB Cypher数据集[21] | CodeLlama-7b-Cypher-hf[22] | lora | 0.928 | 0.946 |
base | 0.493 | 0.002 | |||
GQL(tugraph-analytics)[23] | TuGraph-Analytics GQL数据集[24] | CodeLlama-7b-GQL-hf[25] | lora | 0.935 | 0.984 |

当下GraphRAG的研究和产业实践仍在持续迭代和探索中,自LlamaIndex发布第一版GraphRAG之后,蚂蚁、微软、Neo4j等厂商,以及大量的AI智能体框架产品都在跟进支持。使用社区摘要增强GraphRAG只是一个起点,我们希望从这里开始,联合社区开发者、科研团队、内部业务以及外部企业共同探索图计算与大模型的结合技术和应用场景,期待与您的合作与共建。
参考资料
1. DB-GPT v0.5.6:https://github.com/eosphoros-ai/DB-GPT/releases/tag/v0.5.6
2. 微软GraphRAG:https://github.com/microsoft/graphrag
3. DB-GPT v0.6.0:https://github.com/eosphoros-ai/DB-GPT/releases/tag/v0.6.0
4. HybridRAG:https://arxiv.org/abs/2408.04948
5. Neo4jVector:https://neo4j.com/docs/cypher-manual/current/indexes/semantic-indexes/vector-indexes/
6. TuGraph DB版本:https://github.com/TuGraph-family/tugraph-db/releases
7. Mem0:https://github.com/mem0ai/mem0
8. LPA:https://en.wikipedia.org/wiki/Label_propagation_algorithm
9. Louvain:https://arxiv.org/abs/0803.0476
10. Leiden:https://arxiv.org/abs/1810.08473
11. PageRank:https://arxiv.org/abs/1407.5107
12. GraphRAG用户手册:http://docs.dbgpt.cn/docs/cookbook/rag/graph_rag_app_develop/
13. DB-GPT快速开始:https://www.yuque.com/eosphoros/dbgpt-docs/ew0kf1plm0bru2ga
14. TuGraph镜像:https://hub.docker.com/r/tugraph/tugraph-runtime-centos7/tags
15. AntV G6:https://github.com/antvis/G6
16. OneKE:https://oneke.openkg.cn/
17. AgentRE:https://arxiv.org/abs/2409.01854
18. DB-GPT-Hub:https://github.com/eosphoros-ai/DB-GPT-Hub
19. Text2GQL:https://github.com/eosphoros-ai/DB-GPT-Hub/blob/main/src/dbgpt-hub-gql/README.zh.md
20. tugraph-db:https://github.com/TuGraph-family/tugraph-db
21. TuGraph-DB Cypher数据集:https://tugraph-web.oss-cn-beijing.aliyuncs.com/tugraph/datasets/text2gql/tugraph-db/tugraph-db.zip
22. CodeLlama-7b-Cypher-hf:https://huggingface.co/tugraph/CodeLlama-7b-Cypher-hf/tree/1.0
23. tugraph-analytics:https://github.com/TuGraph-family/tugraph-analytics
24. TuGraph-Analytics GQL数据集:https://tugraph-web.oss-cn-beijing.aliyuncs.com/tugraph/datasets/text2gql/tugraph-analytics/tugraph-analytics.zip
25. CodeLlama-7b-GQL-hf:https://huggingface.co/tugraph/CodeLlama-7b-GQL-hf/tree/1.1
欢迎关注TuGraph代码仓库✨
TuGraph-DB 图数据库:https://github.com/tugraph-family/tugraph-db







