Skip to content

【外滩大会2026】拉香了:拍一张💩,测出你的 DBTI,再隔空扔给朋友 #109

Description

@TabbyYu

【外滩大会2026】拉香了打卡:拍一张💩,测出你的 DBTI,再隔空扔给朋友

每个人每天都会产生一份最诚实的健康报告,然后按下冲水键。
拉香了想做的,是在它被冲走之前,让百炼读懂它,再让用户愿意记住它。

参赛项目名称

拉香了(LaXiangLe)· 便便人格 DBTI

每个人都有MBTI,但你的便便,也有自己的性格。

基于 阿里云百炼 Qwen-VL 的多模态生活健康观察与社交化表达微信小程序。

拍照 → 百炼视觉分析 → Bristol 参考 → DBTI 人格 → 卡通形象 → 隔空扔💩 → 长期记录


团队 / 作者

个人开发者:@TabbyYu

产品设计 / 微信小程序 / 后端 / AI Pipeline / Prompt Engineering 独立完成。


我做了什么

30 秒看懂拉香了

用户拍一张便便照片,阿里云百炼 Qwen-VL 识别其中可观察到的形态、颜色、表面状态和图像质量。

但最终展示给用户的,不只是:

Bristol Type 4

而是:

💩 你的 DBTI:黄金守序者

SRBG · 稳定 / 规律 / 平衡

Bristol 参考:Type 3–4
便便观察:……
状态分析:……
今日建议:……

随后,这只专属卡通便便可以被:

🚀 隔空扔给朋友

好友在微信里打开后,便便会真的从屏幕外飞进来 → 旋转 → 撞击 → 爆开粒子 → 揭晓 DBTI 人格卡

最后,每次分析自动沉淀到记录日历里,形成长期观察。

它既是一个 AI 多模态应用,也是一个人格测试、记录工具和社交玩具。


为什么我要做它?

便便形态本身是一个很日常的身体观察线索,但传统健康工具面临两个非常现实的问题:

第一,不好意思。

人们愿意记录睡眠、步数和心率,却很少主动记录排便状态。

第二,不好玩。

即使告诉用户:

今天是 Bristol Type 4。

大多数人也很难产生持续记录和分享的动力。

所以我没有继续做一个“更严肃的健康 App”。

我反过来问:

能不能把一个难以启齿、很难坚持的健康观察行为,变成一个用户愿意主动打开、甚至愿意分享给朋友的体验?

于是有了 DBTI


DBTI:把 Bristol 留在科学底层,把人格放在娱乐层

DBTI 不是医学分类,也不会替代 Bristol。

它采用的是:

百炼视觉识别
      ↓
Bristol 1–7 型等可观察特征
      +
生活状态 / 排便节奏
      ↓
DBTI 人格映射
      ↓
原创名字 + 卡通形象 + 中文观察 + 中文分析 + 中文建议

真实便便:16 个 DBTI 人格

通过 4 个二元维度构成 16 型人格:

维度 两种倾向
形态 S · Solid / F · Fluid
节奏 R · Regular / A · Active
状态 B · Balanced / C · Casual
风格 G · Guardian / E · Explorer

例如:

  • 👑 SRBG · 黄金守序者 —— 稳定 / 规律 / 平衡
  • 🧭 SRBE · 黄金探索者 —— 稳定 / 好奇 / 成长
  • 🎨 FRBG · 流畅艺术家 —— 柔和 / 协调 / 平衡
  • FACG · 极速行动者 —— 效率 / 速度 / 变化
  • 🌪️ FACE · 风暴冒险家 —— 自由 / 变化 / 探索

拍错了,也不是“报错”

这是我很喜欢的一个产品设计。

如果用户拍到的根本不是便便,系统不会粗暴地返回:

识别失败。

它仍然会得到一个完全独立、与真实便便 16 型绝不重合的彩蛋 DBTI

例如:

  • 📸 镜头捣蛋鬼
  • 🌱 宇宙误入者
  • 🌫️ 重拍召唤师

真实便便人格与非便便人格使用两套完全不同的类型空间。

错误路径本身也是体验。


百炼在这个项目里做了什么?

百炼不仅是开发阶段用来“帮我写代码”的辅助工具。

它更是产品每一次核心分析都必须经过的线上推理层。

微信小程序
   ↓
私有临时图片
   ↓
CloudBase analyze-stool
   ↓
阿里云百炼 qwen-vl-plus
   ↓
结构化 JSON
   ↓
安全规则 + DBTI Engine
   ↓
结果页 / 记录 / 分享

模型配置

项目 实现
模型 qwen-vl-plus
能力 通义千问视觉理解
接入 DashScope OpenAI Compatible API
temperature 0,优先稳定与可复现
输出 response_format: json_object
图片 base64 data URL 内联
校验 Zod Schema + 跨字段规则
超时 30 秒
重试 仅网络 / 429 / 5xx 重试 1 次
版本追踪 Prompt / Schema / DBTI Version 全部随记录落库

我刻意让:

Qwen-VL 负责“看”,确定性程序负责“演”。

AI 判断可观察特征,但 DBTI、卡通形象、人格名称和分享动画都有稳定规则。

因此同一条记录今天打开、明天打开、分享给朋友再打开:

永远是同一个人格、同一只便便。


我认为最难的不是“识别”,而是下面四件事

1. 健康场景里,模型必须学会“少说”

最大风险不是模型不会回答,而是它太愿意回答。

所以我做了三层串联安全约束:

① System Prompt
禁止疾病诊断 / 患病概率 / 处方 / 治疗方案

        ↓

② Zod Schema + superRefine
12 个字段强校验 + 跨字段业务约束

        ↓

③ 危险措辞兜底
诊断性内容直接判定 Schema Invalid

例如检测到清晰人脸时:

containsHumanFace = true
→ bristolType 必须为 null
→ 健康分析链路终止

原则非常简单:

宁可这一次 AI 不回答,也不要让一句不该出现的诊断到达用户。


2. AI 输出必须可复现

我没有让模型直接生成卡通图片。

Qwen-VL 只负责视觉理解。

之后通过:

recordId
   ↓
稳定哈希
   ↓
CartoonConfig
   ↓
微信 Canvas 绘制

代码中禁止用 Math.random() 决定持久化人格。

因此娱乐化不会牺牲一致性。


3. “隔空扔💩”能传播,但健康数据绝不能一起传播

用户可以把自己的 DBTI 扔给朋友。

但分享内容只有:

原创卡通形象
+
人格名字
+
安全预设文案
+
投掷动画参数

不会分享:

  • 原始照片
  • Bristol 类型
  • 健康观察
  • 风险信息
  • 手机号
  • OpenID
  • 用户身份

分享 Token:

  • 32 字节安全随机源
  • SHA-256 Hash 落库
  • 明文 Token 不落库
  • 可主动撤回
  • 源记录删除后自动失效

这让我可以同时拥有:

健康数据的私密性 + 娱乐内容的传播性。


4. AI 挂了,产品也不能完全挂

大模型是核心能力,但不是整个产品。

因此模型请求失败时:

  • 不伪造分析结果;
  • 已有记录仍然可查看;
  • 静态人格目录和页面可以正常运行;
  • 空文案使用安全静态文案降级;
  • 原始图片仍会进入删除/补偿清理流程。

AI 是能力,不应该成为单点产品体验。


使用的工具

OpenWork / 百炼 CLI

本项目没有使用 OpenWork 托管运行时。

采用的是百炼CLI接入vibe coding,且应用运行时直接接入阿里云百炼 DashScope API

换句话说:

百炼不仅仅是“开发辅助”,也是拉香了线上核心业务链路的一部分。


百炼能力 / 模型

**阿里云百炼 **qwen-vl-plus

负责:

  • 图片是否可分析;
  • 便便可观察视觉特征;
  • Bristol 参考信息;
  • 颜色 / 表面 / 形态特征;
  • 图像质量;
  • 中文观察;
  • 中文分析;
  • 中文生活方式建议。

总用时一周,全AI编程,0人工代码

由于只有一个星期时间,以及token限制,用到了多个平台的多款基础大模型包括Qwen,GPT,Hy。


其他

  • 前端:微信原生小程序 + TypeScript + Canvas 2D
  • 后端:TypeScript + CloudBase Serverless
  • 数据库:CloudBase MySQL
  • 验证:Zod + Vitest
  • 部署:5 个 CloudBase 云函数
  • 隐私:私有临时对象存储 + 分析后删原图
  • 账号:微信登录 + 手机验证码绑定
  • 安全:HMAC-SHA256、路径全匹配校验、Token Hash、限流、幂等

效果展示

① 首页:这是什么💩?

Image

一键拍照或从相册选择。


② 百炼分析中

Image

真实调用 Qwen-VL,不使用预制分析结果。


③ DBTI 人格揭晓

Image Image

👑 黄金守序者
SRBG
稳定 · 规律 · 平衡

同时展示:

  • Bristol 参考
  • 便便观察;
  • 状态分析;
  • 3 条中文建议;
  • 原创 Canvas 卡通角色。

④ 拍错了也有彩蛋人格

Image Image

例如:

边界守护者

真实便便人格与非便便人格完全不重合。


⑤ 核心传播玩法:隔空扔💩

Image
点击“隔空扔💩”
      ↓
微信分享
      ↓
朋友打开
      ↓
💩 从屏幕外以不同方式飞入
      ↓
旋转 / 粒子 / 撞击 / 降落伞
      ↓
砰!
      ↓
DBTI 人格卡揭晓

好友可以继续点击:

我也要测一个

形成完整传播闭环。


⑥ 记录与日期打卡

Image

每次成功分析自动进入:

  • 历史记录;
  • 月历;
  • 当日记录数;
  • 连续记录天数。

娱乐入口最终沉淀为长期记录。


现在,它已经不只是一个原型

指标 当前结果
代码量 约 14,100 行
自动化测试 82 个
云函数 5 个
MySQL 数据表 10 张
微信小程序页面 14 个
自研组件 8 个
DBTI 32 型:16 真实便便 + 16 非便便彩蛋型
小程序包体 757.8 KB

当前部署状态

后端已经真实部署到 CloudBase

5 个云函数已经上线。

🟡 微信小程序为开发版

已经完成上传与代码审核,正在微信备案阶段;可提供联系方式加入体验版体验或现场真机演示。


项目链接

  • 演示录屏: 使用录屏
  • 微信小程序: 拉香了打卡。
    微信小程序在备案阶段,通过后会立刻上线;可提供联系方式加入体验版体验或现场真机演示。

推荐评审体验路径

扫码
→ 登录
→ “这是什么💩?”
→ 选择测试图片
→ 查看 DBTI
→ 隔空扔💩

踩坑记录

我只挑 4 个真正改变了系统设计的问题。

1. 同一个请求差点让百炼调用两遍

网络抖动时,同一 clientRequestId 可能并发进入两个请求。

如果只做数据库幂等:

数据最终只有一条,但 Qwen-VL 已经被真实调用两次了

这不仅浪费 Token,也可能触发 429。

最后加入:

inFlight:
Map<userId:clientRequestId, Promise>

同一实例中的并发请求共享同一个 Promise。

教训:AI 应用的幂等不只是“数据库不能重复写”,还包括“昂贵模型不能重复调用”。


2. 我一开始用错了 CloudBase 数据库的心智模型

第一版按传统 SQL / 事务模式设计并发控制。

真实部署后发现 CloudBase RDB Builder 的运行时能力与原本假设不同。

于是把关键流程重新设计为:

原子条件更新 + 乐观锁 + 幂等 + 可补偿

例如浏览量更新:

UPDATE
WHERE id = ?
AND view_count = currentValue

没抢到就重试。

教训:类型能编译,不代表线上能力就真的存在。


3. 分享限流曾经可以被客户端 Session 绕过

匿名访问拿不到 IP 时,第一版会退化使用客户端提供的 Session ID。

问题是:

Session ID 是攻击者自己能改的。

轮换 Session 就能绕过限流。

最后改成:

  • 能得到可信服务端标识 → 正常分桶;
  • 得不到 → 进入统一 anonymous 桶,并采用更严格上限。

教训:限流 Key 只要包含客户端完全可控字段,限流基本就不存在。


4. Schema 越严,不一定体验越好

第一版非便便图片也要求完整视觉字段。

结果用户随手拍盆栽:

ANALYSIS_SCHEMA_INVALID

这在工程上很“严格”,在产品上却很糟。

最后规则变成:

安全字段必须严,描述字段可以降级。

所以:

  • 诊断性措辞;
  • 高风险约束;

必须严格阻断。

但:

  • objectCategory;
  • 非核心描述;

允许 unknown

于是“识别失败”最终变成了:

🌱 宇宙误入者


我刻意没有做的事

为了让边界比功能更可信:

  • 不做医疗诊断
  • 不给疾病概率
  • 不推荐药物
  • 不永久保留原始便便照片
  • 不把健康分析分享给朋友
  • 不让 AI 每次随机改变用户人格
  • 暂不做支付,会员功能先显示“敬请期待”

我希望这个产品先证明一件事情:

用户愿不愿意开始记录。

再讨论后面的商业化。


最后

很多 AI 产品都在解决:

“怎么让 AI 做更多?”

拉香了开发过程中,我花更多时间解决的却是:

“怎么让 AI 只做它该做的事情?”

百炼负责看懂图片。

结构化规则负责守住边界。

DBTI 负责让结果变得愿意被记住。

隔空扔💩负责让它愿意被分享。

记录系统负责让一次玩笑最终留下长期价值。

健康管理最难的往往不是分析,而是让人愿意开始第一次。

如果一个玩笑能让人多看自己一眼,
那它就不只是个玩笑。

—— 拉香了 · 便便人格 DBTI

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions