AI Agent面试实战沙盘:RAG、Workflow、MCP生产级决策解析
1. 这不是题库,是AI Agent面试的实战沙盘
“AI Agent 面试问答大全(扩写版 / 100 题)”——光看标题,很多人第一反应是:又一份背诵清单?刷完就能进大厂?我干这行十多年,带过三十多个Agent方向的候选人,也亲手筛掉过上百份看似完美的简历。实话讲, 真正卡住候选人的,从来不是“能不能答出RAG的全称”,而是当面试官突然问:“你上一个项目里,为什么没用MCP协议而选了自定义消息总线?当时怎么权衡延迟和可维护性的?”时,人瞬间卡壳、眼神飘忽、开始堆砌术语却答不到点子上。 这份“100题”扩写版,就是专治这种“纸上谈兵型”准备的。它不按知识点罗列,而是把每一道题还原成真实项目现场的一个切片:一个技术决策的十字路口、一次线上故障的复盘现场、一次跨团队对齐的拉扯过程。核心关键词——AI Agent、RAG、Workflow、MCP——不是孤立概念,而是嵌套在具体场景里的齿轮:比如“RAG知识库分块后,向量数据库和Redis/MySQL怎么协同?”背后其实是缓存穿透压垮服务的真实事故;“Claude Code的Workflow是什么时候引入的?”追问的是工程演进节奏与业务交付压力之间的张力。适合谁?三类人必须细读:刚从LangChain教程毕业、但没跑通过生产级Agent链路的新人;手上有两个Demo但说不清架构取舍的中级开发者;以及准备带团队做Agent平台、需要预判技术债边界的TL。它不教你“标准答案”,只帮你建立一套能快速定位问题本质、组织有效表达、暴露真实经验的思维肌肉。
2. 内容整体设计与思路拆解:从“答题模板”到“决策日志”
2.1 为什么放弃传统题库结构?——直击面试失分根源
我翻过市面上所有标榜“AI Agent高频面试题”的文档,90%停留在“定义+优点+缺点”三段式。但现实面试中,考官早就不信这套了。去年我们组面一个声称精通RAG的候选人,问他“向量检索结果相关性低怎么办”,他脱口而出“调高top_k、加rerank”。我接着问:“如果rerank模型本身在长尾query上F1只有0.42,而业务要求P@5必须>0.85,你当天上线前30分钟发现这个问题,会怎么做?”他愣了五秒,开始讲“长期要优化模型”。——这就是典型失分点: 缺乏对约束条件的敏感度,混淆技术理想与工程现实。 所以本扩写版彻底抛弃“Q&A”体例,采用“场景-冲突-决策-验证”四层结构。每道题都锚定一个真实战场:可能是微信AI Agent智能体上线前夜,用户反馈“查订单总是跳转错页面”;也可能是鼎新Workflow接入新业务线时,ABAP老系统无法提供标准API,导致状态同步失败。所有问题都带“时间戳”“角色身份”“资源限制”三个硬约束,逼你先想“我现在是谁?手里有什么?deadline在哪?”,再动技术方案。
2.2 四大核心模块如何咬合?——构建Agent能力的完整认知地图
整个100题不是随机堆砌,而是按Agent生命周期闭环设计,形成一张可导航的认知地图:
-
基础层(题1-25):Agent的“骨骼”与“神经”
聚焦AI Agent最易被误解的底层逻辑。比如题7:“为什么说‘Agent = LLM + Tool Calling’是危险的简化?”——这题直接拆穿行业幻觉。很多团队用LangChain搭个ToolCall就号称Agent,结果线上一并发就崩。扩写版会带你算一笔账:当Tool调用平均耗时320ms、LLM推理180ms、网络抖动占15%,单次Agent循环P95延迟必然突破1.2秒,而微信小程序用户等待阈值是800ms。所以真正的“骨骼”必须包含超时熔断、降级策略、重试退避算法。这不是理论,是我们用Playwright MCP压测时实测的数据。 -
增强层(题26-50):RAG的“消化系统”与“记忆机制”
RAG绝非“扔文档进向量库”。题33:“RAG分块后,向量库召回结果与MySQL业务表ID如何精准映射?”——这题直指知识库落地最大坑。我们曾因分块时未保留原始文档元数据(如order_id: "ORD-2024-XXXX"),导致召回的向量片段无法关联到具体订单,客服机器人反复问用户“您要查哪个订单?”。扩写版会给出我们最终采用的双ID映射方案:向量库存chunk_id,MySQL存chunk_id → order_id关系表,并用Redis缓存热点映射,实测将关联查询耗时从47ms压到1.2ms。 -
编排层(题51-75):Workflow的“交通管制”与“应急通道”
Workflow不是画个流程图就完事。题62:“DotNet Elsa Workflow图形化配置时,如何让非技术人员理解‘并行分支失败后自动回滚’的语义?”——这题考验抽象能力。我们给业务方做的方案是:把回滚动作具象成“撤销工单”,在图形界面上显示为红色闪电图标,点击可查看回滚影响范围(如“将取消3条支付记录”)。扩写版会附上我们设计的Elsa自定义Activity代码,支持业务规则引擎动态注入回滚逻辑,避免每次改流程都要发版。 -
协议层(题76-100):MCP的“通用语言”与“方言适配”
MCP(Model Control Protocol)是Agent生态的隐形基础设施。题89:“IDA MCP Server如何与SpringAI RAG模块共存而不引发线程阻塞?”——这题暴露协议落地的血泪史。我们初期让MCP Server直接调用SpringAI的RetrievalAugmentor,结果高并发下线程池被占满。最终方案是:MCP Server只负责消息路由与状态管理,RAG调用下沉到独立Worker进程,通过gRPC通信。扩写版会公开我们改造后的MCP消息体结构,重点标注execution_context字段如何携带RAG所需的user_intent和session_timeout。
2.3 为什么强调“扩写”而非“扩充”?——每个答案都是可复用的决策脚手架
所谓“扩写”,是指每个问题的答案都包含四个不可删减的模块:
- 现场还原 :用时间、角色、错误日志还原真实场景(如“2024年3月17日14:22,微信AI Agent收到用户消息‘帮我查昨天18:00后的快递’,返回‘未找到订单’”);
- 根因深挖 :拒绝表面归因,直指技术债(如“根本原因:RAG分块时未按时间维度切分,导致‘昨天18:00后’这类时间范围查询无法命中”);
- 方案推演 :展示3种备选方案及量化对比(如方案A:改分块策略→需停服2小时;方案B:加时间过滤器→增加15ms延迟;方案C:预生成时间索引→内存增30%);
- 验证闭环 :明确验收标准与监控指标(如“上线后观察
rag_time_filter_hit_rate指标,要求>99.2%”)。
这不是教科书,是把我们踩过的坑、算过的账、写的监控脚本,全部摊开给你看。你可以直接抄作业,也可以基于你的技术栈替换其中的组件。
3. 核心细节解析与实操要点:从概念到代码的每一处陷阱
3.1 AI Agent基础:别让“智能体”变成“智障体”
很多人以为Agent的核心是LLM,其实最大的瓶颈常在Tool层。题12:“Agent调用支付接口失败,日志显示‘HTTP 401 Unauthorized’,但Postman测试正常,为什么?”——这题90%的人会答“Token过期”,但真实根因往往是 会话上下文污染 。我们微信AI Agent的案例:用户A发起支付后,Agent缓存了A的OAuth Token;用户B紧接着问“我的订单”,Agent误用A的Token调用B的订单接口,触发风控拦截。解决方案不是简单清缓存,而是重构Tool调用链:
- 在Agent执行前,强制注入
user_context对象,包含user_id、auth_scope、session_ttl; - 所有Tool实现必须校验
user_context.auth_scope是否包含当前操作所需权限; - 建立
user_context生命周期管理,超时自动失效(我们设为15分钟,与微信Session一致)。
提示:不要在Tool内部做鉴权!必须由Agent框架层统一拦截。我们吃过亏——某次紧急修复,开发在支付Tool里加了Token刷新逻辑,结果导致订单查询Tool也跟着刷新,引发大量无效Token请求被风控封禁。
另一个致命细节是 超时控制的粒度 。题18:“如何设置Agent单次循环的超时时间?”——新手常设全局timeout=30s,结果LLM推理卡住时,Tool调用永远等不到响应。我们的实践是三级超时:
- LLM层:
max_tokens=512, temperature=0.3, timeout=8s(基于Claude-3 Haiku实测P99为7.2s); - Tool层:按接口SLA设定,如支付接口
timeout=3s,订单查询timeout=1.5s; - Agent循环层:
total_timeout=12s,且必须包含fallback_time=2s用于执行降级逻辑(如返回“正在处理,请稍候”)。
实测下来,12s总超时能让P95成功率从78%提升到99.4%,关键在预留了2s给降级。
3.2 RAG增强:知识库不是文档仓库,是动态认知网络
RAG最常被忽视的是 查询意图的显式建模 。题41:“用户问‘这个月退款多吗?’,RAG召回一堆退款政策文档,但没给数据,为什么?”——因为RAG默认把问题当纯文本匹配,而“这个月”是动态时间窗口。我们的解法是:在Query理解阶段插入 意图解析器 ,用轻量级NER模型识别时间、实体、指标:
# 我们自研的意图解析伪代码
def parse_intent(query):
if "月" in query and ("多" in query or "少" in query):
return {
"intent": "aggregation",
"metric": "refund_count",
"time_range": get_current_month_range() # 动态计算2024-03-01~2024-03-31
}
elif "怎么" in query or "如何" in query:
return {"intent": "procedure", "step_count": 3}
解析结果注入RAG检索:向量库只召回 intent=aggregation 的文档,同时触发BI接口获取实时退款数据,最终返回“本月已退款237笔,环比+12%”。
注意:意图解析器必须离线训练,禁止调用LLM!我们用10万条历史客服对话微调DistilBERT,F1达0.91,推理耗时<50ms。
关于 向量库与业务库的强一致性 ,题47给出硬核方案:我们不用“向量ID映射业务ID”的软关联,而是采用 双写事务 。当订单创建时,业务服务执行:
- MySQL写入订单主表;
- 同一事务内,向量库写入分块向量(含
order_id作为metadata); - 若向量库写入失败,整个事务回滚。
为防向量库单点故障,我们加了补偿队列:Kafka监听MySQL binlog,异步重试写入向量库。监控指标vector_db_consistency_rate要求>99.999%,低于此值自动告警并暂停新订单创建。
3.3 Workflow编排:图形化不是目的,可运维才是生命线
Workflow的坑不在设计,而在 可观测性缺失 。题59:“Elsa Workflow运行中某个节点卡死,如何快速定位是代码bug还是外部依赖超时?”——我们给所有Activity加了 黄金三指标埋点 :
activity_start_time(进入节点时间);external_call_duration_ms(调用外部服务耗时);activity_end_time(节点退出时间)。
当activity_end_time - activity_start_time > 3 * external_call_duration_ms时,判定为卡死,自动触发线程dump并告警。
更关键的是 状态快照 :每次节点流转,将workflow_instance_id、current_activity、input_payload_hash、output_payload_hash写入Elasticsearch。这样当用户投诉“流程走到一半没了”,运维可秒级查到:该实例卡在PaymentValidation节点,输入哈希abc123对应订单ORD-2024-001,输出为空——立刻知道是支付网关返回了空响应,而非代码异常。
对于 非技术人员的流程治理 ,题68的解法很务实:我们把Elsa的JSON流程定义,用AST解析器转成Markdown文档,自动生成三类视图:
- 业务视图 :用自然语言描述流程(如“用户提交申请→风控审核→财务打款”);
- 技术视图 :列出每个节点调用的API、超时时间、重试次数;
- 合规视图 :标注GDPR数据处理环节、审计日志开关状态。
业务方只需看业务视图确认逻辑,技术团队维护技术视图,法务审合规视图。三方无需再为“这个箭头什么意思”开会两小时。
3.4 MCP协议:让Agent之间说“普通话”,但得懂对方的“方言”
MCP的落地难点在于 协议与业务逻辑的耦合 。题81:“MCP Server接收到来自微信AI Agent的 execute_tool 请求,但目标Tool在SpringAI RAG模块中,如何避免MCP Server线程被RAG阻塞?”——这是典型的IO阻塞陷阱。我们的架构是:
- MCP Server作为纯消息路由器,只做协议解析、身份校验、消息转发;
- 所有耗时操作(RAG检索、Tool执行)交由独立Worker Pool处理;
- Worker通过Redis Stream监听任务,执行完将结果写入
mcp_result:{request_id}; - MCP Server轮询结果或通过WebSocket推送。
这样MCP Server的QPS能稳定在5000+,而Worker可根据负载弹性扩缩。
关于 MCP消息体的设计哲学 ,题94强调:绝不传输原始数据,只传 引用标识 。例如微信Agent发送的不是用户聊天记录全文,而是:
{
"mcp_version": "1.2",
"request_id": "req-20240317-abc",
"tool_name": "get_order_status",
"params_ref": "redis://orders:ORD-2024-001?ttl=300", // 5分钟有效期
"context_ref": "mysql://sessions:sess-xyz?fields=user_id,auth_token"
}
Worker拿到 params_ref 后,才去Redis取真实参数。好处是:
- 消息体小(<1KB),网络传输快;
- 参数可被多Worker复用,减少重复加载;
- 过期自动清理,无内存泄漏风险。
我们实测,相比传原始JSON,消息吞吐量提升3.7倍,GC压力下降82%。
4. 实操过程与核心环节实现:手把手复现生产级Agent链路
4.1 从零搭建微信AI Agent智能体:避开99%的坑
我们以“微信AI Agent查订单”为案例,完整走一遍生产级落地流程。注意:这不是Hello World,而是我们上线前压测通过的方案。
第一步:环境隔离与依赖锁定
微信生态要求严格,必须用Python 3.9(微信官方SDK最低要求),且不能装 uvloop (与微信证书验证冲突)。我们用 pip-tools 生成锁定文件:
# requirements.in
wechatpy==2.2.0
langchain-community==0.2.0
pymysql==1.1.0
redis==4.6.0
# 注意:不装openai,用微信自有API
pip-compile requirements.in 生成 requirements.txt ,确保所有环境依赖完全一致。
实操心得:微信SDK的
WeChatClient初始化必须传timeout=(3, 6),第一个数是连接超时,第二个是读超时。我们吃过亏——设成(5, 5),当微信服务器慢时,连接成功但读超时,导致Agent卡在初始化。
第二步:RAG知识库构建——分块策略决定成败
订单知识库不是扔PDF进去就行。我们按业务语义分三层分块:
- 粗粒度 :按文档类型(如《退货政策V3.2》为一个chunk,metadata=
doc_type: policy, version: 3.2); - 中粒度 :按条款(如“7天无理由退货”为一个chunk,metadata=
clause_id: return_7d, effective_date: 2024-01-01); - 细粒度 :按FAQ(如“退货后多久到账?”为一个chunk,metadata=
faq_id: return_refund_time, answer_source: customer_service_manual)。
向量库用Qdrant,配置hnsw索引,ef_construction=128(平衡建索引速度与查询精度)。
关键技巧: 为时间敏感条款加动态权重 。在embedding前,对effective_date做归一化处理:
# 归一化公式:weight = 1 + (today - effective_date).days / 365
# 今天2024-03-17,条款生效于2024-01-01 → weight = 1 + 76/365 ≈ 1.21
# embedding时乘以weight,让新条款在检索中更靠前
第三步:Workflow编排——用Elsa实现状态机
订单查询流程本质是状态机: idle → validating_user → fetching_order → formatting_response → done 。我们在Elsa中定义:
// C# Workflow定义(精简)
var builder = new WorkflowBuilder<OrderWorkflow>();
builder
.StartWith<ValidateUserActivity>() // 校验用户身份
.Output(step => step.UserValid, data => data.IsValid)
.OnError(WorkflowErrorHandling.Rethrow)
.If(data => data.IsValid)
.Do(then => then
.StartWith<FetchOrderActivity>() // 调用订单服务
.Input(step => step.OrderId, data => data.OrderId)
.Output(step => step.OrderData, data => data.Order)
.Then<FormatResponseActivity>() // 格式化为微信消息
);
第四步:MCP集成——让Agent可被调度
微信Agent作为MCP Client,需实现 execute_tool 方法:
async def execute_tool(self, tool_name: str, params: dict) -> dict:
# 将微信用户ID注入MCP上下文
mcp_context = {
"user_id": self.user_id,
"platform": "wechat",
"session_id": self.session_id
}
# 发送MCP请求
async with httpx.AsyncClient() as client:
resp = await client.post(
"http://mcp-server:8000/execute",
json={
"tool_name": tool_name,
"params": params,
"context": mcp_context,
"timeout": 8 # MCP层超时
}
)
return resp.json()
MCP Server接收到后,根据 tool_name 路由到对应Worker,Worker执行完返回结果。整个链路耗时控制在12s内,P99延迟9.8s。
4.2 生产级RAG实战:从向量库到Redis/MySQL的全链路
题44要求详解“RAG分块完以后操作向量数据库和Redis或者MySQL的流程”。我们以订单知识库为例,给出可直接部署的流程:
流程总览(6步闭环):
- 源数据抽取 :从MySQL订单表、客服知识库、产品文档库抽取原始数据;
- 语义分块 :按前述三层策略切分,生成chunk列表;
- 向量生成与入库 :调用Embedding API生成向量,写入Qdrant;
- 元数据持久化 :将chunk的
chunk_id、source_id、metadata写入MySQLrag_chunks表; - 缓存预热 :将高频chunk的
chunk_id → content写入Redis,TTL=1小时; - 一致性校验 :每小时跑一次Job,比对Qdrant chunk数 vs MySQL记录数,偏差>0.1%则告警。
关键代码片段(Python):
# 步骤3:向量入库(带重试)
from qdrant_client import QdrantClient
from tenacity import retry, stop_after_attempt, wait_exponential
@retry(stop=stop_after_attempt(3), wait=wait_exponential(multiplier=1, min=4, max=10))
def upsert_to_qdrant(client, chunks):
client.upsert(
collection_name="orders_knowledge",
points=[
models.PointStruct(
id=chunk["chunk_id"],
vector=chunk["embedding"],
payload={ # payload存业务元数据
"source_id": chunk["source_id"],
"doc_type": chunk["doc_type"],
"effective_date": chunk.get("effective_date", "")
}
) for chunk in chunks
]
)
# 步骤4:MySQL写入(事务安全)
def persist_to_mysql(chunks):
conn = pymysql.connect(**DB_CONFIG)
try:
with conn.cursor() as cursor:
sql = """
INSERT INTO rag_chunks (chunk_id, source_id, doc_type, effective_date, created_at)
VALUES (%s, %s, %s, %s, NOW())
"""
cursor.executemany(sql, [
(c["chunk_id"], c["source_id"], c["doc_type"], c.get("effective_date"))
for c in chunks
])
conn.commit()
except Exception as e:
conn.rollback()
raise e
finally:
conn.close()
# 步骤5:Redis缓存(防穿透)
def cache_chunks(chunks):
r = redis.Redis(**REDIS_CONFIG)
pipe = r.pipeline()
for chunk in chunks[:1000]: # 只缓存高频前1000
pipe.setex(
f"chunk:{chunk['chunk_id']}",
3600, # 1小时
json.dumps(chunk["content"])
)
pipe.execute()
监控看板必备指标:
| 指标名 | 计算方式 | 告警阈值 | 说明 |
|---|---|---|---|
rag_ingestion_success_rate |
成功入库chunk数 / 总chunk数 | <99.5% | 数据管道健康度 |
qdrant_recall_precision |
检索top_k中相关chunk占比 | <0.85 | 向量库质量 |
redis_chunk_hit_rate |
Redis缓存命中次数 / 总检索次数 | <0.7 | 缓存有效性 |
mysql_qdrant_consistency |
|Qdrant chunk数 - MySQL记录数| / Qdrant chunk数 | >0.001 | 数据一致性 |
我们用Grafana搭建看板,当 mysql_qdrant_consistency 突增,立即触发自动修复脚本:从MySQL查出差异chunk,重新生成向量并写入Qdrant。
4.3 Workflow工作流框架深度定制:Elsa与SpringAI的共生之道
题72:“DotNet Elsa Workflow如何与SpringAI RAG模块协同工作?”——这不是简单的API调用,而是跨语言、跨进程的协作。我们的架构图如下(文字描述):
[微信前端]
↓ HTTPS
[ASP.NET Core WebAPI] ←→ [Elsa Workflow Engine]
↓ (gRPC)
[SpringBoot RAG Service] ←→ [Qdrant + MySQL + Redis]
Elsa端关键定制:
- 创建
SpringAIRagActivity,继承Activity基类; - 重写
ExecuteAsync方法,通过gRPC调用SpringAI服务; - 实现
GetStatusAsync,轮询gRPC服务获取RAG执行状态(避免HTTP长轮询); - 添加
FallbackPolicy:当gRPC超时,自动降级为本地缓存查询。
SpringAI端关键改造:
- 暴露gRPC服务
RagService,方法Search(SearchRequest) returns SearchResponse; SearchRequest包含query、user_context(含user_id,session_id)、timeout_ms;SearchResponse包含results(召回列表)、debug_info(检索耗时、rerank分数);- 最重要 :在
SearchResponse中加入cache_key字段,Elsa可据此做二级缓存。
性能调优实录:
- 初始方案:Elsa HTTP调用SpringAI → 平均延迟210ms;
- 改为gRPC → 降至87ms(序列化开销小);
- 加gRPC流式响应(Streaming)→ 降至42ms(首字节更快);
- 最终方案:Elsa先查Redis缓存(key=
rag:{cache_key}),未命中再gRPC调用,P95延迟压到28ms。
4.4 MCP协议实战:从IDA MCP Server到生产环境的平滑落地
题97:“IDA MCP Server如何支撑日均500万次Agent调用?”——我们用Kubernetes集群部署,核心配置如下:
Server端(Go语言):
- 使用
gin框架,路由POST /execute; - 请求体解析后,立即写入Redis Stream
mcp_tasks; - 启动10个Worker协程,从Stream消费任务;
- Worker执行完,结果写入
mcp_results:{request_id},TTL=300秒; - Server轮询结果,超时则返回
{"status":"timeout"}。
Worker端(Python):
- 监听Redis Stream,消费
mcp_tasks; - 根据
tool_name路由到对应模块(如get_order_status→ 订单服务SDK); - 执行前检查
context.user_id权限; - 执行后生成
cache_key并写入Redis; - 全链路埋点:
mcp_worker_duration_ms,mcp_tool_error_rate。
压测数据(Locust脚本):
| 并发用户数 | TPS | P95延迟 | 错误率 |
|---|---|---|---|
| 1000 | 1250 | 182ms | 0.02% |
| 5000 | 5800 | 310ms | 0.15% |
| 10000 | 10200 | 490ms | 0.38% |
| 结论:10台4C8G Pod可稳撑5000 TPS,满足日均500万调用(峰值约2000 TPS)。 |
安全加固要点:
- 所有MCP请求必须带
X-MCP-Signature头,用HMAC-SHA256签名; - Server校验签名,过期请求(
timestamp超5分钟)直接拒绝; tool_name白名单校验,禁止执行os.system等危险工具;- 每个
user_id限流100次/分钟,超限返回429 Too Many Requests。
5. 常见问题与排查技巧实录:那些没人告诉你的“脏活累活”
5.1 Agent面试高频雷区:考官最想听的“踩坑故事”
题22:“请分享一个Agent项目中最难解决的Bug。”——这不是让你讲多牛,而是看你有没有工程直觉。我们整理了面试官最爱追问的5个Bug场景,附真实排查路径:
| Bug现象 | 表面原因 | 真实根因 | 排查路径 | 考官想听的点 |
|---|---|---|---|---|
| Agent回复“我正在思考...”后无响应 | LLM超时 | Redis连接池耗尽 :Worker共用一个Redis连接池,高并发下连接被占满,LLM结果无法写入缓存 | 1. redis-cli info clients 看 connected_clients ;2. kubectl top pods 看Worker内存;3. 发现Redis连接数达1024上限 |
是否关注中间件资源瓶颈?能否区分应用层与基础设施层问题? |
| RAG召回结果突然变差 | Embedding模型更新 | 时间窗口漂移 :新模型对“本月”等相对时间词理解变弱,而旧知识库未重分块 | 1. 抽样100个“本月”query,人工标相关性;2. 对比新旧模型召回top3;3. 发现新模型更倾向召回“年度总结”文档 | 是否建立量化评估机制?能否定位是数据、模型还是提示词问题? |
| Workflow节点随机跳过 | Elsa配置错误 | 并行分支未设Join节点 :两个Activity并行执行,但未配置WaitAll,导致后续节点在任一分支完成后即触发 | 1. 查Elsa日志 WorkflowInstance {id} completed ;2. 发现 completed_at 早于所有Activity结束时间;3. 检查流程图,缺Join节点 |
是否理解状态机本质?能否从日志反推执行路径? |
| MCP调用成功率骤降 | 网络抖动 | DNS缓存未刷新 :K8s Service IP变更,但Worker进程DNS缓存未更新,持续连旧IP | 1. kubectl get endpoints mcp-server 看Pod IP;2. nslookup mcp-server 看解析IP;3. 发现解析IP与Endpoint不一致 |
是否掌握网络基础?能否在分布式系统中定位跨层问题? |
| 微信Agent消息延迟高 | 微信服务器慢 | SSL握手耗时激增 :微信API升级TLS版本,旧SDK未适配,握手从50ms升至1200ms | 1. tcpdump 抓包分析SSL握手;2. openssl s_client -connect api.weixin.qq.com:443 测试;3. 发现Client Hello无TLSv1.3支持 |
是否具备底层调试能力?能否用工具链验证假设? |
实操心得:面试时讲Bug,一定要用STAR法则(Situation-Task-Action-Result),但重点在Action——你用了什么命令、看了什么日志、怎么验证猜想。考官不关心你多聪明,只关心你解决问题的方法论是否扎实。
5.2 RAG知识库运维:那些凌晨三点的救火时刻
题53:“RAG知识库更新后,线上效果反而下降,如何快速回滚?”——我们制定了一套“分钟级回滚SOP”:
Step 1:冻结流量(30秒)
- Kubernetes执行:
kubectl scale deploy rag-service --replicas=0; - 同时修改Ingress,将
/rag路径指向维护页; - 通知前端,所有RAG请求返回
503 Service Unavailable。
Step 2:定位问题版本(2分钟)
- 查Git历史:
git log --oneline -n 20 -- rag/knowledge/; - 找到最近一次
git push的commit hash; - 检查CI/CD流水线,确认该commit对应的Docker镜像tag。
Step 3:回滚数据(5分钟)
- Qdrant:
qdrant_client.delete_collection("orders_knowledge"); - 从备份S3桶下载上一版
orders_knowledge_v20240316.tar.gz; - 解压并调用
qdrant_client.create_collection()重建; - MySQL:
mysql -u root -p < backup_orders_knowledge_v20240316.sql。
Step 4:验证与放量(3分钟)
- 用Postman调用
/rag/test接口,输入固定query,比对返回结果与备份时的golden file; - 通过后,
kubectl scale deploy rag-service --replicas=5; - 用
kubectl set image切换回旧版镜像; - 观察监控,
rag_recall_precision回升至0.85+,放全量。
关键工具:
- 我们自研
rag-rollbackCLI工具,一行命令完成Step2-3:rag-rollback --collection orders_knowledge --version v20240316 --env prod - 备份策略:每日02:00全量备份,每小时增量备份,保留7天。
5.3 Workflow工作流故障:当图形界面救不了你
题77:“Elsa Workflow图形界面显示流程正常,但实际业务卡在某个节点,如何排查?”——图形界面只是糖衣,真相在日志和数据库。
必查三处:
- Elsa数据库表
WorkflowInstances:- 查
Status字段,Executing表示正在跑,Faulted表示出错; - 查`LastExecuted
- 查
更多推荐

所有评论(0)