AI脑洞板
完整教案
自学课件
第 43 课 · 共 43/51 课

智能菜谱——把"吃什么"变成一段对话 把"吃什么"变成一段对话

课时
待定
器材
ESP32-S3 触摸屏板 + USB 线
前置知识
无
配套代码
见项目 demo 目录

每到饭点都纠结的"吃什么"

你好,我是吴老师。

晚上回家,最头疼的一个问题:今天吃什么? 冰箱里有土豆、鸡蛋、青椒,可就是不知道该怎么搭配。

以前,这是你得翻菜谱、问家人的事。今天,我们把这块板子变成一个随身的小管家——你开口告诉它"冰箱里有什么",它就能按你的要求,给你列出一道道菜,甚至把菜的样子画给你看。

本课一句话:智能菜谱不是"一堆做菜的规矩",而是一条对话链——你说话 → 板子听懂 → 云端大模型按你的要求"编"出一道菜 → 板子把它说/画给你。全程没有一个"厨师",全是"你描述 + AI 生成"。

一、先让板子当一回"小管家"

先别听我讲,让板子演示一遍。

请使用课程的 esp32s3-touchboard-hardware-dev Skill,
烧录本课配套程序 assets/codes/demo01_recipe_voice:
板书显示"按住说话,告诉我冰箱里有什么"。
按住 BOOT 说话,比如"冰箱里有土豆、鸡蛋和青椒,帮我做一道菜",
松开后板子会识别你说的话,请大模型给你一道菜谱,屏幕显示菜名和做法,
然后问你要不要"画出这盘菜的样子"。
烧录前把密钥和 WiFi 填好(见 README)。烧录后告诉我:
你说的话,板子识别成了什么字?它给你出的菜叫什么?

几秒后,屏幕出现"按住说话"的提示。你按住 BOOT 说"冰箱里有土豆、鸡蛋、青椒",松开后,板子先显示一句"我听到:冰箱里有土豆、鸡蛋、青椒",然后"思考中……",接着屏幕上出现菜名和做法(比如"家常土豆青椒炒蛋")。

二、拆开看:这条对话链有几棒?

这个"问吃什么 → 得到菜谱"的过程,其实是四段接力——你之前在别的课都分别见过,这次把它们串起来:

flowchart LR
    A[你按住说话] --> B[1 录音+识别<br/>板子·百度STT<br/>把声音变成文字]
    B --> C[2 问大模型<br/>板子·火山Ark<br/>把「食材+要求」寄给AI]
    C --> D[3 云端生成菜谱<br/>大模型按提示词<br/>给出菜名+做法]
    D --> E[4 板子显示/朗读<br/>屏幕显示 或 喇叭播放]
    style B fill:#22d3ee,color:#131a22
    style E fill:#22d3ee,color:#131a22
    style C fill:#f472b6,color:#131a22
    style D fill:#f472b6,color:#131a22

看懂这张图的标志:青色的在板子上(录音识别、显示/朗读),粉色的在云端(识别、生成菜谱)。板子负责"听你说话、把你的要求寄出去、把结果给你看",真正"想菜谱"的是云端的大模型。

关键:板子不会做菜。 它只是把你说的"食材 + 要求"翻译成一段话,寄给会"想菜谱"的大模型,再把它想出来的菜谱念/画给你。想菜谱的是 AI,板子是快递员 + 显示屏。

三、四段接力,每段用什么技术?

不深挖代码,但每段接力你用到的技术要清楚:

接力棒用到的技术之前在哪学过
① 录音识别麦克风采集 PCM → 百度 STT 转文字第 24 课(ASR)
② 发请求HTTP POST + JSON 把"食材+要求"寄给大模型第 19 课(HTTP/JSON)
③ 云端生成菜谱大模型按 system 提示词"编"一道菜(结构化输出)第 26 课(大模型)
④ 显示/朗读中文绘制显示(TTS 可选朗读)第 9 课 / 第 25 课(TTS)
⑤(可选)画菜用识别文本做生图提示词 → 生图 API → 显示图片第 27 课(生图)

⚠️ 生图那一段:如果你想让它"画出这盘菜的样子",就要把识别到的文字直接当作生图的个提示词,寄给一个"会画图"的 AI,它返回一张图片的网址,板子再把图片下载下来显示(这一步用到了 TJpg_Decoder 解码 JPEG)。你画我猜(第 27 课)的底层就是这个,但反过来——那次是"板子画、AI 猜",这次是"AI 画、板子看"。

四、要让 AI 给出"好菜谱",得把话说清楚

这四段接力里,第③段最值得琢磨——它决定了 AI 给你的是"一道正经菜"还是"一团废话"。

先看一个反例 版本 A:含糊地问

system 提示词:你是一个做菜的助手,请回答用户吃什么。

你问"冰箱有土豆鸡蛋青椒",它可能回:"可以炒土豆,也可以炒鸡蛋。"——不具体、没法做、不知道要啥材料。

再看 版本 B:给足条件、规定格式

system 提示词:你是家常菜谱助手。请按「菜名 / 难易度 / 需时(分钟) / 食材清单(逗号分隔) / 步骤(编号列表)」的格式,给出一道具体的菜。
如果食材或步骤不确定,请标注「仅供参考」。用不超过80字的简体中文回答。

你问同样的话,它可能回:

菜名:青椒土豆炒蛋
难易度:简单
需时:15分钟
食材:土豆1个、青椒1个、鸡蛋2个、盐、油
步骤:1.土豆切丝青椒切块 2.打入鸡蛋炒散 3.下土豆青椒翻炒 4.加盐调味

看出差别了吗? 版本 B 比 A 多了这四样:

AI "听话"的地方为什么重要
给角色(家常菜谱助手)它才知道自己该"认真做菜",不是闲聊
给格式(菜名/难易度/食材/步骤)它才知道"怎么输出",才能分屏显示
给要求(具体一道、80字内)它才不会乱编一堆、啰嗦
给兜底(标注"仅供参考")菜谱不一定营养均衡,要留个心眼

这就是你前面学会的:提示词=角色 + 任务 + 约束 + 负面指令的四要素。第 35 课你练的是"让 AI 说话很像老师",这一课练的是"让 AI 把菜谱按规矩写出来"——关键是给它"格式",它才能输出能分屏显示的结构化结果。

五、动手:加一个条件,看菜谱怎么变

请改 system 提示词里的约束,每种改动先预测再烧录:

✏️ 可以直接在表格里填写
#我在提示词里加/改这句我预测 AI 会实际菜谱变化
1加上"只挑 15 分钟能做完的"
2加上"按时间从短到长排 3 道"
3改成"不要放辣的"
4加上"告诉我这道菜适合几人吃"

⚠️ 关键观察:你会发现,约束加得越具体,菜谱越贴近你的真实需求。你说"15 分钟"它就挑快的;说"不要辣"它就避开辣。但如果你只加一个模糊的"简单点",它可能还是给你一道要 40 分钟的——因为你没写清楚"简单"是多少时间。

六、如果它没按你想的来

现象先查什么
录音识别错字说清楚点、安静点;看串口里"她说的话"是不是你想的
一直"思考中"联网/密钥对吗?看串口的"模型 HTTP 状态码"
菜谱不像菜谱(一团话)不是 AI 坏了,是提示词没给格式——补上"菜名/食材/步骤"
菜谱明明说"15 分钟"但实际要 1 小时AI 估的时间不一定准,菜谱要"仅供参考"
生图那步失败生图 API 密钥/网络对吗?图片下载到 PSRAM 够不够?

记住:菜谱"看起来很专业"不代表"一定准"。AI 编的是"像菜谱"的话,不是"做过验证"的菜。 吃之前要用常识核对,菜谱上要标注"仅供参考"。

七、下课前,把"对话链"讲给我听

先别看 AI 的回答,自己说一遍:

  1. 智能菜谱是"板子会做菜"吗?板子真正做了哪几件事?
  2. 这条对话链有哪几棒?哪几棒在板子、哪几棒在云端?
  3. 同样"冰箱有土豆鸡蛋青椒",为什么含糊提示词和"给格式"提示词得到的菜谱差那么多?
  4. 提示词的四要素,在这一课里各起到什么作用?(角色/任务/约束/负面指令)
  5. 生图那一棒,识别到的文字派上了什么用场?
  6. 为什么菜谱要标注"仅供参考"?

今天请留下三样东西:你用语音让板子识别到的一句话、AI 给你的一道菜谱(菜名+食材+步骤)、以及一句"我在提示词里加的一个约束和它的效果"。

八、最后留给你:AI 是按"你的话"来"生菜谱"的

这一课你可能觉得"不就是问个菜嘛"。但想深一点:

AI 不是一个固定的"菜谱库",它是一个"按你的要求现编"的助手。 你把话描述到什么程度,它就生到什么程度。这跟第 35 课"改提示词看回答变"、第 36 课"让 AI 生成例句"是同一个道理。

你想让 AI 帮你你要给出的"条件"
定今天的晚餐冰箱有什么、几个人吃、多少分钟内、忌口什么
推荐 3 道菜要几道、按什么排序(时间/难度)、什么范围
给出健康搭配要不要控制卡路里、是不是主食/荤素搭配
画一道菜的样子描述清楚"菜长什么样"(颜色、摆盘、盘子)

摸清这个规律:"AI 生活"的每一课,都是"你说清楚 → AI 按你的话生成"。 下一课的电子宠物不一样——它不是 AI,是一段你写死了的规则,它"活得怎么样"靠的是时间,不是你的语言。


教师备课备注(不作为课堂口播)

课程定位

  • 第九章「AI 生活」开篇。把语音(ASR) + 大模型(Ark) + TTS + 生图串成一条完整对话链,落点是"板子不做菜,云端按提示词生成菜谱,板子负责听/寄/显示"。是第 23–28 课"AI 感知/对话"的收束应用。
  • 技术与原理并重:讲清楚四段接力各用什么技术(用"零件表"+链路图),不深究代码。提示词训练是主线之一:让 AI 给出"结构化菜谱",核心是给格式 + 约束。
  • 与第 27 课"你画我猜"严格对偶:那次"板子画、AI 猜",这次"AI 画、板子看"——同一条生图链路,方向相反。

本课新增的核心知识点

  1. 对话链:语音识别→HTTP寄给大模型→云端生成→显示/朗读。板子不做内容生成。
  2. 结构化输出:让 AI 按"菜名/食材/步骤/时间"格式输出,才便于分屏显示。这是提示词里"命令格式"的力量。
  3. 提示词四要素在"生成"场景:角色+任务+约束+负面指令 → 菜谱变具体。与第 35/36 课呼应。
  4. 生图链路:识别文本当生图提示词 → 生图API返回URL → 下载到PSRAM → TJpg解码显示。
  5. AI 素养:菜谱"看起来专业≠一定准",要"仅供参考";AI 估的时间/营养不保证准确。

必须避免的错误

  • 不要说"板子会做菜/知道怎么炒菜"。统一口径:"板子把你说的话寄给云端大模型,大模型按提示词编出菜谱,板子再显示。"
  • 不要把生图讲得太深(下载、解码细节少讲)。重点让学生理解"文字变成了一张图"这个链路和"识别文本当提示词"。
  • 密钥绝不进口播稿/截图;演示机用 config.real.h 覆盖后编译。
  • 菜谱不必逐一验证营养,但课堂要强调"仅供参考、用常识核对"。

执行约束

  • FQBN:esp32:esp32:esp32s3:FlashSize=16M,PartitionScheme=app3M_fat9M_16MB,CDCOnBoot=cdc,PSRAM=opi
  • 依赖:TFT_eSPI、FT6336、WiFi、WiFiClientSecure、HTTPClient、ArduinoJson、TJpg_Decoder、arduino_base64、es8311(项目内)、font/ChineseFont16.h。
  • 音频缓冲(96KB)和生图JPEG(最大2MB)必须放 PSRAM(ps_malloc),PSRAM=opi 必开。
  • 屏幕/触摸/音频引脚同第 32/47 课;中文绘制用 font/ChineseFont16.h + drawWrapped。
  • 凭证:百度(ASR)+火山(Ark)+生图(Image-2-Lite) 三组密钥,只放 config.real.h,源码顶部占位符,绝不进教案/skill/公开 zip。

课堂执行要点

  • 顺序建议:demo01(现象:说话→识别→得菜谱→可选画菜)→ 四段接力链路图 → 提示词 A/B 对比(含糊 vs 给格式)→ 改一个约束实验 → 下课前复述。
  • 灵魂追问 ①:"板子会做菜吗?它真正做了哪几件事?"——引出"板子=快递员+显示屏,想菜谱的是云端"。
  • 灵魂追问 ②:"同样一句话,为什么给格式的提示词就得到正经菜谱?"——引出"结构化输出"。
  • 观察表先预测后实测(五、改约束表)。
  • 演示建议:先让学生"含糊地描述"看 AI 给啥,再"给足条件+格式"对比,让学生亲眼见到提示词的力量。

待办与遗留

  • demo01_recipe_voice 源码已写(复用 Example_47 骨架 + 菜谱提示词),尚未实板验证。吴老师实板验收重点:① 录音识别是否准确;② 火山 Ark 是否返回菜品格式;③ 生图链路是否显示图片;④ 三组密钥配置路径。
  • 生图环节网络要求高(生图几十秒),若教室网络差,可先做"纯菜谱"(去掉生图),生图作为拓展。
  • 实机联网数据(识别文字→菜谱→生图耗时)待回填。

第 43 课 · 智能菜谱

第 43 课 · 智能菜谱

按住 BOOT 说出冰箱里有什么,板子识别成文字后请 AI 给出一道菜的菜谱,显示在屏幕上。

43AI语音识别提示词