共计 1549 个字符,预计需要花费 4 分钟才能阅读完成。
为什么需要 RAG 技术?
传统的生成模型(如 GPT)虽然能产生流畅的文本,但在实际应用中常遇到两个核心问题:

- 知识时效性差:模型训练后无法自动更新知识,导致回答过期信息
- 事实准确性低:依赖模型参数中的记忆,容易产生幻觉(Hallucination)
RAG(Retrieval-Augmented Generation)通过『检索 + 生成』的架构解决了这些问题。它像是一个『即时查资料再作答』的聪明助手,结合了搜索引擎的准确性和语言模型的表达能力。
技术方案对比
| 维度 | 微调 (Fine-tuning) | 提示工程 (Prompting) | RAG |
|---|---|---|---|
| 成本 | 高(需训练) | 低 | 中(需维护检索库) |
| 效果 | 领域适配好 | 依赖 prompt 设计 | 事实性强 |
| 知识更新 | 需重新训练 | 实时性差 | 可热更新 |
| 硬件需求 | GPU 资源要求高 | 低 | 中等 |
核心实现四步走
1. 文档预处理
关键操作是将文本拆分为语义完整的片段:
from langchain.text_splitter import RecursiveCharacterTextSplitter
# 建议参数:块大小 500,重叠 150 字符
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=500,
chunk_overlap=150
)
docs = text_splitter.split_documents(your_documents)
2. 向量化与索引构建
使用 Sentence-BERT 生成向量,FAISS 加速检索:
from sentence_transformers import SentenceTransformer
import faiss
# 加载预训练模型
encoder = SentenceTransformer('paraphrase-multilingual-MiniLM-L12-v2')
# 生成向量库
vectors = encoder.encode([doc.page_content for doc in docs])
dimension = vectors.shape[1]
index = faiss.IndexFlatIP(dimension)
index.add(vectors)
3. 检索增强生成
用 LangChain 串联流程:
from langchain.chains import RetrievalQA
from langchain.llms import OpenAI
qa_chain = RetrievalQA.from_chain_type(llm=OpenAI(temperature=0), # 降低随机性
chain_type="stuff",
retriever=your_retriever
)
response = qa_chain.run("如何配置 MCP 的权限系统?")
4. 生产环境优化技巧
- 检索延迟 :对高频 query 做缓存,异步更新索引
- 数据新鲜度 :设置定时任务增量更新向量库
- 幻觉抑制 :
# 添加置信度过滤 if response['confidence'] < 0.7: return "未能找到可靠答案,请重新提问"
新手避坑指南
- 分块尺寸不当
- 错误:5KB 的大文本块导致检索精度下降
-
解决:根据语义完整性调整,法律文档建议 300-500 字
-
忽略 query 扩展
- 错误:直接检索原始问题 ”MCP 怎么用 ”
-
解决:重写为 ”MCP 平台的操作步骤和使用示例 ”
-
向量模型不匹配
- 错误:用通用模型处理医学专业术语
- 解决:使用领域适配模型如 biobert
进阶思考题
- 当检索到多个矛盾答案时,如何设计融合策略?
- 对于中文混合英文的文档,哪种分块策略更合理?
通过这个流程,我用 2 周时间就搭建起了公司内部的知识问答系统。RAG 最让我惊喜的是修改答案源只需要更新文档,完全不用碰模型代码。建议新手先从 LangChain 的 RetrievalQA 模板开始,再逐步自定义各模块。
正文完
