RAG & AI Agent 开发面试题大全

0 阅读18分钟

一、RAG 基础原理

Q1:什么是 RAG?请描述其核心原理和三阶段流程

答:

RAG(Retrieval-Augmented Generation,检索增强生成)是一种将信息检索生成式模型结合的技术,本质是给大模型"外挂一个实时知识库",解决大模型的知识截止、幻觉等问题。

三阶段流程:

检索(Retrieve)→ 增强(Augment)→ 生成(Generate)
阶段核心操作关键技术
检索阶段将用户 Query 向量化,从外部知识库搜索相关文档片段(Chunk)Embedding 模型、向量数据库(Milvus/Faiss/ES)、ANN 搜索
增强阶段将检索到的文档片段与原始问题拼接构建 PromptPrompt Engineering、上下文组织
生成阶段将增强后的 Prompt 输入 LLM,生成最终答案GPT/Qwen/GLM 等大模型

完整工作流(6 步):

  1. 用户提问
  2. 数据准备:文档清洗、切块(PDF→文本切片)
  3. 向量化:Embedding 模型(BGE、text-embedding-3 等)将文本转为高维向量
  4. 索引存储:向量存入向量数据库
  5. 检索增强:用户 Query 向量化后从库中检索 Top-K 相关片段
  6. 生成答案:检索结果 + 问题 → LLM → 最终回答

Q2:RAG 相比大模型微调(Fine-tuning)的优劣势是什么?

答:

维度RAGFine-tuning
成本低(无需训练)高(GPU 训练、数据标注)
更新速度实时(修改文档即生效)慢(需重新训练)
知识私密性知识在外部库,相对安全知识融入模型权重
可解释性高(可追溯检索来源)低(知识黑盒化)
适用场景私域知识、实时数据、长尾知识风格迁移、领域能力提升
幻觉风险较低(有文档锚定)较高(无来源验证)

结论: 生产环境中通常优先考虑 RAG,Fine-tuning 用于风格/格式对齐,二者可结合使用。


Q3:RAG 的常见失败场景有哪些?如何解决?

答:

失败场景原因解决方案
检索空洞Query 与文档语义差异大Query 改写、HyDE、多路检索
召回不准分块策略不当、向量模型差优化分块大小、微调 Embedding 模型
上下文溢出检索文档超过 LLM 上下文限制压缩摘要、动态截断、Rerank 排序
多文档冲突不同文档答案矛盾权威度加权、多视角输出、提示词控制
时效性问题知识库未更新增量索引、添加时间敏感性提示
幻觉拼凑LLM 忽视检索结果凭空捏造强制引用约束、Self-RAG 信号机制

Q4:解释 HyDE(Hypothetical Document Embeddings)的原理和应用场景

答:

原理: HyDE 的核心思路是"用假设答案代替真实 Query 做检索":

  1. 将用户 Query 输入 LLM,让其生成一段假设性答案文本(不要求正确)
  2. 对这段假设答案进行 Embedding 向量化
  3. 用该向量在真实知识库中检索相似文档

为什么有效:

  • 用户 Query 通常很短(5~20字),而知识库文档是长文本,二者向量分布有差异
  • 假设答案与文档风格更接近,向量相似度更高,检索更准确

适用场景:

  • Query 极短或模糊(如:"推荐算法")
  • 用户 Query 与文档术语不一致(口语 vs 专业术语)

二、RAG 系统构建与优化

Q5:RAG 的文本分块(Chunking)策略有哪些?如何选择?

答:

分块策略适用场景优缺点
固定大小分块通用场景简单快速,可能打断语义完整性
句子级分块语义要求高语义完整,但大小不均匀
段落级分块结构化文档保留文章结构,但 chunk 可能过大
重叠分块(Sliding Window)上下文连贯性要求高保留边界上下文,存储冗余
Small-to-Big 检索长文档精确定位先检索小块定位,再扩展到大块提供上下文
语义分块(Semantic Chunking)高质量检索按语义边界切割,效果好但计算成本高

实践建议:

  • Chunk 大小通常在 512~1024 token
  • 重叠(overlap)建议 10%~20%
  • 标题/元数据应随 chunk 一起存储,便于过滤

Q6:如何优化 RAG 的检索召回率?

答:

方案一:Query 扩展

  • 同义词替换(如"机器学习" → "ML、人工智能训练")
  • LLM 改写(生成多个查询变体,合并结果)
  • HyDE(生成假设文档检索)

方案二:混合检索(Hybrid Search)

  • 稠密检索(Dense Retrieval):基于 Embedding 向量的语义检索
  • 稀疏检索(Sparse Retrieval):基于 BM25 的关键词检索
  • 通过 RRF(Reciprocal Rank Fusion)融合两路结果,同时覆盖语义和关键词

方案三:重排序(Reranking)

  • 初步召回 Top-50,再用 Reranker 模型(如 BGE-Reranker、Cohere Rerank)精排 Top-5
  • 二阶段检索显著提升精确率

方案四:优化分块和 Embedding

  • 多粒度分块(chapter→paragraph→sentence)
  • 针对业务领域微调 Embedding 模型

Q7:什么是迭代检索(Iterative Retrieval)?与普通 RAG 有何区别?

答:

普通 RAG(单轮):

Query → 检索 → 生成答案(一次完成)

迭代 RAG(多轮):

Query → 检索₁ → LLM生成中间答案 → 以中间答案为新Query → 检索₂ → 最终生成
(可循环多次直到满足终止条件)

适用场景: 复杂推理、多跳问题(需要先查A再查B)

相关变体:

  • FLARE:LLM 在生成过程中主动触发检索,检测到低置信词时检索补充
  • Self-RAG:模型生成特殊 token(如 [Retrieval])来决定何时需要检索

Q8:RAG 如何处理多文档冲突信息?

答:

冲突产生的原因:不同文档对同一问题有不同甚至矛盾的描述(如不同时间版本的政策文件)。

解决策略:

  1. 权威度加权:根据来源可信度排序(官方文档 > 学术论文 > 博客),优先采信高权威来源
  2. 时间戳优先:选择最近更新的文档
  3. Prompt 引导:在系统提示中明确告知 LLM "如遇到矛盾信息,列出各观点并标注来源"
  4. 多视角输出:呈现多种观点,让用户判断,适用于争议性问题
  5. 置信度投票:多文档支持的观点获得更高权重

Q9:如何优化长文档的 RAG 检索效果?

答:

方案一:层次化检索

  • 第一层:文档摘要级别索引,快速定位相关文档
  • 第二层:段落/句子级索引,精确定位答案片段

方案二:Small-to-Big(子父块检索)

  • 索引时:小 chunk 做检索(精准定位)
  • 返回时:扩展为包含该小 chunk 的大 chunk(提供更完整上下文)

方案三:知识图谱增强

  • 将文档内容抽取为实体-关系三元组,构建知识图谱
  • 检索时同时走向量检索 + 图查询,解决多跳推理问题(GraphRAG)

方案四:位置感知分块

  • 保存 chunk 在原文中的位置信息(章节标题、页码)
  • 检索时可合并相邻 chunk,保证上下文连贯

Q10:RAG 如何适配实时更新的知识库?

答:

方案实现方式特点
增量索引新文档入库时直接 Embedding 并写入向量库接近实时,无需全量重建
定时全量重建每日/每周重建索引适合低频更新场景
数据分区冷热数据分离,热数据频繁更新平衡性能和实时性
时间戳过滤检索时加入时间范围过滤条件确保使用最新文档

注意: 知识库更新无需重新训练生成模型,这是 RAG 相比 Fine-tuning 的核心优势之一。


三、RAG 评估与质量保证

Q11:如何评估 RAG 系统的检索质量?

答:

核心评估指标:

指标含义计算方式
Precision@KTop-K 结果中相关文档的比例相关结果数 / K
Recall@K所有相关文档中被检索到的比例检索到的相关数 / 总相关数
MRR(Mean Reciprocal Rank)第一个正确结果排名的倒数均值反映排名质量
NDCG综合考虑相关度和排名位置适合多级相关性评估

测试流程:

  1. 构建测试集:人工标注 200~500 组 QA 对,每组含问题 + 标准答案 Chunk
  2. 批量检索:将测试问题批量输入检索模块
  3. 对比计算:将返回结果与标准答案对比,计算上述指标
  4. 持续监控:在生产环境中设置指标报警

Q12:如何评估 RAG 生成答案的质量?

答:

自动评估指标:

  • ROUGE/BLEU:生成文本与参考答案的字面重叠度(适合封闭域,需谨慎)
  • RAGAS 框架:专为 RAG 设计的评估框架,包含以下维度:
    • faithfulness(忠实度):答案是否忠实于检索文档
    • answer_relevancy(答案相关性):答案是否回答了问题
    • context_precision(上下文精确率):检索文档是否相关
    • context_recall(上下文召回率):相关文档是否被检索到

人工评估维度:

  1. 事实准确性:对比标准答案,答案是否正确
  2. 引用精确度:引用内容与源文档的一致性
  3. 完整性:是否覆盖所有关键信息
  4. 无害性:是否存在有害或歧视性内容

四、向量数据库

Q13:向量数据库的核心原理是什么?

答:

向量数据库将非结构化数据(文本、图片、音频)转换为高维向量存储,通过近似最近邻(ANN)搜索快速找到语义相似内容。

核心三步:

原始数据 → [Embedding模型] → 高维向量 → [ANN索引] → 毫秒级相似搜索

主流索引算法:

算法原理特点
HNSW分层导航小世界图,多层跳跃结构搜索复杂度 O(log N),高召回率,内存占用大
IVF(倒排文件)将向量空间分区,只搜索相近分区内存友好,召回率略低
PQ(乘积量化)将高维向量压缩为低维编码大幅压缩内存,速度快
LSH(局部敏感哈希)相似向量大概率映射到同一哈希桶实现简单,精度较低

对比传统数据库:

特性传统数据库向量数据库
数据类型结构化数据高维向量
检索方式精确匹配(SQL)近似最近邻(ANN)
典型场景订单查询语义搜索、推荐

Q14:常见向量数据库有哪些?如何选型?

答:

向量库特点适用场景
Milvus分布式、高性能、开源、功能丰富大规模生产部署(>1亿向量)
QdrantRust 实现,高性能,支持过滤中大型项目,对性能要求高
WeaviateGraphQL API,支持多模态需要复杂查询和图关系的场景
Chroma轻量级,易于上手开发调试、小规模项目
FAISSMeta 开源,纯向量检索库嵌入到自研系统中
Elasticsearch支持混合检索(BM25 + 向量)已有 ES 基础设施,混合检索场景
pgvectorPostgreSQL 插件已用 PostgreSQL,轻量接入

选型原则:

  • 小型项目 / 快速验证:Chroma 或 pgvector
  • 生产环境大规模:Milvus 或 Qdrant
  • 需要混合检索:Elasticsearch(8.x 已支持 HNSW)

五、AI Agent 核心概念

Q15:什么是 AI Agent?与普通 LLM 应用的区别?

答:

AI Agent(智能体) 是能够自主规划、调用工具、执行多步任务的 AI 系统。

核心组成(四要素):

感知(Perception)→ 规划(Planning)→ 行动(Action)→ 记忆(Memory)
组件职责
LLM 核心理解用户意图、制定计划、推理决策
工具集(Tools)搜索引擎、代码执行、数据库查询、API 调用
记忆系统(Memory)短期(对话历史)+ 长期(向量存储)记忆
规划器(Planner)任务拆解、多步执行、错误恢复

与普通 LLM 的区别:

对比项普通 LLMAI Agent
执行步骤单轮问答多步迭代执行
工具使用可调用外部工具
自主性被动响应主动规划执行
状态维护无(或简单)有上下文状态管理

Q16:Agent 中的幻觉问题如何解决?

答:

幻觉产生的原因:LLM 训练数据偏差、知识截止、过度拟合训练分布。

解决方案:

  1. RAG 接地气:让 Agent 检索真实文档后再回答,有据可查
  2. 工具验证:提供计算器、搜索引擎等工具,让模型去验证而不是猜测
  3. Chain-of-Thought(CoT):强制分步推理,减少跳跃式幻觉
  4. Prompt 约束:明确指示"如果不确定请说不知道,不要猜测"
  5. 输出结构化:强制 JSON Schema 输出,减少自由发挥空间
  6. RLHF/DPO 对齐:通过人类反馈强化"拒绝回答"的正确行为
  7. 事实验证工具:集成知识图谱或权威数据库做事实核查

六、Agent 工具调用与协议

Q17:什么是 Function Calling?工作流程是什么?

答:

Function Calling(函数调用)是 LLM 与外部工具交互的标准机制,允许模型在对话中触发预定义函数。

工作流程:

1. 开发者定义工具(JSON Schema描述工具名、参数、功能)
2. 将工具定义 + 用户问题一起发给 LLM
3. LLM 决策:需要调用工具时,返回结构化 JSON(包含工具名和参数)
4. 客户端解析 JSON,调用实际函数/API
5. 将函数返回结果发回 LLM
6. LLM 基于结果生成最终自然语言答案

示例:

// 用户问:"上海明天天气怎么样?"
// LLM 返回 Function Call:
{
  "name": "get_weather",
  "arguments": {
    "city": "上海",
    "date": "tomorrow"
  }
}

Q18:MCP 是什么?与 Function Calling 有何区别?

答:

MCP(Model Context Protocol,模型上下文协议) 是 Anthropic 推出的 AI 工具集成标准协议,类比于"AI 世界的 USB 接口"——实现 AI 与外部数据源/工具的标准化连接。

MCP vs Function Calling 对比:

维度Function CallingMCP
标准化程度各厂商各自定义,不统一统一协议标准,跨模型通用
工具注册方式每次请求携带定义Server 独立运行,Client 连接
状态维护无状态Server 可维护状态
适用范围单次工具调用复杂持久化工具集成
生态OpenAI/Anthropic 等各自实现开放标准,已有大量 Server

MCP 核心架构:

  • MCP Client:AI 应用(如 Claude Desktop)
  • MCP Server:工具服务(文件系统、数据库、搜索引擎等)
  • 通信方式:stdio(本地)或 SSE/HTTP(远程)

Q19:A2A(Agent to Agent)协议是什么?与 MCP 的区别?

答:

A2A(Agent-to-Agent) 是 Google 提出的多 Agent 通信协议,专注于异构 Agent 之间的协作

维度MCPA2A
通信对象AI ↔ 工具/数据源Agent ↔ Agent
场景单个 Agent 调用外部工具多 Agent 任务分发与协作
设计目标工具接入标准化Agent 能力发现与委托
互补关系底层工具集成上层 Agent 编排

简单理解:

  • MCP:Agent 如何使用工具(锤子、扳手)
  • A2A:多个 Agent 如何分工协作(工头 → 工人)

七、Agent 规划与推理

Q20:什么是 ReAct 框架?为什么它是 Agent 的主流范式?

答:

ReAct(Reasoning + Acting) 是一种将推理行动交替进行的 Agent 执行框架。

执行循环:

观察(Observation)→ 思考(Thought)→ 行动(Action)→ 观察(Observation)→ ...

示例(查询"2024年诺贝尔物理学奖获得者"):

Thought: 我需要搜索最新信息
Action: search("2024 Nobel Prize Physics")
Observation: 搜索结果返回 "Geoffrey Hinton 和 John Hopfield..."
Thought: 已获得答案,可以回复用户
Action: Final Answer("2024年诺贝尔物理学奖颁给了...")

优势:

  • 推理过程透明可审计
  • 工具调用有依据,减少随机性
  • 适合多步复杂任务
  • 支持错误恢复(观察到错误后重新规划)

局限:

  • Token 消耗大(每步都要推理)
  • 长链路容易循环或卡死
  • 对基础模型推理能力要求高

Q21:Agent 如何进行任务规划(Planning)?主流方案有哪些?

答:

任务规划是 Agent 将复杂目标分解为可执行步骤的能力。

主流规划方案:

方案原理特点
Chain-of-Thought(CoT)逐步推理链,Prompt 引导思考过程简单有效,适合中等复杂度
Tree-of-Thoughts(ToT)探索多条推理路径,树状搜索适合需要回溯的复杂问题
ReAct推理+行动交替执行工具调用场景标准范式
Plan-and-Execute先生成完整计划,再逐步执行适合结构化任务,计划可审查
Reflexion自我反思机制,执行后评估并改进自动纠错,多轮迭代提升质量

实践建议:

  • 简单查询任务 → ReAct
  • 需要审查和修改的任务 → Plan-and-Execute
  • 需要高质量输出的创作 → Reflexion

Q22:如何解决 Agent 的"无限循环"和"早期停止"问题?

答:

无限循环原因: Agent 陷入反复调用同一工具却无法收敛的状态。

解决方案:

  1. 最大步骤限制:设置 max_iterations=10,超出则强制返回当前最优答案
  2. 重复检测:检测到相同 Action 序列时提前终止
  3. 思考链压缩:超过一定轮次后摘要压缩历史 Thought
  4. 工具调用去重:相同参数的工具调用结果缓存,避免重复执行

早期停止原因: Agent 在任务未完成时就认为已完成。

解决方案:

  1. 明确的完成标准 Prompt:在系统提示中定义"任务完成"的判断条件
  2. 人机确认节点:关键步骤加入人工确认(Human-in-the-loop)
  3. 验证工具:让 Agent 在回答前调用验证工具检查结果完整性

八、多 Agent 协作

Q23:多 Agent 系统有哪些常见架构模式?

答:

架构模式描述适用场景
主从架构(Orchestrator-Subagent)一个主 Agent 协调多个专业子 Agent复杂任务分工,如代码生成+测试+部署
管道架构(Pipeline)Agent 串行处理,上一个输出是下一个输入数据处理流水线
投票架构(Voting/Debate)多个 Agent 独立给出答案,最终投票提高输出质量,减少单点幻觉
平行架构(Parallel)多 Agent 并行执行不同任务,最终汇总速度优先场景
群体架构(Swarm)Agent 去中心化自组织协作复杂开放式任务

热门框架对应:

  • LangGraph → 主从 / 状态机架构
  • AutoGen → 对话式多 Agent 协作
  • CrewAI → 角色扮演多 Agent 分工

Q24:多 Agent 系统如何保证任务不重复、不遗漏?

答:

关键设计:

  1. 任务分配协议(Task Queue):使用消息队列(如 Redis / Celery)统一管理任务,每个任务有唯一 ID
  2. 状态跟踪:共享状态存储(如 Redis / 数据库)记录每个任务的执行状态(pending/running/done)
  3. 幂等性设计:工具调用和 Agent 操作保证幂等,重试不会产生副作用
  4. 主 Agent 监控:Orchestrator 定期检查子 Agent 状态,发现超时则重新分配
  5. 结果汇总层:在所有子 Agent 完成后,由汇总 Agent 统一整合输出

九、Agent 记忆机制

Q25:AI Agent 的记忆分类及实现方式?

答:

Agent 记忆分为四类:

记忆类型描述实现方式时效性
Sensory Memory(感觉记忆)当前输入的原始内容当前 Prompt 中的输入文本即时
Short-Term Memory(工作记忆)当前对话上下文历史LLM 上下文窗口(Messages List)本次会话
Long-Term Memory(长期记忆)跨会话的持久化知识向量数据库(存储对话摘要)持久
Episodic Memory(情节记忆)特定事件的经过记录结构化日志 / 向量存储持久

工程实现:

# 短期记忆:直接维护 messages 列表
messages = [
    {"role": "user", "content": "..."},
    {"role": "assistant", "content": "..."},
]

# 长期记忆:对话摘要存入向量数据库
summary = llm.summarize(conversation)
vector_store.add(summary, metadata={"user_id": "xxx"})

# 检索时:先从向量库召回相关历史
relevant_memories = vector_store.search(current_query, top_k=3)

Q26:如何解决 Agent 上下文窗口过长的问题?

答:

方案原理适用场景
对话摘要压缩定期将早期对话摘要为简短文本长对话场景
滑动窗口只保留最近 N 轮对话对历史上下文依赖不强的场景
关键信息提取只保留实体、事实、用户偏好任务型对话
向量化记忆检索将历史存入向量库,按需检索需要精确历史回忆
层次化摘要多轮摘要,逐层压缩超长期对话

实践推荐:

  • 短期:滑动窗口 + 关键信息提取
  • 长期:向量数据库存储对话摘要,检索增强