LeanRAG与KAG:知识图谱增强生成框架对比分析
背景与动机
检索增强生成(RAG)通过利用外部知识来增强大型语言模型,但其有效性常常因检索到上下文有缺陷或不完整的信息而受到影响。为解决这一问题,基于知识图谱的RAG方法应运而生,但仍然存在一些关键挑战:
- 语义孤岛问题:高级概念摘要作为断开的”语义孤岛”存在,缺乏跨社区推理所需的显式关系。
- 结构感知缺失:检索过程本身仍然缺乏结构感知,常常退化为低效的平面搜索,无法利用图谱丰富的拓扑结构。
- 推理能力不足:传统RAG对知识的逻辑关系不敏感,难以处理需要复杂推理的专业问题。
- 领域知识缺失:大语言模型在专业领域知识服务中存在局限性,无法满足高准确性和专业性的需求。
为解决这些问题,研究人员提出了LeanRAG和KAG两种知识图谱增强生成框架,它们通过不同的技术路径,提升了大语言模型在专业领域的推理能力和准确性。
LeanRAG框架详解
LeanRAG(Knowledge-Graph-Based Generation with Semantic Aggregation and Hierarchical Retrieval)是一个基于语义聚合与分层检索的知识图谱生成框架,由上海人工智能实验室等机构的研究人员提出。LeanRAG通过深度协作的知识聚合和检索策略,解决了”语义孤岛”和结构-检索不匹配问题。
LeanRAG首先采用一种新颖的语义聚合算法,该算法形成实体簇并构建聚合级别摘要之间的新显式关系,创建一个完全可导航的语义网络。这一过程包括:
- 递归语义聚类:利用高斯混合模型(GMM)对实体进行语义聚类,形成语义相关的实体组。
- 聚合实体生成:为每个聚类生成一个更抽象的聚合实体,代表该聚类的集体语义。
- 聚合关系生成:在聚合实体之间创建新的关系,防止在更高层次形成”语义孤岛”。
def semantic_aggregation(graph_layer):
# 步骤1: 语义嵌入
embeddings = {entity: encode(entity.description) for entity in graph_layer.entities}
# 步骤2: 高斯混合聚类
clusters = gmm_clustering(embeddings, num_clusters=m)
# 步骤3: 生成聚合实体
aggregated_entities = []
for cluster in clusters:
relations = get_intra_cluster_relations(cluster)
agg_entity = generate_aggregated_entity(cluster, relations)
aggregated_entities.append(agg_entity)
# 步骤4: 生成聚合关系
aggregated_relations = []
for i, entity_a in enumerate(aggregated_entities):
for j, entity_b in enumerate(aggregated_entities):
if i < j: # 避免重复
inter_cluster_relations = get_inter_cluster_relations(
clusters[i], clusters[j])
if len(inter_cluster_relations) > threshold:
agg_relation = generate_aggregated_relation(
entity_a, entity_b, inter_cluster_relations)
aggregated_relations.append(agg_relation)
return KnowledgeGraph(aggregated_entities, aggregated_relations)
LeanRAG采用自底向上、结构引导的检索策略,将查询锚定到最相关的细粒度实体,然后系统地遍历图谱的语义路径,收集简洁但上下文全面的证据集。这一策略包括:
- 初始实体锚定:在基础层执行密集检索搜索,识别与查询最语义相似的实体。
- LCA路径遍历:利用最低公共祖先(LCA)原则构建连接种子实体的最小子图。
- 上下文收集:收集LCA路径上的所有实体和关系,形成紧凑且连贯的上下文。
def structured_retrieval(query, hierarchical_graph):
# 步骤1: 初始实体锚定
base_layer = hierarchical_graph.get_base_layer()
seed_entities = top_n_entities(base_layer, query, n=10)
# 步骤2: 找到最低公共祖先
lca = find_lowest_common_ancestor(seed_entities, hierarchical_graph)
# 步骤3: 构建LCA路径
retrieval_paths = []
for entity in seed_entities:
path = shortest_path(hierarchical_graph, entity, lca)
retrieval_paths.append(path)
# 步骤4: 收集检索子图
retrieved_entities = set()
retrieved_relations = set()
for path in retrieval_paths:
for node in path.nodes:
retrieved_entities.add(node)
for edge in path.edges:
retrieved_relations.add(edge)
# 添加聚合层间关系
for layer in hierarchical_graph.layers:
for relation in layer.inter_cluster_relations:
if relation.source in retrieved_entities and relation.target in retrieved_entities:
retrieved_relations.add(relation)
# 步骤5: 返回原始文本块
original_chunks = get_original_chunks(retrieved_entities)
return RetrievalResult(retrieved_entities, retrieved_relations, original_chunks)
KAG框架详解
KAG(Knowledge Augmented Generation)是蚂蚁集团开源的一款知识增强生成框架,基于OpenSPG引擎和大型语言模型,设计了逻辑符号引导的混合推理引擎,将自然语言问题转化为结合语言和符号的问题求解过程,集成了图谱推理、逻辑计算、chunk检索、llm推理四种问题求解过程。
KAG采用层次化知识表示,将非结构化文本转为结构化知识图谱,定义概念类型、实体类型等数据结构,让知识表示更符合大语言模型理解能力,提升可解释性与应用范围。KAG能够处理非结构化数据、结构化信息和业务专家经验,并将它们融合到统一的业务知识图谱中。
class KnowledgeRepresentation:
def __init__(self):
self.concept_types = {} # 概念类型定义
self.entity_types = {} # 实体类型定义
self.relation_types = {} # 关系类型定义
self.attribute_types = {} # 属性类型定义
def add_concept_type(self, name, parent=None, description=""):
"""添加概念类型"""
self.concept_types[name] = {
"parent": parent,
"description": description
}
def add_entity_type(self, name, concept_type, attributes=[]):
"""添加实体类型"""
self.entity_types[name] = {
"concept_type": concept_type,
"attributes": attributes
}
def add_relation_type(self, name, domain, range, description=""):
"""添加关系类型"""
self.relation_types[name] = {
"domain": domain,
"range": range,
"description": description
}
def transform_text_to_kg(self, text):
"""将非结构化文本转换为知识图谱"""
# 1. 实体识别
entities = self.entity_recognition(text)
# 2. 关系抽取
relations = self.relation_extraction(text, entities)
# 3. 属性抽取
attributes = self.attribute_extraction(text, entities)
# 4. 构建知识图谱
kg = self.build_kg(entities, relations, attributes)
return kg
KAG实现了知识图谱与原始文本块之间的相互索引,提高了数据检索精确度和效率,增强了知识整合能力。通过语义分块、信息注入和领域知识约束,KAG能够有效提升知识检索和表示效率。互索引构建过程包括:
- 数据来源整合:收集非结构化数据、结构化数据和专家规则数据。
- 知识抽取与结构化:使用信息抽取技术从文本中提取实体、事件、概念和关系等信息。
- 知识语义对齐:对知识图谱中的实体实例进行分类,预测概念之间的超/下位词关系。
- 互索引构建:将原始文本根据语义、段落等因素进行分块,并为每个文本块赋予唯一的标识。
class MutualIndexing:
def __init__(self, kg, text_chunks):
self.kg = kg # 知识图谱
self.text_chunks = text_chunks # 文本块列表
self.kg_to_text = {} # 知识图谱到文本的映射
self.text_to_kg = {} # 文本到知识图谱的映射
def build_mutual_index(self):
"""构建互索引"""
# 1. 文本分块与标识
self.chunk_and_identify_text()
# 2. 知识抽取与结构化
entities, relations = self.extract_and_structure()
# 3. 知识语义对齐
self.semantic_alignment(entities, relations)
# 4. 构建互索引
self.build_index_mapping(entities, relations)
def chunk_and_identify_text(self):
"""文本分块与标识"""
for i, chunk in enumerate(self.text_chunks):
chunk_id = f"chunk_{i}"
self.text_to_kg[chunk_id] = {
"entities": [],
"relations": [],
"content": chunk
}
def extract_and_structure(self):
"""知识抽取与结构化"""
# 从文本中提取实体和关系
entities = []
relations = []
for chunk_id, chunk_data in self.text_to_kg.items():
# 实体识别
chunk_entities = self.entity_recognition(chunk_data["content"])
entities.extend([(entity, chunk_id) for entity in chunk_entities])
# 关系抽取
chunk_relations = self.relation_extraction(chunk_data["content"], chunk_entities)
relations.extend([(relation, chunk_id) for relation in chunk_relations])
return entities, relations
def build_index_mapping(self, entities, relations):
"""构建索引映射"""
# 构建知识图谱到文本的映射
for entity, chunk_id in entities:
if entity not in self.kg_to_text:
self.kg_to_text[entity] = []
self.kg_to_text[entity].append(chunk_id)
self.text_to_kg[chunk_id]["entities"].append(entity)
# 构建文本到知识图谱的映射
for relation, chunk_id in relations:
if relation not in self.kg_to_text:
self.kg_to_text[relation] = []
self.kg_to_text[relation].append(chunk_id)
self.text_to_kg[chunk_id]["relations"].append(relation)
KAG设计了一种逻辑符号引导的混合推理引擎,有规划、推理和检索三种运算符,可将自然语言问题转化为结合语言和符号的求解过程,集成图谱推理、逻辑计算、chunk检索和llm推理四种问题求解过程,通过符号驱动生成逻辑查询表达式,必要时调用外部知识库。
class HybridReasoningEngine:
def __init__(self, kg, llm):
self.kg = kg # 知识图谱
self.llm = llm # 大语言模型
self.operators = {
"plan": self.plan_operator,
"reason": self.reason_operator,
"retrieve": self.retrieve_operator
}
def solve(self, query):
"""求解问题"""
# 1. 问题理解与规划
plan = self.plan_operator(query)
# 2. 执行推理过程
result = self.execute_plan(plan)
# 3. 生成答案
answer = self.generate_answer(result, query)
return answer
def plan_operator(self, query):
"""规划运算符:将自然语言问题转化为逻辑形式"""
# 使用LLM将自然语言问题转化为逻辑形式
prompt = f"""
将以下自然语言问题转化为逻辑形式查询:
问题:{query}
请输出一个逻辑查询计划,包括:
1. 需要检索的实体和关系
2. 需要执行的推理步骤
3. 需要的计算操作
"""
logic_form = self.llm.generate(prompt)
return self.parse_logic_form(logic_form)
def reason_operator(self, logic_form):
"""推理运算符:执行逻辑推理"""
# 1. 图谱推理
kg_result = self.kg_reasoning(logic_form)
# 2. 逻辑计算
calc_result = self.logical_calculation(logic_form)
# 3. LLM推理
llm_result = self.llm_reasoning(logic_form)
# 整合推理结果
return self.integrate_results(kg_result, calc_result, llm_result)
def retrieve_operator(self, logic_form):
"""检索运算符:检索相关信息"""
# 1. 知识图谱检索
kg_subgraph = self.kg_retrieval(logic_form)
# 2. 文本块检索
text_chunks = self.text_retrieval(logic_form)
# 整合检索结果
return {
"kg_subgraph": kg_subgraph,
"text_chunks": text_chunks
}
def execute_plan(self, plan):
"""执行查询计划"""
context = {"query": plan["query"]}
for step in plan["steps"]:
operator_type = step["operator"]
operator_input = step["input"]
if operator_type in self.operators:
result = self.operators[operator_type](operator_input)
context[step["name"]] = result
return context
两者对比
LeanRAG和KAG都是基于知识图谱的增强生成框架,但它们在技术架构、推理能力和应用场景等方面存在一些差异。下面从几个关键维度对两者进行对比:
| 对比维度 | LeanRAG | KAG |
|---|---|---|
| 开发机构 | 上海人工智能实验室等 | 蚂蚁集团 |
| 核心引擎 | 自定义知识图谱引擎 | 基于OpenSPG引擎 |
| 知识表示 | 分层知识图谱,通过语义聚合算法构建 | 层次化知识表示,兼容无模式和有模式约束 |
| 检索策略 | 自底向上、基于LCA的结构化检索 | 知识图谱与文本互索引,逻辑形式引导的混合检索 |
| 推理能力 | 支持多跳推理,通过LCA路径遍历实现 | 支持复杂逻辑推理,集成图谱推理、逻辑计算、chunk检索和LLM推理 |
| 技术架构 | 语义聚合算法 + 结构引导检索策略 | KGBuilder + KGSolver + KAGModel |
| 应用场景 | 通用QA任务,多跳问答 | 专业领域知识服务,如医疗、金融、法律等 |
| 性能表现 | 在Mix数据集上总体质量得分8.59±0.01,减少46%检索冗余 | 在电子政务问答准确率91.6%,医疗问答指标解读准确率90%以上 |
| 开源情况 | 已开源,GitHub: https://github.com/RaZzzyz/LeanRAG | 已开源,GitHub: https://github.com/OpenSPG/KAG |
总结与展望
LeanRAG和KAG作为两种先进的知识图谱增强生成框架,分别从不同角度解决了传统RAG方法的局限性,为大语言模型在专业领域的应用提供了新的可能性。
核心贡献
- LeanRAG通过语义聚合算法和自底向上、结构引导的检索策略,解决了”语义孤岛”和结构-检索不匹配问题,实现了高效的知识检索和推理。
- KAG通过知识表示增强、知识图谱与文本互索引、逻辑形式引导的混合推理引擎等技术,提升了大语言模型在专业领域的推理能力和准确性。
未来发展方向
- 知识表示与构建:进一步优化知识表示方法,提高知识图谱的构建效率和质量,支持更多类型的知识和关系。
- 推理能力增强:增强框架的推理能力,支持更复杂的逻辑推理和多跳推理,提高推理的准确性和效率。
- 多模态融合:支持多模态数据的处理和融合,如图像、音频、视频等,扩展框架的应用范围。
- 领域自适应:提高框架在不同领域的自适应能力,降低领域适配的成本和难度。
- 性能优化:优化框架的性能,提高检索和推理的效率,降低资源消耗。
总的来说,LeanRAG和KAG代表了知识图谱增强生成领域的两个重要方向,它们的发展将推动大语言模型在专业领域的应用,为人工智能的发展带来新的可能性。