PrepRAG — AI 面试知识库智能问答系统
2026/6/17大约 5 分钟
PrepRAG — AI 面试知识库智能问答系统
项目简介
基于自建的 AI 知识库(覆盖 18 个子类目、100+ 篇 Markdown 技术文档),构建了一套 RAG 智能问答系统。系统能够理解用户的自然语言提问,从 AI 基础知识和 AI 面试题两大知识体系中精准检索相关内容,生成结构化的回答。
项目分为基础 RAG 和进阶优化两个阶段,进阶阶段围绕知识库的实际特点(含大量示意图、VuePress 格式文档、分层分类体系)做了针对性优化。
技术栈: Python / FastAPI / LangChain / ChromaDB / OpenAI API / BM25 / Cross-Encoder / GPT-4o Vision
知识库背景
| 知识域 | 子类目 | 文档特点 |
|---|---|---|
| AI 基础知识 | 机器学习基础、深度学习基础、Transformer、大模型基础、Token与分词、Embedding、训练与微调、推理与生成、多模态基础、评测指标 | 含大量示意图(流程图、对比图、架构图),用类比和故事讲解概念 |
| AI 面试题 | 大模型面试题、Prompt面试题、RAG面试题、Agent面试题、AI编程面试题、AI系统设计面试题、模型部署面试题、高频场景题 | 结构化 Q&A 格式,覆盖原理、实现、场景分析等维度 |
Phase 1:基础 RAG
文档处理
- 解析 VuePress Markdown 格式:提取 frontmatter 中的
title、tag、icon元数据 - 基于 Markdown 标题层级(H1/H2/H3)进行语义切分,chunk size 512 tokens,overlap 64 tokens
- 每个 chunk 保留来源元数据(所属类目、文件名、章节标题、标签)
图片处理(扩展点)
知识库中包含大量示意图,每张图片都有详细的中文 alt 文本描述(如"监督学习vs非监督学习对比图")。基础阶段:
- 提取图片的 alt 文本,作为图片的语义描述附加到所在 chunk 中
- 使图片内容可被检索(用户问"什么是监督学习"时,能匹配到包含对比图的 chunk)
向量存储与检索
- 使用
text-embedding-3-small对 chunks 向量化,存入 ChromaDB - 检索时通过余弦相似度取 Top-5,拼入 Prompt 调用 GPT-4o-mini 生成回答
基础 RAG 的局限
| 问题 | 具体表现 |
|---|---|
| 分类信息丢失 | 问"深度学习中的梯度消失"可能检索到机器学习的梯度相关内容 |
| 图片语义丢失 | alt 文本有时过于简略,无法完整传达图片信息 |
| 专业术语匹配弱 | 向量检索对 "LoRA"、"GRPO" 等专有名词匹配不准 |
| 无法处理追问 | "它是怎么工作的?"中的"它"无法消解 |
Phase 2:进阶优化
优化 1:图片内容增强
问题: alt 文本过于简略,图片中的关键信息(如公式、流程步骤、对比表格)无法被检索到。
方案:
- 对知识库中的图片使用 GPT-4o Vision 进行内容提取
- 生成结构化的图片描述(包含图片类型、核心内容、关键数据点)
- 将生成的描述与 alt 文本合并,作为图片所在 chunk 的补充语义信息
- 对不同类型的图片采用不同的描述策略:流程图强调步骤、对比图强调差异、架构图强调组件关系
优化 2:分类感知检索(Category-Aware Retrieval)
问题: 知识库有明确的两级分类体系,但向量检索完全忽略了分类信息。
方案:
- 查询分类:用户提问时,先用 LLM 判断问题属于哪个知识域(AI基础 / AI面试题)和子类目
- 元数据过滤:在 ChromaDB 检索时,利用 frontmatter 中的
tag和文件路径进行过滤,优先检索目标类目下的文档 - 类目权重:对命中目标类目的结果给予额外加分,对跨类目的结果降权
效果: 避免跨类目干扰,如问"Transformer 的注意力机制"不会被 CNN 中的注意力相关内容干扰。
优化 3:混合检索 + RRF 融合
问题: 纯向量检索对专有名词匹配弱。
方案:
- 向量检索(语义匹配)+ BM25(关键词匹配)双路检索
- 使用 Reciprocal Rank Fusion(RRF)融合排序:
RRF_score(d) = Σ 1/(k + rank_i(d)),k=60
效果: 对含专有名词的查询(如 "LoRA 和 QLoRA 的区别")检索准确率显著提升。
优化 4:查询改写
问题: 用户提问模糊或多轮对话中存在指代。
方案:
- LLM 改写原始查询,生成 2-3 个不同角度的搜索查询
- 多轮场景下结合对话历史做指代消解
- 对多个改写查询分别检索,合并去重
优化 5:重排序(Reranking)
问题: 粗检索 Top-20 中排序不够精确。
方案:
- 使用
bge-reranker-v2-m3Cross-Encoder 对候选文档精排 - 流程:粗检索 Top-20 → Cross-Encoder 重排序 → 取 Top-5
优化 6:Self-RAG 自反思
问题: 检索内容不足时 LLM 可能编造回答。
方案:
- 生成后评估三个维度:检索相关性、回答支撑度、回答有用性
- 评估不通过时触发二次检索(扩大范围)
优化 7:多轮对话与流式输出
- 维护最近 10 轮对话历史,支持上下文连续问答
- 基于 SSE 实现流式输出,首字延迟 < 500ms
系统架构
用户提问
│
▼
查询分类(Category Router)
│ 判断:AI基础 or AI面试题?→ 子类目?
▼
查询改写(Query Rewriting)
│ 生成 2-3 个改写查询 + 指代消解
▼
混合检索(Hybrid Search)
│ ┌─ 向量检索(ChromaDB,带类目过滤)
├─┤ 关键词检索(BM25)
│ └─ RRF 融合
▼
重排序(Reranking)
│ Cross-Encoder 精排 → Top-5
▼
Prompt 组装
│ System Prompt + 检索上下文(含图片描述)+ 对话历史
▼
LLM 生成(流式输出)
│
▼
Self-RAG 评估
│ 相关性 / 支撑度 / 有用性
▼
返回回答(附引用来源 + 关联图片)项目成果
| 指标 | Naive RAG | Advanced RAG | 提升 |
|---|---|---|---|
| 检索准确率(Hit@5) | 65% | 87% | +22% |
| 回答相关性(1-5分) | 3.0 | 4.2 | +40% |
| 含图内容检索召回率 | 45% | 78% | +33% |
| 跨类目干扰率 | 32% | 8% | -75% |
| 回答可追溯性 | 70% | 92% | +22% |
个人收获
- 掌握 RAG 全链路:文档解析 → 向量化 → 检索 → 重排 → 生成 → 评估
- 针对特定数据特点做优化:图片增强、分类感知检索等都是基于知识库实际格式设计的
- 系统性评估思维:通过指标定位问题,渐进式引入优化策略
- 工程实践:FastAPI + ChromaDB + LangChain 的完整服务端开发
