1. 为什么使用 RAG
大语言模型 (LLM) 虽然在海量数据上训练,但并不包含我们的私有数据。为了让 LLM 能够回答与我们特定领域相关的问题,我们可以使用检索增强生成(RAG)技术。RAG 的核心原理是将信息检索与语言生成相结合,其工作流程如下:
- 文档处理:将私有文档分割成小片段(chunks)。
• 分割方法:基于 Token 数量、字符数量、语义或层次结构 - 嵌入生成:为每个 chunk 生成向量表示(embedding)。
• 目的:将文本转换为可计算的数值向量 - 向量索引:将 embeddings 存储到高维向量数据库中并建立索引。
• 优势:支持快速相似度检索 - 查询处理:将用户的查询转换为 embedding。
• 关键点:保持查询与文档片段在相同的向量空间 - 相似度搜索:在向量数据库中找出与查询最相似的 Top K 个 chunks。
• 技术:利用向量相似度计算(如余弦相似度) - 上下文融合:将相关 chunks 及其上下文发送给 LLM。
• 重要性:为 LLM 提供回答问题所需的背景信息 - 回答生成:LLM 基于提供的上下文生成自然、流畅的回答。
• 结果:结合了私有知识的精确答案
RAG 技术的主要优势包括:✧ 提高 LLM 在特定领域的适应性 ✧ 实现知识的实时更新 ✧ 增强答案的可解释性 ✧ 保护私有数据安全。通过 RAG,我们可以充分发挥大语言模型的潜力,同时保持对特定领域知识的精确把控,为各种应用场景提供强大而灵活的解决方案。
2. GraphRAG 和传统 RAG 的区别
在探讨大语言模型 (LLM) 应用于私有数据集的过程中,我们之前介绍了检索增强生成(RAG)技术。然而,当面对 “ 数据集中的核心主题是什么?” 这类需要全局理解的问题时,传统 RAG 系统可能力不从心。这就是 GraphRAG 最大优势。
GraphRAG 巧妙地结合了 知识图谱、RAG 和查询聚焦摘要(QFS)的优势,使其能够根据问题的普遍性和索引文本量进行灵活扩展。
让我们深入了解 GraphRAG 的工作流程:
- 源文档到文本块 📄
• 关键决策:确定从源文档中提取文本的粒度
• 目的:为后续处理准备合适大小的文本单元 - 文本块到元素实例 🔍
• 使用 LLM 识别实体、类型、描述和关系
• 重点:提取图节点(实体)和边(关系)的实例 - 元素实例到元素摘要 📝
• LLM 将实例级摘要转换为描述性文本块
• 优势:可能包含文本暗示但未明确陈述的概念 - 元素摘要到图社区 🕸️
• 使用 Leiden 算法将图划分为模块化社区
• 特点:高效恢复大规模图的层次社区结构 - 图社区到社区摘要 📊
• 为每个社区创建报告式摘要
• 价值:提供理解数据集全局结构和语义的方法 - 社区摘要到社区回答 🤔
• 将社区摘要随机打乱并分块
• 并行生成中间答案并评分(0-100 分)
• 策略:过滤掉得分为 0 的答案 - 社区回答到全局回答 🎯
• 按有用性得分降序排列中间答案
• 迭代添加到新的上下文窗口,直到达到 token 限制
• 最终:生成返回给用户的全局答案
GraphRAG 的优势:
✧ 处理需要全局理解的复杂查询
✧ 可扩展性强,适应不同规模的数据集
✧ 结合知识图谱,提供更深入的语义理解
✧ 通过多阶段处理,提高答案的准确性和相关性
3. poetry 源码安装 graphrag
先安装 poetry,然后安装 graphrag
#1. 下载安装 poetry
curl -sSL https://install.python-poetry.org | python3 -
#2. 写入环境变量
echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.bashrc
source ~/.bashrc
#验证
poetry --version
#Poetry (version 1.8.4)
从源码安装 graphrag
git clone https://github.com/microsoft/graphrag.git
cd graphrag
#安装
poetry install
4. 初始化项目并开始建立索引
我们已经切换到 graphrag 目录下,可按照下面命令来初始化命令
mkdir xiyou
poetry run poe index --init --root xiyou
现在应该有 prompts 文件夹,再加一个 input 放进要查询的文档 txt 或者 csv。然后配置settings.yaml
,这里只需要设置 llm 和 embeddings 即可。
llm:
api_key: sk-xxx
type: openai_chat # or azure_openai_chat
model: deepseek-chat
model_supports_json: false # 一定要设置 false
max_tokens: 4096
api_base: https://api.deepseek.com/v1
embeddings:
## parallelization: override the global parallelization settings for embeddings
async_mode: threaded # or asyncio
llm:
api_key: xxx
type: openai_embedding
model: embedding-2
api_base: https://open.bigmodel.cn/api/paas/v4
设置完毕后就可以进行图谱生成了,时间会比较长要等各个 final 文档生成完毕,大概是这样的。
如果有 All workflows completed successfully。就可以进行 local 和 global 查询。具体效果如下面图片所示。
#--data 加上 data 目录能使用上次抽取的数据继续查询这样能极大的节省开销
poetry run poe query --root xiyou --method local "黄眉老祖有哪些宝物和神通?"
python -m graphrag.query --root xiyou --data /root/aprojects/graphrags/graphrag/xiyou/output/ --method local '大鹏鸟为什么能打过孙悟空?'
poetry run poe query --root xiyou --method global "黄眉老祖有哪些宝物和神通?"
### 灵吉菩萨的经历
灵吉菩萨是佛教中的一位重要菩萨,以其飞龙宝杖和定风丹闻名。他的主要职责包括镇押黄风怪,并在关键时刻帮助行者解决困境。以下是灵吉菩萨的主要经历:#### 1. 道场与职责
灵吉菩萨的道场位于小须弥山,这是一个地理位置特殊的地方,同时也是他的修行和居住之地。灵吉菩萨的主要职责之一是镇押黄风怪,这是一个重要的任务,显示出他在佛教中的重要地位。#### 2. 帮助行者
灵吉菩萨曾多次帮助行者(孙悟空)解决困境。行者在小须弥山曾多次请求灵吉菩萨的帮助,包括得到灵吉菩萨的支持以及请求灵吉菩萨协助捉拿妖怪。灵吉菩萨不仅提供了精神上的支持,还赠予行者定风丹和飞龙杖,这些法宝在行者的冒险中起到了关键作用。#### 3. 降服黄风怪
灵吉菩萨曾与孙悟空一起降服黄风怪,这是一个重要的任务,显示出他的法力和智慧。黄风怪是一个强大的妖怪,灵吉菩萨使用飞龙杖成功将其降服并镇押。#### 4. 定风丹与飞龙杖
灵吉菩萨赠予行者定风丹和飞龙杖,这些法宝在行者的冒险中起到了关键作用。定风丹能够定住风势,而飞龙杖则是灵吉菩萨的法器,用于捉拿妖怪。#### 5. 与其他菩萨的关系
灵吉菩萨与其他菩萨如观音菩萨、普贤菩萨等有着密切的关系。他们共同参与如来的讲法和召唤,显示出他们在佛教中的重要地位和相互支持的关系。### 总结
灵吉菩萨是佛教中的一位重要菩萨,以其飞龙宝杖和定风丹闻名。他的主要职责包括镇押黄风怪,并在关键时刻帮助行者解决困境。灵吉菩萨的道场位于小须弥山,他曾多次帮助行者,包括赠予定风丹和飞龙杖。灵吉菩萨与其他菩萨如观音菩萨、普贤菩萨等有着密切的关系,共同参与如来的讲法和召唤。** 数据参考:**
- 灵吉菩萨的道场与职责 [Data: Entities (1456, 1457); Relationships (6797, 6616)]
- 帮助行者 [Data: Entities (1456); Relationships (4784, 4935, 6800, 6799)]
- 降服黄风怪 [Data: Entities (1456); Relationships (6616, 6618)]
- 定风丹与飞龙杖 [Data: Entities (1456); Relationships (6800, 6799)]
- 与其他菩萨的关系 [Data: Entities (1456, 3016, 405, 1556); Relationships (2927, 2942, 3254)]
5. Inference
[2] graph paper