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 为什么强调“扩写”而非“扩充”?——每个答案都是可复用的决策脚手架

所谓“扩写”,是指每个问题的答案都包含四个不可删减的模块:

  1. 现场还原 :用时间、角色、错误日志还原真实场景(如“2024年3月17日14:22,微信AI Agent收到用户消息‘帮我查昨天18:00后的快递’,返回‘未找到订单’”);
  2. 根因深挖 :拒绝表面归因,直指技术债(如“根本原因:RAG分块时未按时间维度切分,导致‘昨天18:00后’这类时间范围查询无法命中”);
  3. 方案推演 :展示3种备选方案及量化对比(如方案A:改分块策略→需停服2小时;方案B:加时间过滤器→增加15ms延迟;方案C:预生成时间索引→内存增30%);
  4. 验证闭环 :明确验收标准与监控指标(如“上线后观察 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”的软关联,而是采用 双写事务 。当订单创建时,业务服务执行:

  1. MySQL写入订单主表;
  2. 同一事务内,向量库写入分块向量(含 order_id 作为metadata);
  3. 若向量库写入失败,整个事务回滚。
    为防向量库单点故障,我们加了补偿队列: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步闭环):

  1. 源数据抽取 :从MySQL订单表、客服知识库、产品文档库抽取原始数据;
  2. 语义分块 :按前述三层策略切分,生成chunk列表;
  3. 向量生成与入库 :调用Embedding API生成向量,写入Qdrant;
  4. 元数据持久化 :将chunk的 chunk_id source_id metadata 写入MySQL rag_chunks 表;
  5. 缓存预热 :将高频chunk的 chunk_id → content 写入Redis,TTL=1小时;
  6. 一致性校验 :每小时跑一次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-rollback CLI工具,一行命令完成Step2-3:
    rag-rollback --collection orders_knowledge --version v20240316 --env prod
    
  • 备份策略:每日02:00全量备份,每小时增量备份,保留7天。

5.3 Workflow工作流故障:当图形界面救不了你

题77:“Elsa Workflow图形界面显示流程正常,但实际业务卡在某个节点,如何排查?”——图形界面只是糖衣,真相在日志和数据库。

必查三处:

  1. Elsa数据库表 WorkflowInstances
    • Status 字段, Executing 表示正在跑, Faulted 表示出错;
    • 查`LastExecuted

更多推荐