共计 1752 个字符,预计需要花费 5 分钟才能阅读完成。
技术背景:为什么需要 RAG?
传统生成模型(如 GPT 系列)虽然能生成流畅文本,但存在两个关键问题:

- 知识固化:模型训练后无法动态更新知识,导致回答时效性问题时表现不佳
- 幻觉问题:当遇到训练数据未覆盖的领域时容易编造虚假信息
RAG 通过引入检索机制解决了这些问题:
- 实时性:通过连接最新文档库实现知识动态更新
- 可验证性:生成结果基于检索到的真实文档,减少幻觉
- 可解释性:可追踪生成内容的参考来源
核心架构:双模块协同工作
典型的 RAG 系统包含两大核心组件:
检索器(Retriever)
- 采用双编码器架构(查询编码器 + 文档编码器)
- 主流向量数据库选型对比:
- FAISS:Facebook 开源的 CPU/GPU 高效检索库
- Annoy:适合静态数据集的内存优化方案
- Milvus:支持分布式部署的生产级方案
生成器(Generator)
- 接收检索结果作为上下文提示
- 常用方案:
- T5:适合重写型任务
- BART:擅长长文本生成
- GPT-3:商业 API 快速接入
优化策略:提升系统表现
检索阶段优化
- 查询扩展技术:
- 同义词扩展(WordNet)
- 伪相关反馈(PRF)
- 重排序方法:
- 交叉编码器(Cross-Encoder)二次排序
- 多样性控制(MMR 算法)
生成阶段控制
- 提示工程技巧:
# 示例:结构化提示模板 prompt = f""" 基于以下文档回答问题:{retrieved_docs} 问题:{query} 要求:1) 不超过 100 字 2) 标注参考段落 """ - 温度参数调节:
- 事实性问题建议 temperature=0.3
- 创意任务可提高到 0.7
代码实现:快速搭建原型
from transformers import RagTokenizer, RagRetriever, RagSequenceForGeneration
import faiss
# 1. 初始化组件
tokenizer = RagTokenizer.from_pretrained("facebook/rag-sequence-nq")
retriever = RagRetriever.from_pretrained(
"facebook/rag-sequence-nq",
index_name="compressed",
passages_path="my_data.faiss"
)
model = RagSequenceForGeneration.from_pretrained("facebook/rag-sequence-nq", retriever=retriever)
# 2. 构建 FAISS 索引
index = faiss.IndexFlatIP(768) # 内积相似度
# 假设 doc_embeddings 是预计算的文档向量
index.add(doc_embeddings)
faiss.write_index(index, "my_data.faiss")
# 3. 问答示例
input_dict = tokenizer.prepare_seq2seq_batch(
"中国首都是哪里?",
return_tensors="pt"
)
generated = model.generate(**input_dict)
print(tokenizer.batch_decode(generated, skip_special_tokens=True))
评估体系:超越传统指标
- 检索质量指标:
- Top- k 命中率(k 通常取 5 -20)
- 平均倒数排名(MRR)
- 生成质量指标:
- 事实一致性(FactScore)
- 引用准确率(Citation Precision)
- 端到端延迟:
- 90 分位响应时间
- 吞吐量(QPS)
生产实践:避坑指南
- 冷启动问题:
- 解决方案:使用 Wikipedia 等通用语料预构建索引
-
监控指标:新文档覆盖率
-
检索延迟高:
- 优化手段:
- 量化压缩(PQ 算法)
- 分层索引(HNSW)
-
典型收益:可降低 50% 延迟
-
生成结果不稳定:
- 控制方法:
- 核采样(top-p sampling)
- 束搜索约束(beam blocking)
开放性问题
尽管 RAG 表现出色,但仍存在值得思考的局限性:
- 如何平衡检索范围与计算成本?
- 当遇到矛盾的多源信息时,生成器如何取舍?
- 检索模块的误差传播问题如何系统性地解决?
正如赵鹏等在论文中指出,RAG 评估需要同时考虑检索准确性和生成流畅性,这种多维度的评估范式也带来了新的挑战。期待看到更多关于误差分析和调试工具的研究出现。
正文完
