之前介绍了NodeRAG的节点类型和安装过程。

linux环境conda安装NodeRAG示例-CSDN博客

这里尝试从prompt代码角度分析NodeRAG如何将文档转化为节点、关系。

1 整体处理流程

NodeRAG定义了如下所示状态及处理流程。

# define the state to pipeline mapping
self.state_pipeline_map = {
            State.DOCUMENT_PIPELINE: document_pipline,
            State.TEXT_PIPELINE: text_pipline,
            State.GRAPH_PIPELINE: Graph_pipeline,
            State.ATTRIBUTE_PIPELINE: Attribution_generation_pipeline,
            State.EMBEDDING_PIPELINE: Embedding_pipeline,
            State.SUMMARY_PIPELINE: SummaryGeneration,
            State.INSERT_TEXT: Insert_text,
            State.HNSW_PIPELINE: HNSW_pipeline
}
        

状态转化序列如下所示,依次是INIT、DOCUMENT、TEXT、GRAPH、ATTRIBUTE、EMBEDDING、SUMMARY、INSERT、HNSW和FINISHED,涵盖文档划分、图谱化、特征提取、向量化、内容摘要等。

# define the state sequence
self.state_sequence = [
            State.INIT,
            State.DOCUMENT_PIPELINE,
            State.TEXT_PIPELINE,
            State.GRAPH_PIPELINE,
            State.ATTRIBUTE_PIPELINE,
            State.EMBEDDING_PIPELINE,
            State.SUMMARY_PIPELINE,
            State.INSERT_TEXT,
            State.HNSW_PIPELINE,
            State.FINISHED
]

https://github.com/Terry-Xu-666/NodeRAG/blob/main/NodeRAG/build/Node.py

这里重点关注文档切分、语义单元提取(摘要、实体、关系)、关联关系构建过程。

2 文档初步切分

State.DOCUMENT_PIPELINE: document_pipline环节

NodeRAG文档切分代码,输入是文件读出的字符串,块大小chunk_size对应token数,实际切分end边界按token数计算。

from typing import List
from .token_utils import get_token_counterclass SemanticTextSplitter:def __init__(self, chunk_size: int = 1048, model_name: str = "gpt-4o-mini"):"""Initialize the text splitter with chunk size and model name parameters.Args:chunk_size (int): Maximum number of tokens per chunkmodel_name (str): Model name for token counting"""self.chunk_size = chunk_sizeself.token_counter = get_token_counter(model_name)def split(self, text: str) -> List[str]:"""Split text into chunks based on both token count and semantic boundaries."""chunks = []start = 0text_len = len(text)while start < text_len:# add 4 times of chunk_size string to the start positionend = start + self.chunk_size * 4  # assume each token is 4 charactersif end > text_len:end = text_len# get the current text fragmentcurrent_chunk = text[start:end]# if the token count of the current fragment exceeds the limit, need to find the split pointwhile self.token_counter(current_chunk) > self.chunk_size and start < end:# find semantic boundary in the current rangeboundaries = ['\n\n', '\n', '。', '.', '!', '!', '?', '?', ';', ';']semantic_end = endfor boundary in boundaries:boundary_pos = current_chunk.rfind(boundary)if boundary_pos != -1:semantic_end = start + boundary_pos + len(boundary)break# if found semantic boundary, use it; otherwise, force truncation by characterif semantic_end < end:end = semantic_endelse:# 没找到合适的语义边界,往回数token直到满足大小限制end = start + int(len(current_chunk) // 1.2)current_chunk = text[start:end]# 添加处理好的文本块chunk = current_chunk.strip()if chunk:chunks.append(chunk)# 移动到下一个起始位置start = endreturn chunks

NodeRAG/NodeRAG/utils/text_spliter.py at main · Terry-Xu-666/NodeRAG · GitHub

3 语义单元提取

State.TEXT_PIPELINE: text_pipline环节

将文本切分为块后,进一步从块中提取语义单元,每个单元包含对特定事件或活动的详细描述哦

1)为每个语义单元提供总结,同时保留与原始上下文相关的所有关键细节。
2)直接从每个语义单元的原始文本中提取所有实体,而不是从改写的总结中提取。
3)从第2步中提取的实体中列出语义单元内的所有关系,其中关系类型可以是描述性句子。使用格式"ENTITY_A,RELATION_TYPE,ENTITY_B",请确保字符串中包含三个元素,分别表示两个实体和关系类型。

因为文本被切分为一个个独立语义单元,NodeRAG有可能解决了RAG语义切分问题,

示例中text为文本切分后的块。

text_decomposition_prompt_Chinese = """
目标:给定一个文本,将该文本被划分为多个语义单元,每个单元包含对特定事件或活动的详细描述。 
执行以下任务:
1.为每个语义单元提供总结,同时保留与原始上下文相关的所有关键细节。
2.直接从每个语义单元的原始文本中提取所有实体,而不是从改写的总结中提取。
3.从第2步中提取的实体中列出语义单元内的所有关系,其中关系类型可以是描述性句子。使用格式"ENTITY_A,RELATION_TYPE,ENTITY_B",请确保字符串中包含三个元素,分别表示两个实体和关系类型。

要求:

时间实体:根据文本中提到的日期或时间的具体部分来表示时间实体,不填补缺失部分。

每个语义单元应以一个字典表示,包含三个键:semantic_unit(每个语义单元的概括性总结)、entities(直接从每个语义单元的原始文本中提取的实体列表,实体名格式为大写)、relationships(描述性句子形式的提取关系字符串三元组列表)。所有这些字典应存储在一个列表中,以便管理和访问。

示例:

文本:2024年9月,艾米莉·罗伯茨博士前往巴黎参加国际可再生能源会议。在她的访问期间,她与几家欧洲公司探讨了合作并介绍了她在提高太阳能板效率方面的最新研究。与此同时,在世界的另一边,她的同事约翰·米勒博士在亚马逊雨林进行实地工作。他记录了几种新物种,并观察了森林砍伐对当地野生动物的影响。两位学者的工作在各自的领域内至关重要,对环境保护工作做出了重大贡献。
输出:
[
  {{
    "semantic_unit": "2024年9月,艾米莉·罗伯茨博士参加了在巴黎举行的国际可再生能源会议,她在会上介绍了她关于太阳能板效率提高的研究并探讨了与欧洲公司的合作。",
    "entities": ["艾米莉·罗伯茨博士", "2024-09", "巴黎", "国际可再生能源会议", "欧洲公司", "太阳能板效率"],
    "relationships": [
      "艾米莉·罗伯茨博士, 参加了, 国际可再生能源会议",
      "艾米莉·罗伯茨博士, 探讨了合作, 欧洲公司",
      "艾米莉·罗伯茨博士, 介绍了研究, 太阳能板效率"
    ]
  }},
  {{
    "semantic_unit": "约翰·米勒博士在亚马逊雨林进行实地工作,记录了几种新物种并观察了森林砍伐对当地野生动物的影响。",
    "entities": ["约翰·米勒博士", "亚马逊雨林", "新物种", "森林砍伐", "当地野生动物"],
    "relationships": [
      "约翰·米勒博士, 在, 亚马逊雨林进行实地工作",
      "约翰·米勒博士, 记录了, 新物种",
      "约翰·米勒博士, 观察了, 森林砍伐对当地野生动物的影响"
    ]
  }},
  {{
    "semantic_unit": "艾米莉·罗伯茨博士和约翰·米勒博士的工作在各自的领域内至关重要,对环境保护工作做出了重大贡献。",
    "entities": ["艾米莉·罗伯茨博士", "约翰·米勒博士", "环境保护"],
    "relationships": [
      "艾米莉·罗伯茨博士, 贡献于, 环境保护",
      "约翰·米勒博士, 贡献于, 环境保护"
    ]
  }}
]

##########
实际数据: 
########## 
文本:{text} 
"""

NodeRAG/NodeRAG/utils/prompt/text_decomposition.py at main · Terry-Xu-666/NodeRAG · GitHub

4 实体关系重建

State.GRAPH_PIPELINE: Graph_pipeline环节

之前抽取的关系relationship,格式有可能是错误的,需要重新按照'实体A,关系类型,实体B'重构。

prompt示例如下。

relationship_reconstraction_prompt_Chinese = """
你将获得一个包含实体之间关系的元组字符串。这些关系的格式是错误的,需要被重新构建。正确的格式应为:'实体A,关系类型,实体B',每个元组应包含三个元素:两个实体和一个关系类型。你的任务是将每个关系重新构建为以下格式:{{'source': '实体A', 'relation': '关系类型', 'target': '实体B'}}。请确保输出遵循此结构,准确映射提供的实体和关系。
错误的关系元组:{relationship}
"""

https://github.com/Terry-Xu-666/NodeRAG/blob/main/NodeRAG/utils/prompt/relationship_reconstraction.py

除此之外,Graph环节还包括基本图结构的重建,具体参考以下链接。

https://github.com/Terry-Xu-666/NodeRAG/blob/main/NodeRAG/build/pipeline/graph_pipeline.py

5 关联特征总结

State.ATTRIBUTE_PIPELINE: Attribution_generation_pipeline环节

生成所给实体的简明总结,涵盖其基本属性和重要相关关系。目的是生成属性节点,为重要实体提供详细描述。entity是实体,semantic_units是于entity相关联的语义单元描述,relationships是实体与语义单元关联的相关关系。

attribute_generation_prompt_Chinese = """
生成所给实体的简明总结,涵盖其基本属性和重要相关关系。该总结应像小说中的人物简介或产品描述一样,提供引人入胜且精准的概览。确保输出只包含该实体的总结,不包含任何额外的解释或元数据。字数不得超过2000字,但如果输入材料有限,可以少于2000字。重点在于通过流畅的叙述提炼出最重要的见解,突出实体的核心特征及重要关系。
实体: {entity}
相关语义单元: {semantic_units}
相关关系: {relationships}
"""

如果一个完整语义描述横跨多个节点,这种方式能有效涵盖这种情况。

6 社区摘要总结

State.SUMMARY_PIPELINE: SummaryGeneration环节

使用社区聚类算法找到内容相关的节点,并将这些节点内容组织成一个完整文本。从文本数据中提取不同类别的高层次信息,例如概念、主题、相关理论、潜在影响和关键见解。每条信息应含一个简洁的标题和相应的描述,以反映该聚类文本中的独特视角。基于每条信息构建高级元素节点,包含从社区分析中提取的深层洞察。

community_summary_Chinese = """你将收到来自同一聚类的一组文本数据。你的任务是从文本数据中提取不同类别的高层次信息,例如概念、主题、相关理论、潜在影响和关键见解。每条信息应包含一个简洁的标题和相应的描述,以反映该聚类文本中的独特视角。
请不要试图包含所有可能的信息;相反,选择在该聚类中最具重要性和多样性的元素。避免冗余信息——如果有高度相似的内容,请将它们合并为一个综合条目。确保提取的高层次信息反映文本中的多维度内容,提供全面的概览。
聚类文本数据:
{content}
"""

7 query实体提取

将用户问题query分解为一个 list,其中每一项是句子的主要实体(如关键名词或对象)。

目的是利用提取实体,在图中搜索相关节点。

decompos_query_Chinese = '''
请将以下问题分解为一个 list,其中每一项是句子的主要实体(如关键名词或对象)。如果你对用户的意图或相关领域知识有充分把握,也可以包含密切相关的术语。如果不确定,请仅从问题中提取实体。请尽量减少囊括常见的名词,请将这些元素整合在一个单一的 list 中输出。
问题:{query}
'''

reference

---

NodeRAG

https://github.com/Terry-Xu-666/NodeRAG

linux环境conda安装NodeRAG示例

https://blog.csdn.net/liliang199/article/details/151101894

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

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

相关文章

我改写的二分法XML转CSV文件程序速度追上了张泽鹏先生的

以下是美团龙猫初稿&#xff0c;我改正&#xff0c;DeepSeek重新格式化的代码。 重要改正点&#xff1a; 1.二分查找用goto控制迭代&#xff0c;返回<row的正确位置 2.在缓冲区头填上父标签使expat能连续解析不报错 #include <stdio.h> #include <stdlib.h> #in…

使用Docker安装Stirling-PDF(PDF工具)

1、官方Web端 详见&#xff1a;https://stirlingpdf.io/?langzh_CN 2、安装Docker 合集&#xff1a;Docker安装与使用 3、安装Stirling-PDF 详见&#xff1a; https://docs.stirlingpdf.com/Installation/Docker%20Install https://hub.docker.com/r/stirlingtools/stirli…

【开题答辩全过程】以 基于微信小程序的“XIN”学生组织管理系统为例,包含答辩的问题和答案

个人简介一名14年经验的资深毕设内行人&#xff0c;语言擅长Java、php、微信小程序、Python、Golang、安卓Android等开发项目包括大数据、深度学习、网站、小程序、安卓、算法。平常会做一些项目定制化开发、代码讲解、答辩教学、文档编写、也懂一些降重方面的技巧。感谢大家的…

Iwip驱动8211FS项目——MPSOC实战1

硬件设计采用RTL8211FS芯片&#xff0c;vitis默认的IWIP库不支持此芯片。 网口相关知识可以翻看前期文章 以太网PHY_MDIO通信&#xff08;基于RTL8211&#xff09;--FPGA学习笔记22-CSDN博客 以太网ARP协议——FPGA学习笔记23_fpga以太网学习-CSDN博客 以太网ICMP协议(ping…

《Science》神经炎症综述思路套用:从机制到跨领域研究范式

2025 年 6 月首都医科大学团队在《Science》发表的综述《Immunological dimensions of neurological disease: from mechanisms to therapeutics》(神经疾病的免疫维度:从机制到疗法),系统性解析了神经炎症的动态演变规律与双面性,提出阶段化、精准化治疗新范式。本文基于…

嵌入式学习笔记--Linux系统编程阶段--DAY07进程间通信--存储映射和共享内存

1.存储映射存储映射 I/O (Memory-mapped I/O) 使一个磁盘文件与存储空间中的一个缓冲区相映射。于是当从缓冲区中取数据&#xff0c;就相当于读文件中的相应字节。于此类似&#xff0c;将数据存入缓冲区&#xff0c;则相应的字节就自动写入文件。这样&#xff0c;就可在不适用 …

.Net程序员就业现状以及学习路线图(四)

一、.Net程序员就业现状分析 1. 市场需求与岗位分布 2025年数据显示&#xff0c;.Net开发岗位在全国IT岗位中占比约0.009%&#xff0c;主要集中在一线城市如深圳、上海等地 2 4。行业分布呈现以下特点&#xff1a;‌软件行业‌&#xff1a;占比43.3% ‌研发领域‌&#xff1a;占…

Monorepo 是什么?如何使用并写自己的第三方库

1. 什么是 Monorepo&#xff1f; Monorepo&#xff08;单仓库&#xff09;指的是把多个项目/包放在一个代码仓库里统一管理。常见结构&#xff1a; /repo-root/packages/ui-lib/utils/apps/web-apppackage.jsonpnpm-workspace.yaml好处&#xff1a; 内部库能直接共享&#xff0…

使用CI/CD部署后端项目(gin)

写在前面&#xff1a;使用CI/CD部署gin项目到服务器中 前端可以参考&#xff1a;使用CI/CD部署nextjs项目 使用 GitHub Actions 配置后端 CI/CD&#xff08;含部署到服务器&#xff09; 本文档介绍如何在 GitHub 仓库中配置 CI/CD&#xff0c;将 PROJECT_NAME 项目自动构建并…

Coze添加知识库解析的Embedding和PaddleOCR模型配置

1. Embedding模型配置 使用ollama模型&#xff0c;导入qwen3的embedding-8B模型&#xff0c;导入流程参考&#xff1a; Ollama离线部署模型 qwen3-Embedding模型文件可从魔塔社区下载&#xff1a; Qwen3-Embedding-8B 1.2 Coze配置 在coze_studio/docker目录下输入: vim .en…

02-Media-6-rtsp_server.py 使用RTSP服务器流式传输H264和H265编码视频和音频的示例程序

rtsp_server.py 是使用k230的板载摄像头和WIFI联网功能,使用RTSP服务器流式传输视频和音频的程序示例。程序核心是创建了一个RtspServer类,该类用于初始化、启动、停止RTSP服务器,并进行视频和音频的流传输。 一、首先,程序导入必要的模块,包括视频编码、传感器、媒体处理…

13-Java-面向对象-封装和this关键字

文章目录封装this关键字封装 告诉我们&#xff0c;如何正确设计对象的属性和方法。原则&#xff1a;对象代表什么&#xff0c;就得封装对应的数据&#xff0c;并提供数据对应的行为 package common;/*** Author: 大海* Date: 2025-09-06*/public class GirlFriend {/*private…

三高项目-缓存设计

三高项目-缓存设计 分流、并发 导流&#xff1a;将原本复杂操作的请求&#xff0c;引导到简单的操作上。以后再来查&#xff0c;不需要经过复杂的计算。 成本&#xff1a;空间&#xff0c;收益&#xff1a;节省了时间。 不要以为仅仅是 redis&#xff0c;map等。 对应。kv…

happen-before原则

什么是 happen-before 原则&#xff1f; happen-before 是一个逻辑关系&#xff0c;用于描述两个操作之间的 “先后顺序”—— 如果操作 A happen-before 操作 B&#xff0c;那么 A 的执行结果必须对 B 可见&#xff0c;且 A 的执行顺序在逻辑上先于 B。也就是保证指令有序性和…

4.1 机器学习 - 评估指标

模型评估是判断 “模型是否有效” 的核心环节&#xff0c;需结合任务类型&#xff08;分类 / 回归&#xff09;、数据分布&#xff08;如类别不平衡&#xff09;和商业目标选择指标。本节聚焦分类任务的核心评估指标&#xff0c;从定义、计算逻辑到适用场景逐一拆解&#xff0c…

雅菲奥朗SRE知识墙分享(七):『可观测性的定义与实践』

在分布式系统日益复杂的当下&#xff0c;故障不再是“是否发生”&#xff0c;而是“何时爆发”。SRE可观测性正是应对不确定性的“显微镜”与“导航仪”&#xff1a;通过指标、日志、追踪三大数据血脉&#xff0c;实时外化系统黑盒&#xff0c;让每一次抖动、每一行报错、每一次…

C++ 详细讲解vector类

目录 1. 什么是vector? 2. vector的使用 1. 构造函数---初始化 1. 默认构造函数(无参构造&#xff09; 2. 填充构造函数(指定数量和初始值&#xff09; 3. 范围构造函数(通过迭代器拷贝其他容器元素&#xff09; 4. 拷贝构造函数(直接拷贝另一个vector&#xff09; 注…

Windows Server2012 R2 安装.NET Framework 3.5

Windows Server2012 R2 安装.NET Framework 3.5 虚拟机系统是Windowsserver 2012R2&#xff0c;在安装SQlserver2012时候警告未安装.NET Framework 3.5。于是找了个.NET Framework 3.5的安装包&#xff0c;但是由于系统原因无法正常安装。按照提示从控制面板-程序-启动或关闭Wi…

IDEA中Transaction翻译插件无法使用,重新配置Transaction插件方法

原因 由于Transaction默认的翻译引擎为谷歌翻译&#xff0c;由于一些原因&#xff0c;这个翻译无法使用&#xff0c;因此导致插件无法使用。 解决办法 更换Transaction插件翻译引擎即可。 方法步骤 1.进入Idea的设置里&#xff0c;找到Tool下的Transaction选项2.更改翻译引擎&a…

外置flash提示音打包脚本

批处理脚本说明文档 - 音频资源打包与分发 一、脚本功能概述 本批处理脚本&#xff08;.bat 文件&#xff09;用于将指定目录下的多个音频文件&#xff08;.wtg 和 .mp3 格式&#xff09;打包为音频资源配置文件&#xff08;tone.cfg&#xff09;&#xff0c;进一步将配置文件与…