这些不同类型的节点通过边(Edge)相互连接,形成了一个复杂而丰富的知识图谱。这种结构不仅仅存储了原始信息,更捕捉了信息之间的内在联系,为后续的智能检索奠定了基础。
从代码实现来看,NodeRAG 使用 NetworkX 库构建图结构:
defadd_semantic_unit(self, semantic_unit
ict, text_hash_id:str):
semantic_unit = Semantic_unit(semantic_unit, text_hash_id)
ifself.G.has_node(semantic_unit.hash_id):
self.G.nodes[semantic_unit.hash_id]['weight'] +=1
else:
self.G.add_node(semantic_unit.hash_id,type='semantic_unit', weight=1)
self.semantic_units.append(semantic_unit)
returnsemantic_unit.hash_idNodeRAG 采用了精心设计的流水线架构,将原始文本转化为结构化的知识图谱。整个流水线包含多个关键阶段:
这种流水线设计实现了从非结构化文本到高度结构化知识图谱的转换,每个阶段都专注于特定的数据处理任务。
NodeRAG 的检索系统融合了多种先进技术,实现了精准而全面的信息检索:
# HNSW search for enter points by cosine similarity
query_embedding = np.array(self.config.embedding_client.request(query), dtype=np.float32)
HNSW_results =self.hnsw.search(query_embedding, HNSW_results=self.config.HNSW_results)# Decompose query into entities and accurate search for short words level items
decomposed_entities =self.decompose_query(query)
accurate_results =self.accurate_search(decomposed_entities)# Personalization for graph search
personalization = {ids:self.config.similarity_weightforidsinretrieval.HNSW_results}
personalization.update({id:self.config.accuracy_weightforidinretrieval.accurate_results})
weighted_nodes =self.graph_search(personalization)这种多策略融合的检索方法,既考虑了文本的语义相似性,又利用了图结构中的关系信息,实现了更加精准和全面的信息检索。
NodeRAG 实现了一种优化的稀疏个性化 PageRank 算法,利用 SciPy 的稀疏矩阵计算能力,高效处理大规模图结构:
defPPR(self, personalization:dict[str,float], alpha:float=0.85, max_iter:int=100, epsilons:float=1e-5):
probs = np.zeros(len(self.nodes))
fornode,probinpersonalization.items():
probs[self.nodes.index(node)] = prob
probs = probs/np.sum(probs)
foriinrange(max_iter):
probs_old = probs.copy()
probs = alpha*self.trans_matrix.dot(probs) + (1-alpha)*probs
ifnp.linalg.norm(probs-probs_old)<epsilons:
break
returnsorted(zip(self.nodes,probs), key=itemgetter(1), reverse=True)这一算法使得 NodeRAG 能够在复杂的异构图上高效地进行节点重要性计算,为精准检索提供支持。
NodeRAG 支持增量式的图更新,这意味着当有新的文档加入时,系统不需要重建整个知识图谱,而是能够智能地将新信息整合到现有结构中:
asyncdefstate_transition(self):
# ...
ifself.Current_state == State.FINISHED:
ifself.Is_incremental:
ifself.web_ui:
self.console.print("[bold green]Detected incremental file, Continue building.[/bold green]")
self.Current_state = State.DOCUMENT_PIPELINE
self.Is_incremental =False
# ...这一特性大大提高了系统在实际应用中的灵活性和效率。
NodeRAG 实现了一套智能的后处理机制,根据节点类型和重要性进行筛选和组合,确保检索结果的多样性和全面性:
defpost_process_top_k(self, weighted_nodes
ist[str], retrieval:Retrieval)->Retrieval:
entity_list = []
high_level_element_title_list = []
relationship_list = []
# ... 根据节点类型进行筛选和限制
# 关联属性节点
forentityinentity_list:
attributes =self.G.nodes[entity].get('attributes')
ifattributes:
forattributeinattributes:
ifattributenotinretrieval.unique_search_list:
retrieval.search_list.append(attribute)
retrieval.unique_search_list.add(attribute)
# ...在医学、法律、金融等专业领域,知识结构复杂且相互关联。NodeRAG 的异构图结构能够精确捕捉这些领域中的专业概念及其关系,提供更准确的问答支持。例如,在医学领域,系统可以同时考虑疾病症状、治疗方法、药物相互作用等多方面信息,给出全面的医疗建议。
企业内部积累了大量文档、报告、邮件等非结构化信息。NodeRAG 可以将这些分散的信息转化为结构化的知识图谱,帮助员工快速定位所需信息。当员工询问"上季度销售策略的效果如何"时,系统能够关联销售报告、客户反馈、市场分析等多种信息源,提供综合性的答案。
研究人员需要从海量论文中寻找相关工作并理解研究脉络。NodeRAG 可以构建论文之间的引用关系、方法创新、实验结果等多维度的关联,帮助研究者快速掌握研究领域的发展状况和关键突破。
电商、内容平台等需要为用户提供个性化推荐。NodeRAG 的异构图可以同时建模用户偏好、商品特性、评价情感等多种信息,通过图结构捕捉它们之间的复杂关系,从而提供更精准的推荐。
尽管 NodeRAG 在异构图结构的检索增强生成方面取得了显著进步,但仍面临一些技术挑战:
随着知识库规模增长,图结构的计算复杂度也会增加。尽管 NodeRAG 实现了稀疏矩阵优化,但在极大规模数据集上的计算效率仍是一个挑战。未来可能需要引入图分区、并行计算等技术进一步提升性能。
自动构建的知识图谱可能包含错误或不一致的信息。如何有效评估和提升知识图谱的质量,是 NodeRAG 类系统面临的重要问题。
当前的 NodeRAG 主要处理文本信息,但实际应用中往往涉及图像、视频等多模态数据。如何将这些不同模态的信息有机整合到异构图结构中,是一个值得探索的方向。
NodeRAG 通过引入异构图结构,为检索增强生成系统带来了革命性的变化。它不再将信息视为孤立的文本块,而是构建了一个反映知识内在关联的网络结构。这种方法不仅提升了检索的精准度和全面性,也为生成系统提供了更丰富的知识基础。
随着人工智能和知识图谱技术的不断发展,我们可以期待 NodeRAG 这样的系统在更多领域发挥关键作用,帮助人们更高效地组织、检索和利用知识,推动智能信息处理的新篇章。
| 欢迎光临 链载Ai (https://www.lianzai.com/) | Powered by Discuz! X3.5 |