2026 首个真实厨房数据烹饪AI基础模型发布:模型背后需要哪些数据?
点击此处注册:新用户注册可领免费 50 积分!
橡鹿机器人在 WRC 发布了 CookingMuse 厨启,官方口径称其为全球首个基于真实厨房数据训练的多模态烹饪 AI 基础模型,同期还发布了 3K 视觉 AI 炒菜机器人与具身烹饪机器人"现炒方舟"。这类模型要"理解烹饪"而非"识别菜谱",训练数据的构成,直接决定了它能不能真正学会做菜。
文章目录
- 2026 首个真实厨房数据烹饪AI基础模型发布:模型背后需要哪些数据?
- 一、烹饪 AI 训练需要哪些数据
- 二、这些数据从哪来
- 三、教学视频为什么用实时采集
- 四、视频采集接口约定
- 五、单条视频采集:最小可运行示例
- 六、状态码处理与零成本退避重试
- 七、批量拉取一组烹饪教学视频
- 八、常见坑与排错
- 九、总结
一、烹饪 AI 训练需要哪些数据
一个"会做菜"的多模态模型,训练时要覆盖三类数据,缺一路,模型对烹饪的理解就有短板:
- 真实厨房操作数据:第一人称视角下的完整操作序列——手怎么拿铲、火候怎么调、食材怎么下锅,是模型学"动作因果"的核心,也是最稀缺的一类。
- 成体系的烹饪教学语料:大量公开的烹饪教学视频,画面对应动作、音频对应讲解、字幕对应步骤文本,正好是图像、音视频、文本三类模态的天然对齐样本,用于补齐菜系覆盖与步骤多样性。
- 菜谱与食材文本:结构化的菜谱、食材、步骤文本,作为语言侧的知识底座。
二、这些数据从哪来
上面三类数据,获取方式不一样——一部分可以直接用成品数据集,一部分得靠实时采集补:
- 真实厨房操作数据:第一人称、带动作的操作序列,最稀缺,用成品数据集打底最省事。
- 菜谱与食材文本:结构化的语言侧知识,用成品数据集直接补位。
- 烹饪教学视频:公开、量大但长尾、时效性强,成品数据集难以穷尽,需要实时采集补充。
Dataify 相关成品数据集
- EGO 数据:第一人称视角,覆盖"手怎么拿铲、食材怎么下锅"这类操作样本
- UMI 数据:手持夹爪操作数据,用于抓取与操作动作的模仿学习
- 多模态成品数据集:覆盖图像、音视频、文本、对话四类模态,可补菜谱与步骤语料
也就是说:真实操作数据与文本语料用现成数据集打底,剩下烹饪教学视频这块缺口,靠实时采集来补。
三、教学视频为什么用实时采集
教学视频这类素材,不适合用固定数据集穷尽,更适合按需实时采集,原因有二:
- 长尾且时效性强:分散在各视频平台,菜系、语言、时长各异,还在不断更新,固定数据集很难一次性覆盖全。
- 自建采集成本高:单个平台页面结构和取数方式各异;视频的画面 / 音频 / 字幕 / 元数据往往要分头获取再对齐;批量拉取还得处理失败重试与增量补料。
比较省事的做法,是用一个已经把"多分辨率画面 + 音频 + 多语言字幕 + 元数据"打包返回的采集接口,一次调用拿齐三路对齐素材,把精力留给后续清洗与对齐。下面就用 Dataify 视频数据采集 API 演示这一步。
四、视频采集接口约定
批量拉取 YouTube 视频数据,走 Dataify 的/builder端点,用spider_name指定目标平台、spider_id指定采集类型、spider_parameters传具体参数。
三个关键入参:
| 参数 | 说明 |
|---|---|
spider_name | 目标平台,如youtube.com |
spider_id | 采集器类型,如youtube_video-post_by-url(按视频 URL 取单条) |
spider_parameters | JSON 字符串,形如[{"url":"...","num_of_posts":"5"}] |
spider_parameters本身是一段 JSON 文本,requests用data=传即可,会自动完成表单编码。
五、单条视频采集:最小可运行示例
importjsonimportrequests TOKEN="YOUR_DATAIFY_TOKEN"BUILDER_ENDPOINT="https://scraperapi.dataify.com/builder"deffetch_video(video_url:str)->dict:"""按视频 URL 采集单条 YouTube 视频,同步取回音频/字幕/元数据。"""headers={"Authorization":f"Bearer{TOKEN}","Content-Type":"application/x-www-form-urlencoded",}spider_parameters=json.dumps([{"url":video_url}])payload={"spider_name":"youtube.com","spider_id":"youtube_video-post_by-url","spider_parameters":spider_parameters,}resp=requests.post(BUILDER_ENDPOINT,headers=headers,data=payload,timeout=60)ifresp.status_code!=200:raiseRuntimeError(f"HTTP{resp.status_code}:{resp.text[:200]}")data=resp.json()ifdata.get("code")!=200:raiseRuntimeError(f"业务错误 code={data.get('code')}:{data}")returndata/builder通道遵循与其它接口一致的响应码规则:HTTP 200 且业务code为 200 才算成功。这里先拦 HTTP 层非 200,再拦响应体信封里的业务code,两层都过了才往下取数据,避免把错误信封当正常结果解析。
返回体的分辨率、音频、字幕字段名以实际返回结构为准。视频数据采集 API 支持 720P 至 4K 多分辨率,字幕覆盖 100+ 语言,元数据与音视频一并返回,可直接作为多模态语料的三路对齐来源:
# 字段路径按返回实际结构解析,以下为占位示意defextract_multimodal(data:dict)->dict:item=data.get("data")or{}return{"title":item.get("title"),"url":item.get("url"),# 音频、字幕、分辨率字段名按返回实际结构改写"subtitles":item.get("subtitles"),"audio":item.get("audio"),"metadata":item.get("metadata"),}六、状态码处理与零成本退避重试
退避重试要区分"值得重试"和"重试无意义"。这是本接口计费与容错的一个实打实的点:
- 仅 200 计费;
- 429 / 500 / 504 不计费,属临时性错误,可零成本指数退避重试;
- 300 / 400 / 401 不计费,但重试逻辑上无意义(参数错、鉴权错、重定向),应直接抛错,不要浪费轮次。
importtime RETRYABLE={429,500,504}FATAL={300,400,401,403,404}deffetch_video_with_retry(video_url:str,max_retries:int=4)->dict:headers={"Authorization":f"Bearer{TOKEN}","Content-Type":"application/x-www-form-urlencoded",}payload={"spider_name":"youtube.com","spider_id":"youtube_video-post_by-url","spider_parameters":json.dumps([{"url":video_url}]),}forattemptinrange(max_retries):resp=requests.post(BUILDER_ENDPOINT,headers=headers,data=payload,timeout=60)ifresp.status_code==200:data=resp.json()code=data.get("code")ifcode==200:returndataifcodeinFATAL:raiseRuntimeError(f"业务码{code}无重试意义:{data}")ifcodeinRETRYABLE:time.sleep(2**attempt)continueraiseRuntimeError(f"未预期业务码{code}:{data}")ifresp.status_codeinFATAL:raiseRuntimeError(f"HTTP{resp.status_code}无重试意义")ifresp.status_codeinRETRYABLE:time.sleep(2**attempt)continueraiseRuntimeError(f"未预期 HTTP{resp.status_code}:{resp.text[:200]}")raiseRuntimeError(f"重试{max_retries}次仍失败:{video_url}")time.sleep(2 ** attempt)是指数退避,间隔按 1、2、4、8 秒递增,避免在对端临时压力大时高频重打。由于 429/500/504 不计费,这类重试不产生额外成本。
七、批量拉取一组烹饪教学视频
补充烹饪语料时通常一次要处理一批 URL。可对一组视频 URL 顺序调用带重试的采集函数,逐条落盘为 JSONL,方便后续做画面-字幕-音频的多模态对齐:
defbatch_collect(video_urls:list[str],out_path:str="cooking_corpus.jsonl")->None:withopen(out_path,"a",encoding="utf-8")asf:forurlinvideo_urls:try:data=fetch_video_with_retry(url)record=extract_multimodal(data)exceptRuntimeErrorase:print(f"[SKIP]{url}->{e}")continuef.write(json.dumps(record,ensure_ascii=False)+"\n")print(f"[OK]{url}")if__name__=="__main__":urls=["https://www.youtube.com/watch?v=VIDEO_ID_1","https://www.youtube.com/watch?v=VIDEO_ID_2",]batch_collect(urls)单条失败只跳过该条、不中断整批,失败 URL 打印出来另行补采。JSONL 每行一条,与后续训练管线的读取方式天然契合。若要定时增量补料,把batch_collect挂到调度器(如 cron 或 APScheduler)按天运行,并在连续失败达到阈值时触发告警即可。
八、常见坑与排错
照着上面跑,几个大概率会卡住的地方,对应现象与解法:
spider_parameters直接传了 list,报 400 或参数解析失败:这个字段要传的是JSON 字符串,不是 Python list。必须json.dumps([{...}])序列化后再放进data,直接传[{...}]会被表单编码成错误格式。- HTTP 是 200,但拿到的却是错误、往下解析全是空:
/builder出错时 HTTP 状态码可能仍是 200,真实错误码在响应体code字段里。只判resp.status_code == 200不够,必须再判data.get("code") == 200,否则会把错误信封当正常数据解析,落库一堆空值。 - 解析视频字段全部取到
None:示例里的subtitles/audio/metadata是占位字段名,真实返回结构未必同名。先把一条原始返回print出来看清实际层级和字段名,再按实际结构取值——不要照抄占位名。 - 本地跑一直失败、返回"不支持地区"类错误:
/builder面向海外公开平台,需从海外出口环境请求;用大陆本地 IP 直连大概率失败。放到海外服务器 / 海外出口再跑。 - 批量跑到一半整个中断:确认
batch_collect里对单条失败是continue跳过而非抛出。单条超时或个别视频异常不应让整批停摆,失败 URL 记录下来另行补采即可。
九、总结
CookingMuse 这类多模态烹饪模型的训练数据,可以按"用现成数据集打底、用实时采集补缺"来组织:
- 数据集打底:最稀缺的真实厨房操作数据,用 Dataify 的 EGO 第一人称视角数据、UMI 手持夹爪操作数据现成补齐,还可依托自有采集工厂按场景定制;菜谱、步骤等语言侧语料用多模态成品数据集补位。这部分是训练底座的主体。
- 采集补缺:现成数据集难以穷尽的公开烹饪教学视频,用 Dataify 视频数据采集 API 实时批量补位——一次调用同步拿回音频、字幕与元数据,直接构成图像、音视频、文本三路对齐素材。
采集环节的两个工程要点:两层响应校验(HTTP 状态码 + 业务code信封),以及按错误类型区分的退避重试——可重试的临时错误零成本退避,参数/鉴权类错误直接抛错。