淘天 Agent 二面面经信号拆解¶
一句话结论¶
这条 50 分钟二面说明:淘天 Agent 面试确实会考很多八股,但不是随机八股。它围绕 Agent 工程落地的 4 条链路追问:
- 业务逻辑链:项目到底解决什么业务问题,输入、处理、输出、异常和指标是什么。
- 检索存储链:向量索引、召回、Redis/RediSearch、MySQL 存储结构差异。
- 框架执行链:
@Tool、Spring IoC/AOP、function call、MCP、Skills、Agent 循环。 - 网络协议链:TCP 握手挥手、LLM 流式输出协议。
准备重点不是把 Java 八股百科背完,而是每个点都能接回“Agent 系统怎么跑起来”。
使用方式校正¶
用户判断:这些题不一定会直接考原题,但类似的广度和深度肯定需要拓展。
因此本页不是押题册,而是知识半径校准表。每个主题只要求达到 5 层深度:
- 是什么:一句话定义。
- 为什么需要:它解决 Agent 工程里的什么问题。
- 怎么大致实现:核心链路、数据结构或框架机制。
- 项目里怎么类比:能接回 YouNavi 或 AI coding drill。
- 常见坑:一致性、性能、边界和失败兜底。
不要追到底层源码级细节。例如 RediSearch 不需要背完整实现,但要能说清它和普通 Redis / MySQL 的定位差异、索引大概是什么、为什么适合搜索/向量召回。
新优先级¶
P0:
- 业务逻辑说清楚。
- 向量检索从写入到召回全链路。
@Tool/ function call / MCP / Skills 的区别。- Agent loop 继续循环和停止条件。
- 摘要压缩如何避免上下文扭曲。
P1:
- Redis vs RediSearch vs MySQL。
- Spring IoC/AOP。
- TCP 三次握手、四次挥手。
- SSE 流式输出。
P2:
- RediSearch 底层数据结构细节、向量索引算法细节。
- OpenClaw 是否搭建过、是否自己写过 Skills;按真实经历诚实回答。
1. 业务逻辑为什么说不明白¶
面试官问项目时,不想听“我做了 provider / benchmark / MCP”。他在听:
YouNavi 可以改成这个讲法:
业务上,YouNavi 想解决的是用户知识和工作流不能被外部 Agent 稳定调用的问题。
用户不只是想在 UI 里聊天,还希望 Claude Code、Codex、本地脚本、会议工具能调用同一批能力。
所以我做的几件事分别对应这条链路:
provider / benchmark 解决模型能力怎么选择和验证;
CLI / MCP 解决外部 Agent 怎么调用;
Skill / CLI 解决能力如何安装、复用、检测状态和排错。
追问时用固定骨架:
2. 向量模块基本索引怎么存,怎么召回¶
标准链路:
原始文档
-> chunk 切分
-> embedding 模型转成向量
-> 向量 + 文档 id + 元数据写入向量索引
-> 用户 query 也转成 query embedding
-> 近似最近邻检索 topK
-> metadata filter / rerank
-> 取回原文片段
-> 组装进 prompt
可说版本:
向量索引里不只是存一段文本,而是存 embedding 向量、文档 id、chunk id 和一些元数据。
召回时先把用户问题也编码成向量,再在索引里找距离最近的 topK chunk。
拿到候选后可以再按权限、时间、业务字段过滤,或者用 rerank 模型重排,最后把原文片段放回上下文。
3. 普通 Redis 和 RediSearch 有什么区别¶
一句话:
普通 Redis:
- 数据结构:String、Hash、List、Set、ZSet、Stream。
- 查询方式:主要按 key 直接读写,或者对集合做操作。
SCAN:只是渐进式遍历 key,不等于高效搜索。
RediSearch:
- 会维护额外索引,例如倒排索引、数值索引、标签索引、向量索引。
- 支持
FT.SEARCH/FT.AGGREGATE。 - 文本可做关键词搜索和 BM25 类排序。
- 向量字段可做 KNN,相似度召回常见是 FLAT 或 HNSW 这类索引方式。
面试口径:
4. RediSearch 和 MySQL 存储结构有什么区别¶
MySQL:
- 面向关系表和事务。
- InnoDB 常见主键索引是 B+Tree。
- 数据按页存储在磁盘/缓冲池里。
- 擅长精确查询、范围查询、事务一致性、关联关系。
RediSearch:
- 运行在 Redis 内存体系里,重点是搜索索引。
- 文本检索依赖倒排索引。
- 数值/标签/地理字段有对应索引结构。
- 向量检索依赖 FLAT/HNSW 等向量索引。
- 擅长低延迟搜索、全文检索、向量召回,但不是用来替代 MySQL 做完整事务系统。
口头对比:
MySQL 更像事务型关系数据库,核心是表、行、B+Tree、事务和 SQL。
RediSearch 更像在 Redis 上加了一层搜索引擎索引,核心是倒排索引和向量索引。
所以优惠券订单这种强一致数据我会放 MySQL;
知识库搜索、语义召回、标签过滤这类可以用 RediSearch 或向量库。
5. @Tool 注解底层怎么实现¶
以 Spring AI / Java 框架口径回答:
`@Tool` 本质是用注解标记一个可被模型调用的方法。
框架启动时通过反射扫描这些方法,读取方法名、描述、参数类型和注解信息,
生成 tool schema / function schema,注册到 tool registry。
调用 LLM 时,框架把这些 schema 发给模型;
模型返回 tool call 后,框架根据 tool name 找到对应方法,
反序列化 arguments,做类型校验,然后反射调用或通过 bean 方法调用真正执行业务逻辑。
关键点:
- 注解本身不会让模型自动执行工具。
- 模型只返回“我要调用哪个工具和参数”。
- 真正执行的是框架/harness 的分发逻辑。
6. Spring IoC 和 AOP 是什么,怎么实现¶
IoC:
IoC 是控制反转:对象的创建、依赖注入和生命周期不由业务代码自己 new,
而是交给 Spring 容器管理。
容器启动时扫描 Bean 定义,通过构造器、字段或 setter 注入依赖,
最后业务代码从容器拿到已经组装好的对象。
AOP:
AOP 是面向切面编程,把日志、事务、权限、监控这类横切逻辑从业务代码里抽出来。
Spring 常用代理实现:如果有接口可以用 JDK 动态代理,没有接口常用 CGLIB 生成子类代理。
调用方法时先进入代理对象,代理再执行前置/后置/环绕增强,最后调用真实业务方法。
Agent 关联:
7. Agent 执行循环怎么判断是否需要下一轮¶
继续循环的条件:
- 模型返回了结构化 tool call。
- tool 执行结果需要再让模型解释或继续决策。
- plan 还没完成,且没有超过 max steps / timeout / token budget。
- 当前 observation 不是最终答案,只是中间状态。
停止条件:
- 模型返回 final answer,没有 tool call。
- 达到 max steps。
- 超时或 token/cost 超预算。
- 工具连续失败,进入 fallback。
- 重复调用同一工具但没有新信息,判定无进展。
- 用户任务已经满足验收条件。
口径:
8. 复杂例子串一下¶
例子:用户问“帮我分析这场直播里某商品转化差的原因,并给主播生成一段改进话术”。
链路:
1. 用户输入任务。
2. 系统判断需要业务数据和内容数据。
3. Agent 先调用商品/订单/点击数据工具,拿到转化率、曝光、点击、下单。
4. 再调用直播内容检索工具,召回相关片段、弹幕和商品讲解文本。
5. LLM 结合数据和内容判断原因:曝光不足、讲解太晚、价格解释不清、弹幕疑问未回应。
6. 如果证据不足,继续调用检索或指标工具。
7. 满足证据条件后输出分析和主播话术。
8. 记录 trace、引用证据、把 badcase 或用户确认结果写回评估/记忆。
这个例子能串起:
- tool calling。
- RAG/向量召回。
- Agent loop。
- 业务逻辑。
- trace/eval。
- 最终回答兜底。
9. 摘要错误导致上下文扭曲怎么办¶
风险:
- 摘要把事实写错。
- 摘要丢掉约束。
- 摘要把模型猜测当成用户真实意图。
- 后续轮次基于错误摘要越跑越偏。
控制方法:
- 摘要结构化:事实、决策、待办、偏好、未确认假设分开。
- 保留最近几轮原文,不只依赖摘要。
- 摘要里保留来源 turn id / trace id / tool result id。
- 对关键事实不要让模型自由改写,尽量从结构化状态或数据库读取。
- 重要操作前让模型显式引用依据,或者让用户确认。
- 定期做 summary verification:让模型检查摘要是否被原文支持。
可说版本:
我不会让摘要直接替代全部上下文。
我的做法是:最近几轮保留原文,长历史压成结构化摘要;
摘要区分事实、决策、待办和假设;
关键业务事实从数据库或 tool result 重新读取;
如果摘要影响重要动作,就要求引用来源或让用户确认。
10. function call、MCP、Skills 有什么区别¶
function call:
MCP:
一种把工具、资源和上下文暴露给 Agent 的协议。
它解决的是不同 Agent host 和外部工具/server 之间如何标准化连接。
function call 更像一次模型调用里的工具格式;
MCP 更像跨应用、跨工具系统的连接协议。
Skills:
对比句:
11. 为什么 Skills 会流行¶
原因:
- 比纯 prompt 稳定:把流程、约束、脚本和示例固化下来。
- 比单个 function call 更有上下文:能包含任务说明、工作流和工具。
- 可复用、可安装、可版本管理。
- 适合 AI coding:把代码规范、测试命令、脚本和常见坑打包。
- 能降低长 prompt 成本:需要时加载,不必每次把所有知识塞进上下文。
可说版本:
我理解 Skills 流行,是因为 Agent 需要的不只是“能调一个函数”,
还需要一整套完成任务的上下文、步骤、脚本和经验。
这些东西如果每次靠 prompt 临时写,很难复用也难验证;
打包成 Skill 后,就更像可安装、可测试、可迁移的能力资产。
12. OpenClaw 和自己写 Skills 怎么答¶
如果没有完整搭建过 OpenClaw:
我没有完整搭建过 OpenClaw 生产环境。
我了解它这类 Agent harness 关注的是工具、技能、记忆、上下文和长任务执行。
我实际更熟的是 YouNavi 里 CLI/MCP/Skill 相关的工程链路,
包括能力如何被外部 Agent 调用、安装、检测状态和排错。
如果问是否自己写过 Skills:
我写过/维护过类似 Skill 的能力包装:把某类任务需要的说明、命令、脚本和使用约束组织起来,
让 Agent 或 CLI 能稳定调用。
我不会夸成完整生态,但我理解 Skill 的价值是把一次性的 prompt 变成可复用能力。
13. TCP 握手与挥手¶
三次握手:
为什么三次:
四次挥手:
TIME_WAIT:
14. 流式输出用什么协议¶
LLM API 最常见口径:
补充:
- SSE:服务端到客户端单向推送,适合 LLM token streaming。
- WebSocket:双向通信,适合更强交互场景。
- 普通 HTTP:一次性返回完整响应,用户等待更久。
可说版本:
我接触到的 LLM 流式输出通常是 SSE。
请求还是 HTTP,请求头里声明 stream,服务端以 event-stream 的方式持续返回 chunk。
客户端收到每个 chunk 后增量渲染,所以用户能看到模型边生成边输出。
二面校正版准备顺序¶
第一块:业务逻辑 30 分钟¶
把 YouNavi 按这个模板说 3 遍:
验收:不再只说技术名词,能说明“为什么用户需要这个功能”。
第二块:向量/RediSearch 45 分钟¶
背:
- chunk -> embedding -> vector index -> query embedding -> ANN topK -> filter/rerank -> prompt。
- Redis 是 key-value 数据结构。
- RediSearch 是搜索索引模块。
- MySQL 是关系型事务数据库,常见索引是 B+Tree。
验收:能回答“数据怎么召回回来”和“为什么不用 MySQL 直接做语义搜索”。
第三块:框架/工具 45 分钟¶
背:
@Tool= 注解扫描 + 反射/schema + tool registry + 模型返回 tool call + 框架执行。- IoC = 容器管理对象和依赖。
- AOP = 代理增强方法调用。
- function call / MCP / Skills 三者区别。
验收:能从 @Tool 一直讲到模型怎么触发真实方法。
第四块:Agent loop 和摘要 30 分钟¶
背:
- 继续循环:返回 tool call、计划未完成、observation 需要继续解释。
- 停止:final answer、max steps、timeout、无进展、工具失败、预算耗尽。
- 摘要防扭曲:结构化摘要、保留最近原文、来源 id、关键事实回读、用户确认。
第五块:网络协议 20 分钟¶
背:
- TCP 三次握手。
- TCP 四次挥手。
- LLM streaming 通常用 SSE,WebSocket 是双向可选方案。
面试前最小背诵版¶
只背 5 句话:
- 向量召回链路:chunk、embedding、vector index、query embedding、topK、rerank、prompt。
- RediSearch 是 Redis 上的搜索索引模块,和普通 Redis 的 key-value 访问不同。
@Tool底层是注解扫描生成 schema,模型返回 tool call,框架校验参数并调用真实方法。- Agent 是否继续循环,看模型是否返回 tool call、任务是否完成、是否超出 step/timeout/budget。
- 流式输出常用 SSE;TCP 先三次握手建连,结束时四次挥手释放连接。