ingFang SC", "Microsoft YaHei", sans-serif;font-size: 14px;background-color: rgba(0, 0, 0, 0.05);border-radius: 2px;padding: 0.5em;line-height: 22px;color: unset;display: block;text-size-adjust: none;overflow-x: auto;">cdLightRAG ingFang SC", "Microsoft YaHei", sans-serif;font-size: 14px;background-color: rgba(0, 0, 0, 0.05);border-radius: 2px;padding: 0.5em;line-height: 22px;color: unset;display: block;text-size-adjust: none;overflow-x: auto;">pipinstalllightrag-hku ingFang SC", "Microsoft YaHei", sans-serif;font-size: 14px;background-color: rgba(0, 0, 0, 0.05);border-radius: 2px;padding: 0.5em;line-height: 22px;color: unset;display: block;text-size-adjust: none;overflow-x: auto;">pipinstall"lightrag-hku[api]"ingFang SC", "Microsoft YaHei", sans-serif;font-size: 14px;background-color: rgba(0, 0, 0, 0.05);border-radius: 2px;padding: 0.5em;line-height: 22px;color: unset;display: block;text-size-adjust: none;overflow-x: auto;"># 按需创建 Python 虚拟环境 ingFang SC", "Microsoft YaHei", sans-serif;font-size: 14px;background-color: rgb(249, 242, 244);border-radius: 2px;padding: 2px 4px;line-height: 22px;color: rgb(199, 37, 78);">examples目录。ingFang SC", "Microsoft YaHei", sans-serif;font-size: 14px;background-color: rgb(249, 242, 244);border-radius: 2px;padding: 2px 4px;line-height: 22px;color: rgb(199, 37, 78);">export OPENAI_API_KEY="sk-..."。curlhttps://raw.githubusercontent.com/gusye1234/nano-graphrag/main/tests/mock_data.txt>./book.txt
importos
importasyncio
fromlightragimportLightRAG,QueryParam
fromlightrag.llm.openaiimportgpt_4o_mini_complete,gpt_4o_complete,openai_embed
fromlightrag.kg.shared_storageimportinitialize_pipeline_status
fromlightrag.utilsimportsetup_logger
setup_logger("lightrag",level="INFO")
asyncdefinitialize_rag():
rag=LightRAG(
working_dir="your/path",
embedding_func=openai_embed,
llm_model_func=gpt_4o_mini_complete
)
awaitrag.initialize_storages()
awaitinitialize_pipeline_status()
returnrag
defmain():
# 初始化 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()
classQueryParam:
mode
iteral["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
asyncdefllm_model_func(
prompt,system_prompt=None,history_messages=[],keyword_extraction=False,**kwargs
)->str:
returnawaitopenai_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
)
asyncdefembedding_func(texts:list[str])->np.ndarray:
returnawaitopenai_embed(
texts,
model="solar-embedding-1-large-query",
api_key=os.getenv("UPSTAGE_API_KEY"),
base_url="https://api.upstage.ai/v1/solar"
)
asyncdefinitialize_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
)
)
awaitrag.initialize_storages()
awaitinitialize_pipeline_status()
returnrag
使用 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=lambdatexts: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=lambdatexts
llama_embed(
texts,
embed_model="nomic-embed-text"
)
),
)
ollama pull qwen2ollama show --modelfile qwen2 > ModelfilePARAMETER num_ctx 32768ollama create -f Modelfile qwen2mrag=LightRAG(
...
llm_model_kwargs={"options":{"num_ctx":32768}},
...
)
集成 LlamaIndex
# 使用 LlamaIndex 直接访问 OpenAI
importasyncio
fromlightragimportLightRAG
fromlightrag.llm.llama_index_implimportllama_index_complete_if_cache,llama_index_embed
fromllama_index.embeddings.openaiimportOpenAIEmbedding
fromllama_index.llms.openaiimportOpenAI
fromlightrag.kg.shared_storageimportinitialize_pipeline_status
fromlightrag.utilsimportsetup_logger
setup_logger("lightrag",level="INFO")
asyncdefinitialize_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=lambdatexts:llama_index_embed(texts,embed_model=embed_model)
),
)
awaitrag.initialize_storages()
awaitinitialize_pipeline_status()
returnrag
defmain():
rag=asyncio.run(initialize_rag())
withopen("./book.txt","r",encoding="utf-8")asf:
rag.insert(f.read())
# 执行不同模式的查询...
if__name__=="__main__":
main()
fromlightrag.utilsimportTokenTracker
# 方法 1:上下文管理器(推荐)
withTokenTracker()astracker:
result1=awaitllm_model_func("问题 1")
result2=awaitllm_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()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"])
流水线插入
# 异步入队和处理文档(适合后台增量处理)
awaitrag.apipeline_enqueue_documents(input_data)
awaitrag.apipeline_process_enqueue_documents()
多文件类型支持
importtextract
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"
asyncdefinitialize_rag():
rag=LightRAG(
working_dir=WORKING_DIR,
llm_model_func=gpt_4o_mini_complete,
graph_storage="Neo4JStorage",# 覆盖默认图存储(NetworkX)
)
awaitrag.initialize_storages()
returnrag
使用 PostgreSQL 存储
# 示例:使用 PostgreSQL + AGE
rag=LightRAG(
graph_storage="AGEStorage",
vector_storage="PGVectorStorage",
kv_storage="PGKVStorage",
...
)
使用 Faiss 存储
# 安装依赖:pip install faiss-cpu(或 faiss-gpu)
asyncdefembedding_func(texts:list[str])->np.ndarray:
fromsentence_transformersimportSentenceTransformer
model=SentenceTransformer('all-MiniLM-L6-v2')
returnmodel.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":"保留首个"}
)
# 清除所有缓存
awaitrag.aclear_cache()
# 清除指定模式(如本地搜索)
awaitrag.aclear_cache(modes=["local"])
# 同步版本
rag.clear_cache(modes=["global"])
| 参数 | 类型 | 说明 | 默认值 |
|---|---|---|---|
lightrag_cache+时间戳 | |||
JsonKVStorage | |||
NanoVectorDBStorage | |||
NetworkXStorage | |||
JsonDocStatusStorage | |||
openai_embed | |||
gpt_4o_mini_complete | |||
| 欢迎光临 链载Ai (https://www.lianzai.com/) | Powered by Discuz! X3.5 |