ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

认识lightrag

2026/8/31 15:47:39 拓冰建站 浏览量
认识lightrag lightrag是什么1. Light RAG 介绍论文: https://arxiv.org/pdf/2410.05779文档地址: https://learnopencv.com/lightrag/项目地址: GitHub - HKUDS/LightRAG: [EMNLP2025] LightRAG: Simple and Fast Retrieval-Augmented Generation · GitHub1. 研究背景与动机传统Naive RAG只用向量检索 → 容易丢失实体间复杂关系全局理解差回答常碎片化无法很好合成多跳、多源信息。GraphRAGMicrosoft用社区摘要 图结构提升全局理解但非常贵且慢构建阶段 token 消耗巨大常数十万到百万 token增量更新几乎不可能。LightRAG要做的事保留图结构的优势捕捉关系、全局理解但大幅降低成本与时间支持增量更新适合实际生产。2. 核心创新双层检索LightRAG的关键设计是 dual-level retrieval双层检索 graph-enhanced text indexing图增强文本索引。知识图构建方式文档分块 → LLM 提取实体 关系 → 构建知识图节点实体边关系。同时为每个实体/关系生成简短文本描述key-value pairs存入向量数据库。双层检索机制低层low-level针对查询提取具体实体/关系关键词 → 向量匹配最相关实体 直接邻居 → 提供精确细节。 (孙悟空的师傅是谁这种问题)高层high-level提取更抽象的主题/关键词 → 检索更广的上下文 高阶邻居2-3跳→ 提供全局视角。(西游记说的什么样的故事)最终把两层结果融合 → 给 LLM 更全面的上下文。增量更新新文档进来时只更新受影响的局部图 向量不需重跑整个 corpus。这点让LightRAG在动态知识库场景下远比GraphRAG友好。3. 系统整体流程索引阶段文档 → 分块 → LLM 抽实体/关系 → 建图 向量嵌入实体/关系/文本块。检索阶段查询 → 双层关键词提取 → 向量检索 图遍历低层精确 高层全局→ 融合上下文。生成阶段检索结果 查询 → 喂给 LLM 生成最终回答。整个过程只用少量 API 调用token 消耗极低。2. 架构流程分析也可以自行搜索资料综合分析。功能介绍索引阶段Input Documents → Text Chunks : 把原始文档切分成小块chunksStore in Vector DB Storage : 把文本块的向量存入向量数据库NanoVectorDB/ Faiss 等Store in KV Storage : 把实体/关系/块的元数据、描述、chunk_id 等存入 JSON KV 存储Extract Entities Relations : 用 LLM 从文本块中提取实体人、物、地点等和关系谁对谁做了什么Max Cleaning Turns / Dedupe : 去重set dedupe LLM 进一步清洗避免重复实体/关系Update Description : 用 LLM 为去重后的实体/关系生成/优化描述更简洁、准确Store in Knowledge Graph : 把实体节点和关系边存入知识图谱检索阶段Query → Keywords Extraction : 用 LLM 专用 Prompt 从查询中提取两组关键词 low_level_keywords底层实体导向 high_level_keywords高层主题/关系导向low_level_keywords → Embedding → Top Entities Results : 用底层关键词向量搜索 → 找到最相关的实体high_level_keywords → Embedding → Top Relations Results : 用高层关键词向量搜索 → 找到最相关的关系Top Entities Results → related text_units / related Relations / Local Query Context : 从 Top 实体拉取相关文本块 直接相关关系 局部上下文Top Relations Results → related text_units / Global Query Context : 从 Top 关系拉取相关文本块 全局聚合上下文Local Query Context Global Query Context → Combined Context : 把局部 全局上下文融合简单拼接或加权3. 实战案例模块安装pip install lightrag-hku操作案例#!/usr/bin/env python # -*- coding: UTF-8 -*- # pip install lightrag-hku import asyncio import os from lightrag import LightRAG, QueryParam from lightrag.llm.openai import openai_complete_if_cache, openai_embed from dotenv import load_dotenv from lightrag.utils import EmbeddingFunc from lightrag.kg.shared_storage import initialize_pipeline_status from sentence_transformers import SentenceTransformer load_dotenv() # 创建嵌入模型 512 model_name rD:\LLM\Local_model\maidalun\bce-embedding-base_v1 WORKING_DIR light_test model SentenceTransformer(model_name) # 准备大模型链接 async def llm_func(prompt, system_promptNone, history_messages[], **kwargs): return await openai_complete_if_cache( modelqwen3.7-plus, promptprompt, system_promptsystem_prompt, history_messageshistory_messages, base_urlos.getenv(DASHSCOPE_BASE_URL), api_keyos.getenv(DASHSCOPE_API_KEY), **kwargs ) # 准备向量模型 async def local_embedding_func(texts): embeddings model.encode(texts, convert_to_numpyTrue, batch_size32) # 生成嵌入 return embeddings async def initialize_rag(): rag LightRAG( llm_model_funcllm_func, # 使用自定义本地嵌入函数 embedding_funcEmbeddingFunc( embedding_dim768, # 模型维度根据你的模型调整 max_token_size8192, # 最大 token 长度根据模型调整 funclocal_embedding_func # 传入你的函数异步或同步 ), # vector_storageFaissVectorDBStorage, # window 添加之后会报错 RuntimeError: Event loop is closed 使用get_event_loop启动协程 graph_storageNeo4JStorage, ) # IMPORTANT: Both initialization calls are required! await rag.initialize_storages() # Initialize storage backends await initialize_pipeline_status() # Initialize processing pipeline return rag async def main(): rag await initialize_rag() # 第一遍生成好后第二遍执行时可以注释掉 代码开始位置。 await rag.aclear_cache() with open(西游记.txt, r, encodingutf-8)as f: data f.read() task loop.create_task(rag.ainsert(data)) await asyncio.gather(task) # 第一遍生成好后第二遍执行时可以注释掉 代码结束位置。 # 向量检索 # da1 await rag.aquery(孙悟空的虎皮裙怎么得到的, paramQueryParam(modenaive)) # print(da1) # da1 await rag.aquery(美猴王被谁压在五指山下, paramQueryParam(modelocal)) # print(da1) # da1 await rag.aquery(五指山是谁的技能, paramQueryParam(modeglobal)) # print(da1) # da1 await rag.aquery(唐僧的为什么要西天为什么不去东天, paramQueryParam(modehybrid)) # print(da1) da1 await rag.aquery(孙悟空和观音菩萨有啥联系, paramQueryParam(modehybrid)) print(da1) da1 await rag.aquery(猪八戒和菩提祖师有啥联系, paramQueryParam(modenaive)) print(da1) if __name__ __main__: # asyncio.run(main()) loop asyncio.get_event_loop() loop.run_until_complete(main())观察结果:查看neo4j控制台没有建立任何实体和关系。