AI知识库

53AI知识库

学习大模型的前沿技术与行业应用场景


基于graphRAG和gpt4omini的知识库与目前主流RAG的对比实验记录
发布日期:2024-07-22 08:46:32 浏览次数: 3155


graphRAG 简单介绍

** 论文名**《 From Local to Global: A Graph RAG Approach to Query-Focused Summarization 》
** 地址**https://arxiv.org/pdf/2404.16130
⛳** Official repo**https://github.com/microsoft/graphrag


unsetunset论文介绍unsetunset

在今年的4月份,微软团队就早早在git和arxiv占了个坑,不过是先发表了论文,一直到7月初才开源了代码,这期间,于我自身发生了太多事情,城市变迁与努力很久的目标再次失之交臂,加上一系列的破财消灾,以至于我是4月底看到了论文,非常期待在之后的工作中使用并加速商业化,但直到工作都结束了,还没等到,现在回看论文,突然就有了种"何当共剪西窗烛,却话巴山夜雨时"之感,相比于后来的开源框架,论文数据当然是漂亮又可信的,比如说为什么要提出graphRAG呢?

在论文中,作者很明确地提出了一个常规RAG无法处理的应用场景:

However, RAG fails on global questions directed at an entire text corpus, such as “What are the main themes in the dataset?”, since this is inherently a queryfocused summarization (QFS) task, rather than an explicit retrieval task.

之前的RAG方法在处理针对整个文本语料库的全局性问题时存在局限性,例如“数据集中的主要主题是什么?”这类问题本质上是查询聚焦的摘要(Query-Focused Summarization, QFS)任务,而不是显式的检索任务。于是作者提出了解决思路:

In contrast with related work that exploits the structured retrieval and traversal affordances of graph indexes (subsection 4.2), we focus on a previously unexplored quality of graphs in this context: their inherent modularity (Newman, 2006) and the ability of community detection algorithms to partition graphs into modular communities of closely-related nodes (e.g., Louvain, Blondel et al., 2008; Leiden, Traag et al., 2019). LLM-generated summaries of these community descriptions provide complete coverage of the underlying graph index and the input documents it represents. Query-focused summarization of an entire corpus is then made possible using a map-reduce approach: first using each community summary to answer the query independently and in parallel, then summarizing all relevant partial answers into a final global answer.

Graph RAG的创新之处在于它结合了图的模块性和层次化社区结构,通过LLM生成的图索引和社区摘要,实现了对大规模文本语料库的高效查询聚焦摘要。这种方法在处理需要全局理解的复杂问题时,能够生成更全面和多样化的答案。而在生成最终答案的过程中,Graph RAG 使用类似 MapReduce 的方法。Map 阶段并行生成社区答案,Reduce 阶段将这些答案汇总,生成一个综合的全局答案。这种方法提高了处理大规模数据集的效率。实现方式如下:


unsetunsetgraphRAG 框架unsetunset

GraphRAG是利用图机器学习算法针对数据集进行语义聚合和层次化分析的框架,代码结构可以从git官网直接看到,而在微软官方的Get Started 中,提到的Top-Level Modules分为两部分,为Indexing PipelineQuery Engine

Indexing Pipeline含义如其名,是一个数据pipeline包含转换套件,旨在使用 LLM 从非结构化文本中提取有意义的结构化数据,该项是可配置的,其是由workflows(微软自研DataShaper)、prompt templates、input/output 适配器等组成,整体还是很复杂的,可看如下图:

(来自 源码解读 - 微软GraphRAG框架 )

Query Engine相对而言要简单些, 执行query的语句如下:

# Global search
python -m graphrag.query \
--root ./ragtest \
--method global \
"What are the top themes in this story?"

# Local search
python -m graphrag.query \
--root ./ragtest \
--method local \
"Who is Scrooge, and what are his main relationships?"

这里需要注意的是有Global/Local search两种模式.,具体同样输出调用图:

这两部分的详细解释可查看上述两个引用,这里就不再详细展开。那么以下为本次实验步骤。


实验过程


unsetunset环境安装unsetunset

graphRAG: 保证python版本在3.10到3.12之间

$ pip install graphrag

# 创建数据集目录
$ mkdir -p ./ragtest/input

**ragflow: **

  • CPU >= 4 cores
  • RAM >= 16 GB
  • Disk >= 50 GB
  • Docker >= 24.0.0 & Docker Compose >= v2.26.1
$ sudo sysctl -w vm.max_map_count=262144

$ git clone https://github.com/infiniflow/ragflow.git

$ cd ragflow/docker
$ chmod +x ./entrypoint.sh
$ docker compose up -d

当然,如果系统达不到要求,可以用线上官方部署的环境,同样只需要提供api key就行了。

然后准备数据集,这里选用的是古腾堡计划中的一本免费图书,即查尔斯・狄更斯创作的小说《圣诞颂歌》,为graphRAG官方测试用例推荐小说。

curl https://www.gutenberg.org/cache/epub/24022/pg24022.txt > ./ragtest/input/book.txt

整部小说篇幅为189K,长度适中,不过是全英,我没有看过,这也给后续的评价埋下的伏笔。


unsetunsetgraphRAG 使用unsetunset

使用同样很简单,截止到今天我使用的版本,好像比7月初刚发版的时候少很多了,之前听说ollama本地大模型运行很多报错,全部解决了,生成质量也非常堪忧,但看近期issue似乎少了,这里我所使用的是上一篇中的走第三方api调用gpt4o-mini,首先生成工作区变量:

python -m graphrag.index --init --root ./ragtest

这将在目录中创建两个文件:.env和。settings.yaml``./ragtest

  • .env包含运行 GraphRAG 管道所需的环境变量。如果检查文件,将看到已定义的单个环境变量。 GRAPHRAG_API_KEY=<API_KEY>这是 OpenAI API 或 Azure OpenAI 端点的 API 密钥。可以将其替换为自己的 API 密钥。
  • settings.yaml包含管道的设置,可以修改此文件以更改管道的设置。

修改.env

修改settings.yaml

然后运行pipeline

python -m graphrag.index --root ./ragtest

部分输出日志为:

                                        entity_graph
0  <graphml xmlns="http://graphml.graphdrawing.or...
? create_summarized_entities
                                        entity_graph
0  <graphml xmlns="
http://graphml.graphdrawing.or...
? create_base_entity_graph
   level                                    clustered_graph
0      0  <graphml xmlns="http://graphml.graphdrawing.or...
1      1  <graphml xmlns="
http://graphml.graphdrawing.or...
2      2  <graphml xmlns="http://graphml.graphdrawing.or...

? create_final_entities
                                   id  ...                              description_embedding
0    b45241d70f0e43fca764df95b2b81f77  ...  [-0.03869034722447395, 0.03913777321577072, 0....
1    4119fd06010c494caa07f439b333f4c5  ...  [0.0005341707728803158, 0.002819786313921213, ...
2    d3835bf3dda84ead99deadbeac5d0d7d  ...  [0.06952155381441116, 0.010321843437850475, -0...
3    077d2820ae1845bcbb1803379a3d1eae  ...  [0.006576313637197018, 0.01620018668472767, -0...
4    3671ea0dd4e84c1a9b02c5ab2c8f4bac  ...  [0.02052260749042034, -0.008479364216327667, -...
..                                ...  ...                                                ...
162  6090e736374d45fd84f0e4610a314f8f  ...  [-0.008593256585299969, 0.039817050099372864, ...
163  0e8d921ccd8d4a8594b65b7fd19f7120  ...  [-0.0030632284469902515, 0.010951987467706203,...
164  59c726a8792d443e84ab052cb7942b4a  ...  [-0.023868346586823463, 0.0008730254485271871,...
165  4f2c665decf242b0bfcaf7350b0e02ed  ...  [-0.03389299660921097, -0.006695814896374941, ...
166  66cdf168f36d4a57a505028c97dc06e0  ...  [-0.004404974170029163, 0.032069943845272064, ...


......


[1 rows x 4 columns]
⠙ GraphRAG Indexer
├── Loading Input (text) - 1 files loaded (0 filtered) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% 0:00:00 0:00:00
├── create_base_text_units
├── create_base_extracted_entities
├── create_summarized_entities
├── create_base_entity_graph
├── create_final_entities
├── create_final_nodes
├── create_final_communities
├── join_text_units_to_entity_ids
├── create_final_relationships
├── join_text_units_to_relationship_ids
├── create_final_community_reports
├── create_final_text_units
├── create_base_documents
└── create_final_documents
? All workflows completed successfully.

整个输出日志可以对照上述的函数设计图,很多地方也是照着顺序走的,最后输出All workflows completed successfully.那说明没有问题了,这里能在输出文件中打开相应的图谱文件,直接查看:

确认没问题后,即能使用查询engine,首先使用全局搜索来查询答案:

python -m graphrag.query \
--root ./ragtest \
--method global \
"What are the top themes in this story?"

输出结果我google翻译了一下,为:

INFO: Reading settings from ragtest/settings.yaml
creating llm client with {'api_key''REDACTED,len=51''type'"openai_chat"'model''gpt-4o-mini''max_tokens'4000'temperature'0.0'top_p'1.0'n'1'request_timeout'180.0'api_base''xxx''api_version'None'organization'None'proxy'None'cognitive_services_endpoint'None'deployment_name'None'model_supports_json'True'tokens_per_minute'0'requests_per_minute'0'max_retries'10'max_retry_wait'10.0'sleep_on_rate_limit_recommendation'True'concurrent_requests'25}

SUCCESS: Global Search Response: 
## 故事中的关键主题

故事中有几个突出的主题,这些主题增加了故事的深度和道德教训。这些主题围绕着转变、家庭、同情、遗憾以及贫富之间的对比。

### 转变

故事中的一个中心主题是转变,特别是通过埃比尼泽·斯克鲁奇这个角色来体现。他从吝啬到慷慨的转变很大程度上受到圣诞节精神和鬼魂造访的影响。这种转变强调了个人成长和救赎的潜力,表明无论个人过去的行为如何,他们都有可能变得更好[数据:报告(520181113)]。

### 家庭和社区

家庭和社区的重要性是一个反复出现的主题,特别是通过克拉奇特一家在圣诞节期间的团结和爱。尽管他们经济拮据,但他们的互动凸显了困难时期支持和团结的重要性。这一主题强调了家庭纽带和社区联系对于克服逆境至关重要 [数据:报告 (151416319)]。

### 同情心和慷慨

同情心和慷慨也是关键主题,正如史高治最终理解了关心他人(尤其是那些不幸的人)的必要性所表明的那样。故事批判了自私,提倡善良,尤其是在圣诞节期间。这一主题提醒人们有道德义务去支持那些需要帮助的人 [数据:报告 (520141222)]。

### 遗憾和反思

遗憾和反思的主题很突出,尤其是在史高治与鬼魂的遭遇中。这些遭遇迫使他面对自己过去的行为及其后果,强调了自我意识的重要性。这一主题说明了一个人的选择如何影响他人,以及反思自己的生活以促进个人成长的必要性 [数据:报告(111819134)]。

### 财富与贫穷

最后,整个故事都探讨了财富与贫穷之间的对比,特别是通过鲍勃·克拉奇特的性格和克拉奇特家族的挣扎。这一主题强调了社会问题以及那些有能力支持不幸的人的道德责任。它批判了社会不平等,并鼓励富人有责任感,帮助有需要的人 [数据:报告(1512171419)]。

### 结论

总之,这个故事包含了引起读者共鸣的深刻主题,强调了转变、家庭和社区的重要性、同情的必要性、反思的价值以及贫富差距的道德含义。这些主题共同传达了有关人类经验和积极变革潜力的强有力的信息。

同样,第二个问题使用本地搜索询问有关特定角色的更具体问题的示例:

python -m graphrag.query \
--root ./ragtest \
--method local \
"Who is Scrooge, and what are his main relationships?"
## 谁是史高治?

埃比尼泽·史高治是查尔斯·狄更斯的小说《圣诞颂歌》中的主角。史高治最初被描绘成一个吝啬冷酷的老头,他体现了贪婪和对他人冷漠的精神。他对圣诞节的蔑视和缺乏同情心在他与周围人的互动中显而易见,尤其是他的侄子弗雷德和他的员工鲍勃·克拉奇特。然而,在整个故事中,史高治经历了一场深刻的转变,这是由各种灵魂的来访引发的,包括过去、现在和未来的圣诞幽灵。这些遭遇让他反思自己的人生选择,最终导致性格发生了重大变化,从孤立和自私变成了慷慨和同情[数据:实体(418);关系(163141)]。

## 主要关系

### 1. **鲍勃·克拉奇特**
史高治与鲍勃·克拉奇特的关系是阐释财富与贫穷主题的关键。起初,史高治对鲍勃很差,反映出他的吝啬和缺乏同情心。然而,随着史高治的转变,他开始认识到鲍勃的挣扎,并最终决定提高他的薪水并养家糊口,标志着他向善良和同情心的重大转变[数据:关系(167)]。

### 2. **弗雷德(史高治的侄子)**
弗雷德代表着家庭的温暖和圣诞节的精神,与史高治的消极态度形成鲜明对比。尽管史高治对他不屑一顾,但弗雷德坚持邀请他的叔叔参加节日庆祝活动,强调了家庭关系的重要性。这种关系强调了史高治最初的孤立以及他最终意识到家庭纽带的价值 [数据:关系 (6062)]。

### 3. **雅各布·马利**
雅各布·马利是史高治已故的商业伙伴,也是史高治转变的关键催化剂。马利的鬼魂来访警告了人们没有同情心的生活会带来的后果,敦促史高治改变自己的生活方式。这次遭遇不仅强调了遗憾和救赎的主题,还建立了指导史高治旅程的超自然框架 [数据:关系 (4178)]。

### 4. **小蒂姆**
小蒂姆是鲍勃·克拉奇特最小的儿子,他成为史高治转变中的重要人物。史高治对小蒂姆健康和幸福的关心凸显了他改变心态的影响。故事结束时,史高治成为了小蒂姆的第二个父亲形象,展现了他帮助克拉奇特家族的新承诺 [数据:关系 (33)]。

### 5. **费兹威格**
史高治的前雇主费兹威格在史高治的记忆中是一位善良慷慨的老板。这种关系与史高治现在的行为形成了鲜明的对比,并影响了他的转变。费兹威格圣诞派对的快乐回忆让史高治想起了善良的重要性和积极领导的影响 [数据:关系 (1248)]。

## 结论

史高治的性格弧线由他与他人的关系定义,这些关系就像一面镜子,反映了他最初的缺点和最终的救赎。通过与鲍勃·克拉奇特、弗雷德、雅各布·马利、小蒂姆和费兹维格的互动,史高治学会了同情、家庭和社区的价值,最终拥抱了圣诞节的真正精神[数据:实体 (45111422);关系 (1631416062)]。


unsetunsetragflowunsetunset

我这里是本地搭建环境,内置的BAAl/bge-large-zh-v1.5 embedding模型,开启RAPTOR策略,最大聚类数为64,其阈值为0.1,而不采用rerank选用关键词相似度和向量余弦的加权值为0.2,top N为8,最大token数设为1200与graph对齐,大模型接口选用的是chatglm4/3.5,提示词皆没有动,即默认值:

# knowledge prompt
请总结以下段落。 小心数字,不要编造。 段落如下:
      {cluster_content}
以上就是你需要总结的内容。

# chat
你是一个智能助手,请总结知识库的内容来回答问题,请列举知识库中的数据详细回答。当所有知识库内容都与问题无关时,你的回答必须包括“知识库中未找到您要的答案!”这句话。回答需要考虑聊天历史。
        以下是知识库:
        {knowledge}
        以上是知识库。

同样,第一个问题回答翻译成中文后:

这个故事的主要主题包括:

救赎和转变:主角埃比尼泽·斯克鲁奇在受到过去、现在和未来的圣诞幽灵的拜访后,经历了深刻的转变,从一个吝啬、痛苦的老人变成了一个慷慨、善良的人。

圣诞精神:故事强调了圣诞精神的重要性,包括慷慨、欢乐和家庭团聚。

贪婪和自私的后果:斯克鲁奇的吝啬导致孤独、不快乐的生活,而他转变为一个慷慨的人则带来了幸福和满足。

家庭和人际关系的重要性:故事强调了家庭、朋友和人际关系在给生活带来欢乐和意义方面的重要性。

记忆和反思的力量:圣诞幽灵的来访让斯克鲁奇反思自己的生活和所做的选择,从而实现了他的转变。

财富与贫穷的对比:故事将富有的史高治的吝啬与克拉奇特一家的贫穷与挣扎进行了对比,强调了慷慨和同情的重要性。

故事的永恒性:尽管故事背景设定在 19 世纪,但《圣诞颂歌》的主题在今天仍然具有现实意义,强调了救赎、爱和圣诞精神的持久力量。

第二个问题回答:

埃比尼泽·斯克鲁奇是查尔斯·狄更斯的小说《圣诞颂歌》中的主人公。他是一个吝啬又苦涩的老头,在伦敦做放债人。斯克鲁奇以吝啬、厌恶圣诞节和脾气暴躁而闻名。

故事中斯克鲁奇的主要关系包括:

鲍勃·克拉奇特:斯克鲁奇的雇员,克拉奇特是一个善良勤奋的职员,尽管薪水很低,但他还是为斯克鲁奇工作。克拉奇特有一个大家庭,包括他的妻子玛莎和他们的孩子,其中最小的孩子小蒂姆特别令人难忘。

弗雷德:斯克鲁奇的侄子,弗雷德是一个热情慷慨的人,经常邀请斯克鲁奇和家人一起过圣诞节,但斯克鲁奇总是拒绝。弗雷德开朗、亲切的性格与斯克鲁奇吝啬、孤独的生活方式形成了鲜明的对比。

圣诞幽灵的过去、现在和未来:这些超自然生物被派来向史高治指出他所犯的错误。圣诞幽灵的过去向史高治展示了他过去的场景,圣诞幽灵的现在向他展示了现在的欢乐和挣扎,圣诞幽灵的未到来向他展示了他未来行为的后果。

马利的幽灵:史高治的前商业伙伴雅各布·马利以幽灵的形式出现,警告史高治圣诞幽灵即将来访。马利的灵魂因为他的吝啬而被束缚在地球上,他试图拯救史高治,使他免于同样的命运。

通过这些关系以及幽灵向他展示的经历,史高治经历了深刻的转变,成为一个更善良、更慷慨的人,他重视人际关系和圣诞精神。

鼠标移到这里这一段的总结性语录结束句号后的i标志,可看到知识库具体选择抽取的内容:


对比结果

这里比较明显的是第二个问题,根据wiki https://zh.wikipedia.org/zh-cn/圣诞颂歌 介绍可得知,graphRAG答案是更为准确的,而从最初的人物关系介绍来看,ragflow就犯了很多错误,这也对应了图谱技术的作用,第一个问题的回答倒都差不多,两者没有明显差别,另外RAPTOR也是一种接近QFS的方式,但深入垂直领域,似乎依然比较难落地,graphRAG优化了总结性与关联性的问题,如果只从论文中看,它完全是落地的好选择,但真正体验过后就会发现,其短板异常明显。

根据我看到的反馈,在gpt4o mini之前,graphRAG最初的版本,同样是《圣诞颂歌》,使用GPT构建就得调用449次接口,换算成美元是10刀,查询也需要1刀,而同样,选用embedding + rerank的RAG方式,即使加入了策略,也仅仅只需要调用不到20次,这中间的费用非多财力者足够望而却步,而我本实验所选用的gpt4o mini相对友好太多,也可能graphRAG版本有更新,我计算了当前我构建完整本书后的次数大概是205次左右,换算一下只需要1刀左右,似乎graphRAG和gpt4omini是良配,其余本地大模型的方式没有试,感觉还有很多优化的点,微软这时候开放出来,未尝不是路漫漫其修远兮,依靠社区一起求索。

本篇最后,其实可以用langsmith和ragas对结果进行量化对比,但书没有看过,下午搞了一套《诡秘之主》txt文本发现太多了,另外找书的时候,看其它小说去了,所以,emmm,结束。




53AI,企业落地应用大模型首选服务商

产品:大模型应用平台+智能体定制开发+落地咨询服务

承诺:先做场景POC验证,看到效果再签署服务协议。零风险落地应用大模型,已交付160+中大型企业

联系我们

售前咨询
186 6662 7370
预约演示
185 8882 0121

微信扫码

与创始人交个朋友

回到顶部

 
扫码咨询