day38大模型程序开发-GraphRAG实操

news/2025/9/22 16:36:08/文章来源:https://www.cnblogs.com/fuminer/p/19105520

三、GraphRAG快速部署与调用方法详解

1.GraphRAG安装

注,以下实验环境均为Ubuntu系统,以更好的模拟真实企业应用场景,其中大多数方法也可以直接迁移至Windows操作系统中。下面我们的操作以AutoDL平台上进行!

Step 1.使用pip安装graphrag

pip install graphrag=0.5

Step 2.创建检索项目文件夹

需要在任何合适的目录下创建一个任意名字的文件夹,该文件夹内部需要再创建一个名字固定为input的子文件夹,用于保存上传的数据集文件。mkdir -p ./openl/input

Step 3.上传数据集

将数据集文件上传至input目录下。只可以上传txt格式文件。

Step 4.初始化项目文件

初始化项目文件后,会生成GraphRAG项目需要的相关配置文件。

graphrag init --root ./openl

Step 5.修改项目配置

image-20250605081703642

注意:graphrag 本身只支持openai系列模型使用。而deepseek-v3和Qwen系列(如Qwen3-235B-A22B、Qwen3-4B)正好采用了和GPT模型完全一样的调用方法和输出格式。因此deepseek-v3和Qwen系列也是目前除GPT外可以无缝接入GraphRAG的大模型。

  • 打开.env文件(ls -all),填写大模型的 API-KEY。可以使用DeepSeek-V3模型何其对应的api_key

    image-20250605094318384

  • 打开setting.yaml文件,填写模型名称和base url:

    • DeepSeek-V3模型和向量模型,此处的向量模型使用的硅基流动中的Qwen/Qwen3-Embedding-8B为例。
    image-20250730090539626

2.Indexing检索流程实现

一切准备就绪后,即可开始执行GraphRAG索引过程。可以借助GraphRAG脚本自动执行indexing。

graphrag index --root ./openl

运行结束后,各知识图谱相关数据集都保存在output文件夹中:

image-20250605092432538

3.全局搜索问答实现

GraphRAG v 0.5版本bug修复

GraphRAG最新版 v0.5版本当使用OpenAI的Embedding模型时,会出现运行报错,此时需要修改lancedb.py文件才可正常运行。在Ubuntu服务器下,脚本文件地址如下:

image-20250730085339817

autodl修改GraphRAG源码,源码路径:

/root/miniconda3/lib/python3.12/site-packages/graphrag/vector_stores/lancedb.py

打开脚本文件后需修改如下内容:

image-20250730085441516

当使用Qwen/Qwen3-Embedding-8B向量模型时,需手动设置N = 4096。

构建GlobalSearch(全局搜索)搜索引擎并进行问答

模块导入:

import tiktoken
import pandas as pd
from graphrag.query.indexer_adapters import (read_indexer_communities,read_indexer_entities,read_indexer_reports,
)
from graphrag.query.llm.oai.chat_openai import ChatOpenAI
from graphrag.query.llm.oai.typing import OpenaiApiType
from graphrag.query.structured_search.global_search.community_context import (GlobalCommunityContext,
)
from graphrag.query.structured_search.global_search.search import GlobalSearch

数据加载与预处理:

INPUT_DIR = "./demo/output"
LANCEDB_URI = f"{INPUT_DIR}/lancedb"
COMMUNITY_LEVEL = 2 #社区层级COMMUNITY_TABLE = "create_final_communities"
COMMUNITY_REPORT_TABLE = "create_final_community_reports"
ENTITY_TABLE = "create_final_nodes"
ENTITY_EMBEDDING_TABLE = "create_final_entities"#相关指定数据加载,包含:实体表、社区表等
community_df = pd.read_parquet(f"{INPUT_DIR}/{COMMUNITY_TABLE}.parquet")
entity_df = pd.read_parquet(f"{INPUT_DIR}/{ENTITY_TABLE}.parquet")
report_df = pd.read_parquet(f"{INPUT_DIR}/{COMMUNITY_REPORT_TABLE}.parquet")
entity_embedding_df = pd.read_parquet(f"{INPUT_DIR}/{ENTITY_EMBEDDING_TABLE}.parquet")#数据预处理:根据上面加载好的数据表格重构实体和社区报告等对象集合
#read_indexer_communities函数表示为特征解析器
communities = read_indexer_communities(community_df, entity_df, report_df)
reports = read_indexer_reports(report_df, entity_df, COMMUNITY_LEVEL)
entities = read_indexer_entities(entity_df, entity_embedding_df, COMMUNITY_LEVEL)

创建Global Search模式的上下文构建器 (context_builder):

token_encoder = tiktoken.get_encoding("cl100k_base")
context_builder = GlobalCommunityContext(community_reports=reports,communities=communities,entities=entities,  token_encoder=token_encoder,
)

代码解释如下:

  1. GlobalCommunityContext:
    1. 这是一个为 Global Search 模式创建的上下文构建器。它负责从不同的数据源(如社区报告、实体、社区信息等)中提取相关数据,并构建一个用于查询的大范围上下文。
    2. 这个构建器帮助为整个文档集合(而不是某个特定实体)构建一个全局的知识背景,以便模型能够对广泛的问题做出响应。
  2. community_reports=reports:
    1. 这里传入的是之前从文件中读取的 reports 数据(也就是 COMMUNITY_REPORT_TABLE 表格的数据)。
    2. 这些报告包含了关于不同社区的详细信息,如主题、摘要、影响力、发现等。
    3. 在全局搜索中,这些社区报告有助于构建整个数据集的高层次概览。
  3. communities=communities:
    1. communities 数据包含社区的结构和信息。在图谱中,社区可能代表了不同的主题、领域或相关性较高的实体群体。
    2. 这部分数据通常用于在全局搜索时进行分组和排名,比如通过社群的重要性或与查询的相关性来排序。
  4. entities=entities:
    1. entities 是从之前的索引步骤中提取的实体数据(来自 ENTITY_TABLE 表)。
    2. 这些实体(如人物、地点、事件等)可以用来扩展全局搜索的范围。它们提供了具体的名词、对象和概念,有助于为全局查询提供上下文。
    3. 注意: 如果不希望在全局搜索中使用社区权重来影响排名(例如,不考虑某个社区对某个实体的影响),可以将 entities 参数设为 None
  5. token_encoder=token_encoder:
    1. token_encoder 是用于对文本进行编码的工具。它将文本转化为可以输入到模型中的 token 序列,以便在模型中使用。

配置全局搜索参数(结合下面的“构建全局搜索引擎”使用):

context_builder_params = {"use_community_summary": False,  "shuffle_data": True,"include_community_rank": True,"min_community_rank": 0,"community_rank_name": "rank","include_community_weight": True,"community_weight_name": "occurrence weight","normalize_community_weight": True,"max_tokens": 12_000,  "context_name": "Reports",
}map_llm_params = {"max_tokens": 1000,"temperature": 0.0,"response_format": {"type": "json_object"},
}reduce_llm_params = {"max_tokens": 2000, "temperature": 0.0,
}

构建全局搜索引擎:

llm = ChatOpenAI(api_key="sk-4b79f3a3ff334a15a1935366ebb425b3",model="deepseek-chat",api_base="https://api.deepseek.com",api_type=OpenaiApiType.OpenAI,  max_retries=20,
)search_engine = GlobalSearch(llm=llm,context_builder=context_builder,token_encoder=token_encoder,max_data_tokens=12_000,  map_llm_params=map_llm_params,reduce_llm_params=reduce_llm_params,allow_general_knowledge=False, json_mode=True,  context_builder_params=context_builder_params,concurrent_coroutines=32,response_type="multiple paragraphs",  
)

这里创建了一个 全局搜索(Global Search) 引擎,利用前面配置的上下文构建器 (context_builder)、语言模型 (llm)、以及其它相关的参数进行搜索。对应参数详解如下:

  • llm:
    • 这个参数传入的是已经配置好的语言模型(LLM)。全局搜索引擎将使用这个模型来生成回答。
  • context_builder:
    • 上下文构建器,它负责根据社区报告、社区等信息来构建查询的上下文。
  • token_encoder:
    • token_encoder 是用来处理文本的编码工具,通常是一个模型专用的 tokenizer。在这里,我们使用了 tiktoken.get_encoding("cl100k_base"),它是 OpenAI 模型的一个编码器,用来将文本转化为 token 格式。
  • max_data_tokens:
    • 最大数据 token 数量。它控制了模型可以处理的最大上下文大小。你可以根据实际使用的模型的最大 token 限制来设置(例如,如果模型最大 token 限制是 8K,则可以设置为 5000,留一些余量)。这个设置控制了全局搜索时在上下文窗口内所使用的最大 token 数。
  • map_llm_paramsreduce_llm_params:
    • 这些参数会影响 LLM 在不同阶段生成内容的方式(例如,max_tokenstemperature 等)。
    • 在GraphRAG框架中,map_llm_params(映射阶段)和reduce_llm_params(归约阶段)代表了模型处理任务时的双向策略。在复杂图谱中,关键证据往往隐藏在非直觉性的间接连接里。只有充分展开搜索树才能确保不遗漏重要分支。通过这种分治策略,GraphRAG既能像蜘蛛网一样广泛感知环境变化,又能像激光般精准定位关键节点,在知识密集型任务中实现效率与准确性的平衡。
    • Map阶段对应发散思维过程,使用较宽松的温度系数鼓励多样化候选集生成;适用于头脑风暴式探索潜在关联路径。
    • Reduce阶段侧重收敛决策,采用低温度强化逻辑一致性;常用于冲突消解和最优解筛选。
  • allow_general_knowledge:
    • 这个参数控制是否允许模型在回答中加入通用知识。如果设置为 True,LLM 会尝试将 外部知识 加入到查询的结果中。这对于需要广泛知识背景的任务可能有帮助,但也有可能导致模型生成 虚假信息(hallucinations)。为了避免这个问题,默认值设置为 False
  • json_mode:
    • 这个参数控制结果的格式。如果设置为 True,LLM 会生成结构化的 JSON 格式 输出。如果设置为 False,则返回的是更自由形式的文本回答。对于结构化数据的处理,通常使用 JSON 格式。
  • context_builder_params:
    • 这是传入给上下文构建器的参数,用来进一步配置如何构建查询上下文(例如是否使用社区简要摘要、是否包含社区排名等)。
  • concurrent_coroutines:
    • 这个参数控制并发协程的数量。全局搜索引擎支持并发处理多个查询,如果你需要同时处理多个请求,可以增加这个值。比如设置为 32,意味着最多可以同时处理 32 个查询。
  • response_type:
    • 这个参数定义了模型生成的响应的类型和格式。它是一个自由文本的描述,指明返回的内容应该是什么样的格式。在这里,"multiple paragraphs" 表示模型会生成多段文字的回答,适合长篇的说明或报告。

执行全局搜索:

from IPython.display import display, Code, Markdownresult = await search_engine.asearch("请帮我介绍下什么是执剑人?")
display(Markdown(result.response))

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

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

相关文章

关于串口通信(232、485、422)和常见问题,一篇文章就给你说清楚~

关于串口通信(232、485、422)和常见问题,一篇文章就给你说清楚~ DB9公头母头接口定义 1、RS-232端(DB9母头/孔型)引脚定义 引脚序号 2 3 5 1、4、6 7、8 信号定义 TXD RXD 地 内部相连 内部相连 注…

东莞哪里的网站建设效果好其中最重要的网络设计结果

什么是接口隔离原则(Interface Segregation Principle) 定义:客户端不应该依赖它不需要的接口;一个类对另一个类的依赖应该建立在最小的接口上。概括的说就是:建立单一接口,不要建立臃肿庞大的接口。&…

怎么制作手机网页湘潭seo 推广快湘潭磐石网络

给你一根长度为 n 的绳子,请把绳子剪成整数长度的 m 段(m、n都是整数,n>1并且m>1),每段绳子的长度记为 k[0],k[1]...k[m - 1] 。请问 k[0]*k[1]*...*k[m - 1] 可能的最大乘积是多少?例如,…

网站怎么做话术做vip的网站好做吗

1、AIDE的简单介绍AIDE通过扫描一台(未被篡改)的Linux服务器的文件系统来构建文件属性数据库,以后将服务器文件属性与数据库中的进行校对,然后在服务器运行时对被修改的索引了的文件发出警告。出于这个原因,AIDE必须在…

有个网站叫设计什么网站建设运营计划书

题目 在一个 2 x 3 的板上(board)有 5 块砖瓦,用数字 1~5 来表示, 以及一块空缺用 0 来表示. 一次移动定义为选择 0 与一个相邻的数字(上下左右)进行交换. 最终当板 board 的结果是 [[1,2,3],[4,5,0]] 谜板被解开。…

网站设计的目的和任务深圳建站哪家专业

目录 如何引入第三方库第三方库与当前项目Bean重复自定义自动配置类 自动配置类通常位于Spring Boot的自动配置模块中,并且被标记为 Configuration类。这些类使用 Conditional注解来检查某些条件是否满足,如果满足,则创建和配置相关的bean。…

有哪些网站适合大学生做兼职网站开发人员是干什么的

题目链接 BZOJ:https://www.lydsy.com/JudgeOnline/problem.php?id2655 Solution 设\(f_i\)表示长度为\(i\)的序列个数,\(g_{i,x}\)表示含有\(x\)的序列个数,注意这里不考虑顺序,顺序答案直接乘\(n!\)就好了。 首先很显然可以得到…

网站建设找 三尾狐wordpress首页添加图片不显示图片

原文合集地址如下,有需要的朋友可以关注 本文地址 合集地址 原理 在 Vue.js 中,$nextTick 方法的底层原理涉及 Vue 的更新队列以及浏览器的异步任务队列(微任务和宏任务)。它的主要目标是在下次 DOM 更新循环结束后执行回调函…

巨鹿网站制作广州有什么好玩的好吃的

摘要: PTS(Performance Testing Service)是web化的卓越的SaaS性能测试平台,具备强大的分布式压测能力,可方便的模拟海量用户的真实业务场景。PTS铂金版在功能上强调页面可视化编排,目前也在快速迭代中&…

day13-Trae之一键换脸APP开发03

今日内容 1 后端Django项目trae或者其他ai工具去编写项目时---》如果UI图不一样,写出来的,可能跟我的不一样 后端的代码,前端代码,每次写都会有差距Django后端项目---》Python的一个web框架----》学习成本挺高---》…

摩尔投票法

0、参考资料(讲解视频及博客等)本人水平有限,如有错误,恳请指正 讲解视频:【【算法】摩尔投票法】一、应用场景典型应用场景:在一个数组中,寻找出现次数超过总元素数一半的元素(即 “主元素”);也可扩展到寻…

基于STM32平台的ADS1292心电采集驱动程序

一、硬件连接方案 graph LRA[STM32F103] -->|SPI1| B[ADS1292]A -->|GPIO| BB -->|DRDY| C[STM32 EXTI]subgraph STM32SPI1_SCK --> GPIOA5SPI1_MISO --> GPIOA6SPI1_MOSI --> GPIOA7SPI1_CS -->…

C#开发的等待界面类库例子 - 开源研究系列文章

C#开发的等待界面类库例子 - 开源研究系列文章Posted on 2025-09-22 16:30 lzhdim 阅读(0) 评论(0) 收藏 举报 今天讲讲应用里的等待窗体的例子。在实际的使用中,有时候如果应用需要长时间的运行某个函数或…

青秀网站建设wordpress 无广告视频

创:18_3_2017修:20_3_2017 什么是前端?  --在浏览器中展示内容以及处理请求 什么是浏览器?   --一款能将网页内容展现给用户查看,并且让用户与网页交互的软件 什么是内核?   --渲染引擎,规…

搜索引擎有哪些网站沈阳网站建设本地化技术服务

二叉树 打算先来了解二叉树基础,都是简单题,目的是熟悉代码格式和解题基础思路。 1、二叉树最大深度 二叉树最大深度 方法一、深度搜索 直接用原函数做递归,比较简单 /*** Definition for a binary tree node.* struct TreeNode {* …

网站前台的网址公众号怎么开通商城

绕孔轴旋转的可无限旋转枪头以及送丝机是ETR堆焊系统的核心在传动米亏的帮助下,焊接电流、保护气、焊枪冷却专职和电气控制信号进行着不间断的工作。然而,如同所有复杂设备,该系统在使用过程中也可能遇到故障。因此,建议与子锐机器…

世界网站制作网站建设找金手指排名

对于ftp工具,你了解多少?其实一般人也接触不到这种软件。ftp工具主要是针对从事网站管理的工作人员比较有利的一款工具。可以帮助他们快速的解决工作中的问题。方便、简单、快捷又明了的解决问题。那ftp工具有哪些呢?接下来给大家推荐四款好用…

简述建设电子商务网站步骤写软文怎么接单子

目录 今日良言:关关难过关关过,步步难行步步行 一、单例模式 1.饿汉模式 2.懒汉模式 二、工厂模式 今日良言:关关难过关关过,步步难行步步行 一、单例模式 首先来解释一下,什么是单例模式。 单例模式也就是单个…

搭建自己的博客网站做网站推广书范法吗

思路&#xff1a;将以桥为分界的所有连通分支进行缩点&#xff0c;得到一颗树&#xff0c;求出树的直径。再用树上的点减去直径&#xff0c;再减一 #pragma comment(linker, "/STACK:1024000000,1024000000") #include<iostream> #include<cstdio> #incl…

学校微网站模板工信部网站黑名单

总结 本系列是机器学习课程的系列课程&#xff0c;主要介绍机器学习中图像文本检索技术。此技术把自然语言处理和图像处理进行了融合。 参考 2024年&#xff08;第12届&#xff09;“泰迪杯”数据挖掘挑战赛 图像特征提取&#xff08;VGG和Resnet特征提取卷积过程详解&…