⭐⭐⭐ Spring Boot 项目实战 ⭐⭐⭐ Spring Cloud 项目实战
《Dubbo 实现原理与源码解析 —— 精品合集》 《Netty 实现原理与源码解析 —— 精品合集》
《Spring 实现原理与源码解析 —— 精品合集》 《MyBatis 实现原理与源码解析 —— 精品合集》
《Spring MVC 实现原理与源码解析 —— 精品合集》 《数据库实体设计合集》
《Spring Boot 实现原理与源码解析 —— 精品合集》 《Java 面试题 + Java 学习指南》

摘要: 原创出处 苏三说技术 「苏三」欢迎转载,保留摘要,谢谢!


🙂🙂🙂关注微信公众号:【芋道源码】有福利:

  1. RocketMQ / MyCAT / Sharding-JDBC 所有源码分析文章列表
  2. RocketMQ / MyCAT / Sharding-JDBC 中文注释源码 GitHub 地址
  3. 您对于源码的疑问每条留言都将得到认真回复。甚至不知道如何读源码也可以请教噢。
  4. 新的源码解析文章实时收到通知。每周更新一篇左右。
  5. 认真的源码交流微信群。

前言

最近金三银四,很多小伙伴在准备大厂面试,几乎每个人都被问到了同一个技术点——RAG(检索增强生成)。

从阿里到字节,从腾讯到美团,RAG已经成为大模型应用方向必考的“压轴题”。

但是,很多求职者对RAG的理解只停留在“检索+生成”四个字上,被面试官追问几句就卡壳了。

今天这篇文章给大家总结了10道最高频的RAG问题,每道题都配有标准答案、Java代码示例、加分点和避坑指南。

希望对你会有所帮助。

一、RAG基础认知篇

面试题1:什么是RAG?它解决了大模型的哪些痛点?

标准答案:

RAG全称Retrieval-Augmented Generation(检索增强生成),是一种将“检索”与“生成”相结合的AI架构。

它的核心流程是:在让大模型生成答案之前,先从外部知识库中检索相关信息,然后把检索到的内容和问题一起提供给大模型,让它基于真实资料来生成回答。

RAG解决了大模型的三大核心痛点:

  1. 知识时效性问题:大模型的训练数据有明确的截止日期(如GPT-4截止到2023年),无法回答之后发生的新事件。RAG通过检索外部知识库,为模型提供“实时”的知识补充。
  2. 幻觉问题:大模型容易“一本正经地胡说八道”。RAG通过检索真实资料,让答案有依据、可溯源,强制模型的回答基于检索到的事实。
  3. 私有数据访问问题:企业内部的文档、客户数据无法被公开的大模型直接访问。RAG可以安全地连接私有数据源,实现定制化问答。

工作流程图:

Java代码示例(使用Spring AI Alibaba):

@Service
publicclass RagService {
@Autowired
private VectorStore vectorStore;
@Autowired
private ChatClient chatClient;

public String ask(String question) {
// 自动完成检索增强
return chatClient.prompt()
.user(question)
.advisors(new QuestionAnswerAdvisor(vectorStore))
.call()
.content();
}
}

加分点:能说出RAG的演进历程——Naive RAG → Advanced RAG(引入Rerank、Query Rewrite)→ Modular RAG → Graph RAG → Agentic RAG。

避坑提示:不要只回答“检索+生成”四个字,面试官要的是深度,需要解释清楚检索什么、怎么检索、为什么能解决幻觉。

面试题2:RAG和微调(Fine-tuning)有什么区别?什么时候用哪个?

标准答案:

RAG和SFT是两条完全不同的技术路线:

对比维度 RAG 微调(SFT)
原理 模型参数不动,知识存外部,推理时检索 用标注数据训练,让模型“记住”知识
知识更新 更新知识库即可,无需重训练 重新训练,成本高(几天+多张GPU)
幻觉控制 答案来源于真实文档,可追溯 模型“凭记忆”回答,难以追溯
延迟 多一次检索,延迟较高 推理直接,延迟低
成本 低(无需训练) 高(需要训练)

选型建议:

  • 优先用RAG:知识频繁变化(客服话术、产品文档)、需要答案可溯源、预算有限。
  • 优先用SFT:领域深度适配(医疗报告生成、法律合同起草)、对回答格式有严格规范、要求毫秒级响应。
  • 生产环境的最佳实践:RAG + SFT 组合使用——先用SFT让模型学会领域说话风格,再用RAG提供实时知识。

Java代码示例(微调 vs RAG配置):

// RAG方式:无需训练,直接配置知识库
@Configuration
publicclass RagConfig {
@Bean
public VectorStore vectorStore() {
returnnew PgVectorStore(dataSource());
}
}

// SFT方式:需要预先训练模型(伪代码)
// 训练完成后替换模型端点
spring:
ai:
openai:
base-url: https://my-fine-tuned-model.com/v1

加分点:能说出RAG和SFT的适用场景对比,并且知道两者可以组合使用。

二、RAG核心流程篇

面试题3:RAG的完整工作流程是怎样的?请画出流程图并解释每一步。

标准答案:

RAG分两大阶段:索引阶段(离线)和检索生成阶段(在线)。

各环节详解:

  • 文档加载:读取PDF、Word、Markdown等格式文档,提取文本内容。
  • 文本分块:将长文档切成语义完整的小块(Chunk),推荐chunk_size=512~1024,overlap=100~200。
  • 向量化:用Embedding模型将文本块转换成向量。
  • 向量存储:将向量和原文存入向量数据库。
  • Query处理:可选地进行Query Rewrite(将口语转为书面)或HyDE生成假设文档。
  • 向量检索:将Query也转换成向量,在向量库中搜索最相似的Top-K个文档块。
  • Rerank:用Cross-Encoder模型对检索结果二次打分,提升精度。
  • Prompt构建:将检索到的文档内容拼接成上下文,与System Prompt、用户问题一起构造完整Prompt。
  • LLM生成:调用大模型基于上下文生成最终答案。

Java代码示例(完整流程):

@Service
publicclass RagPipeline {

@Autowired
private EmbeddingModel embeddingModel;
@Autowired
private VectorStore vectorStore;
@Autowired
private ChatClient chatClient;

// 索引阶段
public void indexDocument(String content) {
List<Document> chunks = DocumentSplitter.recursive(500, 100).split(content);
vectorStore.add(chunks);
}

// 检索生成阶段
public String answer(String question) {
// 1. 向量化查询
List<Document> docs = vectorStore.similaritySearch(
SearchRequest.query(question).withTopK(3)
);
// 2. 构建增强Prompt
String context = docs.stream()
.map(Document::getContent)
.collect(Collectors.joining("\n"));
// 3. 生成答案
return chatClient.prompt()
.system("基于以下资料回答:" + context)
.user(question)
.call()
.content();
}
}

加分点:能完整说出索引阶段和检索生成阶段的所有步骤,并能解释每个步骤的作用。

三、RAG优化与评估篇

面试题4:如何选择合适的Chunk策略?Chunk Size和Overlap怎么定?

标准答案:

Chunk策略直接影响检索效果,主要策略有:

策略 实现方式 适用场景
固定长度 按字符数切分 通用场景
递归分割 按段落→句子→词逐级切分 文档结构规整
语义分割 基于Embedding相似度 高质量要求
结构分割 按标题/表格分割 Markdown/HTML
Parent-Child 小Chunk检索+大Chunk生成 精度+上下文兼顾

最佳实践:

  • Chunk Size:512~1024,根据文档类型调整(技术文档偏大,问答对偏小)
  • Overlap:100~200(约10-20%),保证语义连贯
  • 可通过A/B测试找到最优参数:测试chunk_size=200/400/600/800,overlap=0%/10%/20%

Java代码示例:

import org.springframework.ai.document.DocumentSplitter;

DocumentSplitter splitter = DocumentSplitter.builder()
.chunkSize(800)
.chunkOverlap(100)
.separators(List.of("\n\n", "\n", "。", ";", " "))
.build();
List<Document> chunks = splitter.split(document);

加分点:能分析不同Chunk策略的优劣,并说出如何通过实验找到最优参数。

面试题5:如何提升RAG的检索准确率?列举至少3种方法。

标准答案:

  1. 混合检索(Hybrid Search):结合BM25关键词检索(精确匹配)和向量语义检索(语义相似)。在知识库包含100万篇文档时,混合检索可使召回率从65%提升至82%。
  2. 查询重写(Query Rewrite):用户问题往往口语化、信息不全,用大模型将查询改写为更专业、更完整的形式后再检索。例如“苹果股价咋样”改写为“Apple Inc.的最新股票价格”。
  3. 重排序(Rerank):用Cross-Encoder模型对初步检索结果进行二次打分,显著提升Top-K结果的精度。
  4. HyDE(假设文档嵌入):让LLM先根据问题生成一个“假设答案”,然后用这个假设答案去检索,提高检索相关性。

Java代码示例(混合检索 + Rerank):

// 使用Spring AI Alibaba的混合检索器
HybridSearchRetriever retriever = HybridSearchRetriever.builder()
.vectorRetriever(vectorStore, embeddingModel)
.keywordRetriever(bm25Index)
.weights(0.5, 0.5)
.build();

// 重排序
List<Document> candidates = retriever.search(query, 20);
List<Document> reranked = reranker.rerank(candidates, query, 5);

加分点:能说出具体数据——混合检索提升召回率约17%,Rerank可进一步提升检索质量。

面试题6:如何评估一个RAG系统的质量?有哪些关键指标?

标准答案:

RAG系统评估需覆盖检索、生成、端到端三个维度:

检索阶段指标:

  • 召回率(Recall@K):Top-K结果中包含正确答案的比例
  • 平均倒数排名(MRR):正确答案在结果列表中的排位
  • NDCG(归一化折损累积增益):考虑排序位置的相关性

生成阶段指标(Ragas框架的“RAG Triad”):

  • 忠实度(Faithfulness):生成的答案是否完全基于检索到的文档,严防模型“幻觉”
  • 答案相关性(Answer Relevancy):回答是否直接回应用户问题
  • 上下文召回率(Context Recall):标准答案中的知识点,检索到的文档是否都覆盖了

端到端评估:结合用户行为数据(任务完成率、二次查询率)和人工标注的答案正确性。

Java代码示例(使用Ragas评估,调用Python服务):

// 假设通过HTTP调用Ragas服务
RestTemplate rest = new RestTemplate();
EvaluationRequest req = new EvaluationRequest();
req.setQuestion("什么是RAG?");
req.setAnswer("RAG是检索增强生成...");
req.setContexts(List.of("RAG结合检索与生成..."));
req.setGroundTruth("RAG全称检索增强生成...");
EvaluationResult result = rest.postForObject(
"http://ragas-server/evaluate", req, EvaluationResult.class);
System.out.println("Faithfulness: " + result.getFaithfulness());

加分点:能说出Ragas框架的评估逻辑——通过“LLM监考”方式自动评分,无需人工标注大量数据。

面试题7:RAG常见的10大问题及解决方案是什么?

标准答案:

问题 常见原因 解决方案
内容缺失 切片策略不合理、向量召回率低 调整分段长度、多向量检索
错过排名靠前文档 召回算法问题 优化距离计算、引入Rerank
脱离上下文 拼接多个文档时语义边界丢失 Context Window Re-weighting、语义拼接
未能提取答案 检索结果太广或太窄 调整相似度阈值、Prompt引导
格式错误 源数据清洗不规范 统一索引格式、Prompt约束输出模板
特异性错误 领域知识被误导 引入领域词向量或知识图谱增强
回答不全面 检索召回范围太小 多通道检索(keyword + embedding)
数据处理慢 非结构化文档提取慢 批量向量化、流式索引、分布式检索
SQL/表格支持弱 RAG对结构化数据查询能力弱 混合架构——让LLM先生成SQL再执行
复杂PDF提取难 表格、页眉、脚注干扰 布局识别(LayoutLM)+ OCR + 坐标级切分

Java代码示例(多通道检索):

// 多路召回
List<Document> keywordDocs = keywordRetriever.search(query, 10);
List<Document> vectorDocs = vectorRetriever.search(query, 10);
List<Document> kgDocs = kgRetriever.search(query, 5);

// 融合去重
Set<Document> merged = new HashSet<>();
merged.addAll(keywordDocs);
merged.addAll(vectorDocs);
merged.addAll(kgDocs);

加分点:能结合自己的实际项目经验,说出遇到过的具体问题和解决过程。

四、RAG高级机制篇

面试题8:什么是Self-RAG和CRAG?它们解决了什么问题?

标准答案:

Self-RAG(自反思检索增强生成) :模型在生成答案的同时,会自我评估检索到的信息质量,并决定是否需要再次检索。

它通过训练模型输出“反思Token”(如“相关”“不相关”“有用”“无用”),让模型在检索后先评估,判断是否需要补充检索。这解决了“一次检索可能不够”的问题。

CRAG(Corrective RAG,纠正性检索增强生成) :当检索结果质量不佳时,系统会自动纠错。

如果置信度低,它会自动触发补充检索(如网络搜索),或启动知识图谱推理来补全信息。这解决了“检索结果质量差导致生成错误”的问题。

两者区别:

  • Self-RAG:模型自己评估检索结果,决定是否需要再次检索
  • CRAG:评估后发现检索质量差时,会启动纠正机制(如Web Search Fallback、知识图谱推理)

工作流程图:

Java代码示例(模拟CRAG的Fallback机制):

@Service
publicclass CorrectiveRagService {

public String answer(String question) {
List<Document> docs = vectorStore.search(question);
double confidence = evaluateConfidence(docs, question);

if (confidence > 0.8) {
return generateAnswer(docs, question);
} elseif (confidence > 0.5) {
// Self-RAG: 再次检索
String rewritten = queryRewriter.rewrite(question);
docs = vectorStore.search(rewritten);
return generateAnswer(docs, question);
} else {
// CRAG: 启用Web搜索
String webResult = webSearchService.search(question);
return generateAnswerWithWeb(webResult, question);
}
}
}

加分点:能说出这两种机制是RAG在“高可靠性场景”(如金融、医疗)的重要优化方向。

面试题9:什么是Graph RAG?它与传统RAG有什么区别?

标准答案:

Graph RAG(基于知识图谱的检索增强生成)是将知识图谱与RAG相结合的技术。

传统RAG依赖向量相似度检索文本块,而Graph RAG先构建一个知识图谱(实体-关系-实体),检索时通过图遍历找到相关实体和关系,再将图谱子图转换为文本上下文送给LLM。

与传统RAG的区别:

对比维度 传统RAG Graph RAG
知识表示 文本块(Chunk) 实体-关系-实体(三元组)
检索方式 向量相似度 图遍历 + 向量检索
多跳推理 弱(需多次检索) 强(沿关系链推理)
可解释性 返回文档片段 返回推理路径
适用场景 事实性问答 关系推理、复杂查询

Java代码示例(使用Jena构建知识图谱):

// 构建三元组
Model model = ModelFactory.createDefaultModel();
Resource hypertension = model.createResource("Hypertension");
Resource ibuprofen = model.createResource("Ibuprofen");
Property contraindicated = model.createProperty("contraindicated");
model.add(hypertension, contraindicated, ibuprofen);

// 查询:高血压禁忌什么药物?
StmtIterator stmts = model.listStatements(hypertension, contraindicated, (RDFNode) null);
while (stmts.hasNext()) {
Statement stmt = stmts.next();
System.out.println("禁忌药物:" + stmt.getObject());
}

加分点:能说出Graph RAG适合需要多跳推理的场景,如“A公司的竞争对手投资了哪些初创企业”。

面试题10:如何用Spring AI Alibaba实现一个生产级RAG系统?

标准答案:

Spring AI Alibaba是阿里云开源的AI开发框架,与Spring Boot生态无缝集成,内置高并发处理、模型热更新、监控告警等企业级功能。

完整实现步骤:

第一步:添加依赖

<dependency>
<groupId>com.alibaba.cloud.ai</groupId>
<artifactId>spring-ai-alibaba-starter</artifactId>
<version>1.0.0</version>
</dependency>
<dependency>
<groupId>com.alibaba.cloud.ai</groupId>
<artifactId>spring-ai-alibaba-starter-dashscope</artifactId>
<version>1.0.0</version>
</dependency>

第二步:配置向量数据库和Embedding模型

@Configuration
publicclass RagConfig {
@Bean
public ChatClient chatClient(ChatClient.Builder builder) {
return builder
.defaultSystem("你是一个专业的智能问答助手,请基于提供的参考资料回答问题")
.build();
}

@Bean
public VectorStore vectorStore(EmbeddingModel embeddingModel) {
returnnew MilvusVectorStore(MilvusVectorStoreConfig.builder()
.withHost("localhost")
.withPort(19530)
.withCollectionName("knowledge_base")
.build(), embeddingModel);
}

@Bean
public EmbeddingModel embeddingModel() {
returnnew DashScopeEmbeddingModel(
DashScopeEmbeddingOptions.builder()
.withModel("text-embedding-v3")
.build()
);
}
}

第三步:实现RAG问答服务

@Service
publicclass RagService {
@Autowired
private VectorStore vectorStore;
@Autowired
private ChatClient chatClient;

public String ask(String question) {
// QuestionAnswerAdvisor自动完成向量检索并增强Prompt
return chatClient.prompt()
.user(question)
.advisors(new QuestionAnswerAdvisor(vectorStore))
.call()
.content();
}
}

第四步:提供REST API

@RestController
@RequestMapping("/api/rag")
public class RagController {
@Autowired
private RagService ragService;

@PostMapping("/ask")
public String ask(@RequestParam String question) {
return ragService.ask(question);
}
}

Spring AI Alibaba的优势:

  • 与Spring Boot无缝集成,Java开发者友好
  • 支持多种向量数据库(Milvus、pgvector、Chroma)
  • 内置高并发处理、监控告警
  • 与阿里云通义千问等国内大模型深度适配

加分点:能说出Spring AI Alibaba相比原生Spring AI的增强——更完善的企业级特性、国内模型生态支持、开箱即用的Agent框架。

五、总结

以上10道面试题涵盖了RAG从基础原理 → 核心流程 → 检索优化 → 评估体系 → 高级机制 → 生产落地的完整知识体系。

建议按照以下思路准备:

题型分类 对应题目 掌握要点
基础认知 题1、2 RAG定义、与SFT区别
核心流程 题3、4 完整工作流、Chunk策略
优化评估 题5、6、7 提升准确率、评估指标、常见问题
高级机制 题8、9 Self-RAG/CRAG、Graph RAG
生产落地 题10 Spring AI Alibaba实现

最终建议:不仅要背答案,更要动手实现一个完整的RAG系统。

可以按照题10的Spring AI Alibaba示例,从文档索引到智能问答,完整走一遍流程。

这样被面试官追问时,你才能真正对答如流。

文章目录
  1. 1. 前言
  2. 2. 一、RAG基础认知篇
    1. 2.1. 面试题1:什么是RAG?它解决了大模型的哪些痛点?
    2. 2.2. 面试题2:RAG和微调(Fine-tuning)有什么区别?什么时候用哪个?
  3. 3. 二、RAG核心流程篇
    1. 3.1. 面试题3:RAG的完整工作流程是怎样的?请画出流程图并解释每一步。
  4. 4. 三、RAG优化与评估篇
    1. 4.1. 面试题4:如何选择合适的Chunk策略?Chunk Size和Overlap怎么定?
    2. 4.2. 面试题5:如何提升RAG的检索准确率?列举至少3种方法。
    3. 4.3. 面试题6:如何评估一个RAG系统的质量?有哪些关键指标?
    4. 4.4. 面试题7:RAG常见的10大问题及解决方案是什么?
  5. 5. 四、RAG高级机制篇
    1. 5.1. 面试题8:什么是Self-RAG和CRAG?它们解决了什么问题?
    2. 5.2. 面试题9:什么是Graph RAG?它与传统RAG有什么区别?
    3. 5.3. 面试题10:如何用Spring AI Alibaba实现一个生产级RAG系统?
  6. 6. 五、总结