基于冰箱内食材的智能菜谱推荐应用搭建
整体概述
本篇最佳实践介绍了如何快速搭建一款基于冰箱内食材的智能菜谱推荐应用。该应用通过调用千帆平台官方的“图像内容理解”API,同时充分利用了千帆AppBuilder平台的工作流Agent与其他预置组件能力,并结合卡片功能以提高信息展示效率和用户体验。在使用时,用户首先上传冰箱内食材图片(使用智能冰箱内摄像头拍摄),大模型会识别图片中的食材具体种类,进行智能思考,并推荐最合适的菜谱,同时分步骤给出图文并茂的做菜过程。
最终应用搭建以及展示效果如下:
构建过程
食材识别组件搭建
首先,我们调用官方图像内容理解API(https://cloud.baidu.com/doc/IMAGERECOGNITION/s/xlrotqxl8)构建“食材识别”组件。
根据API文档,图像内容理解服务涉及 2 个子接口,分别为:1)图像内容理解-提交请求:传入图片、提问等参数,创建图像内容理解任务,返回任务ID。2) 图像内容理解-获取结果:在任务成功创建后,传入任务ID,查看任务处理的状态、获取处理完成的结果。
因此在创建“食材识别”组件时,需要构建“鉴权认证-提交请求-获取结果”的工作流。具体搭建步骤如下:
在开始节点中添加一个自定义参数为“image_url", 用于传入图片链接。
在开始节点后,添加一个API节点,命名为“鉴权”。向授权服务地址https://aip.baidubce.com/oauth/2.0/token使用POST发送请求,获取access_token。请参考“Access Token获取”获取API key和Secret Key,并填入URL。
之后我们开始调用官方图像内容理解API。首先添加一个API节点,命名为“创建任务”。向图像内容理解-提交请求的API服务地址https://aip.baidubce.com/rest/2.0/image-classify/v1/image-understanding/request使用POST发送请求。请参考图像内容理解的API文档https://cloud.baidu.com/doc/IMAGERECOGNITION/s/xlrotqxl8,传入image_url和access_token,在这里我们设定question为“图片中有哪些食材?请分点列出数量和名称,例如一个西红柿”,该节点返回task_id。
接着我们再添加一个API节点,命名为“获得结果”。向图像内容理解-获取结果的API服务地址https://aip.baidubce.com/rest/2.0/image-classify/v1/image-understanding/get-result使用POST发送请求。传入task_id和access_token,该节点返回result,其中description即是针对输入的 question 问题,对图片内容进行分析后输出的答案。
因为图像内容理解的任务处理需要一定时间,在工作流运行的情况下可能存在返回的result中decription为null的情况,因此我们利用代码节点构建一个延时装置,经过一段时间之后传递task_id到“获得结果”节点。
延时装置代码:
# 定义一个 main 函数,传入 params 参数。params 中包含了节点配置的输入变量。
# 需要定义一个字典作为输出变量
# 引用节点定义的变量:params['变量名']
# 运行环境 Python3;预置 Package:NumPy
import time
def main(params):
time.sleep(22)
# 30秒后输出params
return params
最后,我们添加一个大模型节点对图像内容理解API返回的内容进行总结概括。
以下是提示词示例:
简化并概括{{description}},其中提到了哪几样食材,按照数量+品类列举,例如“一个番茄”,无须回答无关内容
工作流Agent搭建
我们使用搭建好的“食材识别”组件构建工作流Agent,进行“冰箱智能菜谱助手”应用的搭建。
在开始节点后,可以从节点内选择“组件”,并从我的组件中添加创建好的“食材识别”组件。我们为该组件配置输入与输出,以便连接上下游节点:1)输入参数可以引用用户原始输入“rawQuery”,也可以在开始节点增加自定义参数并引用,目标是将冰箱内食物照片的url传入工作流。2)输出参数在组件中已经进行设定,为“food”(参数为String类型)。
之后我们使用大模型节点,让大模型为我们根据“食材识别”组件识别到的食物种类,智能推荐一款家常菜谱,并且分步骤输出。大模型节点支持配置不同模型,可以根据需要进行选择。目前千帆AppBuilder已经支持选择DeepSeek V3/R1模型,进一步深度思考,提高模型输出效果。
我们为该节点配置输入与输出,以便连接上下游节点:1)选择前序“食材识别”组件的输出"food"作为大模型节点的输入参数,2)定义菜品名称“name”、菜谱步骤“receipe”、做菜额外提示“tip”为大模型节点的输出参数,本步骤中可以根据需要最终的菜谱展示需要,自由定义输出参数。
以下是提示词示例:
你是一个擅长营养美味家常菜、快手菜,同时会整理清晰菜谱的厨师专家。
任务:
1. 根据给出的食材清单{{food_list}}, 首先提供1道家常菜
2. 给出菜品的分步骤菜谱,例如以宫保鸡丁为例,分步步骤为{“1.鸡胸肉切丁,加入花雕酒,白胡椒粉,少量盐和玉米淀粉抓匀,最后再加一点食用油抓匀锁住味道,没有花雕酒也可以用料酒代替","2.黄瓜和胡萝卜切丁,加入一点点盐抓匀腌制一会儿,下锅前要提前把盐冲洗干净,攥干水分","3.提前挑一碗料汁,生抽,蚝油,米醋,白糖,玉米淀粉和清水调匀,我还加了一点点鸡粉提鲜,没有也可以不放","4.起锅热油,倒入鸡丁翻炒至变色,边缘稍稍金黄色,盛出备用","5.另起锅,少油,放入葱花蒜末炒香,加入郫县豆瓣酱,可以根据自己的口味决定用量,炒出红油","6.加入黄瓜和胡萝卜定,炒软","7.倒入提前炒好的鸡丁,翻炒均匀","8.倒入调好的料汁,翻炒至沸腾起泡","9.最后加入一把油炸花生米,快速炒匀,就可以关火出锅了"
3. 给出菜品所需而当前食材清单没有的食材
要求:
不需要过分创新菜品,尽量选择家常菜、快手菜
菜谱中的主要食材必须存在于给出的食材清单,配菜可以提醒用户补充
给出的菜谱要简单、清晰,步骤明确,在关键的火候、时机处描述清楚,易于用户操作
每个菜谱按照参数输出菜品名、分点步骤、补充提示
接下来,我们添加“必应图片搜索”节点(或“百度图搜”节点),用于搜索菜谱图片,让菜谱助手推荐的菜谱更加图文并茂。我们为该节点配置输入与输出,以便连接上下游节点:1)输入参数可以选择前序大模型节点输出的菜谱名称“name”,2)输出参数为必应图片搜索默认的输出“urls”,返回菜品的图片。
最后我们配置结束节点。选择回复模式为“直接返回参数值”,并将菜谱相关的参数添加到输出参数上,分别为菜品名称“name”、菜谱步骤“receipe”、做菜额外提示“tip”和菜品图片“urls”,他们将作为工作流Agent的最终输出结果,展示给用户。
全部节点配置完成后,点击“调试”按钮。输入一张菜品图片的url,即可调试工作流Agent。调试成功后,应该能看到全部节点执行完成。
可用于测试的冰箱内食材图片:https://yuqi-image.bj.bcebos.com/%E5%9B%BE%E7%89%87%E5%AD%98%E5%82%A8/%E5%86%B0%E7%AE%B1%E5%86%85%E9%A3%9F%E6%9D%901.jpg
卡片创建与配置
在有了菜谱和菜谱相关图片后,可以对工作流Agent应用的用户展示界面进行丰富。在这里我们使用千帆AppBuilder上的卡片编辑器功能,为大模型回复添加卡片样式。
首先在AppBuilder控制台左上角点击“创建”进入卡片编辑器,点击新增创建卡片。接着拖入文字控件、循环Each控件,编排标题、辅助说明、菜谱步骤和成品参考图的布局。然后创建对应的四个卡片参数,绑定到对应控件。具体请参考卡片配置文档https://cloud.baidu.com/doc/AppBuilder/s/ym6robqyw。
以分列展示菜谱步骤为例,添加循环Each控件,向该控件内添加文字控件,创建字符串数组类型参数recipe,将recipe绑定到循环Each控件,将其元素参数item绑定到文字控件。
制作好卡片后,我们回到工作流Agent内,在结束节点进行绑定卡片。点击“绑定回复卡片”,在“我的卡片”中即可选中刚才制作好的卡片。将对应的输出参数一一绑定到卡片参数上,点击“确认”,就完成了对大模型回复样式的绑定。
绑定卡片后,可以点击“调试”,输入一张菜品图片的url,测试卡片渲染效果。一个基于冰箱内食材的智能菜谱推荐应用就搭建完成了。 以下是最终的应用效果展示。