LLM 面试中 RAG 板块的所有题型与答案。来源:AiGC 面试宝典,共 16 份 RAG 相关 PDF。
一、RAG 基础(为什么 / 什么是 / 三模块)
为什么需要外挂(向量)知识库
| 直接方法 | 问题 |
|---|---|
| 微调 | 成本高 / 需训练时间 / 通用能力下降(灾难遗忘) |
| In-Context Learning | 上下文长度受限 / 多文档处理困难 |
| RAG (外挂知识库) ✅ | 检索 + 生成,灵活 + 低成本 + 易更新 |
RAG 三模块
| 模块 | 作用 |
|---|---|
| R - Retriever 检索 | 把外部知识源转化为向量,根据 query 检索相关文档 |
| A - Augment 增强 | 把检索结果与用户 query 拼接成新 prompt |
| G - Generator 生成 | 大模型基于增强 prompt 生成最终答案 |
RAG 工作流程
1. 知识库构建:文档 → 切分 chunk → embedding → 向量库
2. 用户提问:Query → embedding
3. 检索:向量相似度搜索 Top-K chunk
4. 增强:Query + 检索 chunk → 新 Prompt
5. 生成:LLM 基于新 Prompt 生成答案
LangChain RAG 实战范本
详见 file_13 — 用百度百科"藜麦"数据 + LangChain 框架,实现简单 RAG 问答应用。
二、PDF 解析关键问题(file_16)
为什么需要 PDF 解析?
ChatPDF / ChatDoc 等用 LLM 实现文档助手时,PDF 文本提取困难(尤其复杂排版 / 多列 / 表格)。
PDF 解析的难点
| 难点 | 案例 |
|---|---|
| 多列布局 | 学术论文双栏 |
| 嵌入图表 | 财报中的表格图 |
| 字符编码异常 | 自定义字体不可逆 |
| 扫描图 PDF | 无文本层,需 OCR |
| 文档结构信息丢失 | 标题层级 / 段落归属 |
PDF 解析方案
- pdfplumber / pdftotext (poppler) — 简单文本
- PaddleOCR / Tesseract — 扫描图 OCR
- Layout Parser / Donut — 版面分析
- GPT-4 Vision — 多模态直接看 PDF
三、版面分析(file_17 表格 + file_18 文本分块)
表格识别任务
为什么需要识别表格? — 财报 / 论文中的数据多在表里,直接 OCR 失序。
表格识别方法:
| 方法 | 特点 |
|---|---|
| 规则法 | 检测水平/垂直线 |
| 基于 CNN | 检测表格区域 + 单元格 |
| 基于 Transformer(TableNet) | 端到端表格解析 |
| GPT-4V | 视觉直接读 |
文本分块(Chunking)
为什么需要分块? — Embedding 模型有 token 长度限制 + LLM 上下文有限。
常见分块方法:
| 方法 | 思路 |
|---|---|
| 固定长度切分 | 按 token / character |
| 按句子切分 | spaCy / NLTK / langchain RecursiveCharacterTextSplitter |
| 按段落切分 | \n\n 分隔 |
| 语义切分 | 用 embedding 相似度判断切点 |
| 结构切分 | 按文档标题层级 |
最佳实践:
- chunk_size: 256-1024 token
- chunk_overlap: chunk_size 的 10-20%
- 中文比英文 chunk_size 略小
四、检索增强(召回优化)
file_19:HYDE — 假设性文档嵌入
问题:用户 query 短 + 抽象 → 检索难。
HYDE 思路:
- 让 LLM 先针对 query 生成一篇"假设答案文档"
- 用该假设文档的 embedding 作为检索 query
- 检索得到真实文档作为最终上下文
优势:假设文档语义更接近真实答案,召回率高。
file_20:负难样本挖掘
为什么需要构建负难样本? — 简单负样本(随机)训练后,模型对"看似相关但实际无关"的内容无判别力。
负难样本构建方法:
| 策略 | 思路 |
|---|---|
| Random Sampling | 简单随机 |
| Hard Negative Mining | 模型当前最易混淆的样本 |
| In-Batch Negatives | batch 内非自身 |
| Cross-Batch Negatives | 跨 batch |
| Bi-encoder + Cross-encoder Distillation | 用 cross-encoder 蒸馏 bi-encoder |
五、RAG 优化策略(file_22 + file_23)
RAG 各模块的优化点
| 模块 | 优化策略 |
|---|---|
| 数据预处理 | 清洗 / 去重 / 元数据增强 |
| chunk | 切分粒度 / 重叠 / 父子 chunk |
| embedding | 模型选择(中文 BGE / m3e)/ 微调 |
| 检索 | Top-K / 多路召回 / 重排(Rerank) |
| 增强 | Prompt 模板 / context 压缩 |
| 生成 | 模型选择 / 温度 / 长度 |
RAG 关键痛点(file_23,6 大问题及解决方案)
| 痛点 | 解决 |
|---|---|
| 内容缺失 | 完善知识库 / 增加来源 |
| 错过排名靠前文档 | 多路召回 + Rerank |
| 整合后丢失内容 | 上下文压缩用 LLM 而非截断 |
| 上下文限制 | Long Context model / Map-Reduce |
| 格式错误 | 显式 Prompt + 输出验证 |
| 答案不完整 | Step-back Prompting / 多轮迭代 |
六、RAG 评测(file_21)
为什么需要评测 RAG?
- 大模型黑盒,需要量化判断改进
- A/B 比较不同 RAG 方案
如何合成 RAG 测试集?
| 方法 | 思路 |
|---|---|
| 人工标注 | 人工写问题 + 标准答案 |
| GPT-4 合成 | 给文档 → 让 GPT-4 出问题和答案 |
| 公开数据集 | NaturalQuestions / TriviaQA |
RAG 评测方法
| 方面 | 指标 |
|---|---|
| 检索质量 | Recall@K / MRR / NDCG |
| 答案质量 | BLEU / ROUGE / BERTScore(自动)/ 人工评分 |
| 整体 | RAGAS 框架(faithfulness / answer_relevancy / context_precision / context_recall) |
七、RAG-Fusion(file_24)
为什么需要 RAG-Fusion?
普通 RAG 局限:
- 单 query 召回的 top-K 可能不全
- 用户问题模糊时召回偏
RAG-Fusion 思路
1. 用 LLM 把原 query 改写出 N 个不同表达
2. 每个 query 单独召回 top-K
3. 用 RRF (Reciprocal Rank Fusion) 合并结果
4. Rerank + 最终给 LLM
优势:
- 召回率提升(多查询覆盖更广)
- 对用户问题模糊鲁棒
八、Graph RAG(file_25)
为什么需要 Graph RAG?
普通 RAG 局限:只能捕获局部上下文,无法回答需要全局推理的问题(如"X 和 Y 是什么关系?")。
Graph RAG 思路
1. 用 LLM 从文档中抽取实体 + 关系 → 构建知识图谱
2. 用户问题先做实体识别 / 关系查询
3. 通过图遍历得到相关子图
4. 子图 + 上下文给 LLM 生成
典型场景:
- 多跳问答(需要 2-3 步推理)
- 全局摘要(整本书核心实体关系)
- 复杂查询("和 X 合作过的所有公司在 2023 后的财务表现")
九、多轮对话长期记忆(file_12)
多轮对话挑战
- 用户问题依赖前文(代词 / 省略)
- 上下文太长会超出 LLM context window
8 种长期记忆优化方式
| 方式 | 思路 |
|---|---|
| 1. 全量历史对话 | 简单但贵 + 受 context 限制 |
| 2. 滑动窗口 | 只保留最近 N 轮 |
| 3. 摘要总结 | 用 LLM 把旧对话压缩 |
| 4. 实体记忆 | 提取关键实体作短期记忆 |
| 5. 知识图谱记忆 | 构建对话 KG |
| 6. 向量记忆(LongTerm Memory) | 把对话存向量库 + 检索相关历史 |
| 7. 缓存记忆 | LRU 缓存常用上下文 |
| 8. 混合记忆 | 短期(全文)+ 长期(向量)结合 |
实战推荐:LangChain ConversationSummaryBufferMemory(摘要+滑窗混合)。
十、LangChain RAG 实战(file_13)
实战步骤(以百度百科"藜麦"数据为例)
from langchain.document_loaders import TextLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.embeddings import OpenAIEmbeddings
from langchain.vectorstores import Chroma
from langchain.chains import RetrievalQA
from langchain.llms import OpenAI
# 1. 加载文档
loader = TextLoader("liwheat.txt")
docs = loader.load()
# 2. 分块
splitter = RecursiveCharacterTextSplitter(
chunk_size=500, chunk_overlap=100
)
chunks = splitter.split_documents(docs)
# 3. 向量化 + 存库
embeddings = OpenAIEmbeddings()
db = Chroma.from_documents(chunks, embeddings)
# 4. 构建 RAG Chain
qa = RetrievalQA.from_chain_type(
llm=OpenAI(),
retriever=db.as_retriever(search_kwargs={"k": 3}),
chain_type="stuff"
)
# 5. 问答
answer = qa.run("藜麦有哪些营养价值?")
十一、LangChain 基础(file_11)
LangChain 是什么
- 一个强大的框架,旨在帮助开发人员使用语言模型构建端到端应用
- 提供工具 / 组件 / 接口,简化创建由 LLM 提供支持的应用
- 可以管理与语言模型的交互,将多个组件链接 + 集成额外资源(API / 数据库)
LangChain 核心组件
| 组件 | 作用 |
|---|---|
| Models | 抽象不同 LLM(OpenAI / Anthropic / 本地)的统一接口 |
| Prompts | 模板化 prompt 管理 |
| Chains | 多步骤组合(LLM + 工具 + ...) |
| Agents | 让 LLM 决定调用什么工具 |
| Memory | 维护对话历史 |
| Indexes | 文档加载 / 切分 / 向量化 |
| Retrievers | 检索接口 |
| Output Parsers | 把 LLM 输出转结构化数据 |
See also
- LLM 面试 / 基础架构与组件 — 基础架构与组件
- LLM 面试 / 微调与强化学习完整专题 — 微调 / RLHF
- LLM 面试 / 分布式训练 8 篇图解专题 — 分布式训练
- AI 产品经理面试与转型 / 12 份资料汇编 — AI 产品经理面试题
- newtype · RAG 实战与知识库演化 — newtype 老黄的 RAG 实战哲学(消费者视角)
- dontbesilent AI 自媒体课程 / 13 节系统化方法论 — RAG 知识库本质(艾玛 + Perplexity 都是)
高频考点优先级
- 🔥🔥🔥 RAG 三模块 + 工作流程 — 必考
- 🔥🔥🔥 RAG 关键痛点 6 大类 — 实战题
- 🔥🔥 文本分块策略 + chunk_size 经验值
- 🔥🔥 HYDE 假设性文档(进阶)
- 🔥🔥 RAG-Fusion + RRF
- 🔥 Graph RAG(差异化优势)
- 🔥 RAGAS 评测框架
- 🔥 多轮对话 8 种记忆方式