掌纹 / 面相 识图 Skill(混合架构 · 最省版)
定位
趣味 / 自我探索工具,非命运预测。所有输出必须附免责声明(见 assets/disclaimer.md)。
架构(三层,越往下越省)
- 本地特征提取(免费、快,仅手相):
scripts/extract_features.py用 OpenCV 抠手掌区域、估算手型、检测三大主线存在度与清晰度,输出features.json。
- 几何深化(MediaPipe 21 点):若装了mediapipe,scripts/geometry.py从 21 个手部关键点算指段长、指长比(食指/无名指 vs 中指)、解剖掌长宽比、拇指相对长度与外展角、四元素/六型手型几何近似,并摊进features.thumb / fingers / hand(与云端词表对齐,规则双路径同命中)。这些量是确定性几何计算,比线条纹理可靠,置信度标medium。
- 拇指 / 手指 / 手型的可计算维度因此可本地完成(见规则thumb.json「几何」部件、fingers.json「指长比」部件、handshape_western.json「四元素/六型几何」部件);纹理类(指尖方尖、指节粗细、掌丘发达度、肤色气色)仍属云端/人工项。
- 未装mediapipe→ 几何字段缺失,相关部件走兜底,整条本地路径优雅降级;装法:pip install mediapipe(建议放受管 venv)。
- ⚠️ 面相没有本地 CV:人脸结构识别必须走云端视觉(见第 3 层vision_extract_face.md)。 - 本地规则解读(免费):
scripts/interpret.py是通用规则引擎,读取features.json,按knowledge/rules/*.json(手相)或knowledge/rules/face/*.json(面相)中声明的规则出结构化解读,输出reading.md。所有领域知识都在 JSON 里,新增/修改模块只改 JSON 不需改代码。 - 可选云端润色(按需、耗 token、需用户授权):
- 手相补标:prompts/vision_extract.md把原图送视觉模型补高置信度线条标注(含真实性甄别 / 左右手自动识别 / 性别字段)。
- 面相辅标:prompts/vision_extract_face.md把人脸送视觉模型输出面相features.json(domain=face,含真实性甄别 / 性别字段)。
- 文本润色:prompts/report.md把reading.md丢给文本大模型做自然语言润色。
- 三阶段叙事:prompts/synthesize.md把reading.md+features.json+ 必填gender丢给云端模型,输出"过去/现在/未来 + 性格画像 + 个性化建议"。本地零 token 替代:knowledge/rules/synthesis_{palm,face}.json(简化版)。
- 不调用也能完整出报告(面相需在云端拿到 features 后再本地解读)。
> 设计原则:默认全程本地、零 token、照片不出设备;只有当用户明确授权要"更像人写的"或本地线条识别置信度低时才走云端,且云端步骤前必须告知"照片将发送至第三方模型"。面部照片属敏感生物特征,授权要求更严格。
使用流程
- Step 0 · 强制询问(不可跳过):
- 性别(male/female):在跑extract_features.py/interpret.py/ 云端补标之前,必须先向用户确认性别。原因:①单凭照片视觉推断性别不可靠(曾把女性手误判为男性),②gender_palm.json/gender_face.json各自有独立男女分支,性别用于手相·男女差异等模块的特征解读(线形/掌肉/权重)。
- 惯用手(right/left):必须询问用户是右撇子还是左撇子(决定手位主次)。若用户拒绝/未答,按右撇子默认口径,并在报告头标注"惯用手未提供,暂按右撇子"。
- ⚠️ 手位含义由惯用手决定,与性别无关:右撇子→右手=后天(主≈70–80%)、左手=先天(辅≈20–30%);左撇子反之。「男左女右」是民间简化、无理论依据,本技能不采用(详见knowledge/rules/hand_phase.json与interpret.py头注)。
- 用户未提供性别:按"未提供"走通用口径(fallback分支),报告头标注"未提供性别,已按通用口径解读"。 - 采集必要信息 + 双手建议:
- 手相照片要求:掌心朝上、光线均匀、五指自然张开、明确左右手。
- 建议用户同时上传左右手(先传右手、再补左手)。流程编排:先传右手 → 做「后天主诊断」(当前状态/30 岁后/努力成果);出报告后提示用户:"想更准?再传左手,我补「先天」(遗传禀赋/30 岁前/体质基础/潜在风险)判断,并做左右对照看努力是否改写了先天趋势。"若用户补传左手 → 对左手跑interpret(先天辅)→ 走synthesize.md的「先天 vs 后天 对照」节(双手权重合并叙事)。
- 面相照片要求:正脸、光线均匀。 - 手相路径:
-python3 scripts/extract_features.py <图片> --out features.json [--hand left|right] [--handedness right|left|unknown]
-python3 scripts/interpret.py features.json --out reading.md [--gender 由云端回填]
- (可选·授权后)云端补标:vision_extract.md→ 重跑 interpret。 - 面相路径(无本地 CV,必须云端):
- (可选·授权后)python3 scripts/interpret.py <人脸图按 vision_extract_face.md 产出的 features.json> --domain face --out reading.md
- 或直接在对话里把云端features.json交给引擎;引擎按--domain face加载knowledge/rules/face/。 - 第三层 · 叙事综合(可选·推荐):
- 默认reading.md是结构化证据("看到了什么 → 解读 → 建议"分模块列),已含「手位与权重(先天/后天)」模块声明本手角色。
- 想看到"像真手相师那样讲过去 / 现在 / 未来 + 性格画像 + 个性化建议",把reading.md+features.json+ 必填的gender+handedness丢给prompts/synthesize.md(云端,需用户授权)。若上传双手,额外把左手的features.json/reading.md一并传入,synthesize 会输出「先天 vs 后天 对照」节(惯用手≈70–80% 主导、非惯用手≈20–30% 修正)。
- 拒绝云端时,引擎的synthesis_{palm|face}.json模块会渲染本地零 token 兜底的简化版(性格画像 + 现状 + 通用建议,order=99 自动放最后)。本地兜底为单手视角;双手完整对照需云端 synthesize。 - 隐私门(强制):调用任何云端模型前,必须明确告知用户"以下操作会将您的照片发送至第三方 AI 模型",并获得确认。未获授权不得调用;非真实照片(AI 生成/卡通/绘画/重度滤镜)必须拒绝解读(见 prompts 内「真实性甄别」)。
- 报告开头 / 结尾附
assets/disclaimer.md内容。
扩展方式(解耦后的标准动作)
- 新增/修改手相解读模块:在
knowledge/rules/放一个{模块名}.json(字段见下方"规则 JSON schema"),引擎自动加载,无需改interpret.py。 - 新增/修改面相解读模块:在
knowledge/rules/face/放{模块名}.json,并以interpret.py --domain face调用。 - 调整某条结论文本:直接改对应 JSON 的
text,不改代码。 - 新增符号/纹形:往
symbols.json的dictionary加一条即可。
输出格式
- 手相(默认域):按 生命 / 事业 / 爱情 / 健康 / 财运 / 拇指 / 手指(西式) / 西式手型 / 符号与线形 / 手相·男女差异 分模块给出「看到了什么 → 解读 → 建议」。
- 面相(
--domain face):按 脸型·五行形 / 三停 / 五官 / 十二宫 / 面痣 / 气色 / 面相·男女差异 分模块给出同上结构。报告头标注"面部照片敏感"提示与性别。
知识底座
knowledge/ 已蒸馏整合:
- 中式·手相(已并入):《图解麻衣神相》——三才纹语义维度、八卦九宫掌位映射、论手原则、吉祥纹形。
- 西方·手相(已并入):Cheiro / Benham——七型手、逐指、拇指、智慧线起点、西式特殊符号、Benham 七丘类型。
- 中式·铁关刀(已并入):纹线吉凶系统、拇指相法、掌色爪甲、特殊标记;拇指模块、铁关刀六型手。
- 面相篇(本次新增):knowledge/tiedaodao_face.md 蒸馏自《图解麻衣神相》《柳庄相法》《神相铁关刀》——五行形、三停、五官、十二宫、面痣、气色、男女差异;并落地为 knowledge/rules/face/ 七个 JSON 模块 + gender_palm.json(手相男女差异)。
> 配套规划文档见《掌纹识图skill-可行性与书单.md》。
已知局限(诚实标注)
- 本地 CV 对「哪条线是哪条」识别为边缘密度粗估、低置信度:输出统一用概率性措辞(
likely_present/possible/unlikely+ 密度等级),不表述为「明显 / 深而清晰」。细符号(岛 / 十字 / 星)本地基本识别不了。 - 西式七型手 / Benham 七丘类型:知识在 skill(
handshape_western.json完整定义 +western.md来源),但识别置信度低——指尖形状(方/尖/圆/铲/匙)和七丘发达度需要高清近距照片 + 视觉细评,本地 CV 与单次手机照都难以可靠给出。处理:本地仅算"四元素/六型几何近似"(hand.element_estimate置信度 medium);细分仍属云端/人工项。 - 命运线 / 太阳线"未见"不等于"不存在":缺失/浅淡是 palmistry 常态(多数人本就没有强命运线),但报告里 confidence=low 表示我无法在照片中确认其存在,可能是真无、可能是太浅、可能是我视觉遗漏——三者无法仅凭单张照片区分。需更清晰照片或专业扫描才能上调置信度。
- 面相无本地 CV,人脸结构只能靠云端视觉模型;云端结论亦为「视觉可见形态」的倾向性判断,非事实/医学/身份结论。
- 拍照质量(光线、角度、皮肤状态、镜像自拍)显著影响结果。自拍照片左右相反,云端 prompt 已要求「先翻转判定再写 hand_side」。
- 左右手口径(按惯用手,性别无关):在
features.json设"school",默认"congenital_acquired"(惯用手=后天、非惯用手=先天)。惯用手决定主次:右撇子→右手(后天)为主≈70–80%、左手(先天)为辅≈20–30%;左撇子反之。报告头与knowledge/rules/hand_phase.json据此声明本手角色与权重。「男左女右」为民间简化、无理论依据,现代主流已摒弃,本技能不采用(若误设male_left_female_right,报告头会显示弃用提示)。建议同时上传左右手以做先天/后天对照。 - 真实性甄别:AI 生成图 / 卡通 / 绘画 / 重度滤镜导致掌纹面相不可信,引擎要求视觉模型拒绝解读(authenticity 非 real_photo 时其余字段填 unknown)。
- 云端路径需用户授权:任何把照片发往第三方模型的操作,必须先告知并取得确认;面部照片授权要求更严。
- 手相 / 面相均无科学实证,仅作文化娱乐与自我觉察。
规则 JSON schema(供扩展)
knowledge/rules/*.json 与 knowledge/rules/face/*.json 每个文件定义一个模块,通用引擎自动加载并按 order 排序:
{
"module": "模块名",
"type": "feature", // 或 "symbol_lookup"(符号查表型)
"order": 1, // 报告内顺序
"confidence_path": "lines.life.confidence", // 该模块置信度取值路径(feature 型用)
"default_suggestion": "建议文本",
"parts": [ // feature 型:模块可含多个部件,各自独立匹配
{
"name": "部件名",
"rules": [
{"when": {"dot.path": ["值A", "值B"]}, "text": "命中时输出的结论"},
{"when": {"dot.path": ["*"]}, "text": "通配,恒真"}
],
"fallback": {"text": "无规则命中时的兜底文本"}
}
],
"flags": [ // 追加说明,命中后拼到指定部件文本后
{"when": {"dot.path": ["值"]}, "append_to": "部件名", "text": "追加内容"}
]
}
when条件为「字段值 ∈ 允许列表」(列表内任一即命中;"*"通配恒真)。多条when取「全部满足」。symbol_lookup型用dictionary+intro_text+empty_text,引擎遍历features.symbols查表。- 文本支持
{dot.path}占位符,渲染时替换为 features 对应值。 - 男女差异:在对应域放
gender_palm.json/gender_face.json,用when: {"gender": ["male"|"female"]}分支,未提供性别走 fallback(通用口径)。