結合prompt分析NodeRAG的build過程

之前介紹了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;進一步將配置文件與…