Reading System

收录整理

阿里 token 事业群面试全记录:AI 时代的技术追问

作为一个 Java 开发者,作者去阿里面试 token 事业群,却被问到了一堆 AI 问题:从 RAG 到 LangGraph,从 Claude Code 到 OpenClaw 原理。这不仅是一场面试,更是一次对 AI 时代技术变迁的深刻审视。

2026 年 3 月 17 日14 分钟Qq

01、你一天能烧多少 token?

老王开始压力了:"你一天能烧多少 token?"

我说:"王哥,就几十个吧。"

一看老王的脸色不太好看,我立马就改口了:"逗逗你的呀,王哥。我订阅了各种 Coding Plan,尤其是 Qoder,我订阅的是 6000 Credits 那个,一个月都不太够用。"

我接着说:"我昨天刚上架了派聪明 RAG 系统,发现 token 的消耗就有点顶不住。"

老王追问:"那你怎么优化 token 消耗?"

我说:"几个思路,我详细讲讲。"

"第一,prompt 压缩。很多 prompt 里都有冗余信息,比如重复的指令、不必要的示例。我在派聪明 RAG 中写了一个压缩算法,能自动识别并去除这些冗余。"

"第二,缓存机制。相同的问题,如果上下文没变,直接返回缓存结果,不再调用模型。"

"第三,模型分级。简单任务用轻量级模型,比如 Qwen-Turbo,速度快、成本低。复杂任务才用大模型,比如 GPT-5.4。"

"第四,批量处理。多个相似的问题,合并成一次调用,减少 API 请求次数。"

老王听完眼睛一亮:"批量处理这个思路不错,具体怎么实现的?"

我说:"用消息队列做缓冲。用户的问题先入队列,然后按时间窗口聚合,比如 100ms 内的相似问题合并成一次批量请求。这样 API 调用次数能减少 70%。"

老王点点头:"有成本意识,还懂工程优化,不错。"

02、简历上为什么都在写 AI 相关的内容?

老王翻着我的简历:"我看你简历上全是 AI 项目,有派聪明 RAG,有 PaiFlow Agent,传统开发经验怎么没写?"

我说:"王哥,不是我不写,是我觉得 AI 相关的内容更能体现我的竞争力。"

"传统开发我会,Java、Spring Boot、MyBatis 这些八股你随便问,没有我背不出来的,哦不,没有我回答不上来的。但现在是什么时代?AI 时代。HR 和你们这些面试官看简历,第一眼想看的不就是有没有 AI 开发经验?"

"再说了,AI 开发不是空中楼阁,底层还是传统开发。RAG 系统要用向量数据库,得懂 ElasticSearch;Agent 要调用 API,得懂 HTTP 或者 MCP 协议;工作流要编排任务,得懂并发编程、消息队列。"

老王追问:"那你觉得传统后端开发和 AI 应用开发最大的区别是什么?"

我说:"最大的区别是思维方式。"

"传统开发是确定性思维,输入确定,输出确定,逻辑是线性的。AI 开发是概率性思维,输入确定,输出不确定,逻辑是概率的。"

"比如传统开发,你写个 if-else,条件满足就走 A 分支,不满足就走 B 分支,结果是确定的。"

"AI 应用开发不一样,你给模型一个 prompt,它可能给你 A 答案,也可能给你 B 答案,甚至给你 C 答案。你要设计的是怎么让模型大概率给你想要的答案,而不是 100%确定。"

"这种思维方式的转变,是很多传统开发转 AI 开发最难适应的地方。"

老王点点头:"这个观察很深刻。那我问你,什么是 RAG?"

03、什么是 RAG?

我说:"RAG,是 Retrieval-Augmented Generation 的缩写,也就是检索增强生成。"

"简单说,就是让大模型在回答问题之前,先去知识库里检索相关信息,然后把检索结果作为上下文,一起送给大模型生成回答。"

"这样做有两个好处:

一是解决大模型的知识截止问题。大模型的训练数据有截止日期,之后发生的事情它不知道。RAG 通过实时检索,可以获取最新信息。

二是解决大模型的幻觉问题。大模型有时候会一本正经地胡说八道。RAG 通过检索真实文档,让回答有据可依。"

老王追问:"RAG 的核心流程是什么?"

我说:"四步走:

第一步,文档预处理。把原始文档切分成 chunk,用 embedding 模型转成向量,存入向量数据库。

第二步,查询向量化。用户提问时,把问题也转成向量。

第三步,向量检索。在向量数据库里找最相似的 chunk。

第四步,增强生成。把检索到的 chunk 作为上下文,和问题一起送给大模型,生成最终回答。"

老王追问:"RAG 和微调有什么区别?什么时候用 RAG,什么时候用微调?"

我说:"这是个好问题,很多人搞混。"

"RAG 是检索增强,不改变模型本身,只是给模型提供额外的上下文。适合知识频繁更新、需要实时性的场景。"

"微调是改变模型参数,让模型学会新的知识。适合知识相对稳定、需要深度理解的场景。"

"我的判断标准是:如果知识更新频率高于一周,用 RAG;如果低于一周,可以考虑微调。"

"另外,RAG 成本低,不需要训练;微调成本高,需要标注数据和算力。"

老王点点头:"判断标准清晰。那你做的 RAG 智能报价系统是在哪个公司?"

04、RAG 智能报价系统是在哪个公司做的?

我说:"是在上一家公司,一家做 B2B 供应链的企业。"

"他们的业务场景是:采购商在平台上传需求文档,系统需要根据文档内容,自动生成报价方案。"

"传统做法是人工看文档、人工写报价,一个单子平均要 2 小时。用 RAG 之后,系统自动解析文档、匹配历史报价、生成报价方案,平均 5 分钟搞定。"

老王追问:"技术上有哪些难点?"

我说:"三个难点。"

"第一,文档格式复杂。采购商上传的文档有 PDF、Word、Excel,还有图片。我们用了 OCR+文档解析,先把各种格式转成文本,再做后续处理。"

"第二,chunk 切分策略。切得太细,语义不完整;切得太粗,检索不精准。我们试了多种策略,最终按段落切分,效果比较好。"

"第三,检索结果重排。向量检索返回的结果,相关性不一定是最高的。我们加了重排模型,对检索结果二次排序,准确率提升了 15%。"

老王眼睛一亮:"不错,技术细节也讲清楚了。那你在这个项目里担任什么角色?"

05、你在 RAG 项目中担任什么角色?

我说:"我是技术负责人,带了一个 5 人的小团队。"

"具体工作包括:

技术选型:调研了 Milvus、Pinecone、Weaviate、ElasticSearch 等向量数据库,最终选了 ElasticSearch,因为性能好、社区活跃。

架构设计:设计了文档预处理服务、向量检索服务、报价生成服务三个核心模块。

模型调优:针对报价场景,微调了 embedding 模型,让检索准确率从 75%提升到 92%。

工程落地:解决了文档格式兼容、chunk 切分策略、检索结果重排等工程问题。"

老王追问:"安装包这些东西都是你整理的还是协助的?"

06、安装包这些东西都是你整理的还是协助的?

我说:"安装包是我主导整理的。"

"因为 RAG 系统涉及多个组件:向量数据库、embedding 服务、大模型 API、业务后端。部署起来很麻烦,我整理了一键安装包,把 Docker Compose 配置、环境变量模板、初始化脚本都打包进去。"

"新环境部署,原来需要一天,现在半小时搞定。"

老王问:"镜像打包是开发打包还是你负责?"

07、镜像打包是开发打包还是你负责?

我说:"CI/CD 流程是我搭建的,但镜像打包是自动化的。"

"我用 GitLab CI 做了流水线:代码提交 → 自动测试 → 构建镜像 → 推送仓库 → 触发部署。开发人员只需要写代码,打包部署全是自动的。"

"镜像分层也做了优化,基础镜像和业务镜像分开,构建时间从 10 分钟降到 3 分钟。"

"另外,镜像安全扫描也做了。用 Trivy 扫描镜像漏洞,高危漏洞自动阻断发布。"

老王追问:"如果镜像构建失败,怎么排查?"

我说:"先看构建日志,定位失败步骤。常见原因有:依赖下载失败、单元测试不通过、Dockerfile 语法错误。"

"如果是依赖下载失败,检查网络或者换国内镜像源。如果是测试不通过,本地先跑通再提交。如果是 Dockerfile 错误,用 docker build --progress=plain 看详细日志。"

老王点点头:"工程化能力不错。那 AI 运维智能管理平台是一个什么平台?"

08、AI 运维智能管理平台是一个什么平台?

我说:"这是我最近做的一个项目,用 AI 来辅助运维工作。"

"平台核心功能包括:

日志分析:自动分析系统日志,识别异常模式,提前预警。

故障诊断:出现故障时,自动收集相关信息,给出可能的原因和解决方案。

资源优化:分析服务器资源使用情况,给出优化建议,比如哪些服务可以缩容、哪些需要扩容。

知识库问答:把运维文档、历史 case 都录入知识库,运维同学可以直接问 AI,不用翻文档。"

老王问:"这个平台用了什么技术?"

我说:"底层是 RAG+Agent 的技术栈,上层用 LangGraph4j 做了工作流编排。"

老王追问:"工作流是什么?"

09、工作流是什么?(LangGraph4j)

我说:"工作流,就是把一系列任务按照一定的逻辑顺序编排起来,自动执行。"

"LangGraph4j 是一个 Java 的工作流编排框架,特别适合做 AI 任务的工作流。"

"比如故障诊断这个场景,工作流可以这么设计:

第一步,接收告警通知;第二步,查询相关日志;第三步,分析日志内容;第四步,查询知识库;第五步,生成诊断报告;第六步,通知运维人员。"

"每个步骤都是一个节点,节点之间可以设置条件分支。比如如果日志分析发现是磁盘满了,直接走磁盘清理分支;如果是内存溢出,走服务重启分支。"

老王问:"这个工作流不是 AI 的那个工作流是吧?"

10、这个工作流不是 AI 的那个工作流是吧?

我说:"王哥,这个问题问得好。"

"传统的工作流,比如 BPMN,是给人执行的流程,强调流程的规范性和可追溯性。"

"AI 的工作流,比如 LangGraph,是给 AI 执行的流程,强调任务的自动化和智能化。"

"LangGraph4j 是两者的结合:用工作流的结构来保证任务的完整性,用 AI 的能力来完成具体的任务。"

"比如故障诊断工作流,流程结构是固定的,但具体的日志分析、原因推断,都是 AI 来完成的。"

老王点点头:"区分清楚了。平常开发用 AI 工具多吗?"

11、平常开发用 AI 工具多吗?

我说:"多,现在基本离不开 AI 工具了。"

"搭项目骨架的时候,我会用 Qoder 的 Quest 模式;读源码我会用 TRAE 的 Gemini;开发任务我会交给 Codex。"

"但用得最多的还是 Claude Code。"

老王追问:"请讲一下你在 AI 编程中的使用经验,比如 Claude Code。"

12、请讲一下你在 AI 编程中的使用经验,比如 Claude Code。

我说:"Claude Code 是我目前的主力开发工具。"

"我用它做过几件事:

一是代码重构。给一个指令,它能自动理解代码逻辑,给出重构方案,甚至直接生成重构后的代码。

二是 Bug 修复。把报错信息丢给它,它能分析可能的原因,给出修复建议。有时候甚至能直接定位到问题代码。

三是代码生成。写重复性的代码特别快,比如 CRUD 接口、单元测试,几分钟就能生成一套。

四是技术调研。遇到不熟悉的技术,直接问它,比查文档快多了。"

老王问:"Claude Code 和传统的 IDE 插件有什么区别?"

我说:"传统插件是辅助,Claude Code 是协作。"

"传统插件只能做代码补全、语法检查这些基础功能。 Claude Code 能理解你的意图,参与整个开发流程。"

"比如你说'/github-skill-forge 找 GitHub 上有没有辅助写小说的项目',它能按照某个 Skills 帮我找出来我想要的源码,然后下载到本地后进行快速的二次开发。"

老王点点头:"最近很火的 OpenClaw 了解过吗?"

13、最近很火的 OpenClaw 了解过吗?

我说:"太了解了,我自己部署了好几个 Agent。"

"OpenClaw 是一个 Agent 框架,让你可以用自然语言指挥 AI 完成复杂任务。"

"我自己部署了三个 Agent:一个是 gitcode 账号审核助手,一个是技术文档生成助手,还有一个是定时任务监控助手。"

"比如 gitcode 审核这个场景,以前我要手动登录后台、搜索用户、添加权限,一个账号要 2 分钟。现在我把流程教给 Agent,它在后台自动执行,20 个账号 1 分钟搞定。"

老王眼睛一亮:"效率提升很明显啊。那如果让你设计一个 Agent,它的长短期记忆你打算怎么设计?"

14、如果让你设计一个 Agent,它的长短期记忆你打算怎么设计?

我说:"我会设计两层记忆:短期记忆和长期记忆。"

"短期记忆,Session,存储当前对话的上下文。包括用户输入、Agent 回复、工具调用结果。短期记忆在内存中,对话结束就清空。"

"长期记忆,Memory,存储跨对话的重要信息。比如用户偏好、历史结论、关键事实。长期记忆持久化到磁盘,下次对话可以读取。"

"两者的协作方式是:对话过程中,Agent 实时更新短期记忆;当短期记忆接近 Context 上限时,触发 Compaction,把重要信息写入长期记忆;新对话开始时,从长期记忆中检索相关信息,加载到上下文中。"

"具体实现上,短期记忆存在内存里,用链表结构,方便快速插入和删除。长期记忆存在磁盘上,用向量数据库,方便语义检索。"

"还有一个细节:不是所有信息都值得写入长期记忆。Agent 会评估信息的重要性,只有重要程度超过阈值的才会写入。评估标准包括:用户明确陈述的事实、对话的关键结论、可能影响后续决策的信息。"

老王追问:"OpenClaw 的核心组件有哪些?"

15、OpenClaw 的核心组件有哪些?

我说:"五个核心组件:"

"LLM,大语言模型,Agent 的大脑,负责理解指令、规划任务、生成回复。"

"Task Planner,任务规划器,把用户需求拆解成可执行的任务步骤。"

"Tool Executor,工具执行器,负责调用外部工具,比如搜索、文件操作。"

"Memory Manager,记忆管理器,管理短期记忆和长期记忆。"

"Skill Loader,技能加载器,动态加载 Skills,扩展 Agent 能力。"

"这五个组件之间通过消息总线通信,互相解耦。比如你可以把 LLM 从 Claude 换成 GPT,其他组件感知不到变化。"

"另外,OpenClaw 还有 8 个配置文件,定义 Agent 的完整人格。AGENTS.md 定义能力边界,SOUL.md 注入灵魂,TOOLS.json 划定禁区,SKILLS.json 配置技能,MEMORY.json 管理记忆,SESSION.json 管理会话,ROUTER.json 配置路由,CONFIG.json 其他配置。"

老王问:"Agent 是常驻进程吗?"

16、Agent 是常驻进程吗?

我说:"不是,Agent 是 per-session 的瞬态实例。"

"每个对话都是一次完整的加载-执行-销毁循环。用户发起对话时,Agent 加载配置、初始化记忆;对话过程中,Agent 执行任务;对话结束,Agent 保存状态、释放资源。"

"这种设计的好处是资源节省,Agent 不用一直占用内存;配置实时生效,每次 run 都会重新读取配置文件。"

"还有一个好处是隔离性。每个对话都是独立的 Agent 实例,一个对话出问题不会影响其他对话。"

老王追问:"Session 太长,会不会挤爆 LLM 的 Context?"

17、Session 太长,会不会挤爆 LLM 的 Context?

我说:"会,所以 OpenClaw 做了优化。"

"两个机制:Compaction 和 Pruning。"

"Compaction,压缩,当 Session 接近 Context 上限时,Agent 把重要信息写入 Memory,然后压缩 Session 内容。"

"Pruning,修剪,在发送给 LLM 之前,临时裁剪旧的 tool 结果。比如搜索返回 100 条结果,但 LLM 只需要前 10 条,后面的就剪掉。"

"Compaction 是持久化的,重要信息会长期保存。Pruning 是临时的,只影响当前请求。"

"具体数值上,当 Session 长度超过 4000 个 token 时,触发 Compaction。Pruning 会保留最近 2000 个 token,裁剪更早的内容。"

"还有一个优化:如果某个 tool 调用结果特别大,比如搜索返回了 1000 条结果,Pruning 会直接取前 10 条,其他的全部丢弃。"

老王点点头:"Memory 机制是怎么设计的?"

18、Memory 机制是怎么设计的?

我说:"Memory 机制分三个阶段:写入、存储、读取。"

"写入阶段,Agent 分析 Session 内容,提取重要信息,包括用户明确陈述的事实、对话中的重要结论、Agent 生成的有价值信息。"

"存储阶段,写入的 Memory 存到 memory.jsonl 文件,每条 Memory 包含 content、timestamp、importance、tags。"

"读取阶段,新对话开始时,根据当前对话内容,检索相关的 Memory。检索策略包括关键词匹配、语义相似度、时间衰减。"

"关键词匹配就是简单的字符串匹配,适合检索明确的实体,比如用户名、项目名称。"

"语义相似度用向量检索,把查询和 Memory 都转成向量,计算相似度。这个适合检索概念相关的内容,比如'分布式事务'和'分布式一致性',虽然关键词不同,但语义相关。"

"时间衰减是给 Memory 加时间权重,越新的 Memory 优先级越高。但也不是简单的线性衰减,而是指数衰减,保证最新的几条 Memory 权重明显高于旧的。"

"为了避免 Memory 爆炸,还有几个优化策略:重要性评分,只保留高重要性的 Memory;定期清理,默认保留 30 天;合并相似 Memory,避免重复;分层存储,高频放内存,低频放磁盘。"

"重要性评分是 Agent 在写入 Memory 时自动评估的,评估标准包括:信息的新颖性、对后续决策的影响程度、用户的明确强调。"

老王追问:"如果让你优化 OpenClaw 的 Memory 机制,你会怎么做?"

我说:"有几个优化方向。"

"第一,引入记忆遗忘机制。人脑会遗忘不重要的信息,Agent 也应该有类似机制。可以设计一个遗忘曲线,重要性低的信息遗忘得更快。"

"第二,支持记忆关联。现在的 Memory 是独立的,如果能支持 Memory 之间的关联,比如'这个项目用了 Spring Boot'和'Spring Boot 是 Java 框架'关联起来,检索效果会更好。"

"第三,分层记忆。短期记忆、中期记忆、长期记忆三层,每层有不同的存储策略和检索策略。"

老王听完沉默了两秒,然后说:"明天下午 14.04 来二面!"

结尾

走出阿里大楼,我来到星巴克点了一杯冰美式。

明明我一个破做 Java 的,竟然问了这么多 AI 的,还有 OpenClaw 原理?

在 AI 的挟持下,时代变化太快了。

快到应接不暇,快到身边不少人开始抵触 OpenClaw,抵触 AI。

但同时,我也看到另外一批人,他们去看 OpenClaw 的源码,开始理解 Agent 不只是一个套壳 ChatGPT,开始用 LangGraph4j 编排真正的业务流程。

【人生有很多活法,你变与不变,世界都在变化;与其恐惧、怀疑,不如尝试、行动,这个过程也许会挣扎、彷徨,但结果一定是充实的。】

打开 IntelliJ IDEA,继续看研究。

二面加油,我一定要拿下,兄弟姐妹们等我好消息。

下期见。