蚂蚁员工:现在这些应届生,base开这么高,结果菜得不行,入职大半年了离了AI啥都不会干,怎么招的人,还自以为很厉害(附Agent面试题)

📅 发布时间:2026/10/18 22:00:34
蚂蚁员工:现在这些应届生,base开这么高,结果菜得不行,入职大半年了离了AI啥都不会干,怎么招的人,还自以为很厉害(附Agent面试题)
刷到一位蚂蚁老哥的吐槽火气还挺大。他说现在招进来的应届生 base 开得那么高结果菜得不行入职大半年了离了 AI 啥都不会干还自以为很厉害。在团队里配合过就知道现在用 Claude Code、Codex 写功能十分钟就能提交一个大 PR表面上看产出飞快。麻烦往往出线上故障排查的时候不知道AI干了什么也不知道AI怎么干的人和AI之间的对齐就很花时间。不过反过来说应届生一上来就习惯用 AI 写代码这件事本身顺应了时代的发展。工具就在手边没必要为了证明基本功扎实放着现成的 Agent 不用去手敲代码。我现在已经不手敲代码了代码开发的工作都交给了 Opus 5.5 和 GPT-6.1 Sol只不过 Claude 昨天刚被办今天还处在戒断反应的第一天有点不习惯。也不能说不习惯就是很难受。说说蚂蚁吧。这两年在 AI 方向的投入很大。底层有百灵大模型家族包括万亿参数的Ling-2.5-1T、深度思考模型Ring-2.5-1T和主打高效率的Ling-2.6-flash应用层有独立 App 形态的服务型 Agent 支小宝、全模态助手灵光以及百宝箱和 AWorld 等智能体开发平台深入到了智能风控、财富顾问、生活办事和医疗健康等核心业务。如果你想做金融方向的 Agent我觉得接入 Ling-3.0-flash-Fin 模型就很适配蚂蚁在通用模型上进行了金融领域的增强重点涉及资料检索、证据核对、计算建模等。灵光开出来的时候还是挺惊艳的主打【生成一个交互界面】但说老实话我觉得这个场景的应用其实也有限因为对于大多数人来说去做个 APP 只能自嗨没有实际的意义。但 AI 的发展已经是必然就看后面蚂蚁在这方面怎么发展吧。接下来继续上硬菜。content01、挑一个你觉得比较好的项目再介绍一下。“拿派聪明来说吧这是一个面向企业内部知识库的 RAG 问答 Agent。我负责文档上传解析、文本切分、向量化入库以及在线问答时的混合检索、工具调用和离线评测。后端用 Spring Boot 3 加 Elasticsearch 8文本向量化和重排序接的是阿里百炼的text-embedding-v4和gte-rerank-v2问答生成用 DeepSeek异步文档处理用 Kafka文件存储在 MinIO会话状态和限流放在 Redis。”“一个文档从上传到能被检索中间经过了这么几步。前端先把大文件按 5MB 切片上传到 MinIO用 Redis 位图和 MySQL 分片表同时记录上传进度。所有分片上传完毕后合并接口用带状态条件的 SQL 更新抢占合并权调用 MinIO 服务端合并接口拼成完整文件然后在同一个数据库事务里把文件状态改成待处理并写入本地消息表。事务提交后由后台线程把任务发送到 Kafka发送失败用定时任务每 5 秒扫描补发保证文件合并成功后一定能进入解析队列。”“Kafka 消费者拿到任务后先认领处理租约并清理该文件可能残留的旧分块随后根据文件头判断格式。PDF 文档交给外部进程 LiteParse 按页解析并提取页码其他格式交给 Apache Tika 流式读取。提取出的文本先按双换行分段超长段落再按句末标点或 HanLP 分词切分成不超过 512 个字符的子块相邻子块之间保留最多 100 个字符的整句重叠。子块先存入 MySQL再按每批 10 条调用text-embedding-v4生成 2048 维向量批量写入 Elasticsearch。消费者每写完一批向量就会刷新一次数据库心跳万一进程崩溃每分钟执行一次的恢复任务会把心跳超过 10 分钟的记录重新发回队列。”“在线问答采用的是 Agent Loop单次提问最多允许 4 轮推理、最多调用 8 次工具整条请求受 120 秒总截止时间约束。大模型决定调用知识库检索工具后系统在 Elasticsearch 里同时发起 BM25 关键词检索和 2048 维向量 KNN 检索两路都带上当前用户的私有、公开和组织标签三级权限过滤各自取前 150 条候选。两路结果先用 RRF 倒数排名融合常数 k 取 60取出前 50 条交给gte-rerank-v2做交叉编码重排序过滤掉低于 0.1 分的结果后取前 5 条。为了防止 512 字符的小分块丢失主语或上下文命中分块还会去 MySQL 取出前后相邻的 1 个分块去重合并成最多 1500 个字符的父块交给大模型最终生成带文件名和页码引用的回答。”“为了量化检索和回答的质量我还在项目里搭了一套包含 50 道题的离线评测集覆盖单点事实、口语化改写、跨段落汇总、资料冲突、私有文档、跨文档干扰和无答案拒答 7 类场景。每次调整切块策略、重排序阈值或提示词都会运行评测算出分块级 Recall5、MRR、NDCG5 以及大模型评委打分同时抽样 10% 的题目和全部异常题目做人工复核计算评委与人工判断的一致率。”02、如果用户点了不满意你们后面后续会有什么措施呢“处理措施包括立即生效的会话级修正和后台异步推进的数据排查。”“先说立即生效的部分。用户在前端页面点击不满意按钮会调用反馈接口把评价等级bad、不满意原因、会话 ID 和当次生成的唯一标识一起提交如果用户直接在输入框里用文字批评了刚才的回答大模型也会在 ReAct 循环里主动调用反馈记录工具。这两条入口最终都会以用户 ID 为键、当前毫秒时间戳为字段把反馈记录写进 Redis 的 Hash 结构里。”“这个用户在后续的对话里再次提问时问答处理器会从 Redis 里读取该用户按时间倒序排列的最新 5 条反馈拼成一段显式约束注入到提示词的 system 层提醒大模型避免重复刚才被点踩的回答方式。比如用户刚才点踩的原因是回答太啰嗦或者漏掉了具体参数下一轮对话模型就能直接看到这条警告并立刻调整输出风格。”// src/main/java/com/yizhaoqi/smartpai/service/ChatHandler.java:732private String buildRecentFeedbackGuidance(String userId) { if (userId null || userId.isBlank() || redisTemplate null) { return; } MapObject, Object entries redisTemplate.opsForHash().entries(feedback: userId); if (entries null || entries.isEmpty()) { return; } ListString recent entries.entrySet().stream() .sorted((a, b) - Long.compare(parseTimestamp(b.getKey()), parseTimestamp(a.getKey()))) .limit(FEEDBACK_PROMPT_MAX_ITEMS) .map(e - - String.valueOf(e.getValue())) .toList(); return近期用户对回答的显式反馈如下按时间倒序排列当两条反馈要求相反时以排在最前面的最新反馈为准good 表示用户认可这类回答方式bad 表示需要避免类似问题但不得违背知识库优先与事实依据原则\n String.join(\n, recent);}“不过光往提示词里加提醒只能解决回答语气和篇幅格式的问题。如果用户点不满意是因为知识库根本没检索到对应文档或者检索到了错误的分块怎么提醒大模型都没用。所以点不满意的记录同时还要落入数据库的负向反馈表通过请求里携带的会话 ID 和生成 ID去对话记录表里关联取出当次问答的三个关键现场数据也就是用户的原始问题、模型的完整回答以及 JSON 格式保存的分块引用映射。”“拿到这三个数据之后后台任务会自动定位问题出在哪一个阶段打上对应的分类标签。定位清楚之后高频出现或者具有代表性的点踩样本经过脱敏和人工编写参考答案会补充进项目的 JSONL 离线评测集。后续无论是补充上传了缺失的业务文档、调整了重排序的分数阈值还是修改了系统提示词都要重新运行一遍包含这些点踩样本的评测集确认原来点不满意的问题已经修复。”怎么区分用户点不满意是因为检索没找对还是模型没答好“区分的依据都在对话表保存的分块引用映射字段里。派聪明每次调用检索工具都会把返回结果的文件 MD5、文件名、页码、分块编号、命中的分块正文、重排序分数、原始分数以及检索模式完整序列化成 JSON 存进这一列。”“排查时先看引用映射列表是不是空的或者检索模式是不是降级成了只用关键词的纯文本模式。如果引用列表为空说明检索阶段一条达到 0.1 分阈值的分块都没找到问题出在知识库缺少对应文档或者用户的口语化问法和文档用词差距太大需要补文档或者优化查询词改写。”“如果引用列表不为空就要看引用的分块正文里到底有没有包含能回答用户问题的事实依据。我们会把用户的原始问题、引用映射里的父块文本和模型的实际回答一起交给评估模型做一次交叉比对。假如引用的 5 个分块里压根没有答案比如都是同一份 PDF 里的无关章节那就判定为检索召回或重排序阶段失准反过来假如引用的父块里明明写着准确的参数或流程模型却漏答了核心条件或者自己编造了结论那就明确归类为提示词约束不足或生成模型自身的问题。”03、意图识别它识别的一定准确吗“不可能百分百准确。不管是训练一个专门的小尺寸分类模型做前置路由还是直接用大模型的 Function Calling 做工具选择面对用户的口语化简写、省略主语的追问或者边界模糊的提问时都会出现误判。”“既然意图识别一定会有误差架构设计上就要保证误判发生时可以补救。派聪明没有在最前面放一个独立的意图分类器而是把意图识别直接做成 ReAct 循环里的工具选择在工具注册表里定义了 4 个职责边界完全不重叠的工具分别是搜索知识库文档的search_knowledge、针对特定主题生成结构化总结的generate_summary、记录用户满意或不满意评价的submit_feedback以及查询 MySQL 文档总数和 Elasticsearch 分块总数的knowledge_stats。”“不用独立前置分类器的原因很简单。如果前置分类器把一句本该查询知识库的业务问题误判成了普通闲聊请求直接转给不带检索能力的对话分支就失去了查询知识库的机会。放在 ReAct 循环里由大模型选工具就算第一次没选准或者工具返回结果不够模型在循环里还能根据观察到的结果重新调用。”“把选择权交给大模型以后最容易出现的意图识别失误是大模型过于自信。有些问题里包含常见的技术名词或通用流程模型觉得自己预训练时见过就不调用search_knowledge直接凭训练记忆作答结果答出来的和企业内部规定完全对不上。为了堵住这个漏洞派聪明在代码和提示词两层同时加了硬性约束。”// src/main/java/com/yizhaoqi/smartpai/service/ChatHandler.java:267// 第一轮总是带工具知识库优先至少要检索一次它的工具执行仍受截止时间减最终回答预留约束。// 从第二轮起剩余时间不够再来一轮工具调用就提前收尾if (round 1 !hasTimeForToolRound()) { logger.info(问答剩余时间不足以再进行一轮工具调用提前收尾: generationId{}, round{}, remainingMs{}, generationId, round, RequestDeadline.remaining().map(Duration::toMillis).orElse(-1L)); break;}LlmProviderRouter.ReActTurn turn streamReActTurnBlocking( userId, conversationId, generationId, messages, agentToolRegistry.getTools());04、有没有存在用户就想一次性询问两个意图的情况“有一种是跨工具的组合意图比如用户说‘帮我查询一下派聪明的限流设计顺便看看现在知识库里一共存了多少篇文档’这同时触发了知识库检索和知识库统计两个工具或者用户要求‘把知识库里关于分片上传的资料整理成一份结构化总结’这需要先调用search_knowledge圈定材料再调用generate_summary生成总结。另一种是同一个检索工具下的多子问题意图比如用户一句话里同时问‘分片上传的单片大小是多少还有重排序的分数阈值定在多少’两个问题落在同一份或不同文档的不同章节里。”“如果用户在一句话里放进了两个互不相关的子问题大模型只合成一条长query去调用一次search_knowledge检索效果往往很差。因为两条子问题的关键词混在一起BM25 和向量检索召回的前 5 条结果很容易被其中一个子问题霸占另一个子问题的分块排在后面进不了前 5 名。所以在提示词和工具说明里我们明确引导大模型遇到包含多个独立实体或多个子问题的复合提问时拆分成多次独立的工具调用。”“为了承接模型拆分出来的多个意图派聪明的流式和非流式响应解析器都支持在单轮回复里解析多个工具调用决策。流式传输时模型通过 SSE 分片返回tool_calls数组累加器按数组下标index把每个工具的名称和 JSON 参数片段分别拼接到对应的槽位里流结束时一次性拿到完整的工具调用列表。”// src/main/java/com/yizhaoqi/smartpai/service/ChatHandler.java:421int firstReferenceNumber generationReferenceMappings .getOrDefault(generationId, Map.of()) .keySet() .stream() .mapToInt(Integer::intValue) .max() .orElse(0) 1;“拿到同一轮的多个工具调用后如果都是search_knowledge、knowledge_stats这类没有副作用的只读工具后端通过线程池并发执行把总耗时控制在最慢那一次检索的耗时内。每次search_knowledge返回结果后引用映射组装器都会先查出当前这次生成已经分配过的最大引用编号新一批检索结果从最大编号加 1 开始顺延排号。比如第一个子问题检索出的 5 个分块编号是来源#1到来源#5第二个子问题检索出的 5 个分块就会自动排成来源#6到来源#10再把各自的tool_call_id和对应结果写回消息列表。这样大模型在汇总回答两个意图时两边的资料和引用编号清清楚楚不会互相覆盖。”“要是两个意图之间存在先后依赖比如第二个意图的检索词必须等第一个意图查出具体模块名称后才能确定或者先调用search_knowledge确认有相关文档后再调用generate_summary做摘要那就走多轮 ReAct 循环。”05、你在调用这个 agent 的时候会不会出现一些幻觉问题呢“肯定会出现。只要底层依赖生成式大模型幻觉就不可能消失。RAG 场景下的幻觉主要来自三个源头分别是检索阶段把不相关的噪声分块交给了模型、文档切块时把主语或前提条件切断导致模型断章取义以及检索片段只覆盖了一半问题时模型自己脑补另一半。”“第一个措施先在检索出口把不相关的噪声拦住。大模型有个毛病只要检索工具返回了 5 段文字哪怕这 5 段文字和用户问题八竿子打不着它也会硬着头皮顺着材料编出一套看似通顺的回答。所以派聪明里的topK5只是一个数量上限实际决定返回几条的是相关性分数阈值。正常走混合检索加gte-rerank-v2重排序时相关性分数低于0.1的分块直接丢弃如果重排序服务超时或剩余时间不足 2 秒退回到 RRF 排序就启用0.028的 RRF 分数阈值约等于两路平均名次必须在第 11 名以内单路召回时自动减半为0.014如果连向量检索也失败、退回到纯关键词检索就按 Elasticsearch 的 BM25 分数0.3截断。宁可检索工具返回 0 条结果让模型老老实实回答暂无相关资料也绝不把低分噪声放进上下文。”“拦住噪声之后还要解决 512 字符小分块断章取义的问题。比如文档里有一段写着‘该配置默认开启生产环境严禁关闭’可‘该配置’到底指哪个参数写在上一个分块里。只把当前小分块给模型模型就会张冠李戴安到别的参数头上。派聪明默认开启了父块扩展Small-to-Big检索命中 512 字符的小分块后自动去 MySQL 取出同一份文档、同一个上传者在该分块前后相邻的各 1 个分块去掉相邻块之间的重叠文本后拼成最多 1500 个字符的完整父块单次检索所有父块总预算 6000 个字符交给大模型阅读而前端展示的引用页码和锚点仍然精确指向命中的小分块。对准确率要求更高的知识库还可以打开入库时的上下文描述生成每 8 个分块调用一次大模型生成 200 字以内的背景说明拼进检索文本同时在入库后通过向量余弦相似度0.9加字符二元组 Dice 相似度0.8自动扫描跨文档的数值和版本矛盾从源头减少错召回和资料冲突引发的幻觉。”“到了大模型生成回答这一步我们先把采样温度temperature压低到0.3、top_p设为0.9减少随机发散同时在提示词的 system 层和每次检索工具返回文本的开头做双重约束。只要检索返回了片段每句事实性陈述句末都必须按(来源#编号: 文件名 | 第X页)的格式标明出处如果检索回来的片段只够回答问题的前半截模型必须只回答片段能支撑的部分对片段没覆盖的后半截明确说明‘资料中没有相关说明’严禁为了凑出完整回答而凭空编造或者给没有依据的句子硬标一个来源编号。”如果模型还是编造了内容或者乱标了引用编号怎么发现“模型偶尔还是会出现‘虚假引用’也就是句子末尾规规矩矩标注了(来源#1: 派聪明架构文档.pdf | 第3页)但翻开第 3 页的分块一看里面根本没写这句话。为了抓出这种隐蔽的幻觉派聪明在生成结束后加了一道事后引用核验同时在线下用评测集做常态化抽检。”“当流式回答生成完毕、准备落库和推送完成事件之前引用抽取器会用正则表达式扫描整篇回答找出所有带来源#N标记的位置往前扫描到上一个句末标点把这句话和它引用的编号切分出来单句最长截取 300 个字符。接着把每一句陈述和对应编号的父块原文最长 800 个字符最多组装 12 对配成 JSON 数组在独立的核验线程池里发起一次 20 秒超时的非流式大模型调用。”// src/main/java/com/yizhaoqi/smartpai/service/citation/CitationVerificationService.java:156MapInteger, CitationVerdict aggregate(ListClaimPair pairs, MapInteger, Judgement judgements) { MapInteger, CitationVerdict verdicts new LinkedHashMap(); for (ClaimPair pair : pairs) { Judgement judgement judgements.get(pair.id()); if (judgement null) { continue; } CitationVerdict existing verdicts.get(pair.referenceNumber()); if (existing ! null existing.status() CitationVerdict.Status.SUSPICIOUS) { continue; } CitationVerdict verdict judgement.supported() ? new CitationVerdict(CitationVerdict.Status.SUPPORTED, null) : new CitationVerdict(CitationVerdict.Status.SUSPICIOUS, describe(pair, judgement)); verdicts.put(pair.referenceNumber(), verdict); } return verdicts;}“核验时拿去比对的是扩展后的父块文本因为生成模型当时看到的就是父块如果只拿 512 字符的小分块去核验模型合法引用了相邻分块的内容反而会被误判成幻觉。核查提示词要求只依据给定的文档片段判断能否直接推出该句陈述未提及或矛盾的一律判为不支持。汇总结果时采用一票否决同一个引用编号只要被回答里的任何一句话错误引用这个编号的状态就会被标记为SUSPICIOUS可疑连同核查理由一起写进引用映射随完成事件推给前端做降权和风险提示。”学AI大模型的正确顺序千万不要搞错了2026年AI风口已来各行各业的AI渗透肉眼可见超多公司要么转型做AI相关产品要么高薪挖AI技术人才机遇直接摆在眼前有往AI方向发展或者本身有后端编程基础的朋友直接冲AI大模型应用开发转岗超合适就算暂时不打算转岗了解大模型、RAG、Prompt、Agent这些热门概念能上手做简单项目也绝对是求职加分王给大家整理了超全最新的AI大模型应用开发学习清单和资料手把手帮你快速入门学习路线:✅大模型基础认知—大模型核心原理、发展历程、主流模型GPT、文心一言等特点解析✅核心技术模块—RAG检索增强生成、Prompt工程实战、Agent智能体开发逻辑✅开发基础能力—Python进阶、API接口调用、大模型开发框架LangChain等实操✅应用场景开发—智能问答系统、企业知识库、AIGC内容生成工具、行业定制化大模型应用✅项目落地流程—需求拆解、技术选型、模型调优、测试上线、运维迭代✅面试求职冲刺—岗位JD解析、简历AI项目包装、高频面试题汇总、模拟面经以上6大模块看似清晰好上手实则每个部分都有扎实的核心内容需要吃透我把大模型的学习全流程已经整理好了抓住AI时代风口轻松解锁职业新可能希望大家都能把握机遇实现薪资/职业跃迁这份完整版的大模型 AI 学习资料已经上传CSDN朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】