——从数据摄入到查询的全流程实战教程
在大模型(LLM)应用开发中,知识库系统 是提升模型准确性和专业性的关键。本文将带你全面掌握 LlamaIndex(原 GPT Index) 这一强大的开源框架,从基础架构讲起,通过多个实战代码示例,展示如何构建一个完整的、高效的 RAG(检索增强生成)知识库系统。
我们将涵盖:
✅ 适合对象:AI初中级开发者
实战内容:文本分块、向量检索、混合搜索、流式输出
️ 工具链完整:OpenAI、本地模型、Web爬取、PDF解析
场景覆盖:企业知识库、研究文献分析、个性化问答
LlamaIndex 的核心流程是:
Document → Node → Index → Retriever → Query Engine → Response
组件 | 功能 |
---|---|
Document | 原始输入数据(如 PDF、网页、数据库) |
Node | 分块后的最小处理单元 |
Index | 构建可检索的结构(如向量索引) |
Retriever | 负责从索引中查找相关内容 |
Query Engine | 结合 LLM 和检索结果生成最终回答 |
from llama_index.core import SimpleDirectoryReader, VectorStoreIndex
# 步骤1:加载文档
documents = SimpleDirectoryReader("./data").load_data()
# 步骤2:构建索引
index = VectorStoreIndex.from_documents(documents)
# 步骤3:创建查询引擎
query_engine = index.as_query_engine()
# 步骤4:执行查询
response = query_engine.query("量子计算的基本原理是什么?")
print(response)
解释说明:
SimpleDirectoryReader
支持多种格式(txt/pdf/docx/json);VectorStoreIndex
构建基于向量的检索结构;as_query_engine()
是默认查询引擎,也可自定义。from langchain.agents import Tool
from langchain.chains import RetrievalQA
from langchain_openai import ChatOpenAI
# 将 LlamaIndex 索引包装为 LangChain 工具
tool = Tool.from_function(
func=lambda q: str(query_engine.query(q)),
name="KnowledgeBase",
description="用于回答关于知识库的问题"
)
llm = ChatOpenAI(model="gpt-4o")
qa_chain = RetrievalQA.from_chain_type(llm=llm, retriever=index.as_retriever())
# 在 LangChain 中使用
result = qa_chain.invoke({"query": "太阳系有哪些行星?"})
print(result["result"])
解释说明:
from llama_index.core import SimpleDirectoryReader
from llama_index.readers.web import SimpleWebPageReader
# 加载本地文档
documents = SimpleDirectoryReader("./data").load_data()
# 加载网页内容
web_documents = SimpleWebPageReader().load_data([
"https://example.com/page1",
"https://example.com/page2"
])
解释说明:
SimpleDirectoryReader
支持 txt、pdf、csv、json 等格式;SimpleWebPageReader
可抓取网页并提取文本;from llama_index.core.node_parser import SentenceSplitter, TokenTextSplitter
# 基于句子的分块器
sentence_parser = SentenceSplitter(chunk_size=512, chunk_overlap=50)
nodes = sentence_parser.get_nodes_from_documents(documents)
# 基于token的分块器
token_parser = TokenTextSplitter(chunk_size=256, chunk_overlap=20)
token_nodes = token_parser.get_nodes_from_documents(documents)
解释说明:
SentenceSplitter
按句分割,语义连贯;TokenTextSplitter
按 token 数量分割,适合严格限制;from llama_index.core.readers.base import BaseReader
from typing import List, Dict
class MyCustomReader(BaseReader):
def load_data(self, file_path: str) -> List[Dict]:
with open(file_path, 'r') as f:
text = f.read()
return [{"text": text}]
custom_reader = MyCustomReader()
docs = custom_reader.load_data("my_custom_file.txt")
解释说明:
BaseReader
即可定义自己的读取逻辑;from llama_index.core import Document
from datetime import datetime
doc = Document(text="这是一段重要信息", metadata={"source": "internal_doc", "date": str(datetime.now())})
解释说明:
Node
或 Document
可附加元数据;from llama_index.core import VectorStoreIndex, SimpleKeywordTableIndex, KnowledgeGraphIndex
# 创建向量索引
vector_index = VectorStoreIndex.from_documents(documents)
# 创建关键词索引
keyword_index = SimpleKeywordTableIndex.from_documents(documents)
# 创建知识图谱索引
kg_index = KnowledgeGraphIndex.from_documents(documents)
解释说明:
VectorStoreIndex
:最常用,适合通用检索;SimpleKeywordTableIndex
:基于关键词匹配;KnowledgeGraphIndex
:适合实体关系丰富的场景。from llama_index.core.retrievers import VectorIndexRetriever, BM25Retriever
from llama_index.core.query_engine import RetrieverQueryEngine
from llama_index.core.retrievers import EnsembleRetriever
# 创建混合检索器
retriever_vector = VectorIndexRetriever(index=vector_index)
retriever_keyword = BM25Retriever.from_documents(documents)
ensemble_retriever = EnsembleRetriever(
retrievers=[retriever_vector, retriever_keyword],
weights=[0.6, 0.4]
)
# 使用混合检索
nodes = ensemble_retriever.retrieve("量子计算的应用场景有哪些?")
解释说明:
EnsembleRetriever
支持多检索器融合;weights
控制各检索器权重;from llama_index.core.postprocessor import SentenceEmbeddingOptimizer
optimizer = SentenceEmbeddingOptimizer(threshold_cutoff=0.7)
nodes = optimizer.postprocess_nodes(nodes, query_str="量子计算")
解释说明:
SentenceEmbeddingOptimizer
移除不相关的句子;from llama_index.core.postprocessor import SimilarityPostprocessor
postprocessor = SimilarityPostprocessor(similarity_cutoff=0.7)
filtered_nodes = postprocessor.postprocess_nodes(nodes, query_str="太阳能")
解释说明:
SimilarityPostprocessor
过滤低相似度节点;from llama_index.core.query_engine import RetrieverQueryEngine
from llama_index.core.response_synthesizers import CompactAndRefine
# 配置响应合成器
synthesizer = CompactAndRefine(
llm=llm,
verbose=True,
streaming=True
)
# 创建查询引擎
query_engine = RetrieverQueryEngine(
retriever=ensemble_retriever,
response_synthesizer=synthesizer,
node_postprocessors=[postprocessor]
)
# 执行查询
response = query_engine.query("太阳能技术的最新进展是什么?")
解释说明:
CompactAndRefine
逐条处理上下文,节省内存;streaming=True
支持流式输出;node_postprocessors
可叠加多个后处理步骤。from langchain.agents import create_openai_functions_agent, AgentExecutor
from langchain.tools import Tool
def query_knowledge_base(query):
return str(query_engine.query(query))
tool = Tool.from_function(
func=query_knowledge_base,
name="KnowledgeBase",
description="用于回答基于知识库的问题"
)
agent = create_openai_functions_agent(openai_llm, [tool], prompt)
agent_executor = AgentExecutor(agent=agent, tools=[tool], verbose=True)
# 执行代理
agent_executor.invoke({"input": "请总结一下这篇论文的主要观点。"})
解释说明:
from llama_index.core.callbacks import CallbackManager, StreamingOutCallbackHandler
callback_manager = CallbackManager([StreamingOutCallbackHandler()])
llm.callback_manager = callback_manager
response = query_engine.query("请详细解释一下光合作用的过程。")
for token in response.response_gen:
print(token, end="", flush=True)
解释说明:
StreamingOutCallbackHandler
支持回调流式输出;from llama_index.evaluation import DatasetGenerator, RelevancyEvaluator
from llama_index.core import SimpleDirectoryReader
# 生成评估数据集
generator = DatasetGenerator(documents)
eval_dataset = generator.generate_questions_from_nodes(num=50)
# 评估检索器
evaluator = RelevancyEvaluator()
results = evaluator.evaluate_dataset(eval_dataset, query_engine)
解释说明:
SimpleDirectoryReader
加载 PDF;VectorStoreIndex
构建向量库;RedisStorageContext
存储索引;arxiv.Reader
抓取论文;GitHub 示例地址(假设):https://github.com/yourname/llamaindex-knowledgebase-template
BM25Retriever
;cache=True
);max_input_size
限制输入长度;框架 | 优点 | 缺点 |
---|---|---|
LlamaIndex | 插件丰富、社区活跃、生态强大 | 学习曲线陡峭 |
Haystack | 界面友好、可视化强 | 社区较小 |
LangChain | 灵活、模块化强 | 知识库功能较弱 |
Milvus + LangChain | 强大的向量数据库 | 部署复杂 |
LlamaIndex 是构建现代 RAG 系统的核心工具之一。本文不仅介绍了其核心组件与架构,还通过多个实战代码帮助你快速上手,构建真实可用的知识库应用。
如果你想了解某个平台的深度评测、定制化训练或私有化部署方案,欢迎留言,我们将安排专题深入讲解!
✅ 关注《AI大模型应知应会100篇》专栏,持续更新前沿技术干货!