共计 2543 个字符,预计需要花费 7 分钟才能阅读完成。
当大模型开始 ” 胡说八道 ”:幻觉问题的由来
上周用 GPT 帮我整理会议纪要时,发现它居然给不存在的议题编了 3 条讨论结果——这就是典型的模型幻觉(Hallucination)。LLM 就像个知识渊博但爱添油加醋的教授,其核心问题在于:

- 参数化知识局限:训练时见过的知识被压缩成模型权重,像用 256GB 硬盘存整个图书馆
- 时间冻结效应:模型训练后,新发布的论文、财报等时效信息完全缺失
- 过度自信生成:即使遇到超出训练分布的问题,仍会强行输出看似合理的答案
微调 vs RAG:技术方案的对决
传统微调方案
- 优点:在特定领域可以达到较高准确率
- 致命伤:
- 每次更新知识需全量训练,成本呈指数增长
- 训练周期长(典型 case:3 天训练 + 2 天评估)
- 不同知识模块间存在干扰
RAG 方案
通过将知识库外置,实现:
1. 分钟级更新:替换向量数据库即可生效
2. 成本可控:仅需 embedding 计算资源
3. 可解释性:每个回答都能追溯参考文档
实测对比:在客服场景中,微调方案准确率 87% 但更新成本 $500/ 次,RAG 方案准确率 82% 但更新成本仅 $0.3/ 次
RAG 核心组件拆解
检索器:寻找最相关的知识片段
稠密检索(Dense Retrieval)
from sentence_transformers import SentenceTransformer
encoder = SentenceTransformer('paraphrase-multilingual-MiniLM-L12-v2')
doc_vectors = encoder.encode(docs) # 将文档转换为 768 维向量
– 优点:捕捉语义相似性(” 用户 ”≈” 客户 ”)
– 挑战:需要优质 embedding 模型
稀疏检索(Sparse Retrieval)
from sklearn.feature_extraction.text import TfidfVectorizer
tfidf = TfidfVectorizer()
sparse_matrix = tfidf.fit_transform(docs) # 构建词频矩阵
– 优点:精确匹配关键词(适合法律条款)
– 缺点:无法处理同义词
混合方案:先用 BM25 做初筛,再用稠密检索精排
上下文窗口优化
当检索到 10 篇相关文档但超出 LLM 上下文限制时:
- 重排序策略:
- 按与问题 embedding 的余弦相似度排序
-
保留 top- k 个最相关片段
-
摘要压缩:
from langchain.chains import summarize summarizer = summarize.load_chain("refine") compressed_doc = summarizer.run(full_document)
生成控制技术
避免 LLM 自由发挥的关键 prompt 结构:
请严格根据以下上下文回答,若信息不足请回复 "不清楚":[插入检索到的文档]
问题:[用户提问]
生产级实现示例
完整 LangChain 流水线
from langchain.document_loaders import WebBaseLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.embeddings import HuggingFaceEmbeddings
from langchain.vectorstores import FAISS
from langchain.chains import RetrievalQA
# 文档预处理
loader = WebBaseLoader("https://example.com/docs")
docs = loader.load()
text_splitter = RecursiveCharacterTextSplitter(chunk_size=500)
splits = text_splitter.split_documents(docs)
# 向量化存储
embedding = HuggingFaceEmbeddings()
vectorstore = FAISS.from_documents(splits, embedding)
# 混合检索器
retriever = vectorstore.as_retriever(
search_type="mmap", # 混合检索
search_kwargs={"k": 5}
)
# 生成环节
qa_chain = RetrievalQA.from_chain_type(llm=ChatOpenAI(),
chain_type="stuff",
retriever=retriever,
return_source_documents=True # 显示参考来源
)
性能优化实战
延迟优化三板斧
- 分级缓存:
- 内存缓存高频问题(TTL= 5 分钟)
-
Redis 缓存长尾问题(TTL= 1 天)
-
异步处理:
# 并行执行检索与生成 async def rag_query(question): retrieved = await retriever.aget_relevant_documents(question) return await qa_chain.agenerate([question]) -
硬件加速:
- 使用 GPU 加速 embedding 计算
- 量化向量数据库(FP32→INT8)
分布式架构设计
graph TD
A[客户端] --> B[负载均衡器]
B --> C[检索节点 1]
B --> D[检索节点 2]
C & D --> E[向量数据库集群]
E --> F[生成节点]
生产环境生存指南
数据新鲜度保障
- 定时任务每小时检测源数据变更
- 增量更新 embedding 时采用 faiss 的 merge 操作
优雅降级方案
try:
answer = qa_chain(query)
except Exception:
answer = {"result": "系统维护中", "fallback": True}
关键监控指标
- 检索成功率(95% 线应 >98%)
- 平均响应时间(端到端 <1.5s)
- 缓存命中率(建议 >40%)
未完的挑战
当需要回答 ” 特斯拉 2023 年财报相比 2022 年有哪些变化 ” 这类问题时:
- 多跳检索 如何实现?是否需要构建文档关系图
- 动态上下文窗口 能否根据问题复杂度自动调整
- 成本与精度 的帕累托最优曲线在哪里
技术总是在解决问题中进化,而 RAG 才刚刚开始它的长征。
正文完
