淘天 Agent 开发二面:30 多道场景题与系统设计追问
- 轮次
- 二面
- 时间
- 2026-10
- 来源
- 牛客网
《面试题目》
- 淘宝要做个智能客服 Agent,你觉得难点在哪?
- 如何拆分售前咨询、售后投诉、订单查询 Agent 的职责?
- 你的 Agent 系统中「短期记忆」和「长期记忆」怎么设计?
- 如果量大了怎么办?
- 如果挂了怎么办?
- 高并发下怎么做容灾和降级?
- 淘宝搜索「夏天穿什么」,大模型怎么结合天气、地域、画像做个性化推荐?
- 大模型在 Query 理解、商品召回、排序、推荐理由生成各能做什么?
- 双塔召回和生成式召回各有什么优劣?
- 用户行为序列怎么高效输入大模型?
- 怎么解决大模型推荐中的「信息茧房」?
- 推荐文案的点击率、转化率怎么评估?AB 实验怎么设计?
- Agent 整体架构怎么设计?
- 为什么用 Agent 而不是直接做平台或 API?
- 你现在做的 Agent 效果如何?
- Skill 泛滥问题遇到过吗?怎么解决?
- 上下文窗口限制对 Skill 管理有什么影响?
- 怎么沉淀部门级记忆或知识库?
- 怎么解决「经验随人走」?
- 云端 Agent 平台怎么推进?老旧服务怎么接入?
- 动态 workflow 怎么实现?
- 大模型写代码第一次不对,流程断不断?失败怎么回退?
- 大模型幻觉怎么解?说执行了其实没执行怎么办?
- 知识层怎么约束?RAG 怎么强制事实锚定?
- 为什么配多 Agent 而不是全 CLI 或脚本?
- 多 Agent 之间交互逻辑怎么实现?
- 模型调用 RPC 耗时长怎么办?同步与异步链路怎么设计?
- 异步用什么框架?
- 几千个业务能统一 Agent 流程吗?怎么合并?
- 项目大重构的思路是什么?正交与冗余怎么处理?
手撕
- 如何用 PyTorch 实现双塔召回模型的前向传播?
项目追问
- 深挖 CR Agent 项目:这个 Agent 是怎么设计的?团队里还有哪些 Agent?
- 从 2022 年到现在,整个 Agent 与大模型的技术演进是怎样的?你参与过哪些框架设计?
《参考解析》
智能客服 Agent 的难点与职责拆分
难点可以归成四类:边界(用户什么都问,超出商品与订单范围的问题要能识别并礼貌兜住)、状态(售后是长流程、跨多轮甚至跨天,必须有可恢复的会话状态与工单关联)、数据权限(订单、退款、地址属于敏感数据,工具调用前要校验身份与归属,不能让模型凭对话自述就查别人的单)、确定性要求(答复口径、赔付规则、时效承诺不能由模型自由发挥)。
职责拆分按「业务域 + 状态机」切更稳:售前咨询偏检索与推荐(知识库问答、商品对比、优惠解释,可容忍一定灵活性);订单查询偏工具调用(订单状态、物流、发票,答案唯一、要精确、要带数据来源);售后投诉偏流程与升级(先判定诉求类型与责任归属,能自助处理的走规则与工具,触碰到赔付、责任争议、情绪激烈时转人工,并带上已收集的信息)。三个 Agent 之间不要互相调用成环,而是由一个入口做意图路由、共享同一份会话与用户上下文,各自只负责自己那段流程。
记忆设计:短期与长期
短期记忆是当前会话的上下文窗口:最近若干轮原文 + 会话摘要 + 结构化的槽位状态(订单号、诉求类型、已尝试的方案),窗口快满时把最早的几轮压缩成摘要,硬信息(金额、单号、承诺时效)单独留结构化字段,不能只留流水账。长期记忆是跨会话的用户与业务事实:用户偏好、历史诉求、处理结论,写进外部存储按需检索,而不是每轮全量塞进 prompt。工程上要配上写入过滤(低信息量、重复内容不入库)、冲突覆盖(口径变了旧记忆失效)、召回限额与时效标注(告诉模型这条记忆是什么时候的),以及敏感信息的脱敏与保留期限。
量大了怎么扛,挂了怎么兜
量大的解法是「分流 + 缓存 + 异步」三件事:入口先做意图识别,能用规则、FAQ 检索、小模型解决的不进大模型;高频问题的答案与工具结果做缓存(相同订单号短时间内的查询没必要重复打后端);长流程拆成异步任务,用户侧给进度反馈而不是干等;模型侧做请求排队与配额、批处理与流式输出降低单请求成本。架构上没有状态才能水平扩容,会话状态放 Redis、任务状态放队列。
挂了要分「模型挂」和「工具挂」两层兜:模型不可用时降级到检索式 FAQ 加规则引擎,再不行直接转人工并把上下文带过去;工具接口失败要有超时、有限重试、熔断和幂等键,写操作必须有回执校验,不能重试出两笔退款。高并发下的容灾标准答案是分层隔离(不同业务线独立资源池)、限流与排队保护下游、降级开关(按业务分级,先牺牲非核心推荐理由这类能力)、以及全链路可观测——每个请求要能查到走了哪个模型、哪次工具调用、在哪一步失败,否则出故障只能靠猜。
推荐链路:大模型能做什么
Query 理解层做意图与属性抽取、口语化改写、时效与场景补全;召回层做语义向量召回、生成式召回、以及多路召回的融合;排序层大模型更多是给精排做特征、做多样性与业务规则重排,或者对小候选集做 listwise 重排;推荐理由生成是最适合大模型的环节,把结构化事实翻译成自然语言,但必须锚定在真实属性上,不能编造卖点。
「夏天穿什么」这种 query 的个性化要拼接上下文:query 语义 + 地域与实时天气 + 用户画像与历史行为 + 库存与时效,天气这类动态信号通常做成特征或在检索前做一次查询改写(比如把「夏天」细化成具体品类与材质),而不是让模型凭空推理。用户行为序列要进大模型,主流做法是先用行为建模(序列模型或兴趣向量)压成定长的兴趣表示,或者把最近若干条行为转成语义描述(商品标题、类目、动作、时间),两者结合:既保留 ID 侧的协同信号,又让模型能读懂。
双塔召回与生成式召回
双塔是双路编码:用户侧塔编码画像与行为,商品侧塔编码标题、类目、属性,两侧各自出向量做内积或余弦,商品向量可以离线预计算建索引(Faiss、HNSW 之类),在线只算用户塔,延迟低、可扩展到亿级商品,代价是两塔不能交叉、表达能力受限,只能靠特征工程补。生成式召回(TIGER 一类语义 ID 方案)把商品离散成语义 ID,用序列生成的方式直接产出候选,好处是能引入上下文与序列建模、天然做多路融合,问题是需要额外训练、可能生成无效 ID、线上要做合法性校验且推理成本高。工程上的常见结论是双塔打底做大规模召回,生成式或大模型 re-rank 叠在上面做提效,而不是彼此替代。
信息茧房与 AB 实验
茧房的本质是反馈闭环里只放大已证明的兴趣,解法是显式引入探索:ε-greedy 或 Thompson Sampling 做探索利用平衡、在排序目标里加入多样性与新颖度约束、做兴趣衰减让老偏好自动退场、控制相似商品在列表里的重复度。评估上要同时看短期指标(点击、转化)和长期指标(次日/七日留存、复访类目数、退货率),只看点击会把茧房越养越深。
AB 实验的基本功是:先定唯一的核心指标和护栏指标(延迟、成本、退款率),按用户或设备维度做随机分流保证同组体验一致,算清最小样本量与实验周期(至少覆盖一个完整行为周期),避免用一天的数据下结论,注意多重比较与网络效应(推荐场景下同群用户会互相影响),最后看细分维度是否出现「总体涨、某类人群跌」。文案类优化的指标通常是 CTR、CVR、以及下拉/停留这类过程指标。
Agent 架构与 Skill 治理
整体架构讲清分层就够:入口与路由层(鉴权、意图识别、分流)、编排层(规划、步骤状态机、失败重试、人工节点)、能力层(工具与 Skill,统一用 schema 描述)、记忆与知识层(会话状态、长期记忆、检索)、模型层(按任务选模型与推理档位)、可观测与评测层(轨迹落盘、成本与延迟、回归评测集)。
Skill 泛滥与上下文窗口是同一枚硬币:知识不该常驻在系统提示里。做法是分层 + 按需加载——系统提示只放技能索引(名字 + 一句话描述 + 触发条件),模型先决定要不要用,再把对应文档读进上下文;技能之间做去重与合并,粒度按「一个可完成的任务」而不是「一段知识」切;版本化、定期用真实任务回归淘汰没被调用过的技能。确实需要长流程时把它做成工具或工作流,而不是靠一堆提示词拼出来。
为什么要用 Agent、而不用平台或 API
平台/API 解决的是「调用模型」,Agent 解决的是「完成一件需要多步、需要判断、需要接触真实系统的事」:它能把不确定的自然语言输入收敛成确定的多步执行,能在中间步骤失败时换路,能把自己的过程记录下来给人审计。回答时最好绑定一个真实收益:以前要人工点五步的操作,现在一句话走完,且每一步都有回执——而不是说「Agent 更先进」。
「你现在做的 Agent 效果如何」这类题要给可核对的指标:任务完成率、人工接管率、平均步数与 token 成本、端到端延迟、线上 badcase 的典型模式,并且说清评测集怎么建的。答不出数字,前面的架构讲得再好也会被认为没上线。
经验随人走与部门知识沉淀
「经验随人走」的解法是把人脑子里的隐性知识变成可执行资产,分三层:知识(业务规则、SOP、口径,写成结构化文档并挂到检索里)、工具(把重复操作封装成有 schema 的工具,谁都能调)、评测(把历史 badcase 与验收标准固化成回归集,换模型、改流程先跑一遍)。沉淀机制上要有人负责(owner + 评审)、有更新触发(线上问题必回写)、有消费入口(新人在 Agent 里直接问得到),否则文档写完就烂在库里。
幻觉、假执行与事实锚定
模型说「已执行」但实际没执行,根因是把模型的自然语言当成事实来源。正确做法是状态只由程序的回执决定:工具调用返回什么、数据库里写了什么,才是执行结果;模型只能转述结构化回执,不许自述。工程上加三道闸——工具调用要有明确返回码与幂等键;关键动作落库并回读校验;对外承诺(已退款、已改地址)必须由回执驱动。
幻觉的抑制则是概率问题,做法是收窄自由度加验证:能自动补全的参数不要问模型、不允许输出未在检索证据中出现的事实、回答里带上引用来源并做引用校验(引用的片段真存在且支持该结论)、对高确定性场景(订单、金额、时效)直接走模板而不是生成。RAG 强制事实锚定就是这几条的组合:先检索再答、证据不足时明确说「查不到」、生成后做一次事后校验,把无依据的断言拦下来。
多 Agent 与交互实现
用多 Agent 而不是全 CLI/脚本,理由是并行、隔离与可治理:不同 Agent 有各自的工具权限与上下文,可以并行跑互不干扰,失败范围可控,出了事能单独限流或替换;脚本适合确定性、步骤固定的任务,一旦需要判断和异常处理就会迅速长成一堆 if-else。代价是通信成本与协调复杂度,所以能用工作流表达的就别上多 Agent。
交互实现上有几种典型形态:编排者-执行者(主 Agent 规划、子 Agent 执行并回结构化结果)、流水线(前一个的输出是后一个的输入)、黑板/共享状态(多个 Agent 读写同一份上下文,需要加锁或版本号)。落地要点是统一的消息与结果协议(谁调的、参数、结果、耗时、失败原因)、共享状态放在外部存储而不是塞回 prompt、给每个 Agent 明确的能力清单与终止条件、避免互相触发成环。
模型调用链路的性能与异步
模型 RPC 慢是常态(几秒到几十秒),同步链路会同时占住连接、线程和用户耐心。设计上分三类:能流式的走流式,让用户先看到第一个字;能并行的并行(多路检索、多个子任务);长任务全异步——提交成任务拿 taskId,前端轮询或走推送,服务端用队列削峰。接口层面要有超时与预算(单步超时、整任务预算)、幂等(重试不会重复产生副作用)、以及断点续跑(中间结果落盘,失败从最后一步接着做,而不是重头再来)。
异步框架按语言和团队来选:Python 侧轻量用 asyncio + FastAPI 加 Celery/RQ,要长流程编排、重试与可视化就用 Temporal、Airflow、Dagster 这类工作流引擎;跨服务解耦用 Kafka、RabbitMQ 等消息队列,配死信队列处理反复失败的任务。追问常落在「任务状态放哪」(Redis 或数据库,别放进程内存)、「怎么保证不重复消费」(幂等键 + 去重表)、以及「怎么观测」(traceId 贯穿全链路)。
几千个业务能不能统一 Agent 流程
不能靠一套流程硬套,而是分层抽象 + 配置化:底层统一(模型接入、工具协议、记忆存储、评测与观测),中间层把常见形态固化成几种模式(问答检索型、数据查询型、长流程办理型、内容生成型),业务层只填配置(用哪些工具、走哪种模式、验收标准是什么)。合并的前提是先做口径统一——同一个概念在不同业务里的字段与规则对齐之后,才谈得上复用;实在差异大的就并存,用统一的入口和观测来管理,而不是强行合并成一个巨型流程。
大重构的思路也是这两条:正交——按职责切分模块,让每个模块的变化原因唯一,公共能力下沉、业务差异上浮,依赖方向单向不回头;去冗余——同一份逻辑只留一个事实来源,把复制粘贴出来的多份实现收敛成一份带配置的实现,并靠回归评测集保证收敛不改变行为。改造节奏上先加测试与观测、再小步替换、保留开关可回滚,别一次性大爆炸。
手撕:双塔召回的前向传播
要点是把结构写清楚而不是写得花:用户塔和商品塔各自是 embedding 查表 + 若干层 MLP(Linear → 激活 → Dropout → Linear),输出的向量做 L2 归一化,再用内积(等价于余弦相似度)算分数。训练时用 in-batch 负采样:一个 batch 里用户与商品的相似度矩阵,对角线是正样本,其余是负样本,除以温度系数后做交叉熵(cross_entropy 对行和列各算一次即对称损失);推理时商品向量离线算好建索引,在线只跑用户塔。代码里要注意维度对齐、dim=-1 归一化、温度参数 logits / tau,以及 mask 掉 padding。