4月14日(淘天面经1)
自我介绍
面试官你好,我叫XXX,主攻Java后端 + AI工程化方向。技术栈覆盖MySQL、Redis、MQ、Spring、LangChain、LlamaIndex、RAG、MCP等,擅长将AI能力落地到真实业务系统。
曾主导开发“高校私有文档智能检索系统”,基于RAG架构,支持师生快速查询历史课件与资料,提升教学效率;另参与“短信短链+广告效果归因平台”,通过短链缩短短信成本30%,并结合点击/转化数据帮助企业优化投放策略。
长期在CDN平台撰写技术博客,累计浏览量超20万,持续输出AI工程化实践与架构思考。
我希望将我的Java工程能力与AI系统设计经验结合,参与构建下一代智能Agent系统,推动AI从“能跑”到“好用”。
拷打agent项目,react是怎么设计的,多轮对话是怎么实现信息传递的,每个agent在每轮对话中的记忆是怎么样的
在我们的系统中,ReAct 是通过Prompt 模板 + Tool Registry + 状态机来实现的。
每一轮 Agent 会先输出 Thought(思考过程),然后决定 Action(调用哪个工具),系统执行工具后返回 Observation,再拼接到上下文中进入下一轮。
整个流程是循环直到满足终止条件(如生成最终答案或达到最大轮数)。
多轮对话的信息传递分为三层:
短期上下文:使用滑动窗口(如最近 6 轮或 4096 tokens)直接拼进 Prompt
中期记忆:对较早的对话做摘要(summary),再注入上下文
长期记忆:将历史对话和用户偏好存入向量库,通过语义检索召回相关内容
在每个 Agent 的每一轮对话中,记忆可以分为四部分:
System Prompt:角色定义、工具说明、输出格式
短期记忆(Working Memory):当前对话窗口(WindowMemory / Turn Buffer)
长期记忆(Long-term Memory):
用户画像
历史关键对话(向量检索)
之前任务的执行结果
执行记忆(Episodic Memory):
本轮已经调用的工具
工具返回结果
中间思考轨迹
ReAct 设计:
我们通过 Prompt 模板显式引导模型输出 Thought / Action / Observation,并在代码中维护一个 Agent Loop,直到满足结束条件。
多轮对话传递:
采用三层记忆:短期用滑动窗口维护上下文,中期用摘要压缩,长期通过向量数据库存储历史对话和文档。
Agent 每轮记忆:
每一轮 Agent 都会拿到:系统提示词 + 当前窗口上下文 + 检索到的长期记忆 + 本轮工具执行记录,形成一个完整的状态对象,再送入模型。
长短期记忆的理解
在我的理解中,Agent 的短期记忆主要对应当前上下文窗口,包括系统提示词、最近几轮对话、工具调用结果等,通常由 WindowMemory 或 Turn Buffer 维护,特点是容量有限、实时性强。
长期记忆则是外部持久化存储,我们会把用户画像、历史关键对话、行为日志、文档知识等存入向量数据库,在需要时通过语义检索召回,并注入到当前 Prompt 中。
这和传统深度学习里的 LSTM 长短记忆不同:
LSTM 是在模型参数内部维护隐状态
而 Agent 的长期记忆更多是外部知识库 + 检索增强,更可控、可解释、可更新。
RAG是怎么实现的,reader和splitter的策略是什么
RAG主要是检索生成增强,主要过程是数据导入->文档分块(通过语义分块和关键词分块)->向量嵌入(设计统一的BaseExcuter接口,然后定义md_excuter,pdf_excuter等执行计划,实现可插拔的向量嵌入)->存储向量数据库(Milvus向量数据库)->检索前处理技术(HyDE假设性文档)->索引优化技术(通过关键词检索BM25+语义检索FIASS的混合检索策略)->索引后处理技术(通过重排序,选出最相关的Top-K个记录)->文档评估,这一些列流程实现一个完整的RAG系统。
reader策略是
1.格式匹配:PDF。word等不同的文档用专属的解析器
2.结构化读取:设置统一的结构化数据,方便后续进行统一的读取
splitter:
1.按语义分割:通过标点符号或段落分割,优先表证语义的完整性
2.按固定长度分割:设置固定的token分片,再通过滑动窗口解决边界丢失问题
3.混合检索:按关键词加语义检索
召回效率不好怎么优化(切割方案,多路召回,query rewrite)
1.我们可以考虑使用混合检索的方法(使用语义加关键词的混合检索技术)
2.也可以使用HyDE伪文档生成技术,使用大模型基于用户的问题,生成一段假设型文档,将该文档用于向量检索,找到最相似的真实文档,基于这些文档生成最终答案
3.优化的多路召回,引入多维检索范式,让它不仅局限于查询本身,而是通过查询扩展多个相关维度。例如,关键词的检索,基于向量相似度的检索,基于知识图谱的检索通过多角度数据源进行检索,能捕获更多与用户意图相关的文档,从而大大减少漏照的可能性。并对这些候选段落进行更细致的相关打分和重排。提升重排的准确率
MCP的stdio和sse有什么区别
| 维度 | stdio | SSE |
| 通信方式 | 标准输入输出 | HTTP Server-Sent Events |
| 部署范围 | 本机进程 | 跨网络 / 云端 |
| 是否流式 | 通常是同步阻塞 | 支持流式响应 |
| 扩展性 | 差(单机) | 好(分布式) |
| 典型场景 | CLI Agent / 本地工具插件 | 云端 Agent / 多轮推理 / 多步工具 |
在我的理解中,MCP 的 stdio 和 SSE 本质上是两种通信模式。
stdio 更适合本地 Agent,通过标准输入输出在同一台机器上进行工具调用,实现简单、无网络开销,但不具备分布式能力。
而 SSE 基于 HTTP 的服务器推送机制,支持跨网络、跨节点的云端 Agent 部署,能够流式返回中间结果,非常适合分布式集群和多轮推理场景。
我们在实际项目中会根据部署形态选择:本地调试用 stdio,线上服务用 SSE。
传统调api vs 使用mcp的体感差异
传统 API:
每个工具一套接口
参数、鉴权、错误处理全都要手写
多工具组合时编排成本高
MCP:
统一 A2A / 工具描述规范
工具即插件,Agent 只关心能力
支持流式、状态保持、可观测
体感差异:
传统 API 是“我在适配系统”
MCP 是“系统在服务我”
第二个项目实现幂等
幂等性是指同一请求被多次执行,系统状态和结果保持一致。
在我的项目中,我主要通过 Redis 的StringRedisTemplate#setIfAbsent(即 SET NX)来实现。
请求进来时,我会生成一个唯一的业务 Key,尝试写入 Redis:
写入成功 → 执行业务
写入失败 → 说明请求已处理过,直接返回
同时会给 Key 设置合理的过期时间,避免死锁。
极端情况下,数据库也会通过唯一索引做兜底校验。
事务中MySQL崩了,锁怎么释放?
MySQL 崩溃后锁的释放,主要依赖 InnoDB 的崩溃恢复机制:
如果事务还没提交就崩溃,重启时会通过undo log 回滚事务,并释放对应的行锁
如果事务已提交但数据页还没刷盘,重启时会通过redo log 重放,保证数据不丢
所以无论哪种情况,崩溃恢复完成后,锁都会被正常释放,不会出现永久死锁
那你们项目里用的 Redis 分布式锁,MySQL 崩溃了怎么办?
MySQL 的锁由 InnoDB 自动回收,但 Redis 分布式锁必须依赖过期时间 TTL或看门狗机制,否则会永久死锁。
改成用户操作5次,怎么改?
如果要限制用户最多操作 5 次,我会用 Redis 来做分布式计数。
设计 Key 为:业务:用户ID,每次请求进来先INCR,如果是第一次就设置过期时间(比如一天)。
如果计数超过 5,直接拒绝请求。
这种方式能保证原子性和高性能,避免并发问题。
极端情况下,Redis 不可用可以用数据库做兜底校验
RAG 在智能云盘中,用什么向量库?如何做文档切分?
向量库我们用的是Milvus,线上规模在百万级文档以内,性能和稳定性都满足需求。
文档切分我们是按类型分策略:
Markdown:按标题层级切,保证语义完整
PDF:按页 + 段落切,避免跨页断裂
通用策略:
每块控制在 300–600 token
设置 10–20% 的滑动窗口 overlap,防止上下文丢失
切分后的 chunk 会带上 meta:文档ID、页码、标题层级,方便召回后溯源。
MCP 在项目中具体怎么用的?和 LangChain 有什么区别?
在项目中,MCP 主要作为Agent 与外部工具之间的统一通信协议:
本地调试用 stdio,线上服务用 SSE
工具通过 MCP 暴露能力描述,Agent 只关心“要做什么”,不关心接口细节
和 LangChain 的区别在于:
LangChain 更偏向开发框架(Chain / Agent / Memory 的编排)
MCP 更偏向通信与能力描述标准(类似“工具侧的 OpenAPI”)
实际我们是LangChain + MCP 组合使用:LangChain 负责流程编排,MCP 负责工具接入。
Milvus 建索引用的 IVF / HNSW?
我们主要用IVF_FLAT和HNSW两种:
数据量千万级以内、QPS 较高 → IVF_FLAT(召回稳定、构建快)
对召回质量要求极高、数据规模中等 → HNSW(更高召回率,内存占用更大)参数上会做离线评估,选Recall@K vs QPS的 Pareto 最优点。
向量维度和 embedding 模型怎么选?
一般遵循三条原则:
模型优先:选定 embedding 模型后,维度自然确定(如 bge‑base 是 768 维)
对齐上下游:向量库、索引类型、检索算法要和维度匹配
业务权衡:
高精度场景 → 大模型 + 高维
成本/延迟敏感 → 小模型 + 低维(如 384 维)
实际我们做过 A/B,最终选了bge‑base + 768 维 + IVF,在成本和效果之间取得平衡。
附加题:Vibe Coding + 大模型提示词链路设计(帖子→广告投放JSON)
当然可以。这道题本质上不是考察你对某个具体技术细节的掌握,而是考察你在面对陌生、复杂、开放性业务场景时,如何借助大模型进行“问题拆解 + 思维引导 + 交互迭代 + 降本增效”。下面我从多个维度为你逐层拆解 + 实战策略 + 操作路径 + 高分要点,帮你彻底吃透这道“行为面试 + 人机协作 + 工程思维”的综合题。
先明确题目本质(目的:建立认知框架)
题干核心关键词:
“设计提示词链路”、“大模型根据输入输出指定格式JSON”、“帖子 → 广告投放”、“没理解可问大模型”、“看你如何跟大模型交互”、“考察问题思考和降本增效”
这不是编程题,而是“AI协作思维题”+“产品工程化思维题”+“Prompt工程实战题”。
你要展示的是:
✅ 如何把模糊需求转化为可执行步骤
✅ 如何利用大模型弥补自己知识盲区
✅ 如何设计清晰、可迭代、可验证的提示词链路
✅ 如何在有限时间内“低成本试错 + 高效产出”
✅ 如何与大模型“对话式协作”,而不是单向指令
二、逐层拆解题干(目的:把“复杂场景”拆成可操作模块)
输入是什么?
“帖子” → 可能是社交媒体帖子、论坛内容、用户UGC、商品描述等。
→ 你要先确认:帖子的内容结构?有没有标题、正文、标签、作者、发布时间?是否有隐含意图?
输出是什么?
“指定格式的JSON” → 用于“广告投放”
→ 你需要明确JSON结构(如:广告位、受众标签、预算、创意素材、投放时间等)
→ 举例:
{ "ad_slot": "feed_top", "target_audience": ["25-35岁", "女性", "美妆兴趣"], "creative": { "title": "夏日清爽防晒霜限时8折", "image_url": "xxx.jpg", "cta": "立即抢购" }, "budget": 5000, "schedule": "2025-06-01T09:00:00" }
中间链路是什么?
“提示词链路” → 指的是你通过一系列Prompt引导大模型完成从“理解帖子”→“提取意图”→“匹配广告策略”→“生成结构化JSON”的全过程。
你和大模型的互动方式?
→ 不是“一次问完”,而是“分步引导 + 反馈修正 + 试错优化”
→ 类似产品原型迭代:先搭骨架 → 填内容 → 验证 → 优化 → 输出成品
实战操作路径(目的:给你可复用的“人机协作流程”)
假设你完全没接触过这个场景,但你在20分钟内要跑通一个可演示、可解释、有逻辑闭环的方案。
✅ 第一步:澄清需求(主动提问 + 利用大模型辅助)
你说“第一次接触”,面试官说“很正常”,说明他期待你“主动提问 + 合理求助”。
你可以这样启动:
“我理解这是一个从用户帖子中自动识别广告投放策略并结构化输出的任务。为了确保方向正确,我想先确认几个点:
帖子的典型样例有哪些?比如是小红书笔记?微博动态?还是商品评论?
输出JSON需要包含哪些必填字段?有没有模板或示例?
广告投放策略的决策依据是什么?比如是根据内容关键词?用户画像?还是平台规则?”
→ 如果面试官不给,你马上转向大模型:
“大模型,请帮我梳理一个典型‘帖子转广告投放’的场景示例,包括输入帖子文本和对应的JSON输出格式,最好带注释。”
(这是你第一次“用大模型补认知盲区”,面试官会看到你的主动性)
✅ 第二步:设计提示词链路(核心环节)
不要一次性写个超长Prompt!要“分阶段 + 模块化 + 有反馈机制”
阶段1:内容理解 → 提取关键信息
Prompt示例:
“请从以下帖子中提取:1)核心产品/服务;2)用户意图/情绪;3)潜在受众特征;4)是否有促销/限时/优惠暗示。输出为结构化列表。”
阶段2:策略匹配 → 转化为广告参数
Prompt示例:
“基于上一步提取的信息,匹配适合的广告位(如信息流顶部、评论区插播等)、受众标签、创意方向和预算建议。请按以下模板输出:{ad_slot, target_audience, creative_direction, budget_range}”
阶段3:格式化输出 → 转为指定JSON
Prompt示例:
“将以上结果按照以下JSON schema输出,不要加任何解释或额外文字:{...}”
可选阶段4:验证/优化 → 让大模型自我检查
Prompt示例:
“请检查以上JSON是否满足以下要求:1)所有字段非空;2)budget为数字;3)audience是数组;4)cta存在且合理。如有错误,请修正并说明原因。”
✅ 第三步:实际跑通 + 展示协作过程
你不是写代码,而是“演示你如何和大模型对话”,把你的“思考-提问-修正”过程说出来:
“我先让大模型帮我理解帖子内容 → 然后让它匹配广告策略 → 接着强制它输出JSON格式 → 最后让它自我校验一遍。
刚才第一次输出JSON缺了schedule字段,我就追加一句‘请补充投放时间字段,默认为明天上午9点’ → 它马上修正了。
这样虽然不是一次到位,但通过多次交互,我可以低成本地逼近理想结果。”
→ 这个过程体现了:迭代思维 + 试错成本低 + 人机协同 + 可控性强
如何体现“降本增效”?(高分关键)
这是面试官明确提到的考察点!
你可以这样说:
“这个任务如果纯靠人工标注+规则引擎,需要大量人力做特征工程,且泛化能力差。
通过大模型提示链路,我们只需要定义好输入输出结构和中间判断逻辑,就能让模型自动处理海量帖子。
同时,提示词可复用、可微调、可记录——下次遇到类似场景,直接复用模板+小改即可,边际成本趋近于零。
这就是‘降本’——省人力、省时间;‘增效’——快速部署、持续优化、支持多场景迁移。”
→ 如果能举例说明“某个字段从人工判断变成模型自动判断”,加分!
加分项:展示“工程化思维”
面试官想看到你不是“玩AI玩具”,而是“能落地的工程师”。
你可以补充:
“这个链路可以封装为API服务,输入帖子→返回JSON,前端或投放系统直接调用。”
“可以加个‘置信度’字段,当模型不确定时打标记,转人工审核。”
“未来可引入强化学习,根据广告点击率反馈优化提示词。”
“用LangChain或LlamaIndex框架可以模块化管理这些Prompt步骤。”
如果时间紧张?简化版操作流程(救命方案)
20分钟不够?那就走“最小闭环”:
用大模型生成1个“帖子 + 对应JSON”样例(补认知)
写一个三步Prompt链:
Step 1: 提取关键信息
Step 2: 匹配广告策略
Step 3: 格式化输出(指定schema)
实际跑一次,展示“对话过程”
说一句:“如果线上跑不通,我会记录bad case,反向优化Prompt,而不是改模型或重写逻辑。”
总结:这道题满分回答的关键词
“不是懂不懂技术,而是会不会用AI解决问题”
你必须展现出:
🔹 主动澄清 + 善于求助大模型补知识盲区
🔹 拆解复杂任务 → 模块化Prompt设计
🔹 人机协作 → 多轮交互 + 反馈修正
🔹 降本增效 → 可复用、可迁移、边际成本低
🔹 工程思维 → 可封装、可监控、可迭代
🔹 表达清晰 → 边做边讲,让面试官看到你的“思维路径”
✍️ 附赠:模拟面试回答稿(可用于口头表达)
“这个题一开始确实有点懵,因为是第一次接触‘帖子转广告投放’这种具体业务链路。但我理解面试官想考察的是——面对陌生复杂需求时,我能不能借助大模型来思考、拆解、执行并优化。
我第一步是先向大模型提问,让它给我一个典型输入输出示例,帮助我建立认知。接着我把整个流程拆成三步:1)从帖子中提取关键要素;2)根据要素匹配广告策略;3)格式化成JSON。每一步我都写独立的Prompt,确保清晰可控。
我不是一次就成功,而是跑了一遍后发现字段缺失,就追加Prompt让它补全。这个过程虽然迭代了几次,但整个成本非常低——不需要写代码,不用训练模型,只要改提示词就能优化。
我觉得这才是真正的‘降本增效’——通过AI协作,把原本需要大量人工规则的工作自动化、可复用、可扩展。未来还可以加入置信度判断、反馈闭环、A/B测试Prompt版本,持续优化效果。
而且,整个过程我都边做边跟大模型对话,就像和同事讨论方案一样,这也正是面试官想看到的人机协同能力。”
如果你能这样层层展开,哪怕技术细节不完美,也能拿下高分。因为你在展示的是思维、方法论、工程意识和AI协作能力——这才是AI时代工程师的核心竞争力。
需要我帮你模拟写一份具体的Prompt链路脚本/JSON模板/对话记录,也可以继续提,我可以给你完整可复制的“操作手册”。
加油!你完全有能力把这题变成你的加分项。
