Pip,桌面宠物机器人的LLM系统
8人课程项目,我在LLM组,负责最早的LLM原型、agent状态机、网页控制台和语音链路。
- 我做了什么
- TUM Cyber-Physical Systems课程的8人团队项目,我在LLM组,负责LLM和控制台。传感器融合、视觉、电机、固件是其他组做的。
- 用到的技术
- Python、LangGraph、FastAPI、Whisper、edge-tts、pytest
- AI 用在哪
- 开发时用了Claude写代码,控制台的界面方案来自Claude Design。
- 最后更新
- 2026-10-15
| 项目 | 数值 | 说明 |
|---|---|---|
| 控制台功能清单 | 24 / 28项 | 按团队的功能清单,其余4项延后,写在那次提交说明里 |
| Whisper在静音上复读提示词时的no_speech概率 | 0.44–0.51 | 低于0.6的拒识阈值,拦不住,所以另加了提示词回显检测 |
| 全仓库测试 | 214个通过 | 另有4个跳过,2026-09-02我本机的结果,写在那次提交说明里 |
项目是什么
Pip是一个放在桌上的轮式小机器人。它用摄像头看你的表情,电脑端统计你在用什么应用、坐了多久,再由大模型决定这一刻要不要做点什么:说句话、换个表情、往前走两步,或者什么都不做。
整个系统分三层:
- 电脑:做决策。融合传感器状态,跑LangGraph agent,提供网页控制台和语音识别。
- 树莓派5:感官和执行。麦克风、喇叭、LCD表情屏、备用摄像头,收到指令就执行。
- ESP32:驱动两个电机。
这是TUM Cyber-Physical Systems课程的8人项目,分系统架构、LLM、视觉、DevOps和测试、运动五个组。我在LLM组,组里两个人,我负责LLM和控制台。最终展示是2026年9月9日。
我做了什么
我负责的部分分四块:
1. 最早的LLM原型(2026年5月到6月,在我的个人仓库)
第一版是我搭的:大模型只许输出严格的JSON,工具调用先过schema校验,行为优先级写进系统提示,靠近桌边的危险排在最前面。后来加了play_voice工具和12条预生成的提醒语音。
6月中旬,架构组的同学把这套原型重整后,作为第一版带进了团队仓库。
2. agent状态机重构(8月)
把原来的create_react_agent换成手写的StateGraph:llm节点和tools节点循环,加递归上限;工具执行出错时变成一条FAILED:消息,让已有的反思重试能识别。顺手修了一个bug:工具结果被后面的消息覆盖,导致失败检测一直不生效。
第二个提交把传感器到语音的链路接通了:
- 决策结果由服务端推到树莓派去说,放在锁里,连续两条提醒不会抢话。
- 去重从比较时间戳改成比较「决策签名」:情绪、安全状态、当前应用、使用时长按5分钟分桶。时间戳和置信度的小抖动不再触发一次大模型调用。
3. 网页控制台(8月)
一个单文件的深色仪表盘,不用CDN,不用构建:
- 能看到每次决策,被决策门拦下的显示成灰色。
- 能和Pip聊天,和语音共用一份对话记忆。
- 能手动控制,能调久坐阈值、勿扰时段、人设和声线。
- 能看应用使用、情绪曲线、每次大模型调用的耗时和token。
三个隐私开关在服务端强制执行,不只是前端藏按钮:
- 关掉移动:所有移动类工具被挡掉,紧急停止永远放行。
- 关掉语音:语音接口直接返回403。
- 关掉摄像头:情绪一律当作neutral,不落盘。
4. 语音链路(9月)
- 识别:Whisper在静音或噪声上会编出一句话。我按片段给识别结果打分,看no_speech概率、平均对数概率和压缩比,不可信就返回空文本,不把编出来的话交给大模型。
- 复读:Whisper还会在静音上复读自己的提示词。那时no_speech概率只有0.44到0.51,低于0.6的阈值拦不住,所以另加了一条:转写结果和提示词重合,就判为没说话。
- 中英双语:语言只在中英两种里选,避免一秒钟的短音频被判成别的语言。唤醒词「Pip」和「皮普」都认。
- 结束对话:对话要不要继续由模型在回复末尾标出来,没有标记就按结束处理。
- 合成:一份配置管声线、分语气的语速和音调、后处理链和离线兜底。常用提醒在树莓派上提前渲染好;只有文本和配置都没变时才播预渲染的音频,所以改了阈值不会播出旧话术。
边界
agent.py里的提示词、超时、移动兜底和工具表,后来其他组也改过、加过,提示词的优先级阶梯是大家一起定的。- 15个工具的实现主要是其他组员写的。
- 传感器融合、决策门的服务端部分是架构组写的。情绪识别是视觉组做的,电机和固件是运动组做的。
结果
- 9月9日完成最终展示,LLM部分的讲解由我负责。
- 9月2日那次提交时,全仓库测试214个通过、4个跳过。
- 控制台按团队的功能清单完成了28项里的24项,另外4项延后。
没做好的地方
- 没有端到端的延迟数据。控制台记录了每次大模型调用的耗时和token,但我没有整理成一组可复现的数字。
- 语音识别只在合成音频、静音和噪声上验证过,真人在真实麦克风下的准确率没有测。提交说明里我自己写了「还需要在真机上检查」。
- 没有做用户评估。展示前删掉了一张只有15个样本的提醒响应率卡片,因为样本太少,说明不了什么。
- 对话记忆只是最近40条消息,没有长期记忆。
代码
团队仓库和我的原型仓库都是私有的,可以面试时演示或讲代码。
更正记录
还没有更正。发现写错的地方,请告诉我。
想聊这个项目,欢迎发邮件或在小红书私信我。