微信扫码
添加专属顾问
我要投稿
探索高效问答与内容生成的新选择,LightRAG框架让你轻松驾驭RAG技术。核心内容:1. LightRAG框架的轻量化设计及优势2. 快速部署与安装指南3. 实际应用示例与环境配置
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()
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 模型函数(可针对不同模式使用不同模型)"""
...
使用 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 并使用 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 模型
# 初始化 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"
)
),
)
rag = LightRAG(
...
llm_model_kwargs={"options": {"num_ctx": 32768}},
...
)
集成 LlamaIndex
# 使用 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()
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())
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
)
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 存储
# 示例:使用 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(默认格式)
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": "保留首个"}
)
# 清除所有缓存
await rag.aclear_cache()
# 清除指定模式(如本地搜索)
await rag.aclear_cache(modes=["local"])
# 同步版本
rag.clear_cache(modes=["global"])
参数 | 类型 | 说明 | 默认值 |
---|---|---|---|
lightrag_cache+时间戳 |
|||
JsonKVStorage |
|||
NanoVectorDBStorage |
|||
NetworkXStorage |
|||
JsonDocStatusStorage |
|||
openai_embed |
|||
gpt_4o_mini_complete |
|||
53AI,企业落地大模型首选服务商
产品:场景落地咨询+大模型应用平台+行业解决方案
承诺:免费场景POC验证,效果验证后签署服务协议。零风险落地应用大模型,已交付160+中大型企业
2025-04-25
HR AI小科普——什么是MCP?
2025-04-25
RAG之父:部署RAG Agents的10个经验教训
2025-04-25
三任务两失败,通用agent暂时只能坐小孩那桌
2025-04-24
RAG评估深度解析:LLM时代的全方位指南(1.5万字综述)
2025-04-24
RAG 落地必备的 1 个开源 AI 原生向量数据库 —Chroma
2025-04-24
用维基百科(wikipedia) 数据集上手RAG 优化实践
2025-04-24
Dify工作流→知识检索|问题分类
2025-04-24
基于MiniO存储的RAGFlow+Dify图片处理方案
2024-10-27
2024-09-04
2024-07-18
2024-05-05
2024-06-20
2024-06-13
2024-07-09
2024-07-09
2024-05-19
2024-07-07
2025-04-25
2025-04-22
2025-04-22
2025-04-20
2025-04-19
2025-04-18
2025-04-16
2025-04-14