你好!我是今天的面试官。我仔细审阅了你的简历,杨海星同学。你拥有3年的后端开发经验,特别是在 AI 应用工程化(LLM Ops)、RAG 系统优化以及 多智能体架构(Multi-Agent) 方面有非常深入的项目落地经验,技术栈涵盖了 Python (FastAPI/LangChain) 和 Java (Spring Cloud) 双生态,这非常有竞争力。
针对你的简历亮点,我设计了以下五个维度的面试问题及参考回答,旨在考察你的技术深度、架构设计能力以及解决实际问题的思路。
第一部分:RAG 系统深度优化(核心亮点)
向量数据库搭建与优化:基于 Docker Compose 实现 Milvus、Redis
\2. 意图识别与智能分流:基于 BERT 微调业务咨询 /
通用知识二分类模型,完成数据集划分与模型训练;实现通用问题直连大模型、业务问题检索知识库的智能分流,显著提升响应效率。
\3. 双引擎检索架构落地:搭建 BM25 精准 FAQ 匹配 + Milvus 混合检索兜底的双检索机制,设置合理匹配阈值;依托 MySQL管
理多轮对话历史,保障问答上下文连贯性。
基于 Docker Compose 实现 Milvus、Redis等组件一键部署;设计稠密+稀疏双向量存储结构,通过向量融合与重排序大幅提升检索精度与内容匹配准确性。
融合稠密语义、稀疏词汇、关键词三路检索,互补单一检索盲区,大幅提升复杂场景检索准确率
创新父子分块策略——子块精准检索、父块补充上下文,兼顾检索精度与内容完整性
Q1: 你在“智答”项目中提到了“稠密+稀疏双向量混合检索”以及“父子分块策略”。请详细解释一下为什么单一检索存在盲区?你是如何设计混合检索权重的?父子分块具体是如何解决“检索精度”与“上下文完整性”矛盾的?
参考回答:
单一检索的痛点:
- 稠密向量(Dense Vector,如 BGE-M3): 擅长语义匹配,能理解“苹果”在水果和手机语境下的不同,但对于精确关键词(如特定型号
iPhone 15 Pro或专有名词)匹配不够精准,容易受噪声干扰。 - 稀疏向量(Sparse Vector/BM25): 擅长关键词精确匹配,但对于同义词、 paraphrasing(改写)处理能力弱,无法理解语义相似但措辞不同的查询。
- 结论: 结合两者可以互补,既保证语义相关性,又确保关键实体不丢失。
- 稠密向量(Dense Vector,如 BGE-M3): 擅长语义匹配,能理解“苹果”在水果和手机语境下的不同,但对于精确关键词(如特定型号
- 混合检索权重设计:
- 我使用了 Reciprocal Rank Fusion (RRF) 算法或者线性加权融合。在 Milvus 中,我分别存储了稠密向量和稀疏向量。
- 通过 A/B 测试调整权重系数(例如 Dense 0.7 + Sparse 0.3),并结合 BGE-Reranker-Large 进行重排序。Reranker 模型会对初步召回的前 K 个结果进行精细打分,最终取 Top-N 作为上下文。
- 父子分块策略(Parent-Child Chunking):
- 子块(Child Chunk): 将文档切分为较小的片段(如 200-300 tokens),用于向量索引。小片段语义更集中,向量表示更精准,从而提高检索命中率。
- 父块(Parent Chunk): 保留子块所属的更大上下文窗口(如 800-1000 tokens)。当子块被命中时,系统返回其对应的父块内容给 LLM。
- 解决矛盾: 这样既利用了小片段的精准定位能力,又为大模型提供了足够的背景信息,避免了因切片过碎导致 LLM 无法理解完整逻辑的问题。
Q2: 你提到知识库问答准确率提升了 55%,彻底解决了大模型幻觉。除了 RAG 优化,你还做了哪些工程上的手段来抑制幻觉?
参考回答:
- 引用溯源(Citation): 在 Prompt 中强制要求模型在回答时必须标注信息来源的文档片段 ID。如果模型无法从检索到的上下文中找到依据,则强制其回答“根据现有知识库无法回答”,而不是编造答案。
- 置信度阈值过滤: 对 Reranker 的得分设置阈值。如果最高分低于阈值(如 0.6),说明检索内容相关性低,直接触发 fallback 机制(如转人工或返回标准 FAQ),不让 LLM 基于低质量上下文生成。
- FAQ 精准匹配前置: 对于高频、标准问题,优先通过 BM25 精确匹配 FAQ 库。FAQ 答案是人工审核过的“黄金数据”,直接从数据库返回,完全绕过 LLM 生成环节,从根源杜绝幻觉。
- Prompt 工程约束: 使用 System Prompt 明确界定角色,“你是一个基于知识库的助手,严禁使用外部知识”,并采用 Few-shot Learning 提供正负样本示例。
Q3: 在“智答”项目中,你实现了“稠密+稀疏双向量混合检索”和“父子分块策略”。请从原理上解释,为什么这种组合能比单一向量检索提升 55% 的准确率?在处理“专业术语”和“长文档上下文”时,它们分别起到了什么作用?**
参考回答:
- 混合检索互补盲区:
- 稠密向量 (Dense Vector, e.g., BGE-M3): 擅长语义匹配。能理解“苹果”在水果和手机语境下的区别,但对于精确关键词(如型号
iPhone 15 Pro Max)可能因为语义泛化而匹配到不相关的结果。 - 稀疏向量 (Sparse Vector/BM25): 擅长关键词精确匹配。对于专有名词、特定货号、人名等精确匹配效果极好,但无法理解同义词或语义改写。
- 融合优势: 通过 RRF (Reciprocal Rank Fusion) 或加权融合,既保证了语义相关性,又确保了关键实体不丢失,从而大幅提升召回率。
- 稠密向量 (Dense Vector, e.g., BGE-M3): 擅长语义匹配。能理解“苹果”在水果和手机语境下的区别,但对于精确关键词(如型号
- 父子分块解决矛盾:
- 痛点: 小块(Child Chunk)语义集中,向量表示精准,容易检索到;但缺乏上下文,LLM 回答时容易断章取义。大块(Parent Chunk)上下文完整,但向量表示噪音大,检索精度低。
- 策略: 索引时使用子块进行向量存储和检索(保证高精度命中);返回给 LLM 时使用子块对应的父块内容(保证上下文完整性)。
- 效果: 既解决了“搜不到”的问题(子块精准),又解决了“答不准”的问题(父块完整),特别适用于电商详情页、技术文档等长文本场景。
Q4: 你提到通过“FAQ 精准匹配 + 知识库检索兜底”的双引擎架构彻底解决了幻觉。请问如何判断一个问题应该走 FAQ 还是走 RAG?如果 FAQ 匹配度不高但也不低(模糊区间),你会怎么处理?
参考回答:
- 分流策略:
- 第一层:意图识别与 FAQ 匹配。 使用 BM25 或轻量级 Embedding 模型对用户问题进行 FAQ 库检索。设置一个高置信度阈值(如 0.9)。如果得分高于阈值,直接返回 FAQ 标准答案,不走 LLM,速度最快且无幻觉。
- 第二层:RAG 检索。 如果 FAQ 匹配得分低于阈值,则进入 Milvus 进行混合检索,结合 LLM 生成答案。
- 模糊区间处理:
- 如果得分处于中间区间(如 0.6-0.9),说明可能有相关 FAQ 但不完全匹配。
- 策略: 我会将 Top 3 的 FAQ 候选项作为Few-shot 示例或参考信息放入 Prompt 中,交给 LLM 进行最终判断和生成。LLM 可以参考这些相似问题的答案,结合知识库内容进行综合回答,而不是直接返回某个 FAQ。这样既利用了人工审核的高质量数据,又保留了灵活性。
第二部分:多智能体架构与协议标准化
Q3: 在“数智商脉”项目中,你采用了 LangGraph + A2A + MCP 的架构。请解释一下 A2A 和 MCP 在你的架构中分别承担什么角色?为什么要进行分层解耦?
参考回答:
- 角色分工:
- A2A (Agent-to-Agent): 负责智能体之间的调度与通信。它定义了智能体如何发现彼此、如何传递任务状态、如何处理异步响应。在我的架构中,A2A 用于协调 6 个子智能体(如路由智能体、搜索智能体、计算智能体等)的工作流编排。
- MCP (Model Context Protocol): 负责工具/资源的标准化调用。它将业务查询、订单操作、知识库检索等能力封装为标准的 MCP Server。智能体通过 MCP Client 以统一的方式调用这些工具,无需关心底层是 HTTP、gRPC 还是数据库直连。
- 分层解耦的优势:
- 扩展性: 新增一个业务工具(如“库存查询”),只需开发一个 MCP Server 并注册到 Nacos,所有智能体即可自动发现并使用,无需修改智能体核心代码。
- 复用性: 消除了多智能体重复定义 Tool 的问题。以前每个 Agent 都要写一遍“查订单”的代码,现在统一由 MCP 服务提供。
- 跨语言互通: MCP 是语言无关的标准协议,使得 Java 编写的网关或业务服务也能轻松被 Python 编写的智能体调用,打通了技术栈壁垒。
Q4: 你提到实现了“新业务场景零代码快速接入”。这是如何做到的?请描述一下从新业务需求到上线的流程。
参考回答:
- 流程描述:
- 定义 MCP 工具: 开发人员只需按照 MCP 规范,将新业务的 API 或 SQL 查询封装为一个 MCP Tool(例如
query_new_business_data),并配置好输入参数 schema。 - 注册服务: 将该 MCP Server 启动并注册到 Nacos,同时向 A2A 协议层注册该工具的能力描述(Description)。
- 智能体自动感知: 路由智能体(Router Agent)在接收用户请求时,会动态加载所有已注册的 MCP 工具描述。
- 动态规划: LangGraph 中的 Planner 节点根据用户意图和可用工具列表,自动生成执行计划。如果新工具符合当前任务需求,Planner 会自动将其纳入工作流。
- 无需重启: 由于采用了 Nacos 配置热更新和动态服务发现,整个过程无需重启主服务,实现了真正的“零代码”接入(指无需修改核心编排代码)。
- 定义 MCP 工具: 开发人员只需按照 MCP 规范,将新业务的 API 或 SQL 查询封装为一个 MCP Tool(例如
第五部分:场景设计与系统设计
Q7: 假设现在要设计一个“电商直播实时辅助助手”,主播在直播时提问:“刚才那款口红的库存还有多少?”,系统需要在 2 秒内给出准确回答。请结合你的经验,设计这个系统的核心链路。
参考回答:
- 核心挑战: 低延迟(<2s)、数据实时性(库存变动快)、准确性。
- 架构设计:
- 语音转文字(ASR): 前端采集音频,调用 ASR 服务转为文本(需优化垂直领域词汇,如色号名称)。
- 意图识别(轻量级模型): 使用微调后的 BERT 或小参数量 LLM 快速判断意图为“库存查询”,提取实体“口红”、“刚才那款”(需结合上下文记忆)。
- 上下文关联: 从 Redis 中获取最近 N 分钟主播提到的商品 SKU ID 映射表(“刚才那款” -> SKU_12345)。
- 数据查询(关键路径):
- 不走 RAG: 库存是结构化实时数据,不适合向量检索。
- 直接查库/缓存: 通过 SKU ID 直接查询 Redis 缓存(库存预热)。如果 Redis 未命中,降级查询 MySQL 主库(需考虑读写分离)。
- 结果生成: 将查询结果填入预设模板:“当前 SKU_12345 库存剩余 50 件。”
- TTS 播报: 将文本转为语音反馈给主播耳机。
- 优化点:
- 预加载: 直播开始前,将主推商品库存加载到 Redis。
- 旁路缓存: 库存扣减时,同时更新 Redis 和发送 MQ 消息异步更新 DB,保证读性能。
- 超时控制: 设置严格超时(如 1.5s),若超时则返回“正在查询,请稍后”,避免卡顿。
面试官评价与建议
优势:
- 技术前沿性强: 熟练掌握 LangChain, LangGraph, RAG, Vector DB 等 AI 工程化核心技术,且不仅有理论,有具体的优化指标(准确率提升 55%)。
- 全栈思维: 既能做 Python AI 服务,又能做 Java 微服务网关,具备跨语言架构整合能力。
- 结果导向: 简历中量化成果清晰(效率提升 60%-70%),体现了良好的工程价值意识。
潜在追问方向(准备建议):
- Milvus 调优细节: 如果被问到 Milvus 索引类型选择(IVF_FLAT vs HNSW)、参数调整(efConstruction, nprobe)对性能的影响,需准备好具体数据。
- LangGraph 状态管理: 如何管理长时间运行的 Agent 状态?Checkpoint 机制是如何实现的?
- 成本管控: 在大模型调用中,如何通过缓存、模型蒸馏或小模型路由来降低 Token 成本?
这份简历非常优秀,尤其适合应聘 AI 应用工程师、后端开发工程师(AI 方向) 或 大模型平台研发 岗位。祝你面试顺利!
你好,杨海星。我是今天的面试官。
我仔细看了你的简历,你最近的两段经历(智答 和 数智商脉)非常契合我们团队目前对 AI Agent(智能体)工程化落地 的需求。特别是你在 LangGraph 编排、A2A/MCP 协议标准化以及 RAG 优化方面的实战经验,很有深度。
既然我们主要关注智能体方向,我将跳过传统的商城业务逻辑,重点围绕 Agent 架构设计、多智能体协作、工具标准化以及 RAG 增强 这四个核心维度向你提问。
以下是针对你简历定制的面试问题及参考回答:
第一部分:多智能体架构与协议设计(核心考察点)
Q1: 在“数智商脉”项目中,你提到了“路由工作流 + A2A 双架构协同”。请具体解释一下,为什么单纯使用 LangGraph 的工作流不足以支撑企业级需求?引入 A2A (Agent-to-Agent) 协议解决了什么痛点?这两者是如何分工的?
参考回答:
- LangGraph 的局限性: LangGraph 擅长处理单个复杂任务的内部状态机和步骤编排(如:思考->搜索->总结)。但在企业级中台场景下,我们需要将不同的业务能力(如订单查询、库存管理、知识库检索)拆分为独立的微服务或独立智能体。如果全部写在一个 LangGraph 里,会导致代码耦合度高、难以独立扩展和维护,且无法实现跨语言(Java/Python)的服务复用。
- A2A 协议的作用: A2A 解决了智能体之间的发现、通信和调度问题。它让每个子智能体(如“客服Agent”、“数据Agent”)成为独立的服务节点。
- 解耦: 主路由 Agent 不需要知道子 Agent 的具体实现代码,只需通过 A2A 协议发送任务请求。
- 动态扩展: 新增一个业务场景(如“退货处理”),只需开发一个新的 Agent 并注册到 A2A 网络,主路由即可自动感知并调用,实现了简历中提到的“零代码快速接入”。
- 分工协作:
- LangGraph (内部编排): 负责单个 Agent 内部的逻辑流转,比如一个“搜索 Agent”内部可能包含:生成搜索词 -> 调用搜索引擎 -> 过滤结果 -> 总结答案 的步骤。
- A2A (外部协同): 负责 Agent 之间的任务分发。例如,用户问“帮我查一下上周销量最好的口红并分析原因”,主路由 Agent 通过 A2A 将“查销量”分发给“数据 Agent”,将“分析原因”分发给“分析 Agent”,最后汇总结果。
Q2: 你引入了 MCP (Model Context Protocol) 来标准化工具调用。请问 MCP 和你之前使用的 LangChain Tools 有什么本质区别?为什么选择 MCP 而不是继续扩展 LangChain Tools?
参考回答:
- 本质区别:
- LangChain Tools: 是 Python 生态内的代码级封装。如果我要让 Java 写的网关或其他语言的服务被 Agent 调用,通常需要额外开发 HTTP API 并在 Python 侧写 Wrapper,耦合性强,维护成本高。
- MCP: 是一个开放的、语言无关的标准协议。它将工具(Tools)、资源(Resources)和提示词(Prompts)标准化为 JSON-RPC 接口。
- 选择 MCP 的原因:
- 跨语言互通: 我们的架构中有 Java (Spring Cloud Gateway) 和 Python (FastAPI) 两种技术栈。通过 MCP,Java 侧可以将业务接口暴露为 MCP Server,Python 侧的 Agent 作为 MCP Client 直接调用,无需重复开发 SDK。
- 消除冗余: 以前每个 Agent 都要定义一遍“查询订单”的 Tool,现在统一由一个 MCP Server 提供,所有 Agent 共享,避免了工具定义的碎片化。
- 生态兼容: MCP 是行业标准,未来可以无缝接入更多支持 MCP 的第三方工具或 IDE 插件,扩展性更强。
第二部分:RAG 深度优化与幻觉抑制
第三部分:工程化落地与性能优化
Q5: 在智能体应用中,SSE (Server-Sent Events) 流式输出是提升用户体验的关键。你在 FastAPI 和 Spring Cloud Gateway 之间透传 SSE 流时,遇到了哪些挑战?是如何解决的?
参考回答:
- 挑战:
- 缓冲问题: 传统网关或反向代理可能会缓冲响应体,直到完整接收后才转发给前端,导致流式效果失效,用户需要等待很久才能看到第一个字。
- 连接保持: SSE 是长连接,网关需要正确处理心跳和超时,避免连接过早断开。
- 跨语言序列化: Python FastAPI 输出的流式数据格式需要与 Java Gateway 解析兼容。
- 解决方案:
- 禁用缓冲: 在 Spring Cloud Gateway 中配置过滤器,确保对
text/event-stream类型的响应禁用响应体缓冲,实现逐块(Chunk)转发。 - 异步非阻塞: Java 侧使用 WebClient (Reactive) 接收 Python 侧的 Flux 流,并直接 pipe 到前端响应输出流,避免线程阻塞。
- 协议对齐: 统一 SSE 事件格式(如
data: {...}\n\n),确保两端解析一致。同时在 Gateway 层设置合理的空闲超时时间,并发送注释行作为心跳保持连接活跃。
- 禁用缓冲: 在 Spring Cloud Gateway 中配置过滤器,确保对
Q6: 你提到了“Nacos 全量热更新”提升了 70% 的运维效率。在智能体场景中,哪些配置适合热更新?如果热更新导致 Agent 行为异常,你有做回滚或灰度机制吗?
参考回答:
- 适合热更新的配置:
- Prompt 模板: 运营人员可能需要调整 System Prompt 的语气或约束条件,热更新无需重启服务。
- 模型参数: 如 Temperature、Top_P、最大 Token 数等。
- 路由规则: A2A 协议中的路由权重、开关某个子 Agent 的功能。
- 阈值配置: RAG 检索的相似度阈值、FAQ 匹配的置信度阈值。
- 安全机制:
- 版本管理: Nacos 配置支持版本历史,一旦新配置导致异常(如监控到错误率飙升),可一键回滚到上一版本。
- 灰度发布: 虽然 Nacos 本身是全量推送,但我可以在应用层实现灰度逻辑。例如,通过用户 ID 哈希,让 10% 的用户使用新 Prompt,其余使用旧 Prompt。观察指标正常后,再全量推送配置。
- 本地缓存降级: 如果 Nacos 连接失败,Agent 会使用本地缓存的最后一次有效配置,保证服务可用性。
第四部分:开放性问题
Q7: 如果让你设计一个“自主购物 Agent”,它能根据用户预算和喜好,自动在多个电商平台比价、查询库存、甚至完成下单。结合你的 A2A + MCP 架构,你会如何设计这个 Agent 的工作流?其中最大的风险点是什么?如何控制?
参考回答:
- 工作流设计:
- 需求分析 Agent: 解析用户自然语言,提取结构化信息(商品、预算、品牌偏好)。
- 搜索与比价 Agent: 通过 MCP 调用各电商平台的搜索工具,获取商品列表和价格。使用 LangGraph 并行调用多个平台以提高速度。
- 决策 Agent: 根据价格、评分、库存等信息,结合用户偏好进行排序和推荐。
- 确认与执行 Agent: 关键环节。在下单前,必须生成详细订单摘要,要求用户二次确认(Human-in-the-loop)。用户确认后,再通过 MCP 调用下单工具。
- 最大风险点: 误操作与资金安全。Agent 可能理解错误导致买错商品,或被恶意注入攻击导致异常下单。
- 控制措施:
- Human-in-the-loop (HITL): 所有涉及资金的操作(下单、支付)必须经过用户明确确认,不能全自动执行。
- 沙箱环境: 下单工具在测试阶段仅在沙箱环境运行,生产环境需严格权限控制。
- 工具调用鉴权: MCP 工具调用需携带用户身份令牌,并进行二次校验(如短信验证码)。
- 审计日志: 记录 Agent 的每一步思考和调用过程,便于追溯和问题排查。
面试官总结
杨海星,你的简历在 Agent 架构分层(A2A/MCP) 和 RAG 精细化优化 方面非常有亮点,这正是目前高级后端/AI 工程师稀缺的能力。
建议准备:
- 深入细节: 准备好 Milvus 索引类型选择(IVF_FLAT vs HNSW)的依据,以及 LangGraph 中 State Schema 的设计细节。
- 故障排查案例: 准备一个具体的线上问题排查案例,比如“某次 Agent 响应慢,你是如何通过链路追踪定位到是 RAG 检索慢还是 LLM 生成慢,并最终解决的”。
祝你面试顺利!如果有其他具体问题,欢迎继续提问。