2.1 核心架构设计 — LightRAG架构蓝图 本节导读:通过深入理解LightRAG的双层架构设计,读者将掌握图+向量检索的技术实现原理,理解组件间的协同工作机制,为后续模块开发和性能优化奠定坚实基础。 学习目标 掌握LightRAG双层架构的设计理念和整体架构 理解图检索与向量检索的技术特点和适用场景 了解各核心组件的功能定位和协作关系 学会根据应用场景选择合适的检索策略 核心概念 LightRAG的核心架构采用"图+向量"双层检索的轻量级设计,通过语义图谱构建和向量检索的有机结合,实现了从粗粒度到细粒度的多层次知识检索能力。
本节导读:通过深入理解LightRAG的双层架构设计,读者将掌握图+向量检索的技术实现原理,理解组件间的协同工作机制,为后续模块开发和性能优化奠定坚实基础。
LightRAG的核心架构采用"图+向量"双层检索的轻量级设计,通过语义图谱构建和向量检索的有机结合,实现了从粗粒度到细粒度的多层次知识检索能力。
图检索层和向量检索层并非简单并列,而是通过协同配合形成完整的知识检索链路:
# 核心依赖包 torch>=2.0.0 # 深度学习框架 transformers>=4.30.0 # 预训练模型支持 networkx>=3.0 # 图结构操作 scikit-learn>=1.3.0 # 向量化处理 numpy>=1.24.0 # 数值计算 pandas>=2.0.0 # 数据处理
# 导入必要的库 import torch from transformers import AutoTokenizer, AutoModel import networkx as nx from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.metrics.pairwise import cosine_similarity import json import logging # 配置日志 logging.basicConfig(level=logging.INFO) logger = logging.getLogger(__name__)
class GraphRetrievalLayer: """图检索层:构建基于知识图谱的检索能力""" def __init__(self, llm_client): self.llm_client = llm_client self.knowledge_graph = nx.DiGraph() self.entity_relation_map = {} def build_knowledge_graph(self, documents): """构建语义知识图谱""" logger.info("开始构建知识图谱...") # 使用LLM提取实体和关系 for doc in documents: entities, relations = self._extract_entities_relations(doc['content']) # 添加节点 for entity in entities: self.knowledge_graph.add_node(entity['name'], type=entity['type'], description=entity['description']) # 添加边 for relation in relations: self.knowledge_graph.add_edge(relation['source'], relation['target'], relation_type=relation['type']) logger.info(f"知识图谱构建完成,包含{len(self.knowledge_graph.nodes)}个节点,{len(self.knowledge_graph.edges)}条边") def _extract_entities_relations(self, text): """使用LLM提取实体和关系""" # 构建提示词 prompt = f""" 请从以下文本中提取实体和关系: 文本:{text[:2000]} # 限制长度避免token溢出 请按以下JSON格式返回: {{ "entities": [ {{ "name": "实体名称", "type": "实体类型", "description": "实体描述" }} ], "relations": [ {{ "source": "源实体", "target": "目标实体", "type": "关系类型" }} ] }} """ # 调用LLM response = self.llm_client.generate(prompt) result = json.loads(response) return result['entities'], result['relations'] def graph_reasoning(self, query, max_depth=2): """基于图谱的推理查询""" # 1. 查询实体识别 query_entities = self._extract_entities_from_query(query) # 2. 图谱遍历 relevant_entities = set() for entity in query_entities: # 广度优先搜索相关实体 neighbors = nx.single_source_shortest_path_length( self.knowledge_graph, entity, cutoff=max_depth ) relevant_entities.update(neighbors.keys()) # 3. 构建上下文 context = self._build_context_from_entities(relevant_entities) return context
class VectorRetrievalLayer: """向量检索层:基于语义相似度的检索""" def __init__(self, embedding_model_name="sentence-transformers/all-MiniLM-L6-v2"): self.embedding_model = None self.vectorizer = TfidfVectorizer(max_features=5000) self.document_vectors = None self.documents = [] self.model_name = embedding_model_name def initialize_model(self): """初始化向量模型""" try: from sentence_transformers import SentenceTransformer self.embedding_model = SentenceTransformer(self.model_name) logger.info(f"向量模型 {self.model_name} 初始化成功") except Exception as e: logger.error(f"向量模型初始化失败: {e}") raise def index_documents(self, documents): """为文档建立索引""" self.documents = documents # 1. 使用TF-IDF向量作为基础 self.vectorizer.fit([doc['content'] for doc in documents]) tfidf_matrix = self.vectorizer.transform([doc['content'] for doc in documents]) self.document_vectors = tfidf_matrix # 2. 使用预训练模型获得语义向量(可选) if self.embedding_model: document_texts = [doc['content'] for doc in documents] semantic_vectors = self.embedding_model.encode(document_texts) self.semantic_vectors = semantic_vectors logger.info(f"语义向量索引建立完成,共{len(documents)}个文档") def similarity_search(self, query, top_k=5, method="semantic"): """相似度搜索""" if method == "semantic": return self._semantic_search(query, top_k) else: return self._keyword_search(query, top_k) def _semantic_search(self, query, top_k): """语义搜索""" if self.embedding_model is None: raise ValueError("语义模型未初始化") # 编码查询向量 query_vector = self.embedding_model.encode([query]) # 计算相似度 similarities = cosine_similarity(query_vector, self.semantic_vectors)[0] # 获取top-k结果 top_indices = similarities.argsort()[-top_k:][::-1] results = [] for idx in top_indices: result = { 'document': self.documents[idx], 'similarity': similarities[idx], 'rank': len(results) + 1 } results.append(result) return results def _keyword_search(self, query, top_k): """关键词搜索""" # 转换查询向量 query_vector = self.vectorizer.transform([query]) # 计算TF-IDF相似度 similarities = cosine_similarity(query_vector, self.document_vectors)[0] # 获取top-k结果 top_indices = similarities.argsort()[-top_k:][::-1] results = [] for idx in top_indices: result = { 'document': self.documents[idx], 'similarity': similarities[idx], 'rank': len(results) + 1 } results.append(result) return results
class LightRAGRetriever: """LightRAG双层检索引擎""" def __init__(self, llm_client, config=None): self.config = config or {} self.graph_layer = GraphRetrievalLayer(llm_client) self.vector_layer = VectorRetrievalLayer() self.fusion_strategy = self.config.get('fusion_strategy', 'weighted') def setup(self, documents): """初始化检索引擎""" logger.info("初始化LightRAG检索引擎...") # 1. 构建知识图谱 self.graph_layer.build_knowledge_graph(documents) # 2. 建立向量索引 self.vector_layer.initialize_model() self.vector_layer.index_documents(documents) logger.info("LightRAG检索引擎初始化完成") def retrieve(self, query, top_k=10): """执行双层检索""" logger.info(f"开始检索查询: {query}") # 1. 图检索 graph_results = self.graph_layer.graph_reasoning(query) graph_context = self._format_graph_results(graph_results) # 2. 向量检索 vector_results = self.vector_layer.similarity_search(query, top_k//2) vector_context = self._format_vector_results(vector_results) # 3. 融合结果 if self.fusion_strategy == "weighted": final_results = self._weighted_fusion(graph_context, vector_context, top_k) elif self.fusion_strategy == "rank_fusion": final_results = self._rank_fusion(graph_context, vector_context, top_k) else: final_results = self._simple_concatenation(graph_context, vector_context, top_k) logger.info(f"检索完成,返回{len(final_results)}个结果") return final_results def _weighted_fusion(self, graph_results, vector_results, top_k): """加权融合策略""" # 图检索权重 graph_weight = 0.6 vector_weight = 0.4 # 归一化分数 max_sim = max([r['score'] for r in vector_results]) if vector_results else 1.0 fused_results = [] # 处理图检索结果 for result in graph_results: fused_results.append({ 'content': result['content'], 'score': result.get('confidence', 0.8) * graph_weight, 'source': 'graph', 'type': 'structured_knowledge' }) # 处理向量检索结果 for result in vector_results: fused_results.append({ 'content': result['document']['content'], 'score': (result['similarity'] / max_sim) * vector_weight, 'source': 'vector', 'type': 'semantic_content' }) # 按分数排序 fused_results.sort(key=lambda x: x['score'], reverse=True) # 返回top-k结果 return fused_results[:top_k] def _format_graph_results(self, results): """格式化图检索结果""" formatted = [] for result in results: formatted.append({ 'content': result.get('text', ''), 'confidence': result.get('confidence', 0.5), 'entities': result.get('entities', []), 'relations': result.get('relations', []) }) return formatted def _format_vector_results(self, results): """格式化向量检索结果""" return results def update_documents(self, new_documents): """增量更新文档""" logger.info("增量更新文档索引...") # 更新知识图谱 self.graph_layer.build_knowledge_graph(new_documents) # 更新向量索引 all_documents = self.vector_layer.documents + new_documents self.vector_layer.index_documents(all_documents) logger.info("文档更新完成")
# 完整的LightRAG使用示例 class LightRAGDemo: """LightRAG使用演示""" def __init__(self): self.llm_client = None self.retriever = None def setup_llm_client(self, api_key, model_name="gpt-3.5-turbo"): """设置LLM客户端""" # 这里使用模拟的LLM客户端 class MockLLMClient: def generate(self, prompt): # 模拟LLM响应 return '{"entities": [], "relations": []}' self.llm_client = MockLLMClient() logger.info("LLM客户端设置完成") def demo_basic_usage(self): """基本使用演示""" print("=== LightRAG基本使用演示 ===") # 示例文档数据 sample_documents = [ { 'id': 1, 'content': '人工智能(Artificial Intelligence,简称AI)是计算机科学的一个分支,致力于创造能够执行通常需要人类智能的任务的系统。机器学习是人工智能的一个子领域,专注于开发能够从数据中学习的算法。', 'title': '人工智能基础' }, { 'id': 2, 'content': '深度学习是机器学习的一个分支,使用神经网络来模拟人脑的工作方式。卷积神经网络(CNN)在图像识别任务中表现优异,而循环神经网络(RNN)则适用于序列数据处理。', 'title': '深度学习技术' }, { 'id': 3, 'content': '自然语言处理(NLP)是AI的一个重要应用领域,专注于使计算机理解、解释和生成人类语言。Transformer架构的出现极大地推动了NLP技术的发展。', 'title': '自然语言处理' } ] # 初始化检索引擎 self.setup_llm_client("dummy_key") self.retriever = LightRAGRetriever(self.llm_client) self.retriever.setup(sample_documents) # 执行检索示例 queries = [ "什么是人工智能", "深度学习的应用", "自然语言处理技术" ] for query in queries: print(f"\n查询: {query}") results = self.retriever.retrieve(query, top_k=3) for i, result in enumerate(results, 1): print(f"{i}. [分数: {result['score']:.3f}] {result['content'][:100]}...") def demo_config_options(self): """配置选项演示""" print("\n=== 配置选项演示 ===") config = { 'fusion_strategy': 'rank_fusion', 'graph_reasoning_depth': 3, 'vector_search_method': 'semantic' } # 使用自定义配置 self.retriever = LightRAGRetriever(self.llm_client, config) print("配置选项已应用:") for key, value in config.items(): print(f"- {key}: {value}") if __name__ == "__main__": # 运行演示 demo = LightRAGDemo() demo.setup_llm_client("demo_key") demo.basic_documents = [ {'content': 'LightRAG是一种轻量级检索增强生成框架,结合图检索和向量检索的优势。', 'title': 'LightRAG简介'}, {'content': '图检索基于知识图谱,能够进行结构化推理和上下文丰富。', 'title': '图检索原理'}, {'content': '向量检索基于语义相似度,能够快速定位相关内容。', 'title': '向量检索原理'} ] demo.retriever = LightRAGRetriever(demo.llm_client) demo.retriever.setup(demo.basic_documents) # 执行检索 results = demo.retriever.retrieve("什么是LightRAG", top_k=3) print(f"检索结果数量: {len(results)}") for i, result in enumerate(results, 1): print(f"{i}. {result['content']}")
A:LightRAG的核心区别在于采用了"图+向量"双层检索架构。传统RAG通常只依赖向量检索,而LightRAG结合了知识图谱的结构化推理能力和向量检索的语义匹配能力,能够提供更丰富的上下文和更准确的检索结果。
A:图检索层的性能瓶颈主要在三个方面:
解决方案包括:
A:权重分配需要根据具体应用场景调整:
LightRAG提供了三种融合策略:
A:LightRAG理论上支持任何能够提供API调用的LLM模型,包括:
需要注意的是,不同模型的API兼容性和响应格式可能需要适配。
A:针对资源受限环境,LightRAG提供了多种优化方案:
模型轻量化:
图结构优化:
缓存机制:
分布式部署:
在构建知识图谱时,建议将推理深度控制在2-3层。深度过大会导致计算开销指数增长,而深度过小则无法获得足够的上下文信息。
文档去重非常重要。相似或重复的文档会导致知识图谱中出现冗余节点,影响检索效果。建议在构建索引前进行内容去重处理。
根据应用场景选择合适的融合策略。对于需要高准确度的专业领域知识问答,推荐使用加权融合;对于需要广泛覆盖的开放式问答,推荐使用排序融合。
频繁调用LLM API会导致成本上升和响应延迟。建议实现本地缓存机制,对于相似的查询重用之前的结果。
定期监控检索引擎的性能指标,包括:
本节深入介绍了LightRAG的核心架构设计,包括图检索层、向量检索层和融合引擎的实现原理。通过完整的技术实现和实用示例,读者应该能够:
下一节将详细介绍检索策略的设计与实现,包括如何根据不同的查询类型选择最优的检索方案。
关键词:LightRAG, 双层检索, 图检索, 向量检索, 架构设计, 知识图谱, 语义相似度, 检索融合
难度:进阶
预计阅读:45 分钟