大模型存在固有的知识截止与幻觉问题,对于医疗咨询、法律问答、企业内部知识库这类私有领域场景,直接调用基座大模型往往会输出错误或编造的内容。RAG不需要重新训练大模型,通过构建私有本地知识库,检索外部文档作为上下文,辅助大模型输出专业准确的回答。本文结合 LlamaIndex ,完成从环境搭建、基础知识库构建到高阶 RAG 架构的完整实操与生产级演进路线。
一、RAG 项目背景与核心目标
不做任何大模型训练或微调操作,通过搭建私有知识库增强大模型回答私有领域问题的能力。模型权重保持不变,所有领域知识来自外部文档,规避重新训练带来的高昂算力与数据集构建成本。
RAG 非常适合知识量大、内容会频繁迭代更新的垂直业务:
- 医疗咨询:病历、诊疗规范、药品说明书知识库问答。
- 法律问答:法条、判例、企业合规文档检索答疑。
- 企业内部知识检索:内部制度、项目文档、产品手册、技术资料查询。
市面上有多个支持 RAG 开发的 Python 框架。LangChain 是通用的 LLM 应用开发框架,擅长 Agent 构建与链式流程编排。而 LlamaIndex 专为构建 RAG 系统和处理数据设计,在文档解析、索引构建和检索查询方面提供了极高的灵活性,允许开发者精确安装所需的 LLM 接口、向量库和 Embedding 模型,有效避免了冗余依赖。
二、RAG 技术核心工作流程
标准的初级 RAG 系统主要分为离线构建与在线查询两个阶段:
- 文本编码:使用 Embedding 嵌入模型将文本片段(Chunk)转化为高维特征向量。
- 向量索引构建:生成用来执行高效相似度对比的向量索引引擎。
- 查询引擎封装:将 LLM 与向量知识库集成。接收用户提问并检索相关文档片段,将真实上下文拼接给大模型以生成最终答案。
三、LlamaIndex 基础实战操作
3.1 核心依赖安装
使用最新的按需安装范式,拉取 LlamaIndex 核心库与 HuggingFace 支持扩展:
pip install llama-index-core llama-index-llms-huggingface llama-index-embeddings-huggingface
3.2 加载本地 HuggingFace 大模型与 Embedding 模型
直接读取本地磁盘上已下载的开源大模型权重(如 Qwen 系列),并通过 Settings 注册至全局:
from llama_index.llms.huggingface import HuggingFaceLLM
from llama_index.embeddings.huggingface import HuggingFaceEmbedding
from llama_index.core import Settings
# 1. 配置 LLM
Settings.llm = HuggingFaceLLM(
model_name="path/to/local/model",
tokenizer_name="path/to/local/tokenizer",
context_window=4096,
max_new_tokens=512,
device_map="auto"
)
# 2. 配置 Embedding (推荐 BGE-M3 适配多语言与中文检索)
Settings.embed_model = HuggingFaceEmbedding(
model_name="BAAI/bge-m3"
)
3.3 构建向量知识库与基础查询
将 PDF、TXT 等业务数据统一存放在 data 目录:
from llama_index.core import SimpleDirectoryReader, VectorStoreIndex
# 批量读取 data 目录下的全部文档并构建索引
documents = SimpleDirectoryReader("data").load_data()
index = VectorStoreIndex.from_documents(documents)
# 转化为查询引擎并提问
query_engine = index.as_query_engine()
response = query_engine.query("什么是 xtuner?")
print(response)
四、高阶 RAG 架构演进与生产级实战
基础 RAG在面对复杂业务时,常暴露出“检索精度低、上下文割裂、问题意图模糊”等致命缺陷。在生产级实践中,必须引入以下高阶组件完成从能用到好用的跨越。
4.1 混合检索与 Cross-Encoder 重排序
单一的向量检索(Dense Retrieval)对专有名词和型号代码的召回极差。工业界标准做法是“BM25 词频检索 + 向量语义检索”的双路召回,随后使用交叉编码器(Cross-Encoder)进行精确的二次打分排位。
from llama_index.core.postprocessor import SentenceTransformerRerank
# 引入 bge-reranker 进行交叉打分重排序
reranker = SentenceTransformerRerank(
model="BAAI/bge-reranker-large",
top_n=3 # 从初筛的 top_k 中精选最相关的 3 个
)
# 在查询引擎中挂载后处理模块
query_engine = index.as_query_engine(
similarity_top_k=10, # 向量初筛放宽到 10 个
node_postprocessors=[reranker]
)
4.2 智能文档分块与上下文扩展
粗暴的固定长度切片(如每 500 字一刀)会生硬切断语义逻辑。LlamaIndex 提供了 SentenceWindowNodeParser,在检索时仅用核心单句匹配相似度,但传递给大模型时,会自动带上该句前后的 N 个句子作为滑动窗口,完美兼顾检索精度与上下文完整性。
from llama_index.core.node_parser import SentenceWindowNodeParser
# 设置滑动窗口节点解析器
node_parser = SentenceWindowNodeParser.from_defaults(
window_size=3, # 保留核心句前后的 3 个句子
window_metadata_key="window",
original_text_metadata_key="original_text",
)
# 替换全局默认的分块策略
Settings.node_parser = node_parser
4.3 查询重写与多路路由
用户提问往往口语化且信息缺失。在检索前引入 查询重写(Query Rewriting) 或 HyDE(假设性文档嵌入),利用大模型先生成一个“伪答案”,再用该伪答案去检索知识库,能大幅提升召回率。同时,对于兼顾“政策问答”与“表格数据查询”的复杂系统,可使用 RouterQueryEngine 进行智能分发。
from llama_index.core.query_engine import RouterQueryEngine
from llama_index.core.selectors import PydanticSingleSelector
from llama_index.core.tools import QueryEngineTool
# 假设已有 policy_engine (向量库) 和 sql_engine (关系型数据库)
policy_tool = QueryEngineTool.from_defaults(
query_engine=policy_engine, description="用于解答公司规章制度、报销流程的文本问题"
)
sql_tool = QueryEngineTool.from_defaults(
query_engine=sql_engine, description="用于查询实时的产品价格、库存与销量数据"
)
# 赋予大模型路由决策能力
router_engine = RouterQueryEngine(
selector=PydanticSingleSelector.from_defaults(),
query_engine_tools=[policy_tool, sql_tool]
)
response = router_engine.query("帮我查一下 A 产品的库存,并告诉我缺货申报流程。")
4.4 Agentic RAG:自我反思与纠错 (Self-RAG)
被动检索正在向智能体架构(Agentic RAG)演进。系统不仅执行一次检索,还会对召回的文档进行相关性自我评估(Grade Documents)。如果检索到的文档无法支撑回答,Agent 会主动重写问题并发起二次检索,直到信息完备后再生成最终答案,物理级别遏制幻觉发生。
五、Web 应用封装:Streamlit 可视化交互页面
单纯的命令行交互难以用于企业内测与演示,可采用 Streamlit 快速搭建极简的 Web UI 原型。
- 安装依赖:
pip install streamlit - 编写
app.py,将模型加载、索引实例化以及对话逻辑包裹在页面中,利用st.chat_message添加前端输入框与会话历史展示区。 - 启动服务:
streamlit run app.py
Streamlit 主要用于业务原型的快速跑通。在真正的生产级部署中,通常基于 FastAPI 或 Go 开发纯后端接口,再与独立的前端页面对接。
六、对照实验:有无 RAG 的效果差异
以“什么是 xtuner”作为测试问题进行基准对比:
- 未使用 RAG(纯基座大模型推理):如果该私有知识点未出现在模型的预训练数据中,模型通常会产生严重幻觉,输出类似“xtuner 是一款智能音乐播放器”等违背事实的内容。
- 开启 RAG(接入本地知识库):模型精准读取到向量库召回的内部文档,并总结出“xtuner 是一款轻量化的大模型微调工具库”。由于回答完全溯源自真实文档,幻觉率几乎降至零。
通过实验可以发现,只要 RAG 检索链路,尤是高阶的重排序与智能分块策略足够扎实,无论将后端的基座模型切换为 Llama、Qwen 还是 DeepSeek,都能保持稳定的回答准确率,证明了 RAG 极强的工程泛化能力。
七、 工业级 RAG 落地通用范式
零微调成本、知识库灵活迭代、数据源兼容广是 RAG 系统的核心优势。在真实的生产部署阶段,初期调试使用的内存向量引擎必须被 Qdrant、Milvus 或 FAISS 等独立中间件替代,以支撑海量特征的高并发读取。
对于文档的预处理,自动化 OCR 和版面分析往往比选用更贵的千亿级大模型更能提升系统上限。
一套涵盖“多模态解析 ➔ 混合检索 ➔ 交叉重排序 ➔ LLM 生成”的闭环,已成为企业级大模型私有化落地的标准范式。
321

被折叠的 条评论
为什么被折叠?



