📌 面试概览
以下答案基于本人面试录音整理,并结合个人思考与 DeepSeek 辅助完成。实际回答建议结合项目展开。
这轮面试整体问得很细,不是只问"什么是 Agent",而是会追问:
- Function Call、MCP、Skill、Rules 到底怎么区分?
- Agent 怎么按需调用工具,而不是乱调?
- 长短期记忆在项目里怎么落地?
- Agentic RAG 和传统 RAG 差在哪?
- LangGraph 的 Memory 机制、多 Agent 拆分为何容易出错?
- SSE、Redis、MVCC、限流、算法等后端工程能力。
- 安全:提示词攻击、Agent 沙箱。
🟦 一面真题与解析
1. 自我介绍
建议按背景 + 项目 + 技术栈 + 结果 + 匹配度来说。
模板:面试官好,我是 XXX,过去主要做 LLM 应用/Agent 开发。项目里负责过 XXX Agent 系统,技术栈包括 Python、LangGraph、RAG、Function Call、MCP、Redis、SSE。核心做了工具调用编排、记忆系统、检索优化和多 Agent 协作。最终把任务成功率从 X% 提升到 Y%,延迟降低 Z%。我比较匹配贵司 Agent 工程化方向。
⚠️ 不要背简历,要突出和岗位相关的 Agent、RAG、工具调用、工程化经验。
2. 项目一怎么做的
用STAR 法则:
- S:业务背景是什么?
- T:你负责什么?
- A:架构怎么设计?用了哪些 Agent/RAG/工具/记忆?
- R:指标结果如何?
推荐讲清楚这条链路:用户输入 → 意图识别/路由 → Agent 规划 → 工具调用 → RAG 检索 → 记忆读写 → 结构化输出 → 评测与监控。
如果面试官追问,要能画出架构图。
3. Workflow、Agent、Skill 区别
| 概念 | 本质 | 确定性 | 例子 |
|---|---|---|---|
| Workflow | 预定义流程编排 | 高 | DAG、状态机、SOP |
| Agent | LLM 自主决策、规划、调用工具 | 低到中 | ReAct Agent |
| Skill | 可复用能力封装 | 中 | 查订单、发邮件、写 SQL |
一句话:Workflow 是"流程驱动",Agent 是"目标驱动",Skill 是"能力模块",可以被 Workflow 或 Agent 调用。
4. 如何提升 Agent 的 Function Call 能力
核心是:让模型更容易选对工具、填对参数、处理失败。
- 工具描述清晰:说明用途、何时用、何时不用
- 参数 Schema 严格:类型、枚举、必填、默认值
- Few-shot 示例:展示正确调用
- 工具召回:工具太多时先检索候选工具
- 参数校验:Pydantic / JSON Schema 校验
- 错误重试:把错误信息返回给模型
- 权限与预算:限制可调用工具和次数
- 评测集:统计工具选择准确率、参数准确率、任务成功率
- 微调:通用模型不够时,可做 function call 微调
5. Agent 工具调用了解哪些方式
常见方式:OpenAI Function Calling / Tool Calling、ReAct、Plan-and-Execute、MCP、OpenAPI 转工具、LangChain Tool / LangGraph ToolNode、代码解释器、RPC/HTTP API、浏览器自动化、数据库查询工具、本地函数调用。
面试时最好说:简单任务用 Function Call,复杂任务用 ReAct 或 Plan-and-Execute,企业工具统一接 MCP。
6. 怎么保障 Agent 按需调用工具
不要让模型"想调就调",常用约束:
- 意图路由:先判断是否需要工具
- 工具召回:只给模型相关工具
- 置信度阈值:低置信度先追问
- 规则约束:某些场景禁止调用
- 预算控制:最大工具调用次数
- 状态机:流程节点决定可用工具
- 后置校验:检查工具调用是否合理
- 评测:统计过度调用、漏调用
7. Function Call、MCP、Skill 的区别
| 概念 | 层次 | 作用 |
|---|---|---|
| Function Call | 模型能力 | 模型输出结构化函数调用 |
| MCP | 协议标准 | 统一连接模型与工具/资源 |
| Skill | 能力封装 | 把工具、提示、流程、知识打包成可复用能力 |
举例:Function Call 是模型输出
get_weather(city="北京");MCP 是通过标准协议发现并调用天气服务;Skill 是封装"出差规划"能力,内部可能调用天气、航班、酒店多个工具。
8. Skills 和 Rules 的区别?
这题当时没答好,正确理解:
- Skill:能力包,解决"怎么做"。可包含工具、Prompt、流程、代码。
- Rules:规则约束,解决"什么能做、什么不能做、必须怎么做"。
| Skill | Rules |
|---|---|
| 可执行 | 约束性 |
| 扩展能力 | 控制行为 |
| 查订单、写 SQL | 禁止泄露隐私、必须引用来源 |
| 被 Agent 调用 | 写在系统提示/策略层 |
一句话:Skill 是"工具箱",Rules 是"交通规则"。
9. MCP 的使用场景
MCP 适合统一接入企业内外工具和资源:文件系统、数据库、Git 仓库、浏览器、SaaS 系统、内部 API、知识库、监控告警、代码执行环境。
价值:一次接入,多模型、多 Agent 复用;工具动态发现;权限和上下文标准化。
10. Agent 中的长短期记忆,实际怎么实现?
短期记忆:当前会话消息、scratchpad、LangGraph State、滑动窗口、摘要压缩。
长期记忆:向量数据库、KV 存储、知识图谱、用户画像、事件日志、定时摘要。
实现方式:
- 短期:
messages+trim_messages+ summary - 长期:抽取事实 → 去重 → 存向量库 → 检索注入 Prompt
- LangGraph:
checkpointer存短期,Store存长期
11. Prompt 你会怎么考量去写
结构化写 Prompt:角色、目标、上下文、工具、约束、输出格式、示例、边界、安全、评测。
即:你是谁 → 要完成什么 → 已知信息 → 可用工具及使用条件 → 禁止事项 → JSON/Markdown 输出 → Few-shot → 不知道怎么办 → 防注入 → 可迭代。
12. 记忆覆盖问题如何解决
用户偏好会变化,记忆会冲突,常用方案:时间戳(新记忆优先)、版本号、置信度、来源优先级、冲突检测、用户确认、分层存储(事实/偏好/临时)、TTL、去重合并、摘要压缩。
例如用户先说"喜欢咖啡",后说"戒咖啡了",应更新时间线,而不是简单覆盖。
13. Agentic RAG 和传统 RAG 的区别
- 传统 RAG:一次检索 → 拼接上下文 → 生成。
- Agentic RAG:规划 → 查询改写 → 多轮检索 → 工具调用 → 反思 → 验证 → 生成。
| 传统 RAG | Agentic RAG |
|---|---|
| 单轮 | 多轮 |
| 固定流程 | 动态决策 |
| 检索一次 | 可多次检索 |
| 无反思 | 有自我检查 |
| 适合简单问答 | 适合复杂任务 |
14. RAG 的分片逻辑了解吗?
常见分片:固定长度、递归分片、按段落/标题、语义分片、父子分片、句子窗口、表格/代码特殊处理、Late Chunking。
核心原则:一个 chunk 要语义完整,能独立表达一个信息点。
15. 召回时分片不完整怎么办?
方案:父子块(子块检索,父块生成)、句子窗口、重叠分片、查询改写、多路召回、重排、摘要索引、图索引。
不要只靠单一块,最好多粒度召回。
16. 如何选择合适的切块大小和重叠长度?
没有固定答案,要看文档类型和评测。经验值:
| 类型 | 建议 |
|---|---|
| 中文 | 300–800 token |
| 英文 | 500–1000 token |
| 重叠 | 10%–20% |
| 技术文档 | 按标题 |
| 合同 | 按条款 |
| 代码 | 按函数/类 |
| 表格 | 单独处理 |
最终用召回率、答案准确率、上下文长度来调。
17. 哪些技术可以提升 RAG 检索质量?
混合检索(BM25 + 向量)、Rerank 重排、查询改写、HyDE、多向量、元数据过滤、父子块、图 RAG、摘要索引、多路召回、评估集迭代。
18. SSE 如何实现边生成边推送?
SSE 基于 HTTP 长连接,服务端分块返回。
响应头:
Content-Type: text/event-stream Cache-Control: no-cache Connection: keep-alive X-Accel-Buffering: no数据格式:
data: {"token":"你"} data: {"token":"好"} data: [DONE]服务端每生成一个 token 就flush,客户端用EventSource接收。⚠️ 注意 Nginx 要关闭缓冲。
19. Redis 的 Hash 大 Key 怎么优化?
拆 key(按业务/时间分片)、字段过多拆多个 Hash、使用 HSCAN、压缩 value、大 key 删除用UNLINK、设置 TTL、监控大 key、集群分片。
⚠️ 不要一次性
HGETALL。
20. 手撕:快排
defquick_sort(arr,left,right):ifleft>=right:returnpivot=arr[left]i,j=left,rightwhilei<j:whilei<jandarr[j]>=pivot:j-=1whilei<jandarr[i]<=pivot:i+=1arr[i],arr[j]=arr[j],arr[i]arr[left],arr[i]=arr[i],arr[left]quick_sort(arr,left,i-1)quick_sort(arr,i+1,right)if__name__=="__main__":nums=[5,2,9,1,5,6]quick_sort(nums,0,len(nums)-1)print(nums)🟩 二面真题与解析
1. LangGraph 如何搭建?Memory 组件工作机制?
LangGraph 用StateGraph构建,核心四要素:State(共享状态)、Node(执行节点)、Edge(流转边)、Checkpointer(短期记忆持久化)、Store(长期记忆)。
fromlanggraph.graphimportStateGraph,START,ENDfromlanggraph.checkpoint.memoryimportMemorySaverclassState(dict):messages:listbuilder=StateGraph(State)builder.add_node("agent",agent_node)builder.add_node("tools",tool_node)builder.add_edge(START,"agent")builder.add_edge("tools","agent")graph=builder.compile(checkpointer=MemorySaver())- 短期记忆:按
thread_id保存会话状态。 - 长期记忆:用
Store存用户偏好、事实,检索后注入上下文。
2. 为什么要拆子 Agent?
职责隔离、工具集隔离、上下文窗口控制、权限隔离、可并行、可独立评测、可复用。
例如:检索 Agent、SQL Agent、报告 Agent、审核 Agent。
3. 多 Agent 什么情况下容易出错?
通信协议不清晰、共享状态不一致、角色冲突、死循环、错误级联、工具冲突、成本失控、责任扩散、缺少全局评估。
⚠️ 多 Agent 不是越多越好,能单 Agent 解决就别拆。
4. Skill 和多 Agent 执行的区别
- Skill:单 Agent 内调用能力,局部、确定、低成本。
- 多 Agent:多个决策体协作,有角色、通信、编排,适合复杂任务。
一句话:Skill 是"能力扩展",多 Agent 是"组织架构"。
5. Agent 结构化输出信息是什么?
让模型按 JSON Schema 输出:
{"intent":"查询订单","tool":"get_order","args":{"order_id":"123"},"need_human":false}实现方式:OpenAIresponse_format、Function Calling、Pydantic 校验、解析失败重试。
6. Skill 和 Memory 的沉淀怎么设计?
- Skill 沉淀:注册表、版本、描述、参数 Schema、示例、权限、评测。
- Memory 沉淀:抽取、去重、置信度、时间戳、TTL、检索注入、用户确认。
7. 动态 Workflow 了解吗?
- 静态 Workflow:节点和边提前定义。
- 动态 Workflow:LLM 运行时决定下一步、分支、循环、是否人工介入。
适合复杂任务、不确定路径、多工具协作;风险是不可控、难测试、成本高。
8. Agent 开发流程有几个环节?
场景定义 → 任务拆解 → 工具设计 → 知识/RAG → Prompt → 编排 → 记忆 → 评测 → 安全 → 部署监控 → 迭代。
9. Workflow 编排参考什么?偏确定还是自由?
参考:SOP、状态机、DAG、BPMN、LangGraph。
原则:确定优先,自由兜底。能规则解决就规则,LLM 处理模糊和开放部分。
10. 什么情况用 ReAct,什么情况用 Plan and Execute?
- ReAct:短链路、工具反馈即时、探索型任务、边想边做。
- Plan and Execute:复杂多步、可分解、长任务、先规划再执行。
11. Agent 怎么选择工具?
工具描述向量召回、路由模型、Function Calling、规则、权限、成本、历史成功率。
工具多时,先召回候选工具,再让模型选。
12. RAG 整体流程与不同文档分块策略
整体流程:解析 → 分块 → 向量化 → 索引 → 检索 → 重排 → 生成 → 引用。
分块策略:
| 文档类型 | 分块方式 |
|---|---|
| 版面分析、表格转 Markdown | |
| Markdown | 按标题 |
| HTML | 按 DOM |
| 代码 | 按函数/类 |
| 合同 | 按条款 |
| 论文 | 按章节 |
| 表格 | 单独索引 |
13. 检索怎么做?生成怎么控制幻觉?
- 检索:混合检索、多路召回、Rerank、元数据过滤、查询改写。
- 控制幻觉:引用来源、无依据拒答、置信度、输出校验、Self-check、限制上下文。
14. 还有没有其他索引方式?
倒排索引、向量索引、图索引、摘要索引、父子索引、多向量索引、知识图谱、SQL 索引、混合索引。
15. 提示词攻击怎么防护?
攻击类型:直接注入、间接注入(RAG 文档/网页)、越狱、工具滥用。
防护手段:系统提示隔离、输入过滤、工具白名单、最小权限、输出校验、沙箱、人工确认、审计。
16. 如何设计 Agent 沙箱机制?
隔离维度:容器/微 VM、文件系统隔离、网络白名单、只读挂载、权限最小化。
资源与安全:资源限制(CPU/内存/磁盘)、执行超时、seccomp 系统调用过滤、cgroup 资源管控。
可观测:全量审计日志。
⚠️ 代码执行 Agent 必须沙箱,否则一个 Prompt 注入就能拿到宿主机。
17. ZSet 限流的瓶颈在哪?
ZSet 滑动窗口逻辑:
ZREMRANGEBYSCORE key 0 now-window ZCARD key ZADD key now member EXPIRE key window瓶颈:热 key、大 key、内存、并发原子性、集群分片、Lua 阻塞、时钟问题。
优化:Lua 脚本、分片、令牌桶、滑动窗口简化。
18. MVCC 是什么?
多版本并发控制,核心是隐藏版本 + undo log + ReadView + 快照读 + 当前读。
MySQL InnoDB 中的差异:
- RC:每次 SELECT 生成 ReadView;
- RR:第一次 SELECT 生成 ReadView。
作用:读写不阻塞,提高并发。
19. SSE 和 WebSocket 的区别?
| 维度 | SSE | WebSocket |
|---|---|---|
| 通信方向 | 单向服务器推送 | 双向全双工 |
| 协议 | HTTP | 独立协议 |
| 数据类型 | 文本 | 文本/二进制 |
| 重连 | 自动重连 | 需自己处理 |
| 适用场景 | LLM 流式输出 | 聊天、游戏、协同 |
LLM 流式生成一般 SSE 足够。
20. 旋转数组搜索
defsearch(nums,target):left,right=0,len(nums)-1whileleft<=right:mid=(left+right)//2ifnums[mid]==target:returnmid# 左半部分有序ifnums[left]<=nums[mid]:ifnums[left]<=target<nums[mid]:right=mid-1else:left=mid+1else:ifnums[mid]<target<=nums[right]:left=mid+1else:right=mid-1return-1🧭 面试复盘
这轮 Agent 开发面试的特点:
- 不只会用框架,还要懂底层机制。
- Function Call、MCP、Skill、Rules 要能分清。
- RAG 问得很细,分块、召回、重排、幻觉控制都会追。
- 多 Agent 不是越多越好,要能说清拆分边界。
- 工程能力重要:SSE、Redis、MVCC、限流、沙箱。
- 算法题偏基础:快排、旋转数组搜索。
准备建议:
- 手写一个最小 Agent;
- 手写 Function Call 流程;
- 用 LangGraph 搭一个带 Memory 的 Agent;
- 做一个 RAG 评测集;
- 了解 MCP Server/Client;
- 复习 Redis、SSE、MVCC、限流;
- 刷快排、二分、旋转数组。
📚 完整 Agent 面试题
另外像 AI Agent 这种面试,我有收集好的Agent 完整面试题,涵盖:
- Function Call / MCP / Skill / Rules;
- RAG 分块、召回、重排、评估;
- LangGraph / Memory / 多 Agent;
- SSE / WebSocket / Redis / MVCC;
- Agent 沙箱与提示词攻击;
- 手撕算法。
需要的评论区 dd,我整理好发你。
如果这篇文章对你有帮助,欢迎点赞 👍、收藏 ⭐、关注 🔔。
后续继续更新:LangGraph 实战、MCP 入门、Agentic RAG、多 Agent 协作、Agent 评测体系。