NodeRAG检索知识图谱复杂数据的启发
知识图谱保存各种类型数据,类型太多太杂,大部分情况做不到数据统一结构化和sql检索。
NodeRAG是近期新出现的基于LLM的知识图谱开源工具。
https://github.com/Terry-Xu-666/NodeRAG
这里通过分析NodeGraph检索过程,尝试构建包含复杂数据类型的知识库检索方案。
1 search源码
以下是NodeRAG search的源码,整体过程分为:
1)基于hnsw向量检索;
2)基于query entity的将缺检索;
3)基于1和2的检索结果进行graph search,借助LLM生成最终答案。
def search(self,query:str):retrieval = Retrieval(self.config,self.id_to_text,self.accurate_id_to_text,self.id_to_type)# HNSW search for enter points by cosine similarityquery_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)retrieval.HNSW_results_with_distance = 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)retrieval.accurate_results = accurate_results# Personlization for graph searchpersonlization = {ids:self.config.similarity_weight for ids in retrieval.HNSW_results}personlization.update({id:self.config.accuracy_weight for id in retrieval.accurate_results})weighted_nodes = self.graph_search(personlization)retrieval = self.post_process_top_k(weighted_nodes,retrieval)return retrieval
2 过程解析
2.1 hnsw search
hnsw是面向向量检索的近似最近邻搜索算法。
https://blog.csdn.net/liliang199/article/details/151312432
在获取到query后,首先通过hnsw.search,获取到与query向量最相似的topk节点。
2.2 accurate search
NodeRAG通过dompose_query请将问题query分解为一个实体list,其中每一项是句子的主要实体,如关键名词或对象。对应LLM prompt如下所示。
decompos_query_Chinese = '''
请将以下问题分解为一个 list,其中每一项是句子的主要实体(如关键名词或对象)。如果你对用户的意图或相关领域知识有充分把握,也可以包含密切相关的术语。如果不确定,请仅从问题中提取实体。请尽量减少囊括常见的名词,请将这些元素整合在一个单一的 list 中输出。
问题:{query}
https://github.com/Terry-Xu-666/NodeRAG/blob/main/NodeRAG/utils/prompt/decompose.py
使用这些获取到的实体进行精确检索,获得与query实体关联的节点。
2.3 graph search
hnsw search获得语义相关的节点,accurate获得实体相关的节点后,NodeGraph通过graph search的方式,查询与这些节点关联的节点。
在此基础上,基于图算法获取最相关的topk节点,组合为回答query问题的基础info,借助于LLM生成最终答案。
prompt示例如下
answer_prompt_Chinese = '''
---角色---
你是一个根据检索到的信息回答问题的细致助手。---目标---
提供清晰且准确的回答。仔细审查和验证检索到的数据,并结合任何相关的必要知识,全面地解决用户的问题。
如果你不确定答案,请直接说明——不要编造信息。
不要包含没有提供支持证据的细节。---输入---
检索到的信息:{info}用户问题:{query}
'''
https://github.com/Terry-Xu-666/NodeRAG/blob/main/NodeRAG/utils/prompt/answer.py
3 关联启示
受限于硬件资源,本地搭建NodeGraph不现实,然后可采用类似NodeRAG的思路搭建知识库。
假设,知识库包含多个mysql表和向量库:
mysql表保存员工表、设备表、设备状态。
向量库保存设备维护规范、培训材料、设备维护文档等。
query = “xxx设备目前是否需要维护,如何维护?”
可以采用类似的策略,高效完成知识库检索。
1)借助LLM先选定与query相关的mysql表和向量库,并将query拆分为实体和条件。
2)基于实体和条件检索mysql表,基于query向量检索向量库。
3)检索结果汇总为info,使用上文提到的answer模版组合成prompt,借助LLM生成答案。
整个过程确保了与query相关的材料都能汇总到info中,目前Deepseek以及类似LLM,是由能力给出合理可靠答案的。而且,整个过程仅需要2-3次LLM调用,tokens消耗相对受控。
reference
---
NodeRAG
https://github.com/Terry-Xu-666/NodeRAG
结合prompt分析NodeRAG的build过程
https://blog.csdn.net/liliang199/article/details/151191138
hnswlib-高维数据近似最近邻搜索示例
https://blog.csdn.net/liliang199/article/details/151312432