现代舌诊系统 · 构建与演进 Skill
> 本 skill 把一套已落地的「现代舌诊」单文件 PWA 沉淀为可复用资产:换项目、换人、重装环境都能一句话调出重建。核心不是 HTML 模板,而是辨证规则引擎 + 双师知识 + 工程架构三件套(见 references/)。
一、系统总览(先读,避免方向跑偏)
现代舌诊 APP(index.html 单文件,离线可跑)
├─ 快速自查 Tab :舌象5维下拉自评 → buildDiagnosis → 八纲+六经+主兼证+名家点睛+调理建议
├─ 拍照辨证 Tab :面部/舌苔/舌下 三路拍照(取景框) + 睡眠/大便/不适 问卷 → 自动分析
├─ 舌诊资料库 Tab :IMA「正君的知识库」文献结构化(舌面分区/舌色/舌体/舌苔主病/常见病索引)
├─ 健康档案 Tab :IndexedDB 存含照片记录 + localStorage 存自查记录,可导出JSON
└─ 云端智能 :/api/analyze 代理(通义千问VL,密钥留后端) 与 本地规则引擎 并排对照
铁律(任何输出必须锁死,不可绕过):辅助参考、非诊断、不替代执业中医师面诊开方。所有报告页脚/云端返回都带强制免责声明。
二、何时用本 skill
- 用户要"做个舌诊/看舌/中医舌象工具"
- 用户要"把舌诊做成 APP / PWA / 手机能装"
- 用户要"接入倪海厦/李可舌诊规则"或"导入 IMA 舌诊资料"
- 用户要"拍照看舌 + 自动出辨证"
- 用户要"云端视觉模型真·看图辨证"(需联网+合规)
三、辨证规则引擎(系统心脏 · 见 references/engine.js)
输入:sel={color,shape,coatcolor,coattex,jinye} 五项(每项一个 id)+ 可选 extraTags + extraNotes。
输出:{tags, yinYang, hanRe, xuShi, liujing, zx[], quotes[], svgParam, notes[]}。
引擎关键设计(双师规则已编码进逻辑,不是文字摆设):
| 规则 | 来源 | 代码体现 |
|---|---|---|
| 舌淡胖+白厚不腻=阳虚运化无力,非湿 | 李可 | coattex==='bu' 时 delete('tanshi') 并加 yangxu/han |
| 无苔/剥落+舌淡胖=阳虚气化不利(温阳生苔),非阴虚 | 李可 | delete('yinxu')+add('yangxu') |
| 黄苔+舌淡=寒包火,勿纯清热 | 李可/倪 | hanbaohuo |
| 舌淡+舌干/燥=真寒假热,以舌为准 | 倪 | zhenhan |
| 舌红+苔白=寒热错杂厥阴 | 倪 | jueyin |
| 厚苔三分:白厚腻=真湿 / 白厚不腻=阳虚 / 黄厚=热 | 李可 | 分属 tanshi / yangxu / re |
| 主证按 prio 排序取最高(阳虚82/阴虚82/血瘀80/阴实78/厥阴88/真寒95) | — | zx.sort + zx[0].main=true |
references/engine.js 是可直接粘进任意 HTML <script> 的纯净引擎:含 5 维选项映射(COLOR/SHAPE/COATC/COATT/JINYE)、tongueSVG() 舌形生成、buildDiagnosis()、QMAP 问卷、buildCases() 名家案例对照、buildAdvice() 客观调理建议,以及 deriveTagsFromQuestionnaire() 把问诊答案转 tags。
三·五、五维融合辨证(求同存异体系 · 见 references/fusion-engine.js + 4 融合模块)
系统不是"舌诊单点",而是五维合一的问诊系统:舌诊为入口,其余四家作为融合模块补盲区,统一在八纲六经下,矛盾裁决"以舌为准"。
| 维度 | 来源 | 补的盲区 | 与底座的"同/异" |
|---|---|---|---|
| ①舌诊 | 倪海厦+李可 | 望诊主入口(舌质/苔/舌下) | 同根;引擎主体 |
| ②温病 | 叶天士/吴鞠通/薛生白 | 湿热/温病·卫气营血三焦·清透润 | 异:清凉 vs 扶阳辛温,异曲同工 |
| ③脉诊 | 李时珍濒湖/崔氏 | 切诊维度·脉舌合参 | 异:补"切";同归八纲六经 |
| ④体质 | 王琦九种 | 静态禀赋基线·本虚标实 | 异:慢变量底子 vs 动态证候 |
| ⑤本草食疗 | 神农/辨证施膳 | 食药干预+禁忌(禁大辛大热) | 异:从"药食"反观"方证" |
融合模块文件(references/):
- wenbing-fusion.md:温病湿热辨证精华(卫气营血/三焦/湿热三态/舌象意义/与扶阳边界);
- mai-zhen-fusion.md:脉诊合参(胃神根/27脉速查/脉舌矛盾以舌为准);
- tizhi-fusion.md:九种体质辨识(速查/与Boss映射/辨体调摄);
- bencao-fusion.md:本草药性+食疗(三品/十八反十九畏/Boss禁大辛大热/辨证施膳);
- fusion-engine.js:可移植融合引擎 fuseDiagnosis({tongue,pulse,symptoms,constitution,diet}) → 五维结论 + 求同存异裁决 + 合规铁律。
求同存异铁则:五维同归八纲六经;各学派在"清热/温阳/化湿/活血/补泻"上角度不同,但都以舌象为最终裁决(倪师"脉舌矛盾以舌为准")。Boss 定制"禁大辛大热"即此体系下温病边界与扶阳边界的合取。
四、工程架构决策(重建时必须照此,避坑)
- 单文件离线 PWA:
index.html内联 CSS+JS,无需构建。manifest.webmanifest + sw.js + icon-192/512.png 三件套齐全才能"添加到主屏幕"。 - HTTPS 是硬前提:
getUserMedia摄像头与 PWA 安装都要求安全上下文。局域网用 openssl 自签证书(带IP SAN)+ Nodehttps静态服务器(见 references/build-recipe.md 与 pwa-server 思路)。 - 照片用 IndexedDB 存 base64(localStorage 5MB 不够)。
sw.js须用 network-first +skipWaiting/clients.claim,否则手机 PWA 永远缓存首版不更新。 - 相机:
getUserMedia实时取景 +<canvas>截帧(shootCam必须先有 canvas 元素,这是初版"拍照无反应"的真 bug 根因)+<input type=file capture>兜底 + 翻转按钮 + 按部位切换取景框 SVG 引导。 - 背景乐两选一:Web Audio 实时合成五声音阶(离线零依赖,无音频文件)或
<audio>播 mp3(仙曲优先、文件缺失自动降级合成乐,避免误报"被拦截")。 - 云端视觉模式(可选):纯前端看不懂照片,要真·看图须上云端多模态。架构:前端 → 同源
POST /api/analyze代理 → 后端用 env 里的DASHSCOPE_API_KEY调通义千问 VL(OpenAI 兼容)→ 按双师框架要求结构化 JSON 返回。密钥只留后端,前端永不接触;前端加隐私授权勾选(健康biometric数据) + 无 key/断网自动降级本地引擎。
五、IMA 资料导入(见 references/knowledge-ima.md)
通过已连接的 ima-mcp 连接器 → get_knowledge_base_list 定位「正君的知识库」→ search_knowledge/get_knowledge_list 找舌诊文献 → fetch_media_content 抽真实正文(注意:IMA 解析版常含完整目录+章节正文,别误判为"仅试读")→ 结构化进「舌诊资料库」Tab(舌面脏腑分区 / 舌色 / 舌体 / 舌苔主病 / 科学依据 / 体质分辨 / 近50种常见病舌象索引 / 发展概况),逐块标注来源书。
六、工作流(按此顺序落地,先方法论再实现)
- 定边界:确认纯前端规则引擎 or 云端视觉(或双模式);确认合规铁律。
- 搭骨架:单文件 index.html + nav 多 Tab + 静态站点 + HTTPS 自签服务。
- 落引擎:把
references/engine.js粘进<script>,接 5 维自评 UI。 - 加拍照:相机弹窗 + 三路取景框 + 问卷 + 自动分析 + IndexedDB 档案。
- 接知识:从 IMA 抽舌诊文献结构化进资料库 Tab。
- (可选)云端:加后端代理 + 隐私授权 + 本地降级。
- PWA 收尾:manifest/icons/sw(network-first) + 安装按钮 + 背景乐。
- 校验:用 Node DOM-stub 跑
buildDiagnosis多场景(8 自查回归 + 4 拍照合并)确保主证唯一、名家案例与建议齐全、无语法错。
七、已验证经验(少踩坑)
- 初版"拍照无反应"=
shootCam用getElementById('camCanvas')但弹窗无此元素 → 补<canvas>。 - "音频被拦截"伪报错 = 音频文件缺失 + catch 文案写死"被拦截" → 改仙曲优先+失败降级合成乐。
- sw.js 一直 v1 + cache-first → 手机 PWA 卡首版 → 改 network-first + bump 版本 + skipWaiting。
- 健康数据(面部+舌象)上传云端前必须本人授权勾选,密钥绝不进前端。