理论:GraphRAG = 知识图谱 + RAG,优化全局搜索+局部搜索
RAG 解决大模型,之前没有见过的知识,比如企业内部的知识库。
传统 RAG 的问题:偏向一般的事实性检索,如果涉及跨多个段落、多个文档的总结性问题,回答就很片面。
GraphRAG 通过 知识图谱增强 RAG,就是为了解决这个问题。
构建索引
GraphRAG 涉及的概念:
- 输入:csv、txt 格式的文档
- 文本块:会把一个文档拆分为多个块
如果按照 N 来做切分(chunk size 块大小),N 越大,获得的实体就越少,默认 1200。
每个文本块,也会使用 Bert 模型,向量化,助于发现文档间的关系。
-
实体:从文本块中提取的关键词
-
关系:俩个实体之间的关系
-
协变量:有限定的称述(时间限制、状态评估)
-
社区报告:把相关实体分层和分类,形成一个个社区,并总结每个社区的摘要,包括实体、关系、声明
使用递归算法,做社区检测,从小到达聚类,按层次生成,直到社区数量到达阈值。
图嵌入:为社区报告,生成图的向量表示。
- 节点:颗粒度大于实体的单位,包含实体 + 布局信息
查询流程
查询分为,局部查询、全局查询。
局部查询:
用户输入问题 -> 提取实体 -> 把每个实体转成向量 -> 调用一次向量检索,数据库匹配用户的实体,取 top K 个最相关实体。
- 实体文本块映射 -> 候选文本块 -> 排序过滤 -> 最相关
- 社区报告映射 -> 候选属性 -> 排序过滤 -> 最相关
- 实体和实体映射 -> 候选关系 -> 排序过滤 -> 最相关
- 实体和协变量 -> 候选声明信息 -> 排序过滤 -> 最相关
全局查询:
用户输入 -> 提取实体 -> 去每个社区检索一遍 -> 根据相关分数过滤 -> 根据 prompt 调用大模型 -> 拼接 Top K 个结果。
修改为国内大模型
在 tests/fixtures/text/settings.yml
路径下,改模型:
代码部署
#使用qwen灵积大模型平台运行graphrag
1、autodl上创建graph环境
conda init
bash
conda create -n graph python==3.10.14 -y
conda activate graph
2、安装graphrag
2.1 安装项目文件
pip install graphrag
2.2 创建工作目录
cd autodl-tmp
mkdir -p ./ragtest/input #ragtest是工作目录名,可以修改,修改后下面命令中工作目录都需要修改
把文档(txt格式或者csv格式)放入input目录中,注意文档编码为utf-8
2.3 配置文件初始化
python -m graphrag.index --init --root ./ragtest
#此命令会生成prompts文件夹,settings.yaml和.env 文件,settings文件为参数配置,.env文件为环境变量
2.4 修改配置文件
2.4.1修改settings.yaml文件,见项目中settings.yaml参数
主要修改项包括:
llm:
-model 修改为qwen 系列llm大模型,比如qwen-plus,qwen-turbo,qwen-max等等
-api_base 修改为qwen灵积平台地址:https://dashscope.aliyuncs.com/compatible-mode/v1
embeddings:
-model 修改为qwen 系列embedding模型,text-embedding-v2或者text-embedding-v1
-api_base 修改为qwen灵积平台地址:https://dashscope.aliyuncs.com/compatible-mode/v1
chunks:
size: 1200 #分割文本长度,如果需要更细的力度,可以改为500或者300,越小初始化消耗token越多
overlap: 100
2.4.2 修改.env环境变量
GRAPHRAG_API_KEY 修改为qwen大模型的api key
在 命令行 搜索 .env 文件
sudo find / -name ".env"
vi .env 修改自己的 qwen api
2.5 项目初始化
2.5.1 prompt调优,如果是专业领域,可以进行prompt调优(prompt tuning)
命令:
python -m graphrag.prompt_tune --root ./ragtest --config ./ragtest/settings.yaml --language English --domain "financial report" --no-entity-types --output ./prompt
主要参数:
-config 参数为setting.yaml目录
-language 语言chinese,English等
-domain 最重要的参数,领域名称,这里是inancial report金融报告,医学名字是 medical
-output prompt输出目录
生成新的prompt文件后,覆盖prompts 目录下的文件
2.5.2 初始化
python -m graphrag.index --root ./ragtest
2.6 提问
2.6.1 global search
python -m graphrag.query --root ./ragtest --method global "What are the top themes in this story?"
双引号内为问题,主要用于全局搜索,对应文件为output目录下的社区报告,community report即create_final_community_reports.parquet
2.6.2 local search
python -m graphrag.query --root ./ragtest --method local "Who is Scrooge, and what are his main relationships?"
双引号内为问题,主要用于局部细节问题,会使用embedding模型进行文本相似性比较。