LightRAG:简单快速的检索增强生成框架快速上手

LightRAG 是一款轻量级的 检索增强生成(RAG, Retrieval-Augmented Generation)框架,旨在通过优化检索和生成流程,降低传统 RAG 系统的部署成本与资源消耗,同时保持高效的问答和内容生成能力。它适用于需要快速响应、低算力支持的场景,如智能客服、知识问答、轻量化 AI 助手等。

安装

安装 LightRAG 核心模块

  • 从源代码安装(推荐)

    cd LightRAG  
    pip install -e .  
    
  • 通过 PyPI 安装

    pip install lightrag-hku  
    

安装 LightRAG 服务端

LightRAG 服务端提供 Web 界面和 API 支持,便于文档索引、知识图谱探索和简单的 RAG 查询。同时兼容 Ollama 接口,可模拟为 Ollama 聊天模型,方便 Open WebUI 等 AI 聊天机器人接入。

  • 通过 PyPI 安装

    pip install "lightrag-hku[api]"  
    
  • 从源代码安装

    # 按需创建 Python 虚拟环境  
    # 安装 API 支持的可编辑模式  
    pip install -e ".[api]"  
    

更多关于 LightRAG 服务端的信息,请参考 LightRAG Server。

快速开始

  • 本地运行演示视频

  • 所有代码示例位于 examples 目录。

  • 使用 OpenAI 模型时需设置环境变量:export OPENAI_API_KEY="sk-..."

  • 下载演示文本《圣诞颂歌》:
    curl https://raw.githubusercontent.com/gusye1234/nano-graphrag/main/tests/mock_data.txt > ./book.txt  
    

查询

使用以下 Python 代码初始化 LightRAG 并执行查询:

import os  
import asyncio  
from lightrag import LightRAG, QueryParam  
from lightrag.llm.openai import gpt_4o_mini_complete, gpt_4o_complete, openai_embed  
from lightrag.kg.shared_storage import initialize_pipeline_status  
from lightrag.utils import setup_logger  

setup_logger("lightrag", level="INFO")  

async def initialize_rag():  
    rag = LightRAG(  
        working_dir="your/path",  
        embedding_func=openai_embed,  
        llm_model_func=gpt_4o_mini_complete  
    )  

    await rag.initialize_storages()  
    await initialize_pipeline_status()  

    return rag  

def main():  
    # 初始化 RAG 实例  
    rag = asyncio.run(initialize_rag())  
    # 插入文本  
    rag.insert("Your text")  

    # 选择检索模式:朴素搜索、本地搜索、全局搜索、混合搜索、知识图谱与向量混合搜索  
    mode = "mix"  

    rag.query(  
        "What are the top themes in this story?",  
        param=QueryParam(mode=mode)  
    )  

if __name__ == "__main__":  
    main()  

查询参数(QueryParam)

class QueryParam:  
    mode: Literal["local", "global", "hybrid", "naive", "mix"] = "global"  
    """检索模式:  
    - "local": 聚焦上下文相关信息  
    - "global": 利用全局知识  
    - "hybrid": 结合本地与全局检索  
    - "naive": 基础搜索(无高级技术)  
    - "mix": 融合知识图谱与向量检索(支持结构化 KG 和非结构化向量,通过 HTML img 标签处理图像内容,通过 top_k 控制检索深度)  
    """  
    only_need_context: bool = False  
    """若为 True,仅返回检索到的上下文,不生成回答"""  
    response_type: str = "Multiple Paragraphs"  
    """响应格式(如:"多个段落"、"单个段落"、"项目符号")"""  
    top_k: int = 60  
    """检索的 top 数量(本地模式为实体数,全局模式为关系数)"""  
    max_token_for_text_unit: int = 4000  
    """每个检索文本块的最大 token 数"""  
    max_token_for_global_context: int = 4000  
    """全局检索中关系描述的最大 token 数"""  
    max_token_for_local_context: int = 4000  
    """本地检索中实体描述的最大 token 数"""  
    ids: list[str] | None = None  # 仅支持 PG Vector 数据库  
    """过滤 RAG 的 ID 列表"""  
    model_func: Callable[..., object] | None = None  
    """可选:覆盖本次查询的 LLM 模型函数(可针对不同模式使用不同模型)"""  
    ...  

top_k 的默认值可通过环境变量 TOP_K 修改。

LLM 与嵌入模型注入

LightRAG 需要注入 LLM 和嵌入模型的调用方法以完成文档索引和查询任务。

使用 OpenAI 风格 API

async def llm_model_func(  
    prompt, system_prompt=None, history_messages=[], keyword_extraction=False, **kwargs  
) -> str:  
    return await openai_complete_if_cache(  
        "solar-mini",  
        prompt,  
        system_prompt=system_prompt,  
        history_messages=history_messages,  
        api_key=os.getenv("UPSTAGE_API_KEY"),  
        base_url="https://api.upstage.ai/v1/solar",  
        **kwargs  
    )  

async def embedding_func(texts: list[str]) -> np.ndarray:  
    return await openai_embed(  
        texts,  
        model="solar-embedding-1-large-query",  
        api_key=os.getenv("UPSTAGE_API_KEY"),  
        base_url="https://api.upstage.ai/v1/solar"  
    )  

async def initialize_rag():  
    rag = LightRAG(  
        working_dir=WORKING_DIR,  
        llm_model_func=llm_model_func,  
        embedding_func=EmbeddingFunc(  
            embedding_dim=4096,  
            max_token_size=8192,  
            func=embedding_func  
        )  
    )  

    await rag.initialize_storages()  
    await initialize_pipeline_status()  

    return rag  

使用 Hugging Face 模型

参考 lightrag_hf_demo.py

# 初始化 LightRAG 并使用 Hugging Face 模型  
rag = LightRAG(  
    working_dir=WORKING_DIR,  
    llm_model_func=hf_model_complete,  # Hugging Face 文本生成模型  
    llm_model_name='meta-llama/Llama-3.1-8B-Instruct',  # Hugging Face 模型名称  
    # 使用 Hugging Face 嵌入函数  
    embedding_func=EmbeddingFunc(  
        embedding_dim=384,  
        max_token_size=5000,  
        func=lambda texts: hf_embed(  
            texts,  
            tokenizer=AutoTokenizer.from_pretrained("sentence-transformers/all-MiniLM-L6-v2"),  
            embed_model=AutoModel.from_pretrained("sentence-transformers/all-MiniLM-L6-v2")  
        )  
    ),  
)  

使用 Ollama 模型

概述:需先拉取模型(如文本生成模型和嵌入模型 nomic-embed-text):

# 初始化 LightRAG 并使用 Ollama 模型  
rag = LightRAG(  
    working_dir=WORKING_DIR,  
    llm_model_func=ollama_model_complete,  # Ollama 文本生成模型  
    llm_model_name='your_model_name',  # 模型名称  
    # 使用 Ollama 嵌入函数  
    embedding_func=EmbeddingFunc(  
        embedding_dim=768,  
        max_token_size=8192,  
        func=lambda texts: ollama_embed(  
            texts,  
            embed_model="nomic-embed-text"  
        )  
    ),  
)  

增加上下文长度

  • 修改 Modelfile

    (默认上下文 8k,需至少 32k):

    1. 拉取模型:ollama pull qwen2

    2. 导出模型文件:ollama show --modelfile qwen2 > Modelfile

    3. 添加参数:PARAMETER num_ctx 32768

    4. 创建修改后的模型:ollama create -f Modelfile qwen2m

  • 通过 Ollama API 设置
    rag = LightRAG(  
        ...  
        llm_model_kwargs={"options": {"num_ctx": 32768}},  
        ...  
    )  
    

低显存 GPU:选择小模型并调整上下文窗口(如 gemma2:2b 搭配 26k 上下文)。

集成 LlamaIndex

LightRAG 支持与 LlamaIndex 集成(详见 llm/llama_index_impl.py):

# 使用 LlamaIndex 直接访问 OpenAI  
import asyncio  
from lightrag import LightRAG  
from lightrag.llm.llama_index_impl import llama_index_complete_if_cache, llama_index_embed  
from llama_index.embeddings.openai import OpenAIEmbedding  
from llama_index.llms.openai import OpenAI  
from lightrag.kg.shared_storage import initialize_pipeline_status  
from lightrag.utils import setup_logger  

setup_logger("lightrag", level="INFO")  

async def initialize_rag():  
    rag = LightRAG(  
        working_dir="your/path",  
        llm_model_func=llama_index_complete_if_cache,  # LlamaIndex 兼容的生成函数  
        embedding_func=EmbeddingFunc(  
            embedding_dim=1536,  
            max_token_size=8192,  
            func=lambda texts: llama_index_embed(texts, embed_model=embed_model)  
        ),  
    )  

    await rag.initialize_storages()  
    await initialize_pipeline_status()  

    return rag  

def main():  
    rag = asyncio.run(initialize_rag())  
    with open("./book.txt", "r", encoding="utf-8") as f:  
        rag.insert(f.read())  
    # 执行不同模式的查询...  

if __name__ == "__main__":  
    main()  

详细文档和示例

  • LlamaIndex 文档
  • 直接 OpenAI 示例
  • LiteLLM 代理示例

Token 使用追踪

LightRAG 提供 TokenTracker 工具监控 LLM 的 token 消耗,便于控制 API 成本和优化性能。

from lightrag.utils import TokenTracker  

# 方法 1:上下文管理器(推荐)  
with TokenTracker() as tracker:  
    result1 = await llm_model_func("问题 1")  
    result2 = await llm_model_func("问题 2")  
print("总 token 消耗:", tracker.get_usage())  

# 方法 2:手动记录  
tracker = TokenTracker()  
tracker.reset()  
rag.insert()  
rag.query("问题 1", param=QueryParam(mode="naive"))  
print("插入和查询的 token 消耗:", tracker.get_usage())  

使用技巧

  • 长会话或批量操作使用上下文管理器自动追踪

  • 分段统计时手动调用 reset()

  • 开发测试阶段定期检查 token 使用情况

对话历史支持

LightRAG 支持多轮对话,通过传入对话历史实现上下文感知:

conversation_history = [  
    {"role": "user", "content": "主角对圣诞节的态度如何?"},  
    {"role": "assistant", "content": "故事开头, Ebenezer Scrooge 对圣诞节持消极态度..."},  
    {"role": "user", "content": "他的态度如何转变?"}  
]  

query_param = QueryParam(  
    mode="mix",  # 支持所有模式  
    conversation_history=conversation_history,  
    history_turns=3  # 考虑最近 3 轮对话  
)  

response = rag.query("这种性格转变的原因是什么?", param=query_param)  

自定义提示词

支持自定义系统提示词,精细控制模型行为:

custom_prompt = """  
你是环境科学专家,提供详细且结构化的回答,并包含示例。  
---对话历史---  
{history}  
---知识库---  
{context_data}  
---响应规则---  
目标格式和长度:{response_type}  
"""  

response_custom = rag.query(  
    "可再生能源的主要优势是什么?",  
    param=QueryParam(mode="hybrid"),  
    system_prompt=custom_prompt  
)  

独立关键词提取

新增 query_with_separate_keyword_extraction 函数,将关键词提取与用户提示分离,专注查询意图:

rag.query_with_separate_keyword_extraction(  
    query="解释万有引力定律",  
    prompt="为学习物理的高中生提供详细解释",  
    param=QueryParam(mode="hybrid")  
)  

数据插入

基础插入

# 单文本插入  
rag.insert("文本内容")  

批量插入

# 批量插入多文本  
rag.insert(["文本 1", "文本 2", ...])  

# 自定义批量大小  
rag = LightRAG(addon_params={"insert_batch_size": 4})  
rag.insert(["文本 1", "文本 2", ...])  # 每批处理 4 个文档(默认 10)  

带 ID 插入

# 单文本带 ID  
rag.insert("文本 1", ids=["ID_FOR_TEXT1"])  
# 多文本带 ID 列表(需与文本数量一致)  
rag.insert(["文本 1", "文本 2"], ids=["ID1", "ID2"])  

流水线插入

# 异步入队和处理文档(适合后台增量处理)  
await rag.apipeline_enqueue_documents(input_data)  
await rag.apipeline_process_enqueue_documents()  

多文件类型支持

import textract  
file_path = "文档.pdf"  
text_content = textract.process(file_path).decode("utf-8")  
rag.insert(text_content)  

插入自定义知识图谱

custom_kg = {  
    "chunks": [{"content": "文本块", "source_id": "doc-1"}],  
    "entities": [{"entity_name": "实体", "description": "描述"}],  
    "relationships": [{"src_id": "A", "tgt_id": "B", "description": "关系"}]  
}  
rag.insert_custom_kg(custom_kg)  

引用功能

# 插入带文件路径的文档(支持溯源)  
documents = ["内容 1", "内容 2"]  
file_paths = ["path1.txt", "path2.txt"]  
rag.insert(documents, file_paths=file_paths)  

存储配置

使用 Neo4J 存储

export NEO4J_URI="neo4j://localhost:7687"  
export NEO4J_USERNAME="neo4j"  
export NEO4J_PASSWORD="password"  

async def initialize_rag():  
    rag = LightRAG(  
        working_dir=WORKING_DIR,  
        llm_model_func=gpt_4o_mini_complete,  
        graph_storage="Neo4JStorage",  # 覆盖默认图存储(NetworkX)  
    )  
    await rag.initialize_storages()  
    return rag  

使用 PostgreSQL 存储

支持 PGVector(向量存储)和 Apache AGE(图存储),适合生产环境:

# 示例:使用 PostgreSQL + AGE  
rag = LightRAG(  
    graph_storage="AGEStorage",  
    vector_storage="PGVectorStorage",  
    kv_storage="PGKVStorage",  
    ...  
)  

使用 Faiss 存储

# 安装依赖:pip install faiss-cpu(或 faiss-gpu)  
async def embedding_func(texts: list[str]) -> np.ndarray:  
    from sentence_transformers import SentenceTransformer  
    model = SentenceTransformer('all-MiniLM-L6-v2')  
    return model.encode(texts, convert_to_numpy=True)  

rag = LightRAG(  
    vector_storage="FaissVectorDBStorage",  
    vector_db_storage_cls_kwargs={"cosine_better_than_threshold": 0.3},  
    embedding_func=EmbeddingFunc(embedding_dim=384, func=embedding_func),  
    ...  
)  

数据删除

# 按实体名删除  
rag.delete_by_entity("实体名称")  
# 按文档 ID 删除(级联删除关联的实体和关系)  
rag.delete_by_doc_id("doc_id")  

知识图谱编辑

支持创建、编辑实体和关系,保持图数据库与向量数据库的一致性:

创建实体和关系

# 创建实体  
entity = rag.create_entity("Google", {"description": "科技公司", "entity_type": "company"})  
# 创建关系  
relation = rag.create_relation("Google", "Gmail", {"description": "开发邮箱服务"})  

编辑实体和关系

# 更新实体  
updated_entity = rag.edit_entity("Google", {"description": "Alphabet 子公司"})  
# 重命名实体(自动迁移关系)  
renamed_entity = rag.edit_entity("Gmail", {"entity_name": "Google Mail"})  
# 更新关系  
updated_relation = rag.edit_relation("Google", "Google Mail", {"description": "维护邮箱服务"})  

数据导出

支持将知识图谱导出为 CSV、Excel、Markdown 等格式:

# 导出为 CSV(默认格式)  
rag.export_data("knowledge_graph.csv")  
# 指定格式(Excel/Markdown/Text)  
rag.export_data("output.xlsx", file_format="excel")  
# 包含向量数据  
rag.export_data("complete_data.csv", include_vector_data=True)  

实体合并

自动合并多个实体及其关系,处理冲突和重复:

# 基础合并  
rag.merge_entities(  
    source_entities=["AI", "人工智能", "机器学习"],  
    target_entity="人工智能技术"  
)  
# 自定义合并策略  
rag.merge_entities(  
    source_entities=["John", "John Doe"],  
    target_entity="John Smith",  
    merge_strategy={"description": "拼接", "entity_type": "保留首个"}  
)  

缓存管理

清除不同模式的 LLM 响应缓存:

# 清除所有缓存  
await rag.aclear_cache()  
# 清除指定模式(如本地搜索)  
await rag.aclear_cache(modes=["local"])  
# 同步版本  
rag.clear_cache(modes=["global"])  

LightRAG 初始化参数

参数类型说明默认值

working_dir

str

缓存存储目录

lightrag_cache+时间戳

kv_storage

str

文档和文本块存储类型(支持 Json/PG/Redis/Mongo)

JsonKVStorage

vector_storage

str

嵌入向量存储类型(支持 Nano/PG/Milvus/Chroma/Faiss 等)

NanoVectorDBStorage

graph_storage

str

图存储类型(支持 NetworkX/Neo4J/PGGraph/AGE)

NetworkXStorage

doc_status_storage

str

文档处理状态存储类型

JsonDocStatusStorage

chunk_token_size

int

文档分块的最大 token 数

1200

embedding_func

EmbeddingFunc

嵌入函数

openai_embed

llm_model_func

callable

LLM 生成函数

gpt_4o_mini_complete

更多参数详见文档

错误处理

API 包含全面的错误处理:

  • 文件未找到(404)

  • 处理错误(500)

  • 支持多编码(UTF-8/GBK)

LightRAG 服务端

LightRAG 服务端提供 Web 界面和 API,支持知识图谱可视化、文档索引管理等功能。详见 LightRAG Server 文档。

评估

数据集

评估数据集可从 TommyChien/UltraDomain 下载。

生成查询

使用 example/generate_query.py 生成高层级查询,基于数据集描述自动创建用户、任务和问题。

批量评估

通过 example/batch_eval.py 对比不同 RAG 系统的表现,基于 全面性、多样性、赋能性 三个维度进行评估。

复现实验

所有复现代码位于 ./reproduce 目录,步骤包括:

  1. 提取唯一上下文

  2. 插入 LightRAG 系统

  3. 生成查询并执行

 如何系统的去学习大模型LLM ?

大模型时代,火爆出圈的LLM大模型让程序员们开始重新评估自己的本领。 “AI会取代那些行业?”“谁的饭碗又将不保了?”等问题热议不断。

事实上,抢你饭碗的不是AI,而是会利用AI的人。

科大讯飞、阿里、华为等巨头公司发布AI产品后,很多中小企业也陆续进场!超高年薪,挖掘AI大模型人才! 如今大厂老板们,也更倾向于会AI的人,普通程序员,还有应对的机会吗?

与其焦虑……

不如成为「掌握AI工具的技术人」,毕竟AI时代,谁先尝试,谁就能占得先机!

但是LLM相关的内容很多,现在网上的老课程老教材关于LLM又太少。所以现在小白入门就只能靠自学,学习成本和门槛很高。

基于此,我用做产品的心态来打磨这份大模型教程,深挖痛点并持续修改了近70次后,终于把整个AI大模型的学习门槛,降到了最低!

在这个版本当中:

第一您不需要具备任何算法和数学的基础
第二不要求准备高配置的电脑
第三不必懂Python等任何编程语言

您只需要听我讲,跟着我做即可,为了让学习的道路变得更简单,这份大模型教程已经给大家整理并打包,现在将这份 LLM大模型资料 分享出来:包括LLM大模型书籍、640套大模型行业报告、LLM大模型学习视频、LLM大模型学习路线、开源大模型学习教程等, 😝有需要的小伙伴,可以 扫描下方二维码领取🆓↓↓↓

一、LLM大模型经典书籍

AI大模型已经成为了当今科技领域的一大热点,那以下这些大模型书籍就是非常不错的学习资源。

在这里插入图片描述

二、640套LLM大模型报告合集

这套包含640份报告的合集,涵盖了大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师,还是对AI大模型感兴趣的爱好者,这套报告合集都将为您提供宝贵的信息和启示。(几乎涵盖所有行业)
在这里插入图片描述

三、LLM大模型系列视频教程

在这里插入图片描述

四、LLM大模型开源教程(LLaLA/Meta/chatglm/chatgpt)

在这里插入图片描述

五、AI产品经理大模型教程

在这里插入图片描述

LLM大模型学习路线 

阶段1:AI大模型时代的基础理解

  • 目标:了解AI大模型的基本概念、发展历程和核心原理。

  • 内容

    • L1.1 人工智能简述与大模型起源
    • L1.2 大模型与通用人工智能
    • L1.3 GPT模型的发展历程
    • L1.4 模型工程
    • L1.4.1 知识大模型
    • L1.4.2 生产大模型
    • L1.4.3 模型工程方法论
    • L1.4.4 模型工程实践
    • L1.5 GPT应用案例

阶段2:AI大模型API应用开发工程

  • 目标:掌握AI大模型API的使用和开发,以及相关的编程技能。

  • 内容

    • L2.1 API接口
    • L2.1.1 OpenAI API接口
    • L2.1.2 Python接口接入
    • L2.1.3 BOT工具类框架
    • L2.1.4 代码示例
    • L2.2 Prompt框架
    • L2.3 流水线工程
    • L2.4 总结与展望

阶段3:AI大模型应用架构实践

  • 目标:深入理解AI大模型的应用架构,并能够进行私有化部署。

  • 内容

    • L3.1 Agent模型框架
    • L3.2 MetaGPT
    • L3.3 ChatGLM
    • L3.4 LLAMA
    • L3.5 其他大模型介绍

阶段4:AI大模型私有化部署

  • 目标:掌握多种AI大模型的私有化部署,包括多模态和特定领域模型。

  • 内容

    • L4.1 模型私有化部署概述
    • L4.2 模型私有化部署的关键技术
    • L4.3 模型私有化部署的实施步骤
    • L4.4 模型私有化部署的应用场景

这份 LLM大模型资料 包括LLM大模型书籍、640套大模型行业报告、LLM大模型学习视频、LLM大模型学习路线、开源大模型学习教程等, 😝有需要的小伙伴,可以 扫描下方二维码领取🆓↓↓↓

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值