什么是 RAG?
RAG(Retrieval-Augmented Generation,检索增强生成) 是一种将信息检索与大模型生成相结合的技术架构。
核心思路:先从知识库中检索最相关的信息片段,再将这些片段作为上下文传给大模型,让模型基于真实数据生成回答。
用户提问 → 向量检索 → 找到相关文档片段 → 拼入 Prompt → 大模型生成回答为什么需要 RAG?
大模型的局限性
| 问题 | 说明 | RAG 如何解决 |
|---|---|---|
| 知识截止 | 模型训练数据有截止日期 | 外接实时更新的知识库 |
| 幻觉 | 模型可能编造事实 | 基于真实文档生成,可溯源 |
| 领域知识不足 | 通用模型缺少专业知识 | 注入企业私有文档 |
| 成本高 | 长上下文 = 更多 Token | 只检索最相关片段 |
RAG vs 长上下文 vs 微调
| 方案 | 适用场景 | 成本 | 知识更新 |
|---|---|---|---|
| RAG | 大规模知识库 | 低 | 即时 |
| 长上下文 | 单次处理少量文档 | 高 | 每次重传 |
| 微调 | 风格/格式定制 | 很高 | 需重新训练 |
RAG 核心架构
离线阶段:文档预处理
原始文档 → 文本提取 → 文本分块 → Embedding 向量化 → 存入向量数据库1. 文本分块(Chunking)
将长文档拆分为适当大小的片段。常用策略:
| 策略 | 块大小 | 适用场景 |
|---|---|---|
| 固定长度 | 256-512 Token | 通用场景 |
| 按段落/章节 | 不固定 | 结构化文档 |
| 递归分割 | 256-1024 Token | 推荐默认选择 |
| 语义分块 | 动态 | 高精度场景 |
2. 向量化(Embedding)
将文本块转换为高维向量,捕捉语义信息:
from openai import OpenAI
client = OpenAI(
api_key="your-key",
base_url="https://api.your-relay.com/v1"
)
response = client.embeddings.create(
model="text-embedding-3-small",
input="什么是 API 中转站?"
)
vector = response.data[0].embedding # 1536 维向量3. 向量数据库选型
| 数据库 | 特点 | 适用场景 |
|---|---|---|
| Pinecone | 全托管、免运维 | 快速起步 |
| Weaviate | 内置混合搜索 | 企业级 |
| Qdrant | 高性能、Rust 实现 | 大规模 |
| ChromaDB | 轻量、嵌入式 | 原型开发 |
| pgvector | PostgreSQL 扩展 | 已有 PG 的团队 |
在线阶段:检索 + 生成
# 1. 用户提问向量化
query_vector = embed("API 中转站的价格怎么比?")
# 2. 在向量数据库中检索 Top-K 最相似的文档块
relevant_chunks = vector_db.search(query_vector, top_k=5)
# 3. 拼装 Prompt
context = "\n---\n".join([chunk.text for chunk in relevant_chunks])
prompt = f"""基于以下参考资料回答用户问题。如果资料中没有相关信息,请说明。
参考资料:
{context}
用户问题:API 中转站的价格怎么比?"""
# 4. 调用大模型生成回答
response = client.chat.completions.create(
model="gpt-4o",
messages=[{"role": "user", "content": prompt}]
)提升 RAG 效果的关键技巧
1. 混合检索(Hybrid Search)
将向量检索(语义匹配)与关键词检索(精确匹配)结合,效果优于单一方式:
最终得分 = α × 向量相似度 + (1-α) × BM25 关键词得分2. 重排序(Reranking)
用 Cross-Encoder 模型对初步检索结果进行精细排序,显著提升 Top-K 的相关性。
3. 查询改写(Query Rewriting)
让模型先将用户的口语化提问改写为更适合检索的形式:
- 原始:"那个便宜的 GPT 替代品叫什么来着?"
- 改写:"低成本 GPT-4 替代模型名称"
4. 上下文窗口管理
根据模型的上下文窗口大小和Token 预算决定检索数量:
- 预算充足:检索 10-15 个块
- 预算有限:检索 3-5 个高质量块
RAG 的成本优势
以一个包含 10,000 篇文档的知识库为例:
| 方案 | 每次查询的 Token | 每 1,000 次查询成本 |
|---|---|---|
| 全量塞入上下文 | ~500K | $1,250 |
| RAG(Top-5 检索) | ~3K | $7.50 |
| 节省 | 99.4% |
典型应用场景
- 企业客服:基于产品文档自动回答用户问题
- 法律助手:检索法规和案例辅助律师分析
- 技术文档搜索:在 API 文档中精准找到答案
- 学术研究:基于论文库回答研究问题
💡 RAG 中的 Embedding API 也可以通过中转站调用。使用 APIS 费用计算器 估算 Embedding 和对话模型的综合成本。