RAG技术深度解析与实践:让LLM拥有实时知识库
在大语言模型(LLM)飞速发展的今天,其在自然语言理解、生成等领域展现出强大能力,但同时也存在"知识滞后""事实性错误"等固有缺陷。检索增强生成(Retrieval-Augmented Generation,简称RAG)技术应运而生,通过将"检索外部知识库"与"LLM生成"相结合,有效弥补了LLM的不足,让生成内容更具准确性、时效性和专业性。本文将从RAG技术的核心原理、工作流程、核心组件出发,结合完整代码示例,带大家从零搭建一个简单的RAG系统。
一、RAG技术核心原理
RAG的核心思想是"先检索,后生成":在LLM生成回复之前,先从外部知识库中检索与用户问题相关的信息,将这些信息作为"上下文"与用户问题一起输入给LLM,让LLM基于检索到的准确信息进行回复。其核心价值在于:
二、RAG技术工作流程
一个完整的RAG系统主要包含两大阶段:数据准备阶段和查询推理阶段。

数据准备阶段
查询推理阶段
三、RAG核心组件选型

| 组件 | 推荐方案 | 说明 |
|---|---|---|
| 文档分割 | LangChain RecursiveCharacterTextSplitter | 自适应不同文档格式,可自定义片段长度和重叠度 |
| 嵌入模型 | Hugging Face all-MiniLM-L6-v2 | 轻量高效,开源免费,支持多语言 |
| 向量数据库 | Chroma | 轻量级,无需复杂部署,支持内存模式 |
| 大语言模型 | OpenAI GPT-3.5-turbo 或 Llama 2 | GPT生成质量高,Llama 2可本地部署 |
| 开发框架 | LangChain | 封装了RAG全流程组件,降低开发难度 |
四、实战:从零搭建RAG系统

4.1 环境准备
pip install langchain sentence-transformers chromadb openai python-dotenv4.2 完整代码实现
代码分为5个模块:环境配置、数据准备(加载+分割+编码+存储)、检索模块、生成模块、RAG整体流程封装。
import os
from dotenv import load_dotenv
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.embeddings import HuggingFaceEmbeddings
from langchain.vectorstores import Chroma
from langchain.chat_models import ChatOpenAI
from langchain.prompts import PromptTemplate
from langchain.chains import RetrievalQA
1. 环境配置
load_dotenv()
openai_api_key = os.getenv("OPENAI_API_KEY")
CHUNK_SIZE = 500
CHUNK_OVERLAP = 50
EMBEDDING_MODEL_NAME = "all-MiniLM-L6-v2"
VECTOR_DB_PATH = "./chroma_python_knowledge"
LLM_MODEL_NAME = "gpt-3.5-turbo"
2. 数据准备:构建知识库
def build_knowledge_base(document_paths):
texts = []
for path in document_paths:
with open(path, "r", encoding="utf-8") as f:
texts.append(f.read())
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=CHUNK_SIZE, chunk_overlap=CHUNK_OVERLAP, length_function=len
)
splits = text_splitter.split_text("\\n\\n".join(texts))
embeddings = HuggingFaceEmbeddings(model_name=EMBEDDING_MODEL_NAME)
db = Chroma.from_texts(texts=splits, embedding=embeddings, persist_directory=VECTOR_DB_PATH)
db.persist()
retriever = db.as_retriever(search_kwargs={"k": 3})
return retriever
3. 构建RAG生成链
def build_rag_chain(retriever):
prompt_template = \"\"\"
你是一个Python学习助手,仅基于提供的上下文信息回答用户问题。
如果上下文没有相关信息,直接说明"没有找到相关知识点",不要编造内容。
上下文信息:{context}
用户问题:{question}
回答:\"\"\"
prompt = PromptTemplate(template=prompt_template, input_variables=["context", "question"])
llm = ChatOpenAI(model_name=LLM_MODEL_NAME, api_key=* temperature=0.3)
rag_chain = RetrievalQA.from_chain_type(
llm=llm, chain_type="stuff", retriever=retriever,
chain_type_kwargs={"prompt": prompt}, return_source_documents=True
)
return rag_chain
4. 核心查询函数
def rag_query(rag_chain, question):
result = rag_chain({"query": question})
return result["result"], result["source_documents"]
5. 测试运行
if __name__ == "__main__":
test_documents = ["./python_basics.txt"]
retriever = build_knowledge_base(test_documents)
rag_chain = build_rag_chain(retriever)
for q in ["Python中如何定义函数?", "列表和元组的区别是什么?", "Python的装饰器有什么作用?"]:
answer, sources = rag_query(rag_chain, q)
print(f"问题:{q}\\n回答:{answer}\\n")五、RAG技术的优化方向
六、RAG技术的应用场景
七、总结
RAG技术通过"检索增强生成"的核心逻辑,有效弥补了LLM的知识滞后和事实性缺陷,是当前LLM落地应用的关键技术之一。随着技术的发展,RAG与微调、Agent等技术的结合,将进一步拓展LLM的应用边界,推动AI在各行业的深度落地。
原文来源:腾讯云开发者社区