Skip to content

面经精选 2026-10-12 ​

收录概览 ​

本期按 AI Agent、AI 应用后端、Golang 后端和服务端岗位筛选,排除明显前端、测试、产品及纯算法岗位。美团 AI 后端候选详情接口返回空正文,已跳过;以下收录 6 篇有效全文。

字节跳动|AI Agent 开发一面 ​

来源: https://www.nowcoder.com/discuss/933733520864706560 公司/岗位/轮次:字节跳动 / AI Agent 开发 / 一面 说明:原帖已给出较完整思路;保留其核心观点,工程展开部分标注「补充」。

Q1:如何介绍一个 AI 项目,才能证明自己真正做过? ​

简洁回答(30秒):按“业务目标—输入—决策—执行—验证—结果”讲完整链路,明确我负责的模块、关键取舍和失败复盘。不要只报 RAG、Agent、Function Calling 等名词,还要给出质量、延迟、成本或人工接管等可验证指标;没有真实线上数据就明确评测口径,不编造数字。

深度回答(面试深挖):先说业务痛点和成功标准,再画请求经过意图识别、检索、模型、工具、状态存储和验证器的路径。工具参数要经过 Schema 校验、权限检查、超时与重试;工具结果不能直接等价于业务成功,需要数据库状态、测试或规则验证。RAG 项目还应交代解析、切分、混合召回、Rerank、权限过滤、引用和上下文预算。方案取舍可以比较单次 LLM 调用、工作流和 Agent:简单、低风险任务优先确定性工作流,跨工具和动态步骤才引入 Agent。

面试官追问:

  • 如何证明指标不是模型自评?答:建立人工标注集/回放集,按任务成功率、引用准确率、工具调用正确率、P95、Token 成本和人工接管率评估,并做版本对照。
  • 团队成果如何区分个人贡献?答:明确负责模块、提交/设计边界、自己做的实验和未解决问题,不把集体指标归为个人。
  • 什么时候不该用 Agent?答:流程固定、规则明确或副作用高且无需动态规划时,用状态机/工作流更可控。

Q2:什么是 Agent Harness? ​

简洁回答(30秒):Harness 是包围模型的运行时控制层。模型负责提出判断或动作,Harness 负责上下文、工具、状态、权限、预算、循环控制、错误处理、验证和观测,把概率性输出约束进可恢复的工程流程。

深度回答(面试深挖):可拆成 Context 管理、Tool Runtime、Orchestrator、Memory/RAG、Verifier/Guardrail 和 Observability。Tool Runtime 提供版本化 Schema、鉴权、超时、幂等和副作用隔离;Orchestrator 限制步数、总 Deadline、并发和成本;Verifier 判断动作是否可执行、结果是否达标。与“Prompt 模板”相比,Harness 处理的是运行时状态和失败恢复;与纯工作流相比,它允许模型在受限节点做动态决策,但仍要保留确定性边界。

面试官追问:

  • 模型输出不合法怎么办?答:结构化解析失败则拒绝执行,有限次纠正;仍失败就降级或人工接管。
  • 高风险工具怎么做?答:预览—用户确认—提交,服务端重新鉴权并记录审计。
  • 如何观测?答:trace_id 串联模型、检索、工具和状态转移,记录版本、Token、延迟、错误与重试。

Q3:长程 Agent 从5分钟变成20分钟,怎么定位? ​

简洁回答(30秒):不能直接归因于模型变慢。用同一个 trace_id 将总耗时拆成排队、模型、工具 I/O、重试、锁/连接池和人工审批,对比正常样本的 P50/P95/P99、Token、调用次数、版本和依赖状态,再用固定输入回放定位变量。

深度回答(面试深挖):先确认影响范围,再分析关键路径。重点查模型首 Token/总耗时、上下文增长、工具超时与指数重试、循环/重复调用、RAG/数据库尾延迟、队列和连接池。解决时设置总 Deadline 和阶段预算;对错误分类,只有瞬时错误重试并加抖动;为副作用工具设置幂等键;检测无进展循环;无依赖子任务并行,结果分页/摘要化;对外部依赖采用熔断、舱壁和背压。修复后用故障注入、压力测试和小流量灰度验证 P95/P99、成功率、重复调用率和成本。

面试官追问:

  • 为什么不能只看平均值?答:长程任务的用户体验和资源占用由尾延迟决定,平均值会掩盖少数超时。
  • 超时是否一定重试?答:先判断请求是否已在下游生效;副作用操作必须幂等或查询状态后再决定。
  • 无限循环如何止损?答:最大步数、总预算、状态进展指纹和重复工具调用检测,触发后保存 checkpoint 并降级。

Q4:如何保障工具调用可靠性? ​

简洁回答(30秒):让模型只提出候选动作,运行时用 Schema、权限、前置状态和风险规则确定性校验;执行时控制超时、重试和幂等,结果再用数据库状态或规则验证。工具返回是数据,不应直接改变系统指令。

深度回答(面试深挖):参数层校验类型、枚举、范围和字段关系;服务端补充身份、租户、时间等模型不能决定的字段。将参数错误、权限错误、资源不存在、业务冲突和瞬时故障分类,避免对不可恢复错误重试。文件/代码/网络工具放在沙箱,限制域名、路径和资源。返回 tool_call_id、状态、错误码、版本、延迟和结果引用。补充:对高风险动作使用 dry-run 和人工审批,对工具契约做版本兼容和契约测试。

面试官追问:

  • 如何防 Prompt Injection?答:外部内容按不可信数据处理,系统指令与工具结果分层,工具执行前由运行时而非模型授权。
  • 如何评测?答:参数准确率、执行成功率、重复副作用率、恢复率、P95 和故障注入结果。
  • 工具太多怎么办?答:按意图分组和路由,缩短描述,减少语义重叠。

Q5:上下文越来越大,如何压缩且少丢信息? ​

简洁回答(30秒):保留近期原文、结构化任务状态、阶段摘要和可回读的外部记忆;工具结果做字段投影、分页和 Artifact 引用。目标不是最短摘要,而是保留未来决策需要的目标、约束、数字、权限、未完成事项和证据。

深度回答(面试深挖):先结构化抽取目标、事实、约束、状态、冲突、证据和待办,再生成分层摘要。关键事实关联原消息、工具调用或文档片段,冲突显式保留版本。对摘要做数字、日期、实体、否定和权限校验,按任务成功率、事实错误率、约束违反率、引用准确率、延迟和成本评估。不能按轮数机械删除,因为早期目标可能比闲聊更重要。

面试官追问:

  • 哪些信息不能丢?答:授权、硬约束、数字、否定、关键决策依据、工具回执和未完成状态。
  • 工具大结果怎么办?答:字段投影、分页、聚合、错误摘要,原文存 Artifact,模型只拿摘要和引用。
  • 摘要错了怎么办?答:保留来源指针,关键场景二次校验或人工抽样,必要时回读原文。

Golang 后端面经:Touka Games ​

来源: https://www.nowcoder.com/feed/main/detail/bbe696d1c12f488baedf3fbffeb8e36d 公司/岗位/轮次:Touka Games / Golang服务端实习生 / 一面技术面、二面业务面 说明:问题来自原帖;方案展开处标注「补充」。

Q1:高并发秒杀系统如何压测并解释 QPS? ​

简洁回答(30秒):先固定环境、数据、请求比例和成功口径,再用 Go 协程或专业压测工具逐步增加并发,观察吞吐、P95/P99、错误率和资源。并发 2000 不代表 QPS 必然 2000,QPS 受请求耗时、连接、CPU、锁、数据库和下游限流共同约束。 深度回答(面试深挖):区分并发数与吞吐:近似关系是并发数≈吞吐×平均响应时间。压测应预热、阶梯加压、独立压测机,记录服务端与 Redis/MySQL 指标;避免压测机本身成为瓶颈。秒杀常用库存预扣/原子扣减、限流、排队、幂等和异步落库,不能只靠加锁。补充:必须说明测试环境与线上容量不能直接等价。 追问及答案:压测失败如何定位?答:先看客户端、网关、应用、缓存、数据库分层指标;如何防超卖?答:Redis 原子脚本/版本条件更新加最终一致校验;重复下单怎么办?答:业务幂等键加唯一约束。

Q2:Redis 缓存 miss 时,100 个请求是否查 MySQL 100 次? ​

简洁回答(30秒):不应让 100 个请求同时回源。可用 singleflight/分布式互斥锁让一个请求加载,其余等待或短暂失败;加载后回填 Redis,并配合 TTL、随机过期和空值缓存防击穿与穿透。 深度回答(面试深挖):先判断是普通 miss、热点 key 击穿、恶意穿透还是大面积雪崩。单机可用 singleflight,分布式场景用带过期的锁或 Redis Lua;锁持有者查询数据库、校验版本、回填缓存并释放锁,等待者再次读取。缓存回填必须设置 TTL,空结果也可短 TTL 缓存;批量预热和限流用于热点。不要把“查数据”误写成 MQ 插入:MQ 更适合削峰后的异步写入/刷新,读路径要定义超时和降级。 追问及答案:锁失效怎么办?答:锁有租约、持有者校验 token,必要时续租;数据库挂了怎么办?答:熔断、旧值/默认值降级并告警;缓存和数据库不一致怎么办?答:明确最终一致策略,写后删缓存并延迟双删或订阅变更。

Q3:空 interface 与空 struct 有什么用? ​

简洁回答(30秒):interface{}/any 表示可承载任意类型,但取值时要做类型断言,适合兼容多类型边界,不应滥用。struct{} 是零大小类型,常用于无数据信号,如 chan struct{}、集合型 map 的 value。 深度回答(面试深挖):空接口内部仍保存动态类型和值,断言失败可能 panic,应使用 v, ok := x.(T) 或类型 switch。struct{} 不占有效字段空间,map[T]struct{} 表示集合,关闭 channel 或发送空值只表达事件。补充:泛型可以在编译期保留类型安全,优先于业务层大量使用 any。 追问及答案:interface 比较会 panic 吗?答:动态值不可比较时比较 interface 会 panic;如何避免?答:类型约束、反射或显式比较策略。

Q4:Go 如何包装和判断错误? ​

简洁回答(30秒):用 fmt.Errorf("...: %w", err) 保留错误链,调用方用 errors.Is 判断哨兵错误,用 errors.As 提取自定义错误类型,而不是比较错误字符串。 深度回答(面试深挖):底层错误表达原因,上层增加业务上下文;跨边界时映射为稳定错误码和日志字段。Is 判断语义等价,As 做类型提取;对可重试、客户端错误、权限错误和内部故障分别处理。不要把数据库错误原文直接返回用户,也不要丢失 %w 链。 追问及答案:什么时候重试?答:仅瞬时网络/限流等可恢复错误,并有退避和上限;如何记录?答:错误链+trace_id+业务键,避免重复堆栈和敏感信息。

Q5:Go 服务如何构建并部署到 Linux? ​

简洁回答(30秒):按目标平台交叉编译可执行文件,配置通过环境变量/文件注入,上传或制作镜像,设置健康检查、日志、信号处理和回滚。Docker 不是唯一方式,关键是可重复构建和可观测运行。 深度回答(面试深挖):例如 CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -trimpath -ldflags=-s -o app ./cmd/server,使用多阶段 Docker 构建最小运行镜像;服务捕获 SIGTERM,停止接收新请求并优雅退出。配合 systemd/Kubernetes、探针、资源限制和版本标签。补充:依赖锁定、SBOM/漏洞扫描和非 root 运行是生产要求。 追问及答案:IP 访问是否足够?答:开发可用,生产通常经网关/服务发现并配置 TLS;如何回滚?答:保留不可变版本和数据库兼容迁移,按健康指标自动或人工回退。

Golang 后端面经:上海贝塔猫 ​

来源: https://www.nowcoder.com/discuss/926505713172516864 公司/岗位/轮次:上海贝塔猫 / Golang后端开发 / 一面

Q6:slice 是否并发安全?赋值和 append 会怎样? ​

简洁回答(30秒):slice 本身不是并发安全的。复制 slice 只复制指针、长度和容量,若容量足够,两个 slice 可能共享底层数组;append 可能原地写入,也可能扩容换新数组,所以并发读写要加锁或通过 channel 传递。 深度回答(面试深挖):s2:=s1 后共享数组,修改共同范围会互相可见;当 s1 容量足够时 append 的新元素写入原数组,若扩容则 s1 指向新数组,s2 仍指向旧数组。工程上不要依赖扩容细节;用 mutex、复制快照或单写多读设计。补充:竞态检测用 go test -race。 追问及答案:如何安全发布只读 slice?答:构建完成后不可变,或复制后原子替换;append 并发安全吗?答:不安全,哪怕不同索引也可能涉及共享头或底层数组。

Q7:map、channel 是否并发安全?make 与 new 有何区别? ​

简洁回答(30秒):普通 map 并发读写不安全,需要锁或 sync.Map;channel 的发送、接收和关闭由运行时同步,但关闭后再发送会 panic。make 初始化 slice/map/channel 并返回可用值,new 分配零值并返回指针,new(map) 得到指向 nil map 的指针,不能直接写入。 深度回答(面试深挖):map 适合明确类型和受控锁,sync.Map 适合特定读多写少/键生命周期场景,不是默认替代。无缓冲 channel 发送与接收同步,有缓冲 channel 允许容量内暂存但满/空时阻塞。关闭由发送方负责,接收方用 v, ok 判断结束。 追问及答案:channel 底层是什么?答:运行时的 hchan,包含环形缓冲、发送/接收等待队列和锁等;何时用 WaitGroup?答:等待一组 goroutine 完成,不传递业务数据,Add 应在启动前正确计数。

Q8:生产者生产1-100,消费者完成后退出,怎么写? ​

简洁回答(30秒):生产者写入 channel 后关闭它,消费者 range 读取直到关闭;主 goroutine 用 WaitGroup 等消费者结束。无缓冲和有缓冲的核心代码相同,区别只是发送是否需要同步接收。 深度回答(面试深挖):生产者拥有 channel 生命周期,避免消费者关闭导致发送 panic。生产失败时可配合 context.Context 取消;多个生产者要由额外 goroutine 在 WaitGroup 等待后统一 close。补充完整 Go 示例:

go
package main
import ("fmt"; "sync")
func main() {
    ch := make(chan int) // 改成 make(chan int, 16) 即为有缓冲
    var wg sync.WaitGroup
    wg.Add(1)
    go func() { defer wg.Done(); defer close(ch); for i := 1; i <= 100; i++ { ch <- i } }()
    for v := range ch { fmt.Println(v) }
    wg.Wait()
}

追问及答案:为什么 close 后还能读?答:缓冲区读完后返回零值和 false;如何取消?答:select 同时监听 ctx.Done();消费者异常怎么办?答:记录错误并取消上下文,不能静默阻塞生产者。

Q9:MySQL 四种隔离级别与幻读是什么? ​

简洁回答(30秒):隔离级别从低到高是读未提交、读已提交、可重复读、串行化。幻读是同一事务按范围查询时,前后出现了新增/消失的符合条件的行;InnoDB 的快照读主要依赖 MVCC,当前读会加锁,不能简单说可重复读解决所有幻读。 深度回答(面试深挖):快照读读 Read View,当前读如 for update 读取最新并加锁;在 RR 下普通快照读通常保持一致视图,但当前读若无合适索引/间隙锁,范围内并发插入可能造成幻读风险。InnoDB 用 next-key lock(记录锁+间隙锁)约束范围,实际效果取决于语句、索引和执行计划。选择隔离级别要权衡并发、锁等待和一致性。 追问及答案:脏读是什么?答:读到未提交数据;如何减少锁范围?答:正确索引、短事务和合适条件;为什么要看执行计划?答:锁定范围和是否走索引直接影响并发。

Q10:JWT 是无状态的,如何踢掉已签发用户? ​

简洁回答(30秒):JWT 本身可离线验证,通常无服务端会话状态;要主动失效,就引入状态,例如 token_version、黑名单或短 access token+可撤销 refresh token。请求校验签名、过期时间、用户版本和权限。 深度回答(面试深挖):用户表维护 token_version,签发 token 时带版本,踢人时递增版本;每次请求查缓存/数据库版本即可使旧 token 失效。黑名单按 jti 和过期时间存储,适合少量撤销但有存储成本。高安全操作可缩短 access TTL、轮换 refresh token、检测重放并审计。补充:JWT 载荷不应放敏感信息,密钥轮换需支持 key id。 追问及答案:软删除 GORM 如何查回?答:使用 Unscoped();软删除不是物理删除,唯一约束和恢复策略仍需设计;登出是否必须黑名单?答:取决于风险和 TTL,不能一概而论。

OPPO 小布助手|AI Agent 一面 ​

来源: https://www.nowcoder.com/discuss/938479977081602048 公司/岗位/轮次:OPPO / 小布助手 AI Agent / 一面 说明:原帖是候选人复盘与场景还原;系统设计答案为「补充」,不将复盘中的外链和候选人身份信息作为事实扩展。

Q1:天气查询需要多个数据源,如何设计调用顺序和兜底? ​

简洁回答(30秒):先把“明天适合跑步”拆成天气、空气质量、降雨概率和用户偏好等数据需求,再按时效性和可靠性调用。可并行获取独立数据,设置超时、来源优先级和缺失字段兜底;最终由规则或验证器判断是否具备回答条件。

深度回答(面试深挖):意图解析只产生候选字段,服务端根据用户位置、时间和权限补齐上下文。天气和空气质量可并行,若降雨数据缺失,不应编造,可返回“无法判断降雨”的降级答案。对外部 API 做超时、重试、熔断和缓存,区分空值、过期值和服务错误;结果记录来源和时间戳。相比完全交给 Agent 动态选择,固定高频数据链路更稳定,Agent 只在确有多步决策时参与。

面试官追问:

  • 过期缓存能不能用?答:低风险咨询可以标注更新时间后使用;高风险场景必须拒答或实时取数。
  • 多源冲突怎么办?答:定义来源优先级和时间窗口,保留冲突信息,不能静默平均。
  • 如何评估?答:字段抽取准确率、工具选择准确率、数据新鲜度、降级率和端到端成功率。

Q2:Agent 规划出错,靠结果反馈还是规则发现? ​

简洁回答(30秒):两者都需要。规划器提出步骤,规则检查参数、权限、前置条件和风险,执行后用工具结果、状态变化和业务验证器判断是否成功;反馈延迟时用状态机、Deadline 和 checkpoint 防止盲目继续。

深度回答(面试深挖):将任务建模为有限状态图,每一步有输入 Schema、完成条件和失败转移。模型可以重规划,但限制最大次数和预算;规则适合确定性约束,结果反馈适合业务状态,二者结合比让模型自评可靠。工具超时时不能立即判定失败,因为请求可能已生效,应先查询幂等状态。复杂任务保留可恢复 checkpoint,避免全量重跑。

面试官追问:

  • 什么时候允许重规划?答:前置条件变化、工具返回可恢复错误或验证器明确指出路径不可行时;参数错误不应无限重规划。
  • 结果延迟怎么办?答:异步任务状态、轮询/回调、超时后进入待确认状态。
  • 如何防死循环?答:步数/时间预算、状态进展指纹和重复动作检测。

Q3:机票预订并同步日历,如何拆 Agent 系统? ​

简洁回答(30秒):先抽取出发地、目的地、时间、过滤条件和日历账户;规划器拆成查询航班、筛选、用户确认、下单、同步日历,并由执行器按依赖调用工具。下单和写日历都是副作用,必须确认、幂等和可补偿,不能由模型直接自由执行。

深度回答(面试深挖):先用结构化 Schema 收集缺失槽位,查询可并行多家航司;筛选规则由服务端保证“避开红眼”,模型只解释结果。用户确认后创建订单,返回订单状态和幂等键;支付/出票失败时不执行日历写入。出票成功后同步日历,若日历失败,保留待补偿任务并明确告知用户。与单次模型调用相比,Agent/工作流的价值是跨工具状态管理和失败恢复;流程固定时仍优先状态机。

面试官追问:

  • 三步还是一步算复杂?答:不按步数硬编码,以是否跨系统、有副作用、需用户确认、存在分支和异步等待作为标准。
  • 如何防重复订票?答:业务幂等键、订单状态查询和服务端去重。
  • 日历同步失败怎么办?答:可靠消息/补偿任务,提供重试和人工恢复入口。

Q4:端侧 Agent 的延迟、内存和量化怎么考虑? ​

简洁回答(30秒):端侧优先控制模型大小、上下文长度和首 Token 延迟;通过量化、裁剪、KV Cache、流式输出和端云协同降低成本。敏感数据尽量端侧处理,复杂规划或大模型推理再路由云端,并设置网络失败降级。

深度回答(面试深挖):按任务拆分端侧意图识别、唤醒、轻量工具路由和云端复杂生成;量化需在质量、内存和速度间实测,不凭理论判断。上下文做结构化压缩,工具结果不全量回传;端侧缓存模型和热路径结果。指标包括首 Token、端到端 P95、内存峰值、功耗、离线成功率、隐私事件和任务成功率。补充:端云协议要有版本、超时和取消,不能让弱网请求无限挂起。

面试官追问:

  • 量化会损失什么?答:可能损失复杂推理和长尾意图质量,需用代表性集做回归。
  • 云端不可用怎么办?答:本地有限能力、明确拒答或延迟处理,不能伪造结果。
  • 如何选路由?答:按任务风险、上下文长度、隐私、设备能力和实时性策略化决策。

Q5:如何用指标和 badcase 复盘 Agent? ​

简洁回答(30秒):不要只说“效果提升”。建立任务成功率、意图/参数准确率、工具调用成功率、引用或结果正确率、P95 延迟、成本、超时率和人工接管率;按失败类型归因,形成数据集、修复、回放和灰度闭环。

深度回答(面试深挖):先定义成功标准和标注规范,再按规划错误、工具参数错误、数据源空值、权限拒绝、超时、幻觉和用户取消分类。每个 badcase 保留脱敏输入、版本、轨迹、工具返回和最终状态,定位是模型、Prompt、工具契约还是编排逻辑。修复前做离线回放,修复后做回归、压力和小流量灰度;同时监测质量与成本/延迟,防止只优化单指标。

面试官追问:

  • 没有线上数据怎么办?答:用人工标注集、仿真工具和固定回放,明确其与线上分布的差异。
  • 模型自评可靠吗?答:只能作为辅助,关键指标需要人工或确定性验证。
  • 如何保护隐私?答:脱敏、最小化采集、访问控制、保留期限和审计,日志不记录完整敏感内容。

海底捞|AI 工程师实习生一面 ​

来源: https://www.nowcoder.com/feed/main/detail/17ac832a4f644705a52b007f351bd485 公司/岗位/轮次:海底捞 / AI 工程师实习生 / 一面 说明:原帖为公开问题清单;回答为脱敏后的通用技术整理,不伪装亲历。

Q1:LLM-as-a-Judge 也会出错,如何评判和改进? ​

简洁回答(30秒):LLM Judge 只能作为评测链路的一环,先定义评分标准、正反例和权重,再与人工标注、规则校验和任务结果交叉验证。对高风险结论保留人工复核,不把模型自评当作事实。

深度回答(面试深挖):固定 rubric、参考答案和证据要求,做盲评、双模型交叉评审及人工抽样,统计与人工的一致性、偏差和置信区间。按任务类型切分 badcase,区分事实错误、格式错误、偏好差异和评审偏差;对位置偏差、长度偏差和自偏好做随机化或多评审。评测集、Judge prompt、模型版本和阈值都要版本化,修复后回放并灰度。

追问及答案:为什么不能只看平均分?答:平均分会掩盖高风险类别和长尾失败,应看分桶指标、严重错误率和人工一致性。Agent 怎么评估?答:任务成功率、工具选择/参数正确率、轨迹效率、延迟、成本、越权与人工接管率共同判断。

Q2:DPO 和 GRPO 有什么区别? ​

简洁回答(30秒):DPO 用偏好数据直接优化策略,通常不需要在线采样和显式奖励模型;GRPO 属于基于群组相对奖励的策略优化,通过同一问题的多条采样估计相对优势,适合有可验证奖励的推理任务,但训练和采样成本更高。

易踩坑/追问:不要把二者都简单说成“有监督微调”。继续追问时要说明偏好数据质量、奖励函数、KL 约束、采样稳定性和评测集污染;算法选择取决于是否有可靠偏好或可验证奖励,而不是只看名词热度。

恒生电子|AI 应用开发一面 ​

来源: https://www.nowcoder.com/feed/main/detail/f674f0f958c644629f024f95c7c104b6 公司/岗位/轮次:恒生电子 / AI 应用开发 / 一面 说明:原帖问题保留公开技术范围;工程化回答为补充。

Q1:为什么 Agent 框架不能直接拿来开发? ​

简洁回答(30秒):框架提供编排、工具和记忆等基础能力,但不能替代业务边界、权限、数据契约和验证。选型要看可控性、扩展性、调试观测、社区成熟度和团队能力;生产系统通常需要在框架外补齐鉴权、超时、幂等、审计和回滚。

深度回答(面试深挖):先把需求拆成确定性工作流与动态决策点,验证框架是否支持状态持久化、checkpoint、流式输出、工具 schema、重试和人工介入。对框架做最小 PoC 与固定回放,比较任务成功率、工具调用正确率、P95、Token 成本和故障恢复,而不是只看 Demo。锁定版本并封装适配层,避免业务代码深度耦合内部 API。

Q2:Redis 持久化有哪些方式?AOF 什么情况下丢数据? ​

简洁回答(30秒):RDB 是定时快照,恢复快但可能丢最后一次快照后的数据;AOF 记录写命令,数据更完整但文件和重写成本更高。AOF 的同步策略决定丢失窗口,everysec 通常可能丢约一秒,进程或机器异常、操作系统缓存未落盘时仍可能丢数据。

易踩坑/追问:不要把 AOF 说成绝对不丢。还要考虑主从复制、故障切换、磁盘空间、重写期间资源竞争和恢复时间;高可靠业务需明确 RPO/RTO,必要时使用数据库或消息系统作为最终事实源。

本期高频考点总结 ​

  • Agent 工程化:Harness、规划/执行/验证、工具 Schema、权限、幂等、超时、重试、状态机和可观测性。
  • AI 应用后端:RAG 解析与混合召回、引用、上下文预算、端云协同、badcase 评测和成本/延迟权衡。
  • Golang:slice/map/channel 并发安全、底层共享、WaitGroup、错误链、构建部署和生产者消费者。
  • 服务端基础:缓存击穿与并发回源、MySQL MVCC/隔离级别/幻读、JWT 撤销和服务可靠性。

复习建议 ​

  1. Golang 后端:手写一个带 context 取消、幂等、超时和限流的缓存回源服务,并用 go test -race 检查并发问题。
  2. AI 应用后端:准备一个真实项目的输入—规划—执行—反馈—评估链路,能说清工具失败、权限、上下文压缩和指标口径。
  3. 系统设计:对跨系统副作用先讲确认、状态查询、幂等键和补偿,不要默认“超时就重试”。
  4. 面试表达:优先讲背景和个人边界,再讲核心原理、方案对比、工程取舍和失败复盘;没有真实指标时明确评测方案,不编造数字。