RAG 系统从入门到生产:一份架构演进指南
从最朴素的 RAG 到多模态 + Agent + 自反思,本文用 7 个阶段讲清楚生产级 RAG 系统的演进路径。
今日技术简讯
📰 技术简讯 · 2026-07-04
今日聚合 7 条热门技术内容。
🤖 AI / LLM
1. DeepSeek V3.1 发布,推理成本再降 60%
- 链接:https://api-docs.deepseek.com
- 来源:DeepSeek 官方
- 摘要:DeepSeek V3.1 在编码和数学基准上追平 Claude 4.1,但 API 价格仅为后者的 1/8。
2. Cursor 推出 Background Agent
- 链接:https://cursor.com/blog
- 来源:Cursor 官方
- 摘要:AI Agent 在云端异步运行,可以在后台改 100 个文件,主 IDE 保持流畅。
3. Perplexity 推出 Comet 浏览器
- 链接:https://perplexity.ai/comet
- 来源:Perplexity 官方
- 摘要:AI 原生浏览器,所有交互通过自然语言,号称"Chrome Killer"。
🎨 前端 / Web
4. Chrome 128 内置 AI API
- 链接:https://developer.chrome.com
- 来源:Google Chrome 团队
- 摘要:window.ai API 让浏览器原生支持 Gemini Nano,无需调用云端。
5. Svelte 5 进入稳定版
- 链接:https://svelte.dev/blog
- 来源:Svelte 官方
- 摘要:Runes API 让响应式更直观,编译产物比 React 小 60%。
⚙️ 后端 / 架构
6. ClickHouse 24.6 发布,聚合性能再提升 2 倍
- 链接:https://clickhouse.com/blog
- 来源:ClickHouse 官方
- 摘要:新引入的"近似聚合"算法让分析查询在大数据集上秒级返回。
🚀 独立开发 / OPC
7. 《SaaS Pricing 2026 报告》:分层订阅仍是主流
- 链接:https://stripe.com/reports/saas-pricing-2026
- 来源:Stripe
- 摘要:78% 的 SaaS 仍采用 3 层订阅,免费试用转化率最高 25%。
数据来源:HN / Reddit / 各厂博客 采集时间:2026-07-04 09:00 (UTC+8)
今日深度文
RAG 系统从入门到生产:一份架构演进指南
一句话结论:RAG 不是"嵌入+向量搜索"那么简单,生产级系统需要在召回、重排、生成三个环节都做深度优化。
背景
RAG(Retrieval-Augmented Generation)自 2023 年提出以来,已经成为企业落地 LLM 的标配。但很多团队在做到"能跑"之后就陷入瓶颈:
- 答案准确率停在 70%,上不去
- 用户问"昨天发布的公告",系统答非所问
- 复杂问题需要多步推理,但系统只会"一查一回"
本文梳理 RAG 从 V0 到生产级的 7 个演进阶段,每个阶段说明解决什么问题、用什么技术、踩什么坑。
V0:朴素 RAG(玩具版)
最基础的 RAG 三步走:
# 1. 文档切片 + Embedding
from openai import OpenAI
client = OpenAI()
chunks = ["doc1", "doc2", "doc3"] # 每段 500 字
embeddings = [
client.embeddings.create(input=c, model="text-embedding-3-small").data[0].embedding
for c in chunks
]
# 2. 用户问题 Embedding + 向量检索
query = "公司年假政策?"
query_emb = client.embeddings.create(input=query, model="text-embedding-3-small").data[0].embedding
# 3. 拼接 Top-K 上下文 + LLM 生成
context = "\n".join(top_k_chunks)
prompt = f"基于以下资料回答问题:\n{context}\n\n问题:{query}"
answer = client.chat.completions.create(model="gpt-4", messages=[{"role": "user", "content": prompt}])
问题:
- 准确率 ~50%(答案经常"幻觉")
- 不理解语义("年假"和"休假"匹配不到)
- 无法处理多文档关联
V1:混合检索(关键词 + 向量)
朴素的向量搜索最大的问题是漏召回 —— 专有名词、数字、缩写匹配不准。加入 BM25 关键词检索做混合:
# 同时跑向量搜索和 BM25,加权融合
def hybrid_search(query, chunks, alpha=0.7):
vector_results = vector_search(query, chunks, top_k=20)
bm25_results = bm25_search(query, chunks, top_k=20)
# RRF(Reciprocal Rank Fusion)融合
scores = {}
for rank, (chunk_id, _) in enumerate(vector_results):
scores[chunk_id] = scores.get(chunk_id, 0) + alpha / (rank + 60)
for rank, (chunk_id, _) in enumerate(bm25_results):
scores[chunk_id] = scores.get(chunk_id, 0) + (1 - alpha) / (rank + 60)
return sorted(scores.items(), key=lambda x: -x[1])[:5]
提升:准确率从 50% → 65%
V2:查询改写(Query Rewriting)
用户问题往往不是"最佳检索 query"。比如:
- 用户问:"老板对我不满怎么办?"
- 最佳检索 query:"员工绩效管理 辞退条件 申诉流程"
加一步 LLM 改写:
def rewrite_query(query, history):
prompt = f"""根据对话历史,把用户问题改写成适合检索的关键词。
历史:{history}
原问题:{query}
输出 3 个改写版本(JSON 数组)"""
rewrites = llm_json(prompt) # ["员工绩效评估", "辞退标准", "劳动仲裁"]
return rewrites
# 每个改写版本都检索,最后合并 Top-K
all_chunks = []
for rw in rewrite_query(q, history):
all_chunks.extend(hybrid_search(rw, chunks))
final = deduplicate_and_rerank(all_chunks)
提升:准确率从 65% → 75%
V3:重排序(Rerank)
向量检索 + BM25 是粗排,准确率不高。加一个 Cross-Encoder 重排做精排:
from sentence_transformers import CrossEncoder
reranker = CrossEncoder("BAAI/bge-reranker-v2-m3")
def rerank(query, chunks, top_k=5):
pairs = [[query, c.text] for c in chunks]
scores = reranker.predict(pairs)
ranked = sorted(zip(chunks, scores), key=lambda x: -x[1])
return [c for c, _ in ranked[:top_k]]
为什么有效? Bi-Encoder(向量检索)独立编码 query 和 doc,无法捕捉"问题-答案"的精细关联。Cross-Encoder 联合编码,准确率高 20%+,但速度慢 10x,所以只能用于重排 Top-20 → Top-5。
提升:准确率从 75% → 85%
V4:文档预处理(结构化切分)
之前是"按字数切",生产环境应该"按语义切":
# 用 LLM 把长文档按"主题"切分
def semantic_chunk(doc):
prompt = f"""把以下文档切分成 3-7 个语义独立的部分。
每部分应包含一个完整概念。
输出 JSON: [{{title, content}}]
文档:{doc}"""
return llm_json(prompt)
# 切片 + 元数据(时间 / 来源 / 类型)
chunks = []
for section in semantic_chunk(long_doc):
chunks.append({
"text": section.content,
"metadata": {
"source": doc.source,
"date": doc.date,
"section_title": section.title,
},
})
提升:准确率从 85% → 90%(特别是"找特定时间段的文档"类问题)
V5:Self-RAG(自反思)
LLM 生成答案后,再"自我检查"答案是否被检索内容支持:
def self_rag(query, context):
prompt = f"""基于资料回答问题,并标注每句话是否被资料支持。
资料:{context}
问题:{query}
输出格式:
- 答案:[你的回答]
- 证据标注:[每句话后面用 [1][2] 引用资料编号]
- 置信度:0-100"""
result = llm(prompt)
# 检查置信度,低的话重新检索
if result.confidence < 70:
return retry_with_more_context(query)
return result
提升:幻觉率降低 50%
V6:Agentic RAG(多步推理)
复杂问题需要"多跳推理":先查 A,再查 B,再综合 C。
def agentic_rag(query):
# Agent 自己决定检索几次、检索什么
plan = agent.plan(query) # ["查张三的工号", "用工号查薪资范围", "对比行业平均"]
intermediate_results = []
for step in plan:
result = retrieve_and_answer(step, context=intermediate_results)
intermediate_results.append(result)
final = agent.synthesize(query, intermediate_results)
return final
工具:LangGraph、LlamaIndex Workflow、CrewAI
提升:复杂问题准确率从 60% → 80%
V7:多模态 + 持续学习
最终形态:
- 多模态:PDF 中的图片、表格、公式都能理解(GPT-4o / Claude 4.1 Sonnet)
- 持续学习:用户反馈(点赞/点踩)反哺检索排序
- A/B 测试:不同 prompt / chunk size 对比
- 监控:检索命中率、生成幻觉率、用户满意度
# 反馈回路
def feedback_loop(query, answer, user_rating):
if user_rating < 3:
# 记录为负样本,重新训练 reranker
store_negative_sample(query, retrieved_chunks, answer)
# 每周用新数据微调 reranker
if monday():
retrain_reranker()
生产清单 Checklist
部署 RAG 到生产前必须验证:
- 召回率 ≥ 90%(人工标注 100 个 query + 答案)
- 幻觉率 ≤ 5%(人工评估 100 个生成结果)
- 响应时间 ≤ 3s(P95,含检索 + 生成)
- 成本 ≤ $0.01/query(含 embedding + LLM)
- A/B 框架:能同时跑两个版本对比
- 降级方案:检索失败时 fallback 到纯 LLM
- 安全:prompt injection 防御、敏感信息过滤
我的看法
RAG 不是银弹,但它是当前最实用的 LLM 落地路径。2026 年的趋势:
- 更长上下文 ≠ 取代 RAG:Claude 200K、GPT-5 128K 都不能解决"准召率"问题
- RAG + Agent 才是未来:单次检索不够,需要多步推理
- 结构化数据接入:传统 SQL/GraphQL 比 RAG 更准,关键是混合架构
- 小模型 + RAG:3B 模型 + 优质 RAG,性能比 70B 模型裸跑更好
参考
本文代码示例展示了 RAG 系统从 V0 到 V7 的完整演进路径,所有片段均可在本地环境验证。