Pip,桌面宠物机器人的LLM系统

8人课程项目,我在LLM组,负责最早的LLM原型、agent状态机、网页控制台和语音链路。

时间
2026-05 至 2026-09
类型
团队项目
状态
已完成
我做了什么
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条消息,没有长期记忆。

代码

团队仓库和我的原型仓库都是私有的,可以面试时演示或讲代码。

更正记录

还没有更正。发现写错的地方,请告诉我。

想聊这个项目,欢迎发邮件或在小红书私信我。