RAG:让大模型“既懂又查”的智能系统
RAG:让大模型“既懂又查”的智能系统
一、RAG 是什么?
RAG(Retrieval-Augmented Generation)全称 检索增强生成,是近年来最受关注的大模型增强技术之一。
它的核心思想很简单:
“让大模型在生成答案前,先去知识库里查一查,再回答。”
传统的大语言模型(LLM)虽然强大,但它的知识是静态的,只包含训练截止时的数据。
如果我们想让模型回答公司内部文档、私有知识、或最新数据的问题,就会遇到两个问题:
模型不知道这些信息;
即使知道,也可能记错或幻觉。
RAG 正是为了解决这两个问题而诞生的。
二、RAG 的核心思想
RAG 把 LLM 的生成过程拆成了两步:
Retrieval(检索):
从外部知识库中找到与问题最相关的文档片段(如知识库、PDF、网页、数据库等)。Generation(生成):
把检索到的内容与用户问题一起输入大模型,由模型基于这些上下文生成回答。
这相当于给模型“实时查资料”的能力,让它不必完全依赖自己的记忆,而是能“边查边答”。
三、RAG 的系统架构
一个典型的 RAG 系统由以下模块组成:
┌────────────────────────┐│ 用户问题 │└──────────┬─────────────┘│▼┌────────────────────────┐│ 向量化与语义检索层 │ ← 使用 Embedding + 向量数据库└──────────┬─────────────┘│ 检索到相关文档片段▼┌────────────────────────┐│ 大模型生成层 │ ← 使用 GPT / Llama / Qwen 等└──────────┬─────────────┘│ 生成基于检索内容的回答▼┌────────────────────────┐│ 输出答案 │└────────────────────────┘
核心组件说明:
| 模块 | 功能 | 常用工具 |
|---|---|---|
| 文本切片 | 将长文档分成小块(chunk) | LangChain TextSplitter、LlamaIndex NodeParser |
| 向量化 | 将文本转为语义向量 | OpenAI Embeddings、BGE、E5、MiniLM |
| 向量数据库 | 存储和检索相似文本 | FAISS、Milvus、Chroma、Weaviate |
| 检索器 | 根据问题找相关片段 | BM25、Dense Retriever、Hybrid Search |
| 生成器 | 结合上下文生成答案 | GPT-4、Qwen2、Llama3、Mistral |
| 提示模板 | 构造模型输入格式 | LangChain PromptTemplate |
四、RAG 的关键技术细节
1️⃣ 文本切片与索引
大多数知识库文件都很长(例如一本技术手册),直接存储会导致检索不精确。
因此需要切片(chunking):
from langchain.text_splitter import RecursiveCharacterTextSplittersplitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=100)
docs = splitter.split_text(long_text)
小技巧:chunk_size 400~800 通常效果较好,overlap 保留上下文连续性。
2️⃣ 向量化与存储
使用 Embedding 模型将文本转换为向量:
from langchain.embeddings import OpenAIEmbeddings
embeddings = OpenAIEmbeddings()doc_vectors = [embeddings.embed_query(d) for d in docs]
然后将向量存入数据库(如 FAISS):
from langchain.vectorstores import FAISS
vector_db = FAISS.from_texts(docs, embeddings)
3️⃣ 检索增强生成流程
RAG 的核心查询流程如下:
from langchain.chains import RetrievalQA
from langchain.chat_models import ChatOpenAIllm = ChatOpenAI(model_name="gpt-4-turbo")
qa_chain = RetrievalQA.from_chain_type(llm=llm,retriever=vector_db.as_retriever(search_kwargs={"k": 3})
)query = "请解释RAG系统的检索机制"
result = qa_chain.run(query)
print(result)
模型在回答时会基于检索到的内容生成答案,从而显著减少“胡编乱造”。
五、RAG 的优势与局限
| 优势 | 局限 |
|---|---|
| 知识实时更新,无需重新训练模型 | 检索结果质量决定最终答案 |
| 可接入私有知识库 | 大模型仍可能忽略部分上下文 |
| 减少幻觉,答案可溯源 | 多文档整合时可能信息冲突 |
| 成本低、部署快 | 检索速度取决于数据库性能 |
六、RAG 的改进方向
目前业界已经提出多种 RAG 改进方案:
HyDE(Hypothetical Document Embeddings):先让模型生成假设答案,再以其为查询进行检索。
Re-Ranking:使用 Cross-Encoder 对检索结果进行重排序。
Context Compression:对检索内容做摘要,节省上下文长度。
Agent-RAG:引入智能体(Agent),能根据任务动态选择检索策略。
Graph-RAG:结合知识图谱结构,增强检索逻辑关系。
七、实际应用场景
| 场景 | 说明 |
|---|---|
| 📚 企业知识问答 | 公司内部知识库检索,如政策、流程、文档 |
| 🧠 医学/法律咨询 | 利用专业文献数据库生成解释性回答 |
| 💼 客服机器人 | 自动回答客户常见问题 |
| 💾 数据报告分析 | 结合检索与生成解释业务指标 |
| 🧩 教育问答系统 | 从教材中检索知识并讲解 |
八、一个完整的最小可用RAG Demo
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.embeddings import OpenAIEmbeddings
from langchain.vectorstores import FAISS
from langchain.chat_models import ChatOpenAI
from langchain.chains import RetrievalQA# Step 1. 构建知识库
text = open("company_guide.txt", "r", encoding="utf-8").read()
splitter = RecursiveCharacterTextSplitter(chunk_size=600, chunk_overlap=100)
docs = splitter.split_text(text)embeddings = OpenAIEmbeddings()
vector_db = FAISS.from_texts(docs, embeddings)# Step 2. 构建 RAG 问答系统
llm = ChatOpenAI(model="gpt-4o-mini")
qa_chain = RetrievalQA.from_chain_type(llm=llm,retriever=vector_db.as_retriever(),chain_type="stuff"
)# Step 3. 查询
query = "公司员工请假制度是怎样的?"
print(qa_chain.run(query))
九、总结
| 要点 | 内容 |
|---|---|
| RAG 核心目标 | 把外部知识引入生成流程 |
| 关键组成 | 检索 + 向量数据库 + 大模型生成 |
| 典型框架 | LangChain、LlamaIndex、Haystack |
| 优势 | 实时知识、低成本、强扩展性 |
| 未来趋势 | Graph-RAG、Agent-RAG、自适应检索 |
