【外滩大会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
temperature0,优先稳定与可复现
输出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 人格揭晓

ImageImage

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

同时展示:

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

④ 拍错了也有彩蛋人格

ImageImage

例如:

边界守护者

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


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

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

好友可以继续点击:

我也要测一个

形成完整传播闭环。


⑥ 记录与日期打卡

Image

每次成功分析自动进入:

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

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


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

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

当前部署状态

后端已经真实部署到 CloudBase

5 个云函数已经上线。

🟡 微信小程序已上线


项目链接

  • 演示录屏:使用录屏
  • 微信小程序: 拉香了打卡/拉香了。
Image

推荐评审体验路径

扫码
→ 登录
→ “这是什么💩?”
→ 选择测试图片
→ 查看 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

      , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
       blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
      }
      } catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
      })();
      (function(){
      try {
      var __m = "github.com";
      var __re = new RegExp('^' + "github\\.com" + '
      
      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
      temperature0,优先稳定与可复现
      输出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 人格揭晓

      ImageImage

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

      同时展示:

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

      ④ 拍错了也有彩蛋人格

      ImageImage

      例如:

      边界守护者

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


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

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

      好友可以继续点击:

      我也要测一个

      形成完整传播闭环。


      ⑥ 记录与日期打卡

      Image

      每次成功分析自动进入:

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

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


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

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

      当前部署状态

      后端已经真实部署到 CloudBase

      5 个云函数已经上线。

      🟡 微信小程序已上线


      项目链接

      • 演示录屏:使用录屏
      • 微信小程序: 拉香了打卡/拉香了。
      Image

      推荐评审体验路径

      扫码
      → 登录
      → “这是什么💩?”
      → 选择测试图片
      → 查看 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

          , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
          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
          temperature0,优先稳定与可复现
          输出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 人格揭晓

          ImageImage

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

          同时展示:

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

          ④ 拍错了也有彩蛋人格

          ImageImage

          例如:

          边界守护者

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


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

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

          好友可以继续点击:

          我也要测一个

          形成完整传播闭环。


          ⑥ 记录与日期打卡

          Image

          每次成功分析自动进入:

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

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


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

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

          当前部署状态

          后端已经真实部署到 CloudBase

          5 个云函数已经上线。

          🟡 微信小程序已上线


          项目链接

          • 演示录屏:使用录屏
          • 微信小程序: 拉香了打卡/拉香了。
          Image

          推荐评审体验路径

          扫码
          → 登录
          → “这是什么💩?”
          → 选择测试图片
          → 查看 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

              , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
              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
              temperature0,优先稳定与可复现
              输出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 人格揭晓

              ImageImage

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

              同时展示:

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

              ④ 拍错了也有彩蛋人格

              ImageImage

              例如:

              边界守护者

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


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

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

              好友可以继续点击:

              我也要测一个

              形成完整传播闭环。


              ⑥ 记录与日期打卡

              Image

              每次成功分析自动进入:

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

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


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

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

              当前部署状态

              后端已经真实部署到 CloudBase

              5 个云函数已经上线。

              🟡 微信小程序已上线


              项目链接

              • 演示录屏:使用录屏
              • 微信小程序: 拉香了打卡/拉香了。
              Image

              推荐评审体验路径

              扫码
              → 登录
              → “这是什么💩?”
              → 选择测试图片
              → 查看 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

                  , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
                  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
                  temperature0,优先稳定与可复现
                  输出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 人格揭晓

                  ImageImage

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

                  同时展示:

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

                  ④ 拍错了也有彩蛋人格

                  ImageImage

                  例如:

                  边界守护者

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


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

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

                  好友可以继续点击:

                  我也要测一个

                  形成完整传播闭环。


                  ⑥ 记录与日期打卡

                  Image

                  每次成功分析自动进入:

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

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


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

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

                  当前部署状态

                  后端已经真实部署到 CloudBase

                  5 个云函数已经上线。

                  🟡 微信小程序已上线


                  项目链接

                  • 演示录屏:使用录屏
                  • 微信小程序: 拉香了打卡/拉香了。
                  Image

                  推荐评审体验路径

                  扫码
                  → 登录
                  → “这是什么💩?”
                  → 选择测试图片
                  → 查看 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

                      , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
                      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
                      temperature0,优先稳定与可复现
                      输出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 人格揭晓

                      ImageImage

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

                      同时展示:

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

                      ④ 拍错了也有彩蛋人格

                      ImageImage

                      例如:

                      边界守护者

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


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

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

                      好友可以继续点击:

                      我也要测一个

                      形成完整传播闭环。


                      ⑥ 记录与日期打卡

                      Image

                      每次成功分析自动进入:

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

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


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

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

                      当前部署状态

                      后端已经真实部署到 CloudBase

                      5 个云函数已经上线。

                      🟡 微信小程序已上线


                      项目链接

                      • 演示录屏:使用录屏
                      • 微信小程序: 拉香了打卡/拉香了。
                      Image

                      推荐评审体验路径

                      扫码
                      → 登录
                      → “这是什么💩?”
                      → 选择测试图片
                      → 查看 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

                          , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
                          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
                          temperature0,优先稳定与可复现
                          输出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 人格揭晓

                          ImageImage

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

                          同时展示:

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

                          ④ 拍错了也有彩蛋人格

                          ImageImage

                          例如:

                          边界守护者

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


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

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

                          好友可以继续点击:

                          我也要测一个

                          形成完整传播闭环。


                          ⑥ 记录与日期打卡

                          Image

                          每次成功分析自动进入:

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

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


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

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

                          当前部署状态

                          后端已经真实部署到 CloudBase

                          5 个云函数已经上线。

                          🟡 微信小程序已上线


                          项目链接

                          • 演示录屏:使用录屏
                          • 微信小程序: 拉香了打卡/拉香了。
                          Image

                          推荐评审体验路径

                          扫码
                          → 登录
                          → “这是什么💩?”
                          → 选择测试图片
                          → 查看 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

                              , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
                              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
                              temperature0,优先稳定与可复现
                              输出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 人格揭晓

                              ImageImage

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

                              同时展示:

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

                              ④ 拍错了也有彩蛋人格

                              ImageImage

                              例如:

                              边界守护者

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


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

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

                              好友可以继续点击:

                              我也要测一个

                              形成完整传播闭环。


                              ⑥ 记录与日期打卡

                              Image

                              每次成功分析自动进入:

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

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


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

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

                              当前部署状态

                              后端已经真实部署到 CloudBase

                              5 个云函数已经上线。

                              🟡 微信小程序已上线


                              项目链接

                              • 演示录屏:使用录屏
                              • 微信小程序: 拉香了打卡/拉香了。
                              Image

                              推荐评审体验路径

                              扫码
                              → 登录
                              → “这是什么💩?”
                              → 选择测试图片
                              → 查看 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