2026 首个真实厨房数据烹饪AI基础模型发布:模型背后需要哪些数据?
2026/8/28 22:13:45 网站建设 项目流程

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_parametersJSON 字符串,形如[{"url":"...","num_of_posts":"5"}]

spider_parameters本身是一段 JSON 文本,requestsdata=传即可,会自动完成表单编码。

五、单条视频采集:最小可运行示例

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信封),以及按错误类型区分的退避重试——可重试的临时错误零成本退避,参数/鉴权类错误直接抛错。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询