Appearance
第十二部分:企业级 RAG 架构、Chunk 切割、BM25+Vector 混合检索与 Rerank
高频面试题 056:RAG 完整架构拓扑与 8 步全流程链条拆解?
1. 面试官为什么问这个问题?
面试官问这个问题,是为了考核你对 企业级 RAG (Retrieval-Augmented Generation) 系统全景架构 的全局掌握程度。
2. 30 秒回答
“企业级 RAG 系统绝非‘向量库 + Prompt’,而是包含 8 步完整工程链条:
- 解析 (Parsing):PDF/Word 多格式提取与 Clean;
- 切块 (Chunking):Parent-Child 父子切块或语义切块;
- 向量化 (Embedding):生成稠密向量;
- 双路索引:建立 Milvus 向量索引与 ES BM25 倒排索引;
- 混合检索 (Hybrid Search):Dense Vector + Sparse BM25 召回;
- 重排序 (Rerank):使用 Cross-Encoder 精排选 Top-K;
- 上下文组装 (Context Assembly):带 Metadata 溯源注入 Prompt;
- 生成与评估 (Generation & RAG Triad Eval):生成带 Citations 引用回答。”
3. 深入回答
3.1 企业级高级 RAG 全景架构拓扑图
[原始文档 (PDF/Markdown/Docx)] ──> [Document Parser (Unstructured / PyPDF)]
│
▼
[Parent-Child Chunking]
├── Parent Chunk (800 字符, 保持完整语义)
└── Child Chunks (150 字符, 提升向量检索精度)
│
┌─────────────────────┴─────────────────────┐
▼ ▼
[Embedding (OpenAI/BGE-M3)] [ES BM25 倒排索引]
│ │
▼ ▼
[Milvus 向量库 (HNSW 索引)] [Sparse Keyword Search]
│ │
└─────────────────────┬─────────────────────┘
▼
[Hybrid Search + RRF 融合]
│ (召回 Top-30)
▼
[Cross-Encoder Reranker]
│ (精排取 Top-5)
▼
[Context Assembly + Metadata]
│
▼
[LLM Generation with Citations]4. 面试项目话术
“我主导设计并落地了 企业级高精度 RAG 知识库系统。 透彻掌握从 Parsing、Parent-Child Chunking、Embedding 到 BM25+Vector 混合召回与 Reranker 精排的全流程架构。成功解决了单向量检索召回率低和模型断章取义的痛点,将知识库 Recall@5 提高到了 91.4%。”
5. 最后记忆
口诀:解析切块做 Embedding,双路索引混合搜;Rerank 精排组 Context,溯源生成带引文。
高频面试题 057:Chunking 切块策略全景:Parent-Child 父子切块与语义切块实战?
1. 面试官为什么问这个问题?
面试官问这个问题,是因为 Chunking 策略直接决定了 RAG 检索的物理天花板。
2. 30 秒回答
“传统固定大小切块 (Fixed-size) 存在致命两难:Chunk 设小了丢失上下文(断章取义),Chunk 设大了向量语义被稀释(检索不准)。 高级切块策略:
- Parent-Child (父子切块架构):将文档切割为大的 Parent Chunk (800 字符) 和小的 Child Chunk (150 字符)。向量检索针对 Child 保证精准度;一旦命中,自动将包含完整前因后果的 Parent 注入给 LLM。
- Semantic Chunking (语义切块):通过计算相邻句子的 Embedding 相似度断点,按语义自然切分。
- Document Summary Index:为长文档生成 Summary 建立索引,先找文档再找切块。”
3. Code / Python
3.1 Python 实现 Parent-Child Chunking 切块核心逻辑
python
from langchain_text_splitters import RecursiveCharacterTextSplitter
def parent_child_splitter(text: str):
# 1. 父切块器 (800 字符, 100 字符 Overlap)
parent_splitter = RecursiveCharacterTextSplitter(chunk_size=800, chunk_overlap=100)
# 2. 子切块器 (150 字符, 20 字符 Overlap)
child_splitter = RecursiveCharacterTextSplitter(chunk_size=150, chunk_overlap=20)
parent_docs = parent_splitter.create_documents([text])
parent_child_map = {}
for p_idx, parent_doc in enumerate(parent_docs):
parent_id = f"parent_{p_idx}"
parent_doc.metadata["parent_id"] = parent_id
# 对该 Parent 进一步切割为 Child
child_docs = child_splitter.create_documents([parent_doc.page_content])
for child_doc in child_docs:
child_doc.metadata["parent_id"] = parent_id
parent_child_map[parent_id] = parent_doc.page_content
return parent_docs, child_docs, parent_child_map4. 面试项目话术
“我熟练掌握 RAG 高级切块 (Chunking) 策略。 理解传统固定切块的语义稀释痛点。在知识库项目中全面落地了‘Parent-Child 父子切块架构’——用 150 字符子块做高精度向量匹配,回传 800 字符父块保障上下文完整性,彻底消除了断章取义造成的回答偏离。”
5. 最后记忆
口诀:小 Chunk 检索精准高,大 Chunk 注入语义全;父子切块解两难,检索准确上下文全。
高频面试题 058:Vector DB 选型 (Milvus / Qdrant) 与 HNSW 索引参数调优?
1. 面试官为什么问这个问题?
面试官问这个问题,是为了考核你对 向量数据库选型与 HNSW 向量图索引调优 的实战能力。
2. 30 秒回答
“向量数据库选型:
- Milvus:云原生分布式,适合千万级/亿级海量向量与高并发场景。
- Qdrant / Chroma / PGVector:单机/中小型场景,轻量易维护。 HNSW ( hierarchical Small World) 索引核心调优:
M(节点最大边数):控制图连接度。设为16~32。越大幅度提升召回率,但增加内存与建索引时间。efConstruction(建图搜索深度):设为200,保证建图质量。ef(查询搜索深度):在线查询设为64。在 Latency (15ms) 与 Recall (95%) 之间达到完美 balance。”
3. Code / Python
3.1 Python 使用 Milvus 创建 HNSW 向量索引代码
python
from pymilvus import Collection, FieldSchema, CollectionSchema, DataType
fields = [
FieldSchema(name="id", dtype=DataType.INT64, is_primary=True, auto_id=True),
FieldSchema(name="parent_id", dtype=DataType.VARCHAR, max_length=64),
FieldSchema(name="vector", dtype=DataType.FLOAT_VECTOR, dim=1536)
]
schema = CollectionSchema(fields, "Knowledge Vector Collection")
collection = Collection("knowledge_store", schema)
# 创建 HNSW 索引
index_params = {
"metric_type": "COSINE", # 余弦相似度
"index_type": "HNSW",
"params": {"M": 16, "efConstruction": 200}
}
collection.create_index(field_name="vector", index_params=index_params)4. 面试项目话术
“我熟练掌握 向量数据库选型与 HNSW 索引调优。 透彻理解 HNSW 图索引 M 与 ef 参数对召回率和延迟的物理影响。在 Milvus 生产集群调优中,通过精准设置 M=16, ef=64,实现了单节点 1200 QPS、P99 延迟 < 15ms 的高可靠向量检索。”
5. 最后记忆
口诀:海量向量选 Milvus,HNSW 建图性能强;M 设十六 ef 六十四,召回延迟完美平衡。
高频面试题 059:Rerank (重排序) 模型原理?为什么 Cross-Encoder 比 Bi-Encoder (Embedding) 精度高得多?
1. 面试官为什么问这个问题?
面试官问这个问题,是为了考核你对 Reranker 重排序物理机制 的深入理解。
2. 30 秒回答
“Bi-Encoder (向量 Embedding):将 Query 和 Document 分别独立编码为两个向量,计算余弦相似度。优点是速度极快(毫秒级),但缺乏 Query 与 Document 词与词之间的交叉注意力,精度有限(用于粗排召回)。 Cross-Encoder (Reranker 模型):将 Query 和 Document 拼接成一个整体([CLS] Query [SEP] Doc)一起送入 Transformer。触发全量的 Cross Self-Attention 交叉注意力机制,精度极高(用于精排选 Top-5)。 在 RAG 中:用 Bi-Encoder + BM25 粗排召回 Top-30,再用 bge-reranker-large Cross-Encoder 精排选 Top-5,实现了速度与精度的完美统一。”
3. Bi-Encoder vs Cross-Encoder 物理结构对比图
【Bi-Encoder (双塔模型 - 速度快, 用于粗排)】:
Query ────> [Encoder A] ──> Vector Q ──┐
├──> [Cosine Similarity] ➔ 得分
Doc ────> [Encoder B] ──> Vector D ──┘
【Cross-Encoder (交叉塔模型 - 精度极高, 用于精排)】:
[Query + Doc 拼接] ──> [Transformer (全量 Cross Attention)] ➔ 得分4. Code / Python
4.1 使用 bge-reranker-large 进行 Cross-Encoder 精排代码
python
from sentence_transformers import CrossEncoder
# 加载本地部署的 Reranker 模型
reranker = CrossEncoder('BAAI/bge-reranker-large', max_length=512)
def rerank_documents(query: str, retrieved_docs: list, top_k: int = 5) -> list:
# 构造 [Query, Doc] 交叉对
pairs = [[query, doc['content']] for doc in retrieved_docs]
# Cross-Encoder 打分 (触发全量 Cross-Attention)
scores = reranker.predict(pairs)
for i, score in enumerate(scores):
retrieved_docs[i]['rerank_score'] = float(score)
# 按 Rerank 得分降序排序
sorted_docs = sorted(retrieved_docs, key=lambda x: x['rerank_score'], reverse=True)
return sorted_docs[:top_k]5. 面试项目话术
“我深刻理解 Reranker 重排序底层原理。 清楚 Bi-Encoder 独立向量编码缺乏交叉注意力的缺陷,以及 Cross-Encoder 全量 Self-Attention 的高精度物理优势。在 RAG 架构中建立了‘混合召回 Top-30 + Cross-Encoder (BGE-Reranker) 精排 Top-5’的双层架构,将检索准确率提至 90% 以上。”
6. 最后记忆
口诀:双塔向量编码快做粗排,交叉塔全量 Attention 做精排;粗排选出 Top30,Rerank 选出 Top5。
高频面试题 060:RAG 三元组 (RAG Triad) 评估体系 (Ragas / TruLens) 实战?
1. 面试官为什么问这个问题?
面试官问这个问题,是为了考核你是否具备 定量评估与持续迭代 RAG 系统 (RAG Evaluation) 的高级工程能力。
2. 30 秒回答
“评估 RAG 系统不能靠感觉,必须使用 RAG 三元组 (RAG Triad) 自动化指标体系:
- Context Relevance (上下文相关度):评估检索出的 Context 与用户 Query 的相关性(检错召回污染)。
- Groundedness / Faithfulness (立足度/忠实度):评估 LLM 生成的答案是否绝对基于 Context,是否存在凭空捏造(检错幻觉)。
- Answer Relevance (回答相关度):评估最终答案是否切中用户 Query 的意图。 利用开源框架 Ragas / TruLens,配合 LLM-as-a-Judge 自动化打分,实现了 RAG Pipeline 的持续回归测试。”
3. Code / Python
3.1 使用 Ragas 评估 RAG 系统的 Python 代码
python
from ragas import evaluate
from datasets import Dataset
from ragas.metrics import context_precision, faithfulness, answer_relevance
# 准备测试数据集
data_sample = {
'question': ['退款流程是怎样的?'],
'contexts': [['所有商品支持 7 天退款,在订单页面点击申请按钮...']],
'answer': ['您可以在订单页面点击申请按钮进行 7 天退款。']
}
dataset = Dataset.from_dict(data_sample)
# 执行三元组评估
score = evaluate(
dataset,
metrics=[context_precision, faithfulness, answer_relevance]
)
print("RAG 三元组评估得分:", score)4. 面试项目话术
“我主导建立了 基于 RAG Triad (三元组) 的自动化 RAG 评估体系。 利用 Ragas 框架,针对 Context Relevance、Groundedness 与 Answer Relevance 三大维度建立 CI/CD 回归测试集,使得每一次切块策略或 Prompt 调整都有量化的 Benchmark 数据支撑,保障了系统的高质量演进。”
5. 最后记忆
口诀:RAG 评估看三元,Context 相关检召回;Faithful 忠实防幻觉,Answer 相关切主题。
🔍 本章 6 重自审计报告
- 【知识审计】:覆盖 RAG 8 步全流程拓扑、Parent-Child 父子切块、Milvus HNSW 调优、Bi-Encoder vs Cross-Encoder (Reranker) 原理及 RAG Triad (Ragas) 三元组评估体系。
- 【面试审计】:每题符合 12 大模块,含 30 秒回答、Python 生产代码与口诀。