如何用 Nebius Data Lab 的 70B 教师模型批量推理生成客服微调训练数据

发布时间:2026/9/15 12:02:28

如何用 Nebius Data Lab 的 70B 教师模型批量推理生成客服微调训练数据 如何用 Nebius Data Lab 的 70B 教师模型批量推理生成客服微调训练数据【免费下载链接】Nebius-CookbookA collection of projects showcasing RAG, agents, workflows, and other AI use cases项目地址: https://gitcode.com/GitHub_Trending/ne/Nebius-Cookbook如果你要给一个客服模型做微调缺的不是训练代码而是一批高质量的问答训练样本。Nebius-Cookbook 的 fine_tuning/customer_support_datalab 示例给出了一条完整路径先用 8B 基线模型生成一轮客服对话把原始数据集上传到 Nebius Data Lab再让meta-llama/Llama-3.3-70B-Instruct这个 70B 教师模型对整份数据集做批量推理batch inference最后把教师模型的输出导出、过滤、改写成可直接用于 LoRA 微调的对话式 JSONL。本文覆盖其中“生成训练数据”的四个步骤。整个流程由 customer_support_datalab_finetuning_tutorial.ipynb 支撑所有命令、payload 和过滤逻辑都以该 notebook 为准。运行前需要准备什么Notebook 的 Prerequisites 一节列出了三项前提Nebius API key导出为环境变量NEBIUS_API_KEYPython 环境中已安装openai和requestspip install openai requests账号有权限创建 Data Lab 数据集、微调任务和私有自定义模型。流程中用到的关键常量均来自 notebook 初始化单元格API_KEY os.environ[NEBIUS_API_KEY] BASE_URL https://api.tokenfactory.nebius.com/v1/ CONTROL_URL https://api.tokenfactory.nebius.com BASE_MODEL meta-llama/Llama-3.1-8B-Instruct # 基线学生模型 TEACHER_MODEL meta-llama/Llama-3.3-70B-Instruct # 70B 教师模型 DATA_LAB_FOLDER /demo/customer-support # Data Lab 中数据集所在文件夹 BATCH_COMPLETION_WINDOW 24h # 批量推理完成窗口中间产物会写入nebius-datalab-pipeline/scripts/artifacts/目录notebook 还会把各步骤产出的 dataset ID、operation ID 等写入customer_notebook_state.json这样中断后可以从后续步骤重跑而不丢 ID。notebook 通过向上查找nebius-datalab-pipeline/scripts/customer.py来定位仓库根目录找不到时就以当前工作目录为根独立运行时产物同样落在上述相对路径下。示例场景使用两套系统提示词SUPPORT_SYSTEM_PROMPT描述 Northwind Gadgets 的退换、退款、保修等政策会写入每条训练样本TEACHER_SYSTEM_PROMPT则让教师模型以“资深客服政策专家”口吻作答。领域问题由DOMAIN_TOPICS列表提供共 10 条如耳机到货即损坏、未使用商品退货、礼品卡退款等换自己的业务时替换这个列表和两套提示词即可。第一步用 8B 基线模型生成初始客服对话批量推理的输入不是凭空写的 prompt 列表而是先用较小的BASE_MODEL对每个领域问题生成一次回答得到prompt/completion对。这一步让后续教师-学生蒸馏的原始数据集更接近真实客服场景。def step1_generate_inference_logs(topics: list[str]) - list[dict[str, Any]]: logs: list[dict[str, Any]] [] for topic in topics: resp client.chat.completions.create( modelBASE_MODEL, messages[ {role: system, content: SUPPORT_SYSTEM_PROMPT}, {role: user, content: topic}, ], max_tokens256, ) logs.append({ prompt: topic, completion: resp.choices[0].message.content, model: BASE_MODEL, }) print(f✓ {topic[:70]}) return logs logs step1_generate_inference_logs(DOMAIN_TOPICS)其中client是OpenAI(base_urlBASE_URL, api_keyAPI_KEY)创建的 OpenAI 兼容客户端。每完成一个 topic 会打印一行确认。跑完后logs里应包含与DOMAIN_TOPICS等量的prompt/completion记录。第二步把原始数据集上传到 Data Lab这一步把基线对话写成结构化 JSONL并以带 schema 的 dataset 形式上传到 Data Lab。每行保留custom_id后续把教师输出对回原始 prompt 用、原始prompt、给教师模型的messages以及基线回答base_completion以便追溯。def teacher_messages(prompt: str) - list[dict[str, str]]: return [ {role: system, content: TEACHER_SYSTEM_PROMPT}, {role: user, content: prompt}, ] def step2_upload_raw_dataset(logs: list[dict[str, Any]]): path ARTIFACT_DIR / customer_raw_dataset.jsonl dataset_name fcustomer-support-raw-{uuid.uuid4().hex[:8]} rows, id_map [], {} with path.open(w) as handle: for entry in logs: record { custom_id: uuid.uuid4().hex, prompt: entry[prompt], messages: teacher_messages(entry[prompt]), base_completion: entry[completion] or , base_model: entry[model], } handle.write(json.dumps(record) \n) rows.append(record) id_map[record[custom_id]] entry[prompt] payload { name: dataset_name, schema: [ {name: custom_id, type: {name: string}}, {name: prompt, type: {name: string}}, {name: messages, type: {name: json}}, {name: base_completion, type: {name: string}}, {name: base_model, type: {name: string}}, ], folder: DATA_LAB_FOLDER, rows: rows, } dataset datalab_request(POST, /v1/datasets, json_bodypayload).json() print(Raw dataset ID:, dataset[id]) print(Raw dataset version:, dataset[current_version]) return dataset[id], dataset[current_version], id_map raw_dataset_id, raw_dataset_version, id_map step2_upload_raw_dataset(logs)datalab_request是对控制面 API 的统一封装CONTROL_URL Bearer 鉴权超时 60 秒非 2xx 会抛错。判断这一步成功的依据打印出Raw dataset ID和Raw dataset version。批量推理必须绑定 dataset 的id和version这两个值要保存下来——notebook 会把它们写入状态文件。本地同时落盘的customer_raw_dataset.jsonl里id_map依赖的custom_id与prompt映射是第四步恢复原始问题的来源。第三步用 70B 教师模型跑批量推理拿到 dataset 的 ID 和 version 后向 Data Lab 提交一个batch_inference类型的 operation。核心 payload 如下src指向刚上传的数据集mapping指定messages和custom_id两列、并把max_tokens固定为 1024params里指定TEACHER_MODEL和 24 小时的完成窗口。def step3_run_batch_inference(source_dataset_id, source_dataset_version): payload { type: batch_inference, src: [ { id: source_dataset_id, version: source_dataset_version, mapping: { type: text_messages, messages: {type: column, name: messages}, custom_id: {type: column, name: custom_id}, max_tokens: {type: text, value: 1024}, }, } ], dst: [], params: { model: TEACHER_MODEL, completion_window: BATCH_COMPLETION_WINDOW, }, } operation datalab_request(POST, /v1/operations, json_bodypayload).json() if not operation.get(dst): raise RuntimeError(fNo destination dataset returned: {json.dumps(operation, indent2)}) dst_dataset_id operation[dst][0][id] print(fOperation: {operation[id]} status{operation[status]}) print(Output dataset ID:, dst_dataset_id) while True: time.sleep(POLL_SECONDS) operation datalab_request(GET, f/v1/operations/{operation[id]}).json() print(Batch status:, operation[status]) if operation[status] in {succeeded, failed, cancelled, unknown}: break if operation[status] ! succeeded: raise RuntimeError(fBatch inference ended with status{operation[status]}) return operation[id], dst_dataset_id operation_id, output_dataset_id step3_run_batch_inference(raw_dataset_id, raw_dataset_version)批量推理是异步任务notebook 明确提示operation 会在queued或running状态停留一段时间才结束。代码每 30 秒轮询一次GET /v1/operations/{id}直到状态落入succeeded、failed、cancelled、unknown之一只有succeeded才继续其余状态直接抛出RuntimeError。成功后拿到operation_id和输出数据集output_dataset_id教师模型的结果就存在这个新的输出数据集里。第四步导出教师输出并改写成微调训练数据这是整个数据生成流程中价值最高的一步把教师模型的批量输出导出为 JSONL按custom_id对回原始 prompt丢弃弱回答最终写成每条样本都带 system / user / assistant 三个角色的对话式训练文件。def step4_download_and_curate(output_dataset_id: str, id_map: dict[str, str]) - Path: export_response datalab_request( GET, f/v1/datasets/{output_dataset_id}/export, params{format: jsonl}, ) raw_export_path ARTIFACT_DIR / customer_batch_output.jsonl raw_export_path.write_text(export_response.text) output_path ARTIFACT_DIR / customer_curated_training.jsonl records [json.loads(line) for line in export_response.text.strip().splitlines() if line.strip()] written 0 with output_path.open(w) as handle: for rec in records: prompt extract_prompt_from_record(rec, id_map) reply extract_reply_from_record(rec) if not prompt or not reply or len(reply) 50: continue sample { messages: [ {role: system, content: SUPPORT_SYSTEM_PROMPT}, {role: user, content: prompt}, {role: assistant, content: reply}, ] } handle.write(json.dumps(sample) \n) written 1 if not records: raise RuntimeError(fBatch output dataset {output_dataset_id} exported no rows.) if written 0: raise RuntimeError( Batch output export succeeded, but no usable assistant replies were found. fInspect {raw_export_path} for the returned schema. ) print(fCurated {written} examples - {output_path}) return output_path几个过滤与提取规则值得注意一行记录能保留的前提是能恢复出原始prompt、能提取出教师回答reply且len(reply) 50字符。短回答会被直接丢弃这决定了最终训练集的大小。extract_prompt_from_record优先用id_mapcustom_id→ prompt对回原始问题对不上时再从记录的messages/completed_dialogue/prompt字段里找 user 消息。extract_reply_from_record会依次尝试completion、assistant_response、output_text、text等字段以及response.body.choices这类 OpenAI 风格结构最后回退到completed_dialogue/messages里最后一条 assistant 消息。这套多路提取逻辑正是为了兼容批量推理返回的不同 schema——这也是为什么原始导出文件要完整落盘。成功的判断方式很直接终端打印Curated {written} examples - {output_path}且nebius-datalab-pipeline/scripts/artifacts/customer_curated_training.jsonl中每行都是{messages: [system, user, assistant]}结构。如果提示词全部丢失或导出行为 0step4会抛出带路径的错误信息让你去检查对应的导出文件。训练数据就绪后的下一步与排查生成出的customer_curated_training.jsonl就是微调阶段的输入。同一 notebook 的后续步骤把它通过 OpenAI 兼容的 Files API 以purposefine-tune上传再对BASE_MODELmeta-llama/Llama-3.1-8B-Instruct发起 LoRA 微调任务超参数为learning_rate2e-5、n_epochs2、loraTrue、lora_r16、lora_alpha16、lora_dropout0.05、packingTrue。notebook 特别提醒微调调用必须使用当前的 LoRA 字段名lora、lora_r、lora_alpha、lora_dropout旧字段名如lora_rank不会产生可部署的 LoRA 任务。之后再部署 adapter 并做 smoke test完整代码见 notebook 原文。数据链路出了问题时notebook 的 Troubleshooting 一节给出的排查方式随时用load_state()重新打开状态文件从断点步骤继续不必从头重跑调试数据问题时检查scripts/artifacts/下的三个文件customer_raw_dataset.jsonl上传内容、customer_batch_output.jsonl教师模型原始输出、customer_curated_training.jsonl最终训练集三者正好对应第四步的输入与输出若批量推理最终状态不是succeeded先看轮询打印的Batch status变化再对照operation_id在 Data Lab 侧排查若跳过前面步骤直接跑第四步id_map可以从落盘的customer_raw_dataset.jsonl里重新加载load_id_map_from_artifact()但该文件不存在时会提示先重跑第一步和第二步。这条流程的边界也要清楚示例只覆盖一个客服场景训练集大小受 50 字符过滤规则限制批量推理有 24 小时完成窗口且任务会排队。想适配账单、保修、欺诈或内部 IT helpdesk 等其他助手notebook 说明只需替换DOMAIN_TOPICS和两套策略提示词其余 Data Lab 上传、70B 批量推理与数据改写逻辑保持不变。【免费下载链接】Nebius-CookbookA collection of projects showcasing RAG, agents, workflows, and other AI use cases项目地址: https://gitcode.com/GitHub_Trending/ne/Nebius-Cookbook创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
延伸阅读

更多相关文章

2026/9/15 11:57:27

Chrome Manifest V3迁移指南:安全、性能与开发范式重构

1. 这不是一次普通更新:Manifest V2下架背后的架构级重构如果你最近打开chrome://extensions/页面,发现曾经熟悉的“开发者模式”开关旁边多了一行灰色小字——“Manifest V2 扩展将在未来版本中被禁用”,或者更直接地,你试图拖入…

2026/9/15 11:57:27

dotnet/skills .NET 9升10迁移实战:升级要点与回归检查清单

dotnet/skills .NET 9升10迁移实战:升级要点与回归检查清单 【免费下载链接】skills Repository for skills to assist AI coding agents with .NET and C# 项目地址: https://gitcode.com/GitHub_Trending/skills17/skills 在 .NET 10 发布后,把…

2026/9/15 12:12:29

从GC算法到垃圾回收器:JVM内存管理核心解析

Java语言与虚拟机:GC算法与垃圾回收器先聊点实际的。不管是校招刚入门还是大厂面试已经背到烂熟,Java开发者总会撞上一个绕不开的名词——GC,也就是垃圾回收。工作几年后你可能会发现,线上服务频繁Full GC、接口突然卡顿几十秒、内…

2026/9/15 12:12:29

LFM雷达回波仿真:匹配滤波与多目标脉冲压缩参数设计

简介:面向雷达信号处理与MATLAB仿真的学习者,这套压缩包围绕LFM线性调频信号与脉冲压缩雷达,实现了多目标回波信号的完整仿真,适合课程设计、科研入门以及需要快速搭建雷达回波模型的工程人员。包体内共2个文件:1个MAT…

2026/9/15 12:12:29

启英泰伦离线语音固件:Excel配置全流程解析

1. 这不是“开发”,是把语音识别能力像填表一样装进硬件里启英泰伦(ChipInn)的离线语音方案,业内常被称作“Excel驱动型固件开发”,这个说法乍听有点玄,但实测下来真不是营销话术。我带过三支嵌入式团队做过…

2026/9/15 12:12:29

数字贸易限制指数数据集解析与应用实践

1. 项目概述:数字贸易限制指数数据集的价值与应用这个数据集记录了2014至2024年间全球数字贸易限制情况的核心指标,特别聚焦于基础设施完备度和电子交易成熟度两大维度。作为数字经济发展的重要风向标,这类数据对政策研究者、跨国企业战略部门…

2026/9/15 12:12:29

永磁同步电机参数辨识的粒子群优化算法应用

1. 永磁同步电机参数辨识的工程挑战在电机控制领域,永磁同步电机(PMSM)因其高功率密度、高效率等优势,已成为工业驱动和新能源汽车的核心部件。但实际应用中,电机参数的准确获取一直是困扰工程师的难题。传统实验室测量方法需要拆解电机&…

2026/9/15 4:54:30

拯救者Y7000黑屏故障排查与维修实战指南

1. 项目概述:一台黑屏的拯救者Y7000,到底卡在哪一步? 联想拯救者Y7000系列笔记本,从2018年第一代搭载i5-8300H开始,到后来的i7-9750H、i7-10750H、i5-11400H,再到2023年款的R7-7840HS,它始终是学…

2026/9/15 0:01:16

AI英语单词APP开发:自适应学习算法与移动端优化实践

1. 项目概述 作为一名在移动应用开发领域摸爬滚打多年的老手,我最近完成了一个AI英语单词APP的开发项目。这个项目将传统单词记忆方法与现代AI技术相结合,打造了一款能够智能适应不同用户学习习惯的英语学习工具。 市面上大多数单词APP都存在一个通病&a…

2026/9/15 0:01:16

Flutter与OpenHarmony结合开发手语学习APP实战

1. 项目背景与核心价值作为一名同时接触过Flutter和OpenHarmony的开发者,最近我完成了一个基于Flutter for OpenHarmony的手语学习APP实战项目。这个项目最大的特点在于实现了跨平台框架与国产操作系统深度结合的创新实践——用Flutter开发的应用能完美运行在OpenHa…

2026/9/15 0:01:16

六个月成为机器人工程师:从ROS2到SLAM的实战路径

1. 六个月的紧迫感从哪来:先搞清楚你要成为哪种机器人工程师说实话,六个月的期限并不是一个宽松的时间线。市面上任何一本正经的机器人学教材都超过五百页,ROS2的官方文档可以翻到你怀疑人生,再加上ABB、KUKA这些工业机器人厂家动…

2026/9/14 11:59:31

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/14 13:53:59

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/15 11:42:23

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
咨询二维码