RAG 从入门到精通:构建你的第一个检索增强生成应用
rag进阶
AI Engineer Roadmap2026年07月15日
什么是 RAG?
RAG(Retrieval-Augmented Generation,检索增强生成)是一种将信息检索与大语言模型生成能力相结合的技术架构。它的核心思想是:先检索相关信息,再基于检索结果生成回答。
为什么需要 RAG?
大语言模型虽然强大,但存在以下局限:
- 知识截止日期:模型训练数据有截止时间,无法获取最新信息
- 幻觉问题:可能生成不准确或虚构的内容
- 领域知识缺失:通用模型缺乏特定领域的专业知识
- 可解释性弱:难以追踪回答的信息来源
RAG 通过引入外部知识库,有效解决了上述问题。
RAG 的核心流程
┌──────────┐
│ 用户提问 │
└────┬─────┘
▼
┌─────────────────┐
│ 向量化查询 │
│ (Embedding) │
└────────┬────────┘
▼
┌──────────────────┐
│ 向量相似度搜索 │
│ (Vector Search) │
└────────┬─────────┘
▼
┌──────────────────┐
│ 检索相关文档 │
│ (Top-K) │
└────────┬─────────┘
▼
┌──────────────────┐
│ 构建增强 Prompt │
│ Query + Context │
└────────┬─────────┘
▼
┌──────────────────┐
│ LLM 生成回答 │
└──────────────────┘
1. 文档加载与分割
首先,我们需要加载文档并将其分割成合适大小的块(chunks):
from langchain.document_loaders import TextLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
# 加载文档
loader = TextLoader("knowledge_base.txt")
documents = loader.load()
# 文本分割
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=500,
chunk_overlap=50,
separators=["\n\n", "\n", "。", "!", "?", ",", " ", ""]
)
chunks = text_splitter.split_documents(documents)
print(f"共分割成 {len(chunks)} 个文本块")
2. 向量化与存储
将文本块转换为向量并存入向量数据库:
from langchain.embeddings import OpenAIEmbeddings
from langchain.vectorstores import Chroma
# 初始化嵌入模型
embeddings = OpenAIEmbeddings()
# 创建向量数据库
vectorstore = Chroma.from_documents(
documents=chunks,
embedding=embeddings,
persist_directory="./chroma_db"
)
print(f"已存入 {vectorstore._collection.count()} 条向量")
3. 检索与生成
构建完整的 RAG 链:
from langchain.chat_models import ChatOpenAI
from langchain.chains import RetrievalQA
# 初始化 LLM
llm = ChatOpenAI(
model="gpt-3.5-turbo",
temperature=0
)
# 创建检索器
retriever = vectorstore.as_retriever(
search_type="similarity",
search_kwargs={"k": 4}
)
# 构建 RAG 链
qa_chain = RetrievalQA.from_chain_type(
llm=llm,
chain_type="stuff",
retriever=retriever,
return_source_documents=True
)
# 提问
query = "什么是注意力机制?"
result = qa_chain({"query": query})
print(f"回答: {result['result']}")
print(f"来源文档数: {len(result['source_documents'])}")
进阶优化技巧
Chunk 大小调优
Chunk 大小直接影响检索质量:
- 过大:检索精度降低,包含无关信息
- 过小:上下文不完整,丢失语义
建议根据文档类型测试不同大小(200-1000 tokens)。
检索策略选择
对于复杂查询,可以使用高级检索策略:
from langchain.retrievers import ParentDocumentRetriever
# 父文档检索器
retriever = ParentDocumentRetriever(
vectorstore=vectorstore,
docstore=docstore,
child_splitter=child_splitter,
parent_splitter=parent_splitter
)
总结
RAG 是当前 AI 应用开发中最实用的技术之一。通过本文的学习,你应该已经掌握了:
- RAG 的核心原理和架构
- 使用 LangChain + Chroma 构建 RAG 系统
- 文档分块、向量化和检索的完整流程
- 基本的优化方向
下一步可以探索:多模态 RAG、Agent + RAG 混合架构、以及在生产环境中的最佳实践。