GraphRAG——v0.3.6版本使用详细教程、GraphRAG数据写入Neo4j图数据库、GraphRAG与Dify集成

GraphRAG——v0.3.6版本使用详细教程、GraphRAG数据写入Neo4j图数据库、GraphRAG与Dify集成

  • 理论部分
  • 安装
  • 知识图谱生成
  • 测试
  • 将数据导入到Neo4j图数据库可视化
  • 将GraphRAG与Dify集成

在这里插入图片描述

理论部分

https://guoqingru.blog.csdn.net/article/details/150771388?spm=1011.2415.3001.5331

安装

## 创建虚拟环境
conda create -n GraphRAG_0_3_6 python=3.11# 激活虚拟环境
source activate GraphRAG_0_3_6# 安装相关依赖包
# 我安装的版本是graphrag==0.3.5
pip install graphrag==0.3.5 --default-timeout=100 -i https://pypi.tuna.tsinghua.edu.cn/simplepip install future --default-timeout=100 -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install fastapi==0.112.0 --default-timeout=100 -i https://pypi.tuna.tsinghua.edu.cn/simple  uvicorn==0.30.6

知识图谱生成


# 创建文件目录
mkdir -p ./ragtest/input#下载测试txt文档
curl https://www.gutenberg.org/cache/epub/24022/pg24022.txt -o ./ragtest/input/book.txt# 设置你的工作区变量
"""
要初始化你的工作区,首先运行 graphrag init 命令。由于我们在上一步已经配置了一个名为 ./ragtest 的目录,运行以下命令:
"""
# 初始化配置(首次)
python -m graphrag.index --init --root ./ragtest

其会生成相关的文件如下所示:
在这里插入图片描述

修改相关的配置文件settings.yaml,内容如下:


encoding_model: cl100k_base
skip_workflows: []
llm:api_key: ${GRAPHRAG_API_KEY}type: openai_chat # or azure_openai_chatmodel: gpt-3.5-turbomodel_supports_json: true # recommended if this is available for your model.# max_tokens: 4000# request_timeout: 180.0api_base: http://192.168.41.216:8082/v1 # api_version: 2024-02-15-preview# organization: <organization_id># deployment_name: <azure_model_deployment_name># tokens_per_minute: 150_000 # set a leaky bucket throttle# requests_per_minute: 10_000 # set a leaky bucket throttlemax_retries: 10# max_retry_wait: 10.0# sleep_on_rate_limit_recommendation: true # whether to sleep when azure suggests wait-timesconcurrent_requests: 25 # the number of parallel inflight requests that may be made# temperature: 0 # temperature for sampling# top_p: 1 # top-p sampling# n: 1 # Number of completions to generateparallelization:stagger: 0.3# num_threads: 50 # the number of threads to use for parallel processingasync_mode: threaded # or asyncioembeddings:## parallelization: override the global parallelization settings for embeddingsasync_mode: threaded # or asynciollm:api_key: ${GRAPHRAG_API_KEY}type: openai_embedding # or azure_openai_embeddingmodel: gpt-4api_base: http://192.168.41.216:8080/v1# api_version: 2024-02-15-preview# organization: <organization_id># deployment_name: <azure_model_deployment_name># tokens_per_minute: 150_000 # set a leaky bucket throttle# requests_per_minute: 10_000 # set a leaky bucket throttlemax_retries: 10# max_retry_wait: 10.0# sleep_on_rate_limit_recommendation: true # whether to sleep when azure suggests wait-times# concurrent_requests: 25 # the number of parallel inflight requests that may be made# batch_size: 16 # the number of documents to send in a single request# batch_max_tokens: 8191 # the maximum number of tokens to send in a single request# target: required # or optionalchunks:size: 1200overlap: 100group_by_columns: [id] # by default, we don't allow chunks to cross documentsinput:type: file # or blobfile_type: text # or csvbase_dir: "input"file_encoding: utf-8file_pattern: ".*\\.txt$"cache:type: file # or blobbase_dir: "cache"# connection_string: <azure_blob_storage_connection_string># container_name: <azure_blob_storage_container_name>storage:type: file # or blobbase_dir: "output/${timestamp}/artifacts"# connection_string: <azure_blob_storage_connection_string># container_name: <azure_blob_storage_container_name>reporting:type: file # or console, blobbase_dir: "output/${timestamp}/reports"# connection_string: <azure_blob_storage_connection_string># container_name: <azure_blob_storage_container_name>entity_extraction:## llm: override the global llm settings for this task## parallelization: override the global parallelization settings for this task## async_mode: override the global async_mode settings for this taskprompt: "prompts/entity_extraction.txt"entity_types: [organization,person,geo,event]max_gleanings: 1summarize_descriptions:## llm: override the global llm settings for this task## parallelization: override the global parallelization settings for this task## async_mode: override the global async_mode settings for this taskprompt: "prompts/summarize_descriptions.txt"max_length: 500claim_extraction:## llm: override the global llm settings for this task## parallelization: override the global parallelization settings for this task## async_mode: override the global async_mode settings for this taskenabled: trueprompt: "prompts/claim_extraction.txt"description: "Any claims or facts that could be relevant to information discovery."max_gleanings: 1community_reports:## llm: override the global llm settings for this task## parallelization: override the global parallelization settings for this task## async_mode: override the global async_mode settings for this taskprompt: "prompts/community_report.txt"max_length: 2000max_input_length: 8000cluster_graph:max_cluster_size: 10embed_graph:enabled: false # if true, will generate node2vec embeddings for nodes# num_walks: 10# walk_length: 40# window_size: 2# iterations: 3# random_seed: 597832umap:enabled: false # if true, will generate UMAP embeddings for nodessnapshots:graphml: falseraw_entities: falsetop_level_nodes: falselocal_search:# text_unit_prop: 0.5# community_prop: 0.1# conversation_history_max_turns: 5# top_k_mapped_entities: 10# top_k_relationships: 10# llm_temperature: 0 # temperature for sampling# llm_top_p: 1 # top-p sampling# llm_n: 1 # Number of completions to generate# max_tokens: 12000global_search:# llm_temperature: 0 # temperature for sampling# llm_top_p: 1 # top-p sampling# llm_n: 1 # Number of completions to generate# max_tokens: 12000# data_max_tokens: 12000# map_max_tokens: 1000# reduce_max_tokens: 2000# concurrency: 32

注意:

claim_extraction:enabled: true   # 一定要将其改成true,否则不会生成create_final_covariates.parquet文件

经过上述配置文件修改后
我在生成过程中,当所处理的文本较短时,可以正常生成如下所需文件
在这里插入图片描述
问题:
当时当文本文件较大时,create_final_community_reports.parquet文件会没有生成,这个问题待解决

上述修改完毕后,在项目根目录下执行以下语句:

# 开始索引生成
python -m graphrag.index --root ./ragtest

在这里插入图片描述

测试

我所采用数据文本是《明朝那些事儿》第一册

python -m graphrag.query --root ./ragtest --method global "介绍一下朱元璋的生平"
python -m graphrag.query --root ./ragtest --method local "详细的介绍一下马皇后" 

global
在这里插入图片描述
local
在这里插入图片描述

将数据导入到Neo4j图数据库可视化

在项目过程中,由于GraphRAG版本的差异,相应的字段信息不同,致使0.3.x以下的GraphRAG生成的知识图谱与较新的版本生成的字段不同,在执行官方提供的插入Neo4数据库的执行语句会失败

Neo4j执行语句如下:

import pandas as pd
from neo4j import GraphDatabase
import time
NEO4J_URI = "neo4j://192.168.41.220:7687"  # or neo4j+s://xxxx.databases.neo4j.io
NEO4J_USERNAME = "neo4j"
NEO4J_PASSWORD = "googosoft" #你自己的密码
NEO4J_DATABASE = "neo4j"# Create a Neo4j driver
driver = GraphDatabase.driver(NEO4J_URI, auth=(NEO4J_USERNAME, NEO4J_PASSWORD))# 检查连接
try:driver.verify_connectivity()print("✅ 成功连接到 Neo4j 数据库!")
except Exception as e:print("❌ 无法连接到 Neo4j:", e)# 重置数据库:删除所有节点和关系
reset_cypher = """
MATCH (n)
DETACH DELETE n
"""
with driver.session(database=NEO4J_DATABASE) as session:session.run(reset_cypher)print("🗑️ 数据库已重置(所有节点和关系已删除)")GRAPHRAG_FOLDER = "/home/googosoft/GraphRAG/grapgRAG_googosoft_0_3_5/ragtest/output/20250826-213649/artifacts"statements = """
create constraint chunk_id if not exists for (c:__Chunk__) require c.id is unique;
create constraint document_id if not exists for (d:__Document__) require d.id is unique;
create constraint entity_id if not exists for (c:__Community__) require c.community is unique;
create constraint entity_id if not exists for (e:__Entity__) require e.id is unique;
create constraint entity_title if not exists for (e:__Entity__) require e.name is unique;
create constraint entity_title if not exists for (e:__Covariate__) require e.title is unique;
create constraint related_id if not exists for ()-[rel:RELATED]->() require rel.id is unique;
""".split(";")for statement in statements:if len((statement or "").strip()) > 0:print(statement)driver.execute_query(statement)def batched_import(statement, df, batch_size=1000):"""Import a dataframe into Neo4j using a batched approach.Parameters: statement is the Cypher query to execute, df is the dataframe to import, and batch_size is the number of rows to import in each batch."""total = len(df)start_s = time.time()for start in range(0,total, batch_size):batch = df.iloc[start: min(start+batch_size,total)]result = driver.execute_query("UNWIND $rows AS value " + statement,rows=batch.to_dict('records'),database_=NEO4J_DATABASE)print(result.summary.counters)print(f'{total} rows in { time.time() - start_s} s.')return totaldoc_df = pd.read_parquet(f'{GRAPHRAG_FOLDER}/create_final_documents.parquet', columns=["id", "title"])
doc_df.head(2)# import documents
statement = """
MERGE (d:__Document__ {id:value.id})
SET d += value {.title}
"""batched_import(statement, doc_df)text_df = pd.read_parquet(f'{GRAPHRAG_FOLDER}/create_final_text_units.parquet',columns=["id","text","n_tokens","document_ids"])
text_df.head(2)statement = """
MERGE (c:__Chunk__ {id:value.id})
SET c += value {.text, .n_tokens}
WITH c, value
UNWIND value.document_ids AS document
MATCH (d:__Document__ {id:document})
MERGE (c)-[:PART_OF]->(d)
"""batched_import(statement, text_df)entity_df = pd.read_parquet(f'{GRAPHRAG_FOLDER}/create_final_entities.parquet',columns=["name", "type", "description", "human_readable_id", "id", "description_embedding","text_unit_ids"])
entity_df.head(2)entity_statement = """
MERGE (e:__Entity__ {id:value.id})
SET e += value {.human_readable_id, .description, name:replace(value.name,'"','')}
WITH e, value
CALL db.create.setNodeVectorProperty(e, "description_embedding", value.description_embedding)
CALL apoc.create.addLabels(e, case when coalesce(value.type,"") = "" then [] else [apoc.text.upperCamelCase(replace(value.type,'"',''))] end) yield node
UNWIND value.text_unit_ids AS text_unit
MATCH (c:__Chunk__ {id:text_unit})
MERGE (c)-[:HAS_ENTITY]->(e)
"""batched_import(entity_statement, entity_df)rel_df = pd.read_parquet(f'{GRAPHRAG_FOLDER}/create_final_relationships.parquet',columns=["source", "target", "id", "rank", "weight", "human_readable_id", "description","text_unit_ids"])
rel_df.head(2)rel_statement = """MATCH (source:__Entity__ {name:replace(value.source,'"','')})MATCH (target:__Entity__ {name:replace(value.target,'"','')})// not necessary to merge on id as there is only one relationship per pairMERGE (source)-[rel:RELATED {id: value.id}]->(target)SET rel += value {.rank, .weight, .human_readable_id, .description, .text_unit_ids}RETURN count(*) as createdRels
"""batched_import(rel_statement, rel_df)community_df = pd.read_parquet(f'{GRAPHRAG_FOLDER}/create_final_communities.parquet',columns=["id", "level", "title", "text_unit_ids", "relationship_ids"])community_df.head(2)statement = """
MERGE (c:__Community__ {community:value.id})
SET c += value {.level, .title}
/*
UNWIND value.text_unit_ids as text_unit_id
MATCH (t:__Chunk__ {id:text_unit_id})
MERGE (c)-[:HAS_CHUNK]->(t)
WITH distinct c, value
*/
WITH *
UNWIND value.relationship_ids as rel_id
MATCH (start:__Entity__)-[:RELATED {id:rel_id}]->(end:__Entity__)
MERGE (start)-[:IN_COMMUNITY]->(c)
MERGE (end)-[:IN_COMMUNITY]->(c)
RETURn count(distinct c) as createdCommunities
"""batched_import(statement, community_df)community_report_df = pd.read_parquet(f'{GRAPHRAG_FOLDER}/create_final_community_reports.parquet',columns=["id", "community", "level", "title", "summary", "findings", "rank","rank_explanation", "full_content"])
community_report_df.head(2)
# import communities
community_statement = """MATCH (c:__Community__ {community: value.community})
SET c += value {.level, .title, .rank, .rank_explanation, .full_content, .summary}
WITH c, value
UNWIND range(0, size(value.findings)-1) AS finding_idx
WITH c, value, finding_idx, value.findings[finding_idx] as finding
MERGE (c)-[:HAS_FINDING]->(f:Finding {id: finding_idx})
SET f += finding"""
batched_import(community_statement, community_report_df)

在这里插入图片描述

将GraphRAG与Dify集成

在完成上述的任务后,我编写代码提供了一个api接口,以便可以集成到Dify中
由于GraphRAG有两种问答模型,分别是global与local模式,所以我配置了三种,即global、local与混合模型

接口配置截图
在这里插入图片描述

模型选择
在这里插入图片描述
模型测试
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/95021.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/95021.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MongoDB 聚合管道(Aggregation)高级用法:数据统计与分析

MongoDB 聚合管道&#xff08;Aggregation&#xff09;高级用法&#xff1a;数据统计与分析第一章&#xff1a;聚合管道核心概念与架构设计1.1 聚合管道的本质与价值1.2 管道阶段深度解析1.3 执行引擎与优化机制第二章&#xff1a;高级分组与多维统计分析2.1 复合分组与层次化分…

Twitter舆情裂变链:指纹云手机跨账号协同机制提升互动率200%

——基于动态设备指纹与智能行为仿真的裂变增长体系​​一、Twitter舆情运营的三大核心挑战​账号关联风险​同一设备/IP操作多账号触发平台风控&#xff0c;封号率高达65%&#xff0c;舆情响应链路断裂固定设备参数&#xff08;如GPU型号/屏幕分辨率&#xff09;导致账号权重暴…

【密集目标检测】停车场车辆(车位)识别数据集:12k+图像,yolo标注

停车场车辆(车位)识别数据集概述 数据集包含12415张从监控摄像头画面中截取的停车场图像,涵盖晴天、阴天和雨天场景,标注类别包含车位占用、空车位2类。 标注格式:yolo txt 标注工具:labelme/labelimg 分辨率:416*416 一、学术研究的奠基与迭代 停车场车辆(车位)…

苍穹外卖项目笔记day02

接下来的笔记都会以难点与一些不常见的方法为主,一些重复的crud并不会出现哦 ThreadLocal类 ThreadLocal 并不是一个Thread&#xff0c;而是Thread的局部变量&#xff0c;它用于创建线程局部变量。 核心思想&#xff1a;每个线程都有自己独立的变量副本。这意味着&#xff0c;即…

设计模式12-适配器模式

定义 Adapter Partern: 将一个类的接口变换成客户端所期待的另一种接口&#xff0c;从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。 场景 系统需要使用现有的类&#xff0c;而这些类的接口不符合系统的需要。 典型场景&#xff1a;集成第三方库、遗留系统代…

VGG改进(6):基于PyTorch的VGG16-SE网络实战

1. 引言&#xff1a;注意力机制在计算机视觉中的重要性近年来&#xff0c;深度学习在计算机视觉领域取得了巨大成功&#xff0c;从图像分类到目标检测&#xff0c;各种复杂任务都获得了前所未有的性能提升。然而&#xff0c;传统的卷积神经网络&#xff08;CNN&#xff09;在处…

[电商网站-动态渲染商品-尺寸、尺码、颜色图片等];库存缺货状态动态对应。

目录 描述&#xff1a; 数据结构 组件代码文件 描述&#xff1a; 自动处理SKU数据生成规格属性列表 支持用户选择不同规格组合 智能禁用无库存选项 自动匹配当前选择对应的SKU信息 通过视觉样式区分可选/不可选状态 该组件采用Vue实现&#xff0c;通过计算属性和响应式数据…

论《运动战》

运动战的本质是以机动换主动&#xff0c;以时间换空间&#xff0c;通过高度的流动性、主动的位移和灵活的战术选择&#xff0c;在动态中创造并捕捉战机&#xff0c;最终以较小的代价换取最大的胜利。它是一种非对称的、主动的作战哲学&#xff0c;其核心不在于一城一地的得失&a…

DVWA靶场通关笔记-CSRF(Impossible级别)

目录 一、查看源码 二、功能分析 三、CSRF防范分析 1、CSRF令牌验证机制 &#xff08;1&#xff09;核心原理 &#xff08;2&#xff09;防范机制 2、旧密码确认防御实现 &#xff08;1&#xff09;核心原理 &#xff08;2&#xff09;为什么旧密码确认能有效防范CSRF…

深层语义在自然语言处理中的理论框架与技术融合研究

摘要本文章系统阐述了深层语义在自然语言处理&#xff08;NLP&#xff09;领域的定义、特征及其与知识图谱和大型预训练语言模型的融合方法。基于截至2025年8月的最新研究成果&#xff0c;报告深入分析了深层语义的多维度特性、技术实现路径以及面临的挑战&#xff0c;为研究人…

深入解析HarmonyOS:UIAbility与Page的生命周期协同

深入解析HarmonyOS&#xff1a;UIAbility与Page的生命周期协同 在HarmonyOS应用开发中&#xff0c;理解UIAbility和Page的生命周期是构建高质量应用的关键。本文将深入探讨这两大核心概念的生命周期及其协同工作机制&#xff0c;帮助开发者更好地管理应用资源、优化用户体验。…

规律作息 + 养成好的习惯 + 考研倒计时 111 天 + 线面积分入门 1 下半部分

文章目录前言杂进度10.4空间直线一般式方程对称式方程 点向式方程参数式方程转换位置关系10.510.610.7平面束方程10.810.9总结前言 规律作息&#xff01; 杂 欲买桂花同载酒&#xff0c;终不似&#xff0c;少年游。 进度 向量代数和空间解析几何。 10.4 这题就是算一个…

序列容器(vector,deque,list)

STL 序列式容器&#xff08;vector、deque、list、array、forward_list&#xff09;的核心特征是按插入顺序存储元素&#xff08;元素的逻辑顺序与物理存储顺序一致&#xff09; vector 下图是底层原理 具体点击链接vector介绍 deque(双端队列) 在 C STL 中&#xff0c;deque…

Time-MOE添加MLP分类头进行分类任务

文章目录一、背景&#xff1a;Time-MoE 的 4096 长度限制二、数据准备&#xff08;以帕金森二分类为例&#xff09;三、标签对齐&#xff08;弱监督&#xff09;四、类别不平衡 & 数据划分五、模型微调&#xff08;冻结 backbone&#xff0c;只训 MLP 头&#xff09;六、评…

朴素贝叶斯:用 “概率思维” 解决分类问题的经典算法

一、贝叶斯&#xff1a;从 “逆概” 问题走来的数学家要理解朴素贝叶斯&#xff0c;得先回到它的 “源头”—— 贝叶斯公式&#xff0c;以及它要解决的核心问题&#xff1a;逆概问题。1. 贝叶斯的 “生不逢时”托马斯・贝叶斯&#xff08;Thomas Bayes&#xff0c;约 1701-1761…

Qt/C++开发监控GB28181系统/视频点播主码流子码流/动态切换码流/支持海康大华/全网唯一

一、前言说明 目前市面上的国标监控系统&#xff0c;没有看到可以切换码流的&#xff0c;都是默认主码流&#xff0c;包括easynvr、livegbs、wvp等&#xff0c;很是奇怪为什么他们不做呢&#xff1f;难道没有用户反馈需要这个&#xff1f;我这就遇到过一些用户需要能够切换主码…

【 MYSQL | 基础篇 四大SQL语句 】资料位于文章末尾

摘要&#xff1a;本文先介绍数据库 SQL 的核心概念&#xff0c;接着阐述 SQL 通用语法与 DDL、DML、DQL、DCL 四大分类&#xff0c;随后详细讲解各类语句操作&#xff0c;包括 DDL 的数据库与表操作及数据类型&#xff0c;DML 的数据增删改&#xff0c;DQL 的查询语法与功能&am…

Webrtc支持FFMPEG硬解码之Intel

Intel QSV下载编译git clone https://github.com/lu-zero/mfx_dispatch.git1.使用CMake生产VS工程编译生成libmfx.lib文件 头文件为mfx文件夹libmfx---include---mfx---lib---libmfx.libWebrtc中ffmpeg的修改因为Webrtc中的ffmpeg是使用gn进行编译的&#xff0c;所以这里先找到…

【二叉树(DFS) - LeetCode】437. 路径总和 III

437. 路径总和 III 题解&#xff1a;DFS /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* TreeNode(int x) : val(x), left(nullp…

【Python】shutil.make_archive() 方法详解

文章目录功能概述函数签名核心参数详解1. base_name2. format3. root_dir4. base_dir使用示例将 /home/user/project/data 目录打包为 data.tar.gz&#xff0c;并保存到 /home/user/backups/打包当前工作目录下的 docs 文件夹为 zip 文件替代方案总结shutil.make_archive() 是 …