OpenClaw美食助手:Qwen2.5-VL-7B根据冰箱照片推荐菜谱

1. 为什么需要AI美食助手

每次打开冰箱看着满满当当的食材却不知道做什么菜,这种困扰我持续了整整三年。直到上个月在星图平台发现Qwen2.5-VL-7B这个多模态模型,突然意识到OpenClaw+视觉大模型的组合或许能解决这个世纪难题。

传统菜谱App的痛点很明确——需要手动输入已有食材,而实际场景中我们更习惯用手机随手拍下冰箱内容。Qwen2.5-VL-7B的视觉理解能力可以直接分析照片中的食材,配合OpenClaw的自动化流程,实现了从"拍照"到"菜谱"的无缝衔接。这个方案最吸引我的是整个过程完全在本地完成,不用担心食材照片上传到云端的安全隐患。

2. 环境准备与模型部署

2.1 基础组件安装

我的实验环境是一台MacBook Pro(M1芯片,16GB内存),首先通过Homebrew安装OpenClaw:

brew install node@22
npm install -g openclaw@latest
openclaw --version

Qwen2.5-VL-7B的部署选择了星图平台的GPTQ量化镜像,主要考虑是:

  • 7B模型在消费级显卡上可流畅运行
  • GPTQ量化后显存占用控制在8GB以内
  • 自带chainlit前端方便调试

在平台控制台完成镜像部署后,记下API访问地址(如http://192.168.1.100:8000/v1),这个地址后续需要配置到OpenClaw中。

2.2 OpenClaw对接视觉模型

修改OpenClaw配置文件~/.openclaw/openclaw.json,增加模型提供商配置:

{
  "models": {
    "providers": {
      "qwen-vl": {
        "baseUrl": "http://192.168.1.100:8000/v1",
        "apiKey": "your-api-key",
        "api": "openai-completions",
        "models": [
          {
            "id": "qwen2.5-vl-7b",
            "name": "Qwen-Vision",
            "contextWindow": 32768,
            "maxTokens": 4096
          }
        ]
      }
    }
  }
}

配置完成后执行命令验证连接:

openclaw gateway restart
openclaw models list

3. 构建食材识别工作流

3.1 拍照与上传机制

在OpenClaw的Web控制台,我创建了一个专用工作区food-helper,主要包含两个自动化脚本:

  1. 图片接收脚本upload.py):
from openclaw.sdk import workspace
import base64

def handle_image(file_path):
    with open(file_path, "rb") as f:
        image_data = base64.b64encode(f.read()).decode('utf-8')
    workspace.store("current_fridge", image_data)
  1. 模型调用脚本analyze.py):
from openclaw.sdk import models, workspace

def analyze_fridge():
    image_data = workspace.get("current_fridge")
    prompt = """请分析这张冰箱照片,列出所有可见的完整食材(排除调味品和已开封的包装食品),
    用JSON格式返回,字段包括:name(食材名称)、quantity(估算数量)、freshness(新鲜程度1-5)"""
    
    response = models.generate(
        model="qwen2.5-vl-7b",
        messages=[{
            "role": "user",
            "content": [
                {"type": "text", "text": prompt},
                {"type": "image_url", "image_url": f"data:image/jpeg;base64,{image_data}"}
            ]
        }]
    )
    return response.choices[0].message.content

3.2 实际测试中的调优

第一次测试时就遇到了典型问题——模型把酱油瓶识别成了"深色液体食材"。通过调整prompt增加了"排除调味品"的明确指令后,识别准确率显著提升。另一个发现是,明确要求返回JSON格式比自然语言描述更利于后续处理。

经过20次不同冰箱场景的测试,最终确定的优化prompt包含:

  • 食材完整性要求(排除开封包装)
  • 数量估算标准(如"1个胡萝卜"而非"一些胡萝卜")
  • 新鲜度评估标准
  • 严格的JSON输出格式

4. 菜谱推荐系统实现

4.1 从食材到菜谱的转换

获得食材清单后,第二阶段是生成可行的菜谱方案。这里我设计了两步走策略:

  1. 食材预处理:将模型返回的JSON数据转换为自然语言描述
  2. 菜谱生成:结合用户偏好生成3个候选方案

关键实现代码:

def generate_recipes(ingredients_json):
    # 转换食材数据
    ingredients = json.loads(ingredients_json)
    ingredient_desc = "、".join([f"{i['name']}{i['quantity']}" for i in ingredients])
    
    # 生成候选菜谱
    prompt = f"""根据以下食材:{ingredient_desc},请推荐3道家常菜。
    每道菜需要包含:
    1. 菜名
    2. 所需食材及用量(必须在给定食材范围内)
    3. 简要烹饪步骤
    4. 预估准备时间
    返回格式为Markdown表格"""
    
    response = models.generate(
        model="qwen2.5-vl-7b",
        messages=[{"role": "user", "content": prompt}]
    )
    return response.choices[0].message.content

4.2 个性化偏好设置

通过~/.openclaw/workspace/prefs.json文件存储用户偏好:

{
    "cuisine_preference": ["中式", "日式"],
    "cooking_time_max": 40,
    "avoid_ingredients": ["香菜"],
    "skill_level": "中级"
}

在生成prompt时会自动注入这些参数,例如:

用户偏好:中式或日式料理,烹饪时间不超过40分钟,避免使用香菜,烹饪技能为中级水平

5. 完整工作流体验

实际使用时的操作流程非常简单:

  1. 用手机拍摄冰箱内部照片
  2. 通过OpenClaw网页端上传图片
  3. 等待约30秒获取分析结果
  4. 查看系统推荐的3个菜谱方案
  5. 点击选择后生成详细的步骤图

最令我惊喜的是模型生成的步骤图——Qwen2.5-VL不仅能描述步骤,还能生成对应的示意图。比如选择"番茄炒蛋"后,得到的反馈包含:

  • 食材预处理示意图(番茄切块大小、鸡蛋打散程度)
  • 火候控制示意图(中火炒蛋、大火收汁)
  • 装盘建议图

6. 实践中的经验与教训

这个项目最大的收获是认识到多模态模型在实际应用中的潜力。但过程中也踩了不少坑:

  1. 光照条件影响识别:最初在夜间拍摄的照片识别准确率明显下降,后来增加了"请在光线充足环境下拍摄"的提示
  2. 模型响应时间控制:复杂prompt可能导致响应超时,最终设置了15秒的硬性超时限制
  3. 本地资源占用:长时间运行后内存占用会累积,现在每天定时重启OpenClaw服务

一个意外发现是,这个系统还能帮助减少食物浪费。通过记录每次识别的食材和最终选择的菜谱,一个月后就能看到哪些食材经常被剩下,从而调整采购策略。


获取更多AI镜像

想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐