适合任务
面试复习、方案说明、概念边界判断,以及把 RAG 讲清楚给别人听。
这页做横向辨析、讲解表达和面试复习,涵盖 10+ 个参考维度和 23 个可检索概念。你可以把它当成”概念边界和方案判断”的训练场,而不是第一次学习 RAG 的入口。
| 维度 | RAG 的关键问题 |
|---|---|
| D1 分层解构 | 数据层 / 索引层 / 检索层 / 生成层——每层独立优化 |
| D2 对比辨析 | 有RAG vs 没有RAG;RAG vs 微调;稀疏检索 vs 稠密检索 |
| D3 类比迁移 | 开卷考试 / 图书馆馆员 / Google 搜索 + 摘要生成 |
| D4 错误雷达 | Chunk 越小越好?向量相似 = 语义相关?RAG = 微调的替代? |
| D5 实战锚定 | 客服知识库 / 法律文书 / 预售场景 / ToB 话术 |
| 层 | 出问题的症状 | 优化方向 |
|---|---|---|
| 数据层 | 回答基于错误信息 | 数据清洗、去重、格式修复 |
| 索引层 | 找到的块上下文残缺 | 调整 Chunk 大小和 overlap |
| 检索层 | 找到的块和问题不相关 | 换检索策略、加 Reranking |
| 生成层 | 有正确信息但回答还是差 | 优化 Prompt 模板 |
| 维度 | RAG | Fine-tuning |
|---|---|---|
| 解决的问题 | 知道什么(知识注入) | 怎么说(行为改变) |
| 适合场景 | 知识频繁更新、需要可溯源 | 固定风格/格式、任务专一化 |
| 知识更新 | 更新知识库即生效,几乎实时 | 需要重新训练,耗时耗费 |
| 可解释性 | 可以展示"参考了哪些文档" | 黑盒,无法解释知识来源 |
| 幻觉控制 | 强——有真实内容可参考 | 弱——仍可能编造 |
| 成本 | 低——主要是 Embedding + DB 成本 | 高——GPU 训练成本 |
| 不适合 | 需要改变模型行为/推理方式 | 知识量大且频繁更新 |
256–512 token(约128–340汉字),加 20–30% overlap;或用 Parent-Child Chunking:小块检索,大块注入。
「仅基于以下内容回答,如果内容中没有相关信息,请明确说明无法找到答案,不要依据其他知识推测。」
| 症状 | 可能原因 | 排查方向 |
|---|---|---|
| 回答内容是编造的 | 检索失败,或 Prompt 没限制 LLM 只用提供的内容 | 检查检索结果;加「仅基于以下内容回答」约束 |
| 检索到的内容不相关 | Embedding 模型不适合领域;Chunk 策略问题 | 换 Embedding 模型;调整 Chunk 大小;加 Reranking |
| 回答太笼统,缺细节 | Chunk 太小,上下文丢失 | 增大 Chunk 大小;增加 overlap;用父子切块 |
| 专业术语匹配失败 | 纯向量检索对精确词匹配弱 | 改用混合检索 |
| 多文档综合问题回答差 | Top-K 太小,相关内容没全部检索到 | 增大 Top-K;加 Query 扩展 |
128–256 token),保留「问题」和「答案」完整配对 · Embedding: text-embedding-3-small(成本低,支持中英混合)Top-K=5 + Reranking(确保「回答了用户的问题」而非仅语义相似)512–1024 token) · 元数据:合同类型、签约日期、甲乙方名称 · Parent-Child Chunking:小块定位 + 大块注入256–512 token) · 元数据标注:行业 / 年份 / 客户规模 / 方案类型industry=金融, scale=大型(10万条 → 500条)| 组件 | 轻量方案(验证期) | 生产方案(规模化) |
|---|---|---|
| Vector DB | Chroma(本地)、FAISS | Qdrant、Weaviate、Pinecone |
| Embedding 模型 | text-embedding-3-small | text-embedding-3-large、BGE-M3(中文强) |
| RAG 框架 | LangChain、LlamaIndex | 同左,加自定义 Reranking 层 |
| Reranking | 不加(初期) | Cohere Rerank、BGE-Reranker |
| 评测 | 手工抽样 | RAGAS(自动评测 RAG 质量) |
| 场景 | 推荐大小 | 原因 |
|---|---|---|
| 客服 FAQ(一问一答) | 128–256 token | 每条问答是独立单元,不需要上下文 |
| 产品手册段落 | 256–512 token | 需要保留一个完整论述 |
| 法律合同条款 | 512–1024 token | 条款依赖前后文,完整性优先 |
| 代码函数 | 按函数边界切 | 语义边界比 token 数更重要 |
第1块:第 1-100 token("退款申请需在购买后30天内提交...必须附上")
第2块:第81-180 token("必须附上订单截图和支付凭证,申请提交后...")
↑ 第81-100共20个token重叠,确保"必须附上"
不会孤立地出现在两个块里各只有半句
代价:存储空间增加 20-30%,检索时可能出现重复内容(需去重)。收益:大幅降低"语义被切断"导致的检索质量下降。原始 query: "这个怎么退" 扩展后: → "退款申请流程" → "退款需要什么条件" → "退款到账需要几天" → "退款申请在哪里提交" 四个 query 分别检索 → 合并去重 → Reranking → Top-5 → LLM效果:把召回率从 65% 提升到 85%(典型场景数据)。代价:增加 LLM 调用次数和延迟。
全量文档(100,000条) → 元数据过滤:industry=金融 AND year≥2023 → 候选集(500条) → 向量检索 + BM25 在500条内分别排序 → RRF 合并排序结果 → Reranking 精排 → Top-5 → LLM成型技术方案:Qdrant、Weaviate、Pinecone 都原生支持"向量检索 + 元数据过滤"组合查询。Qdrant 的 Filter API 尤其成熟。
用户第1句: "我想了解退款政策" 用户第2句: "那如果是预售商品呢" ← 指代不明 改写后: "预售商品的退款政策是什么" ← 加上上下文这叫指代消解(Coreference Resolution)——把对话历史里的"那""它""这个"替换成明确的指代对象。多轮对话场景下,不做指代消解的 RAG 系统在 3 轮以后检索质量会显著下降。
score(doc) = Σ 1/(k + rank_i),k=60(经验值),rank_i 是文档在第 i 个列表里的排名文档A: 向量检索排名第1, BM25排名第3 score = 1/(60+1) + 1/(60+3) = 0.0164 + 0.0159 = 0.0323 文档B: 向量检索排名第2, BM25排名第1 score = 1/(60+2) + 1/(60+1) = 0.0161 + 0.0164 = 0.0325 ← 更高为什么不直接加分数?向量相似度是 0.85,BM25 分数是 47.3——两个完全不同的尺度,直接相加没有意义。排名是可比的(第1名就是第1名),用排名融合绕开了尺度问题。
rag/code/mock-interview/
词 Q(我在问) K(我的标签) V(我的内容)
银行 [1.0, 0.2] [0.8, 0.1] [0.5, 0.9]
边的 [0.1, 0.8] [0.2, 0.7] [0.1, 0.2]
河 [0.9, 0.3] [0.7, 0.2] [0.6, 0.8]
↑ 用河的Q,去和所有词的K比较
② 点积 QKᵀ — 「河」的 Q 分别和每个词的 K 点乘
河.Q · 银行.K = 0.9×0.8 + 0.3×0.1 = 0.72+0.03 = 0.75 ← 最高 河.Q · 边的.K = 0.9×0.2 + 0.3×0.7 = 0.18+0.21 = 0.39 河.Q · 河.K = 0.9×0.7 + 0.3×0.2 = 0.63+0.06 = 0.69③ / √d = / √2 ≈ /1.41 — 压缩数值范围
0.75/1.41 = 0.53 | 0.39/1.41 = 0.28 | 0.69/1.41 = 0.49④ softmax — 转成概率权重(三个数加和=1)
e^0.53=1.70 e^0.28=1.32 e^0.49=1.63 总和=4.65
权重: 1.70/4.65=0.37 1.32/4.65=0.28 1.63/4.65=0.35
↑银行37% ↑边的28% ↑河自己35%
⑤ · V — 按权重加总三个词的内容向量
输出 = 0.37×[0.5,0.9] + 0.28×[0.1,0.2] + 0.35×[0.6,0.8]
= [0.185,0.333] + [0.028,0.056] + [0.210,0.280]
= [0.42, 0.67] ← 这就是「河」新的向量表示
结论:「河」的新向量 [0.42, 0.67] 融合了「银行」(37%) 和「河」本身(35%) 的信息,而不只是「河」原本的孤立含义。模型因此知道这里是自然河流,不是金融机构旁边。