GraphRAG 详细分析:代码流程、prompt 设计逻辑、源码分析

GraphRAG 详细分析:代码流程、prompt 设计逻辑、源码分析

 


理论: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模型进行文本相似性比较。

 

源码剖析

### 配置 GraphRAG 提示语 GraphRAG 的提示模板生成功能允许用户自定义和调整模型的行为,以便更好地适应特定应用场景。这部分代码位于 `graphrag/prompt_tune` 中[^2]。 #### 自定义提示模板 通过修改提示模板可以影响模型的输出质量。以下是配置提示语的一个基本框架: ```python from graphrag.prompt_tune import PromptTemplate template = """ 给定以下背景信息 {context}, 请根据这些信息回答关于{entity_type}的问题: {question} """ prompt_template = PromptTemplate(template=template) ``` 此模板结构化地引入了上下文(`context`)、实体类型(`entity_type`)以及具体问题(`question`)三个变量,使得模型能够更精准地理解输入并给出恰当的回答。 #### 参数设置 对于不同的应用需求,可以通过传递不同参数来微调提示行为。常见的可调节参数包括但不限于: - **max_tokens**: 控制生成回复的最大长度。 - **temperature**: 调节采样温度,默认值通常设为0.7;较低数值使输出更加保守而较高则增加随机性。 - **top_p**: 只考虑累积概率达到指定阈值之前的候选词作为下一个token的选择范围。 下面是一个完整的例子展示如何利用上述提到的功能来自定义一个用于问答系统的提示配置文件: ```python config = { 'model': 'your_model_name', 'max_tokens': 150, 'temperature': 0.8, 'top_p': 0.9 } def configure_prompt(context, entity_type, question): template = f""" 给定以下背景信息 {context}, 请根据这些信息回答关于{entity_type}的问题: {question} """ return PromptTemplate( template=template, config=config ) ``` 这样就可以灵活地根据不同场景的需求定制个性化的提示逻辑,从而提高对话的质量与准确性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值