RAG (Retrieval-Augmented Generation) ,即检索增强生成,是目前大模型应用中最核心、落地最广的技术架构。
简单来说,RAG 就是给大模型配了一个**"外部知识库"或"实时搜索增强"**。
一、 为什么需要 RAG?(核心痛点)
虽然大语言模型(LLM)很强大,但它有三个致命弱点:
- 幻觉问题:模型会一本正经地胡说八道,尤其是面对它不熟悉的专业领域。
- 知识过时:模型的知识停留在预训练结束的那一刻(例如 GPT-4 可能不知道昨天发生的新闻)。
- 缺乏私有数据:模型无法查看你的公司文档、私人笔记或实时数据库。
RAG 的比喻 :大模型就像一个"博学但记性不太好"的考官。如果不使用 RAG,他是闭卷考试;使用 RAG 后,他变成了开卷考试------在回答问题前,先去翻阅你提供的参考资料。
二、 RAG 的五步标准流程
一个典型的 RAG 系统主要分为两个阶段:索引(离线)和检索生成(在线)。
1. 加载 (Loading)
使用 LangChain 的 Document Loaders 从 PDF、网页、数据库或 Notion 中读取原始数据。
2. 分割 (Splitting)
大模型的上下文长度有限。Text Splitters 会将长文档切分成更小的块(Chunks),例如每块 500 字,并保持语义连贯。
3. 向量化 (Embedding)
将文本块转换成一串数字向量。这一步是让计算机能够通过"语义"来计算文本之间的相似度,而不仅仅是关键词匹配。
4. 存储 (Vector Stores)
将向量存储在专门的向量数据库(如 Chroma, FAISS, Pinecone)中。
5. 检索与生成 (Retrieval & Generation)
- 用户提问:系统先将用户的问题也转化成向量。
- 检索:在数据库中寻找语义最接近的几个文本块。
- 生成 :将这几个文本块作为"参考上下文"喂给 LLM,提示词如下: "基于以下资料:检索到的内容,请回答用户的问题:用户问题。"
三、 LangChain 代码示例
以下是一个基于 LangChain 和本地向量库 FAISS 实现的极简 RAG 示例:
python
import os
from langchain_openai import OpenAIEmbeddings, ChatOpenAI
from langchain_community.vectorstores import FAISS
from langchain_text_splitters import RecursiveCharacterTextSplitter
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.runnables import RunnablePassthrough
# 1. 准备本地知识库内容
text_content = """
2024年某公司发布了全新的AI芯片X1。
该芯片采用3nm工艺,主频高达4.0GHz。
相比上一代产品,性能提升了50%,功耗降低了30%。
"""
# 2. 文档分割与向量化存储
# 使用递归字符分割器
text_splitter = RecursiveCharacterTextSplitter(chunk_size=100, chunk_overlap=20)
chunks = text_splitter.split_text(text_content)
# 创建本地向量库(需要 OpenAI API Key 用于 Embedding)
vectorstore = FAISS.from_texts(chunks, embedding=OpenAIEmbeddings())
retriever = vectorstore.as_retriever()
# 3. 构建 RAG 链
template = """你是一个专业的助手。请根据以下上下文回答问题。
如果你不知道答案,就说你不知道,不要胡编乱造。
上下文:{context}
问题:{question}
"""
prompt = ChatPromptTemplate.from_template(template)
model = ChatOpenAI(model="gpt-4o")
# 定义处理流程
rag_chain = (
{"context": retriever, "question": RunnablePassthrough()}
| prompt
| model
)
# 4. 运行
response = rag_chain.invoke("新发布的X1芯片相比上一代性能提升了多少?")
print(response.content)
# 输出:相比上一代产品,新发布的X1芯片性能提升了50%。
四、 RAG vs 微调 (Fine-Tuning)
很多初学者会纠结:我是该 RAG 还是该微调模型?
| 特性 | RAG (检索增强) | Fine-Tuning (微调) |
|---|---|---|
| 知识更新 | 实时更新(改下数据库就行) | 困难(需重新训练) |
| 外部数据 | 擅长处理海量动态文档 | 不适合存储事实性知识 |
| 幻觉控制 | 低(有据可查,可提供来源) | 较高(模型仍可能胡编) |
| 成本 | 较低 | 较高(算力开销大) |
| 透明度 | 高(可以看到引用了哪段话) | 低(黑盒,不知道知识在哪) |
结论 :如果你的目标是让模型学习新知识 或基于私有文档回答 ,首选 RAG ;如果你的目标是让模型模仿某种特定语态 或学习某种复杂指令,才考虑微调。
五、 RAG 的未来趋势:高级 RAG
基础 RAG(如上代码)在复杂问题上表现有限,目前行业正在向高级 RAG (Advanced RAG) 演进:
- 多路召回:同时使用语义检索和关键词搜索。
- 重排序 (Rerank):从检索回来的 10 条结果中,用更精密的模型选出最相关的 3 条。
- Query Transformation:自动把用户的模糊问题改写成更容易检索的关键词。
- GraphRAG:结合知识图谱,处理跨文档的复杂逻辑关系。