尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

蚂蚁金服Agent算法岗一面:大模型微调与模型训练实战复盘

蚂蚁金服Agent算法岗一面:大模型微调与模型训练实战复盘 1. 从一面追问看 Agent 岗到底在考什么蚂蚁金服 Agent 算法岗的一面很多人以为是聊项目经历实际上面试官的追问密度远超预期。我把这次面试的追问逻辑拆开看核心就三件事你的 Agent 架构为什么这么设计、训练数据怎么构造、微调策略怎么验证有效。这三个问题串起来基本能判断一个候选人是不是真的做过端到端的模型训练还是只调过 API。先说 Agent 架构这块。面试官会问「为什么用意图识别架构」「意图和检索是什么关系」这其实是在考你对 Agent 决策链路的理解。一个典型的 Agent 系统用户输入进来之后先做意图分类再决定走检索、走工具调用还是直接生成。意图识别不是可有可无的装饰它直接决定了后续检索的召回策略和上下文构造方式。如果你回答「因为业界都这么做」基本就凉了。面试官想听的是你的业务场景里意图分类的粒度是多少、分类错了会怎样、有没有兜底机制。再说训练数据构造。面试官问「微调样本怎么构造、规模和分布」这是在验证你有没有真正做过数据工程。很多人做微调数据就是网上扒的或者随便标注的分布严重偏斜训练出来的模型在真实场景里一塌糊涂。面试官会追问「怎么证明微调后的模型更好」「怎么评估多轮问答能力」这两个问题直指评估体系。没有评估体系的微调等于盲人摸象。最后是微调策略。面试官问「为什么最后选择 8B 模型」「都是本地部署吗」这是在考你对模型选型和部署成本的权衡。8B 模型在消费级显卡上能跑14B 就要考虑量化70B 基本得上多卡。选 8B 不是因为它最强而是因为它在效果和成本之间找到了平衡点。面试官还会问「效果比 DeepSeek 更好吗、有评测吗、差距多少」这是在验证你有没有做过 baseline 对比还是自说自话。这三个考察点其实对应了 Agent 岗日常工作的三个核心环节架构设计、数据工程、模型训练与评估。面试官通过层层追问判断你是不是真的踩过坑、有没有形成方法论。如果你只是跟着教程跑过一遍微调这些追问基本接不住。我试过把这些问题整理成一份自查清单发现自己在「评估体系」和「数据分布」这两块最薄弱。后来补了评估集的构造方法和数据去偏策略再回头看这些问题思路清晰了很多。下面我把微调配置模板和训练流程验证清单整理出来你可以对照自查。2. TaoToken 前置把模型接入和微调环境先跑通在讲微调配置之前得先把模型接入的环境跑通。很多人在这一步就卡住了因为本地部署模型或者调用云端模型涉及 Base URL、API Key、Model ID 三件套的配置。我以 TaoToken 为例把接入流程走一遍后面微调验证的时候会用到。TaoToken 是一个模型接入平台官网地址是 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content API 地址是 https://taotoken.net/api 。它的作用是让你用一个统一的接口去调用不同的模型不用每个模型都去单独配置环境。对于做 Agent 开发的人来说这意味着你可以在同一个代码框架里切换模型做对比实验不用改底层调用逻辑。先拿 API Key。进入控制台找到 API Keys 页面创建一个新的 Key。这个 Key 就是你调用模型接口的凭证不要泄露。创建完之后你会得到一个以 sk- 开头的字符串复制保存好。接下来配置环境变量。在终端里执行export TAOTOKEN_API_KEYsk-你的key export TAOTOKEN_BASE_URLhttps://taotoken.net/api如果你用的是 Python可以在代码里这样初始化import os from openai import OpenAI client OpenAI( api_keyos.getenv(TAOTOKEN_API_KEY), base_urlos.getenv(TAOTOKEN_BASE_URL) ) response client.chat.completions.create( modelclaude-sonnet-4-20250514, messages[ {role: user, content: 用一句话解释什么是 Agent} ] ) print(response.choices[0].message.content)这段代码跑通说明你的接入环境没问题。注意 model 参数不同模型的 ID 不一样你可以在模型对话页面查看可用的模型列表。如果你要做微调实验建议先用一个稳定的模型做 baseline比如 Claude 或者 GPT 系列然后再对比你微调后的模型。对于长期做 Agent 开发的场景可以考虑 Coding Plan它提供了更稳定的调用额度和更低的延迟。如果你只是做实验按量付费的 API Keys 就够了。接入文档在 https://taotoken.net/doc 里面有详细的参数说明和错误码解释。遇到问题先查文档大部分报错都有对应的解决方案。环境跑通之后你就可以开始构造微调数据了。下面进入正题。3. 可复制配置微调训练模板与数据构造流程微调的核心不是调参而是数据。面试官问「微调样本怎么构造、规模和分布」其实是在考你有没有数据工程的思维。我下面给出一套可复制的配置模板包括数据格式、训练参数和评估集构造方法。先说数据格式。Agent 场景的微调数据通常包含三个部分系统提示、用户输入、模型输出。如果你做的是意图识别微调数据格式可以是这样{ messages: [ {role: system, content: 你是一个意图分类助手请将用户输入分类为检索、工具调用、直接回答。}, {role: user, content: 帮我查一下北京今天的天气}, {role: assistant, content: 检索} ] }如果你做的是多轮问答微调数据里要包含历史对话{ messages: [ {role: system, content: 你是一个医疗诊断助手请根据用户描述给出诊断建议。}, {role: user, content: 我最近总是头晕}, {role: assistant, content: 头晕可能由多种原因引起请问您是否伴有恶心、耳鸣或视力模糊}, {role: user, content: 有点恶心}, {role: assistant, content: 建议您先测量血压如果血压正常可能需要检查颈椎或内耳前庭功能。} ] }数据规模方面意图识别任务通常 5000 到 10000 条就够了多轮问答任务建议 20000 条以上。分布要均衡每个意图类别的样本数不要差太多否则模型会偏向多数类。训练参数配置以 LoRA 微调为例给出一个可复制的 YAML 配置model_name_or_path: Qwen/Qwen2.5-8B stage: sft do_train: true finetuning_type: lora lora_target: all lora_rank: 8 lora_alpha: 16 lora_dropout: 0.05 dataset: agent_intent_train template: qwen cutoff_len: 2048 max_samples: 10000 overwrite_cache: true preprocessing_num_workers: 8 output_dir: ./output/qwen2.5-8b-lora logging_steps: 10 save_steps: 500 plot_loss: true overwrite_output_dir: true per_device_train_batch_size: 2 gradient_accumulation_steps: 8 learning_rate: 1.0e-4 num_train_epochs: 3.0 lr_scheduler_type: cosine warmup_ratio: 0.1 bf16: true ddp_timeout: 180000000 val_size: 0.1 per_device_eval_batch_size: 2 eval_strategy: steps eval_steps: 100这个配置里lora_rank 设为 8 是保守选择如果你的数据量大、任务复杂可以调到 16 或 32。learning_rate 用 1e-4 是 LoRA 微调的常见起点如果 loss 震荡厉害降到 5e-5。num_train_epochs 设为 3是因为 LoRA 微调通常 2 到 3 轮就够了再多容易过拟合。评估集构造建议从训练数据里留出 10% 作为验证集另外单独构造 200 条测试集覆盖所有意图类别和边界情况。测试集不要和训练集有重叠否则评估结果不可信。训练启动命令llamafactory-cli train config/lora_sft.yaml训练过程中观察 loss 曲线。如果训练 loss 持续下降但验证 loss 开始上升说明过拟合了要减少 epoch 或者增加 dropout。如果 loss 一直不降检查数据格式是否正确、学习率是否太小。训练完成后用测试集评估。评估指标包括准确率、召回率、F1 值。对于多轮问答任务还要评估多轮一致性比如用同一个问题换不同问法看模型回答是否一致。这套流程跑下来你对微调的理解会比只看教程深很多。面试官问「怎么证明微调后的模型更好」你就可以拿出评估集和 baseline 对比数据而不是空口说「感觉更好了」。4. 验证请求用测试集跑通评估流程训练完模型下一步是验证。很多人训练完就结束了没有验证环节这是大忌。面试官问「有评测吗、差距多少」就是在验证你有没有闭环思维。验证的第一步是加载微调后的模型。如果你用的是 LoRA需要先合并权重llamafactory-cli export config/lora_sft.yaml合并后的模型保存在 output_dir 指定的目录里。然后用这个模型跑测试集import json from transformers import AutoModelForCausalLM, AutoTokenizer model_path ./output/qwen2.5-8b-lora-merged tokenizer AutoTokenizer.from_pretrained(model_path) model AutoModelForCausalLM.from_pretrained(model_path, device_mapauto) test_data json.load(open(data/test_set.json)) correct 0 total 0 for item in test_data: messages item[messages][:-1] expected item[messages][-1][content] text tokenizer.apply_chat_template(messages, tokenizeFalse, add_generation_promptTrue) inputs tokenizer(text, return_tensorspt).to(model.device) outputs model.generate(**inputs, max_new_tokens64, do_sampleFalse) response tokenizer.decode(outputs[0][inputs[input_ids].shape[1]:], skip_special_tokensTrue) total 1 if response.strip() expected.strip(): correct 1 print(f准确率: {correct / total:.2%})这段代码跑完你会得到一个准确率数字。如果准确率低于 80%说明微调效果不理想需要检查数据质量或者调整训练参数。如果准确率高于 95%要警惕过拟合用另一批没见过的数据再测一次。除了准确率还要看混淆矩阵。比如意图识别任务哪些类别容易混淆是数据问题还是模型能力问题。如果「检索」和「工具调用」经常混淆说明这两类的边界在数据里定义不清需要重新标注。多轮问答的评估更复杂。可以用 GPT-4 或者 Claude 做裁判给模型的回答打分。评分维度包括相关性、准确性、完整性、一致性。每个维度 1 到 5 分取平均分作为最终得分。def evaluate_with_judge(question, answer, reference): prompt f请评估以下回答的质量从相关性、准确性、完整性、一致性四个维度打分每个维度1-5分。 问题{question} 参考回答{reference} 模型回答{answer} 请输出JSON格式{{relevance: 分数, accuracy: 分数, completeness: 分数, consistency: 分数}} response client.chat.completions.create( modelclaude-sonnet-4-20250514, messages[{role: user, content: prompt}] ) return json.loads(response.choices[0].message.content)用裁判模型评估的时候要注意裁判模型本身也有偏差。最好用两个不同的裁判模型交叉验证取平均分。验证流程跑通之后你手里就有了 baseline 和微调模型的对比数据。面试官问「效果比 DeepSeek 更好吗、差距多少」你可以直接拿出数字在测试集上微调模型准确率 92%baseline 准确率 85%提升 7 个百分点。这比说「感觉更好」有说服力得多。5. 本篇常见错排查401、local proxy failed 与 OAuth 报错接入和训练过程中最容易遇到的报错就那么几个。我把它们整理出来你遇到的时候可以直接对照排查。401 Unauthorized这个报错说明你的 API Key 不对或者没传。检查三件事Key 是否复制完整、环境变量是否生效、请求头里是否带了 Authorization。如果你用的是 TaoToken确认 Base URL 是 https://taotoken.net/api 不要多加斜杠或者路径。有时候 Key 创建后需要等几秒才生效如果刚创建就调用可能会报 401等一分钟再试。local proxy failed这个报错通常出现在你本地起了代理服务但代理配置不对。检查你的 HTTP_PROXY 和 HTTPS_PROXY 环境变量如果不需要代理直接 unset 掉。如果你用的是公司网络可能需要配置 NO_PROXY 把本地地址排除掉。另外有些模型客户端会读取系统代理设置检查一下系统网络配置里有没有开启代理。reading choices 报错这个报错一般是响应格式不对。如果你用的是 OpenAI 兼容接口返回的 JSON 里应该有 choices 字段。如果报错说 reading choices 失败可能是模型返回了非标准格式或者你的代码里解析逻辑有问题。检查 response 的原始内容看看是不是返回了错误信息而不是正常的 completion。OAuth 报错如果你用的是 Claude Code 或者类似的工具可能会遇到 OAuth 认证失败。检查你的 token 是否过期重新生成一个。如果是 Claude Code确认 settings.json 里的配置是否正确{ apiKey: sk-你的key, baseUrl: https://taotoken.net/api, model: claude-sonnet-4-20250514 }三件套 Base URL、Key、Model ID 缺一不可。Model ID 写错也会报 OAuth 错误因为服务端找不到对应的模型。训练 loss 不下降检查数据格式是否正确特别是 messages 字段的 role 和 content 是否配对。检查学习率是否太小LoRA 微调建议 1e-4 起步。检查 batch size 是否太小如果显存够适当增大 batch size 或者 gradient accumulation steps。显存不足 OOM降低 batch size增大 gradient accumulation steps。开启 gradient checkpointing。用 4bit 量化加载模型。如果还是不够换更小的模型或者更短的 cutoff_len。评估结果异常高检查测试集和训练集是否有重叠。检查评估代码是否正确比如是否把 padding token 也算进去了。用另一批完全没见过的数据再测一次。这些报错我基本都踩过最坑的是 local proxy failed排查了半天才发现是系统代理没关。后来养成习惯跑训练之前先检查环境变量省了很多时间。6. 从面试复盘到日常训练把验证清单用起来面试官问「项目大概做了多久」「平时怎么学习大模型新技术」这两个问题看似闲聊其实是在判断你的工程习惯和学习能力。Agent 岗的技术迭代很快今天用的微调方法半年后可能就过时了。所以面试官更看重你是不是有系统的学习方法而不是你当前会多少。我自己的习惯是每做一个微调实验都记录三件事数据构造方法、训练参数、评估结果。时间长了就形成了一份自己的验证清单。下次遇到新任务先对照清单过一遍避免重复踩坑。这份清单包括数据来源是否可靠、分布是否均衡、评估集是否独立、baseline 是否合理、训练参数是否有依据、验证指标是否全面。每次实验前过一遍能省很多返工时间。对于 Agent 岗的面试准备我建议你把做过的项目按「架构设计、数据工程、训练评估」三个维度拆解每个维度准备两个具体案例。面试官追问的时候你能拿出细节而不是泛泛而谈。另外多关注业界 benchmark 和论文但不要盲目跟风。面试官问「有参考业界 benchmark 吗」你可以说参考了但更重要的是你自己的业务评估集。业界 benchmark 只能说明模型在通用任务上的能力不能替代业务场景的验证。最后如果你要做长期 Agent 开发建议把模型接入和微调流程标准化。用统一的接口调用不同模型用统一的格式构造数据用统一的流程评估效果。这样切换模型或者调整策略的时候成本会低很多。TaoToken 的模型对话功能可以用来快速验证模型能力Coding Plan 适合长期编码和 Agent 开发场景。接入文档里有详细的配置说明遇到问题先查文档大部分报错都有解决方案。把环境跑通把数据构造好把评估做扎实面试的时候自然有底气。
返回列表