LlamaIndex 从入门到实战:一条命令跑完“建库→召回→重排→生成”全流程
·
一、为什么要学 LlamaIndex?
- RAG 的本质 = 索引 + 检索 + 生成;LlamaIndex 把这三步做成了“一条链”,10 行代码就能让 LLM 读上你的私域数据。
- 社区活跃、文档全、组件丰富:支持 300+ 文件格式、10+ 向量库、混合召回、重排、HyDE、Agent 等高级玩法 。
- 与 LangChain 互补:LangChain 偏“流程编排”,LlamaIndex 偏“数据索引”,两者结合 = 黄金搭档 。
二、全景速览
LlamaIndex 工作流
├─ 数据连接器(Readers)
│ ├─ PDF、Word、Markdown、TXT
│ ├─ Notion、Slack、GoogleDrive、MySQL、MongoDB
│ └─ 图片、音频、ES、S3……
├─ 分块 & 向量化(Node Parser / Embedding)
├─ 索引(Indices)
│ ├─ VectorStoreIndex(最常用)
│ ├─ SummaryIndex(全文)
│ ├─ KnowledgeGraphIndex(KG)
│ └─ 组合索引(CompositeIndex)
├─ 检索(Retrievers)
│ ├─ 向量检索
│ ├─ BM25 关键词检索
│ ├─ 混合召回(融合)
│ └─ 重排(Rerank)
├─ 后处理(Postprocessor)
│ ├─ 相似度截断
│ ├─ 时间过滤
│ └─ 句子窗口
└─ 查询引擎(QueryEngine)
├─ RetrieverQueryEngine
├─ SubQuestionQueryEngine
└─ RouterQueryEngine
三、5 分钟安装 & 最小可运行 Demo
环境:Python≥3.9,OpenAI API Key 已配置
# 1. 创环境
conda create -n llamaidx python=3.11 -y && conda activate llamaidx
# 2. 一键安装全部依赖(含 PDF、Markdown 解析器)
pip install llama-index==0.10.30 llama-index-readers-file llama-index-llms-openai llama-index-embeddings-openai
目录结构
project/
├─ data/ # 放任意 PDF/MD/TXT
├─ index_cache/ # 索引持久化
├─ chat_pdf.py # 单文件即可跑
└─ requirements.txt
四、实战 1:30 行代码完成“ChatPDF”
# chat_pdf.py
import os, sys
from llama_index.core import (
VectorStoreIndex, SimpleDirectoryReader, Settings, StorageContext, load_index_from_storage
)
from llama_index.llms.openai import OpenAI
from llama_index.embeddings.openai import OpenAIEmbedding
# 0. 基础配置
os.environ["OPENAI_API_KEY"] = "sk-xxx"
Settings.llm = OpenAI(model="gpt-3.5-turbo", temperature=0)
Settings.embed_model = OpenAIEmbedding(model="text-embedding-3-small")
PERSIST_DIR = "./index_cache"
# 1. 加载或构建索引
if not os.path.exists(PERSIST_DIR):
documents = SimpleDirectoryReader("data").load_data(show_progress=True)
index = VectorStoreIndex.from_documents(documents)
index.storage_context.persist(persist_dir=PERSIST_DIR)
else:
storage_context = StorageContext.from_defaults(persist_dir=PERSIST_DIR)
index = load_index_from_storage(storage_context)
# 2. 创建查询引擎
query_engine = index.as_query_engine(similarity_top_k=4)
# 3. CLI 交互
while True:
q = input("\nQuestion: ")
if q.lower() in ("exit", "quit"):
break
resp = query_engine.query(q)
print("Answer:", resp.response)
print("Sources:", [n.node.metadata.get('file_name') for n in resp.source_nodes])
运行:
python chat_pdf.py
即可开始“基于 PDF 的连续对话”,重启后索引仍在,秒级加载 。
五、实战 2:混合召回 + 重排,correct@1 提升 15%
场景:企业内部 2400 份文档,纯向量检索 top1 仅 63%,上混合召回 + cross-encoder 后 78% 。
from llama_index.core import VectorStoreIndex
from llama_index.retrievers.bm25 import BM25Retriever
from llama_index.retrievers.fusion import QueryFusionRetriever
from llama_index.postprocessor import SentenceTransformerRerank
# 1. 已有向量索引
index = VectorStoreIndex.from_documents(documents) # 前面建好的
# 2. 混合召回
vector_retriever = index.as_retriever(similarity_top_k=12)
bm25_retriever = BM25Retriever.from_defaults(
docstore=index.docstore, similarity_top_k=10)
fusion_retriever = QueryFusionRetriever(
[vector_retriever, bm25_retriever],
similarity_top_k=16,
mode="reciprocal_rerank"
)
# 3. Cross-Encoder 二次排序
rerank = SentenceTransformerRerank(
model="cross-encoder/ms-marco-MiniLM-L-6-v2",
top_n=5
)
# 4. 组装查询引擎
from llama_index.core.query_engine import RetrieverQueryEngine
query_engine = RetrieverQueryEngine.from_args(
retriever=fusion_retriever,
node_postprocessors=[rerank]
)
print(query_engine.query("如何安全回滚 v3 计费?"))
内部测试:同样 100 条问题,correct@1 从 63% → 78%, hallucination 减少 30% 。
六、实战 3:HyDE + 多查询改写,解决“用户问题太口语”
from llama_index.core.query_transform import HyDEQueryTransform, MultiQueryTransform
from llama_index.core.query_engine import TransformQueryEngine
hyde = HyDEQueryTransform(include_original=True)
multi = MultiQueryTransform(num_queries=4)
query_engine = TransformQueryEngine(
query_engine, # 上一节的混合引擎
query_transform=[hyde, multi]
)
print(query_engine.query("账单整错了咋整"))
原理:
- HyDE 先让 LLM 生成“假设答案”,再拿答案去搜;
- MultiQuery 把口语问题扩写成 4 条正式问法,分别召回后融合。
实测:模糊口语查询的召回率提升 20%+ 。
七、实战 4:多模态知识库(PDF + 表格 + 图片)
# 支持同时解析 PDF、Excel、PNG
from llama_index.readers.file import (
PDFReader, PandasExcelReader, ImageReader
)
from llama_index.core import SimpleDirectoryReader
file_extractor = {
".pdf": PDFReader(),
".xlsx": PandasExcelReader(),
".png": ImageReader(), # OCR 自动转文本
}
documents = SimpleDirectoryReader(
input_dir="data",
file_extractor=file_extractor
).load_data(show_progress=True)
index = VectorStoreIndex.from_documents(documents)
LlamaIndex 会自动把图片 OCR 成文本、Excel 按行拆分,再统一向量化,实现“跨模态检索” 。
八、实战 5:动态插入 + 版本管理(不停服更新知识库)
# 线上服务运行中,收到新文档
new_doc = Document(text="Berlin is the capital of Germany.")
index.insert(new_doc) # 实时生效
index.storage_context.persist() # 落盘,重启不丢
支持 delete_ref_doc(doc_id) 按 ID 删除,或 update_ref_doc(doc) 原地替换,实现“增量维护” 。
九、实战 6:与 LangChain 合体——“LlamaIndex 做检索,LangChain 做编排”
from langchain.llms import OpenAI
from langchain.prompts import PromptTemplate
from langchain.chains import RetrievalQA
from llama_index.core import VectorStoreIndex
index = VectorStoreIndex.from_documents(documents)
retriever = index.as_retriever(similarity_top_k=4)
prompt = PromptTemplate(
template="用以下上下文回答,并标注来源页码:\n{context}\n问题:{question}",
input_variables=["context", "question"]
)
qa = RetrievalQA.from_chain_type(
llm=OpenAI(),
retriever=retriever,
return_source_documents=True,
chain_type_kwargs={"prompt": prompt}
)
print(qa.run("2026 年 AGI 安全报告核心结论?"))
兼顾 LlamaIndex 的专业索引能力 + LangChain 的 Agent、Memory、链式编排,企业级场景常用组合 。
十、性能调优 & 生产 checklist
| 环节 | 优化点 | 推荐配置 |
|---|---|---|
| 解析 | 多线程 + 缓存 | SimpleDirectoryReader(num_workers=8) |
| 分块 | 语义切分 | SentenceSplitter(chunk_size=512, chunk_overlap=64) |
| 向量 | 批量 Embedding | OpenAIEmbedding(embed_batch_size=100) |
| 召回 | 混合检索 | Vector + BM25 + reciprocal_rerank |
| 重排 | Cross-Encoder | ms-marco-MiniLM-L-6-v2 |
| 生成 | 引用溯源 | response.source_nodes[i].node.metadata['page_label'] |
| 部署 | 异步 + 缓存 | async/await + RedisCache |
| 观测 | 日志 & Token | 开启 CallbackManager + LangSmith |
十一、总结
LlamaIndex = 数据连接器 + 索引 + 检索 + 后处理 的一站式 RAG 框架:
- 10 行代码让 LLM 读懂你的私域文件;
- 混合召回 + 重排 + HyDE 让正确率提升 15~30%;
- 动态插入 + 版本管理让知识库“热更新”;
- 与 LangChain/vLLM 无缝集成,直接生产上线。
AI大模型学习代码仓库
更多推荐
所有评论(0)