1. 项目概述当MBTI遇见占卜一个开源AI的趣味实践最近在GitHub上看到一个挺有意思的开源项目叫mbti-fortune。简单来说它把严肃的心理学工具MBTI迈尔斯-布里格斯类型指标和“算命”结合在了一起。你问它一个问题比如“我该不该换工作”它不会像传统MBTI测试那样分析你是什么人格类型而是会随机“抽”出一个MBTI人格类型然后用这个类型的认知功能栈来解读你的问题给出一个“命运指引”。听起来有点玄乎对吧我第一次看到也觉得这玩意儿是不是太“不科学”了。但仔细研究了一下它的实现逻辑和背后的荣格认知功能理论我发现这其实是一个相当精巧的“思维实验”工具。它不是一个预测未来的神棍软件而是一个强迫你跳出自身思维定式、从16种截然不同的视角重新审视问题的“认知透镜”。对于产品经理、设计师、开发者或者任何需要创意和多元思考的人来说这玩意儿可能比一堆枯燥的头脑风暴方法论更有用。它开源、可玩性高而且代码结构清晰非常适合想了解AI应用、自然语言处理NLP以及如何将心理学模型工程化的朋友学习参考。2. 核心原理拆解荣格认知功能如何成为“占卜语言”这个项目的核心魅力不在于随机抽签而在于它那套扎实的、基于荣格心理学的“翻译”体系。要理解它怎么工作甚至想自己动手魔改或复现我们必须先吃透这套底层语言。2.1 八维认知功能人格的“操作系统”MBTI的四个字母如INTP、ESFJ只是表象真正决定一个人如何思考、感受和决策的是背后八种认知功能的排列组合。这八种功能可以理解为心智处理信息的八种基本“算法”。功能代码名称核心本质大白话解释Si内倾感觉记忆、传统、一致性“经验主义者”。依赖过去的经验和感受追求稳定和可预测性。比如总去同一家餐馆点同样的菜。Se外倾感觉当下、行动、感官体验“现实主义者”。完全活在当下通过五感与世界直接互动。热爱运动、美食、即兴冒险。Ni内倾直觉洞察、愿景、模式识别“预言家”。能从零星信息中看到本质和未来的必然走向。喜欢深度思考结论常常是“我早就知道了”。Ne外倾直觉可能性、连接、探索“创意发电机”。思维发散能在不同概念间建立意想不到的联系。头脑风暴高手但可能难以聚焦。Te外倾思维逻辑、因果、效率“指挥官”。用外部客观标准数据、流程、结果来组织和决策世界。追求高效和解决问题。Fe外倾情感和谐、关怀、社交动态“粘合剂”。关注他人感受和群体氛围致力于维护关系和谐。是团队中的情感雷达。Ti内倾思维分析、原理、精确性“逻辑学家”。构建复杂、自洽的内部逻辑框架。追求精确和真理不在乎是否符合外界标准。Fi内倾情感价值观、真实性、深度“理想主义者”。依据内心深刻的价值观和情感做判断。追求真实和自我认同情感丰富但不外露。这八种功能每个人都具备但使用频率和熟练度天差地别。这就引出了最关键的概念功能栈。2.2 功能栈人格类型的“技能栏”每个MBTI类型都有一个固定的、由四个功能组成的功能栈按主导最擅长、辅助、第三、劣势最不擅长的顺序排列。这决定了该类型认知世界的“默认路径”。例如INTP逻辑学家Ti内倾思维 → Ne外倾直觉 → Si内倾感觉 → Fe外倾情感主导Ti他们首先用内部逻辑分析一切追求模型的精确。辅助Ne接着用发散思维寻找各种可能性填充逻辑框架。第三Si偶尔参考过去的经验和数据。劣势Fe最不擅长处理群体情感和谐可能显得疏离或笨拙。ESFJ执政官Fe外倾情感 → Si内倾感觉 → Ne外倾直觉 → Ti内倾思维主导Fe他们首先感知并照顾周围每个人的情绪维持和谐。辅助Si依赖于传统的、被验证过的社交方式和经验。第三Ne偶尔会畅想聚会的各种可能性。劣势Ti最不擅长构建复杂的、脱离人际关系的抽象逻辑体系。mbti-fortune项目的核心算法就是基于这个功能栈来生成解读。当它为你随机抽到一个类型比如INTJ它并不是在描述你而是在模拟一个“虚拟的INTJ顾问”会如何思考你的问题。它会用INTJ的功能栈Ni→Te→Fi→Se作为过滤器来加工你的问题并输出答案。2.3 随机性与“确认偏误”的妙用项目通过时间戳、问题文本的哈希值或会话熵来生成随机数0-15对应16种类型。这种随机性至关重要它打破了“固定答案”的预期每次都是全新的视角。这里涉及一个有趣的心理学概念确认偏误。人们倾向于寻找和支持符合自己已有信念的信息。在传统占卜中求问者会不自觉地将模糊的解读套用在自己身上觉得“好准”。mbti-fortune则反其道而行之它利用这种心理但提供的是结构化的、基于理论的多元视角。你得到的答案可能与你本能的想法相反这种认知冲突恰恰是价值的来源——它迫使你思考“为什么从这个角度看事情会是这样”实操心得在设计这类“非确定性”交互系统时随机算法一定要有足够的“熵”不可预测性。简单的Math.random()在简单场景下可用但为了增加趣味性和“仪式感”可以像这个项目一样结合用户提问的时间、问题长度甚至首个字符的Unicode码来生成种子让用户感觉这次“抽签”是独一无二的。3. 系统设计与实现解析看懂了原理我们来看看这个项目是怎么把它变成代码的。虽然原项目是OpenClaw平台的一个技能Skill但其核心逻辑完全可以剥离出来用任何你熟悉的语言Python、JavaScript等实现一个命令行工具、Web应用甚至聊天机器人插件。3.1 核心数据模型类型库与功能词典首先需要构建一个坚实的“知识库”。在代码里这通常是一个类型数组或字典。// 示例JavaScript/TypeScript 中的类型定义 const mbtiTypes [ { type: INTP, archetype: 逻辑学家, stack: [ { function: Ti, role: dominant, weight: 0.60 }, { function: Ne, role: auxiliary, weight: 0.25 }, { function: Si, role: tertiary, weight: 0.10 }, { function: Fe, role: inferior, weight: 0.05 } ], description: 抽象逻辑与无尽好奇心的结合体。 }, { type: ESFJ, archetype: 执政官, stack: [ { function: Fe, role: dominant, weight: 0.60 }, { function: Si, role: auxiliary, weight: 0.25 }, { function: Ne, role: tertiary, weight: 0.10 }, { function: Ti, role: inferior, weight: 0.05 } ], description: 社会的粘合剂真诚的社区建设者。 }, // ... 其他14种类型 ];同时需要一个八维功能的详细解释词典const cognitiveFunctions { Ti: { name: 内倾思维, essence: 分析、原理、精确性, interpretation: (context) 这件事在你内心的逻辑模型里说得通吗${context}的核心原理是什么抛开别人的看法你自己推导出的结论是什么, shadowWarning: 小心陷入过度分析而无法行动或者忽视了他人的情感逻辑。 }, Fe: { name: 外倾情感, essence: 和谐、关怀、社交动态, interpretation: (context) 这个决定会让相关的人感觉如何团队/关系的氛围会被影响吗为了维持和谐你需要考虑什么, shadowWarning: 过度迎合他人可能导致你压抑自己的真实需求最终引发 resentment。 }, // ... 其他六个功能 };3.2 随机抽取与权重分配逻辑“抽签”算法需要保证均匀随机同时为后续解读提供权重依据。# 示例Python 实现 import random import hashlib import time def draw_mbti_type(question: str None) - dict: 根据问题或随机种子抽取一个MBTI类型。 if question: # 使用问题文本生成一个确定性但看似随机的种子 seed int(hashlib.sha256(question.encode()).hexdigest(), 16) % 10000 random.seed(seed int(time.time())) # 混合时间戳增加随机性 else: random.seed() # 使用系统时间 type_index random.randint(0, 15) selected_type mbti_types[type_index] # 为解读分配权重可配置这里采用项目默认值 weights {dominant: 0.60, auxiliary: 0.25, tertiary: 0.10, inferior: 0.05} for func in selected_type[stack]: func[interpretation_weight] weights[func[role]] return selected_type为什么这么设计权重这模拟了该人格类型在现实生活中处理问题的精力分配。主导功能是默认的、最强大的工具所以占解读的大头60%。辅助功能是“副手”提供重要补充25%。第三功能像“青少年技能”时灵时不灵略带笨拙感10%。劣势功能是“盲点”通常被回避或压抑但它的缺失恰恰定义了该类型的局限性5%在解读中常用来解释“为什么事情不会朝相反方向发展”。3.3 自然语言生成从功能到“神谕”这是最体现创意和工程能力的部分。如何将干巴巴的认知功能代码转化成一段有说服力、甚至带点“神棍”风格的个性化解读项目采用了一种模板填充逻辑推理的策略。它不是简单的句子拼接而是根据功能角色和问题上下文调用不同的“解释策略”。问题分类与上下文提取首先用简单的NLP技术如关键词匹配或意图识别判断问题领域职业、关系、生活决策、趣味。这决定了解读的大致方向。主导功能解读60%这是答案的基调。例如对于“该不该创业”的问题如果抽到Te主导如ENTJ解读会聚焦于“效率、规划、资源整合”“你的Te功能在尖叫——它已经列出了一个损益表和一份六个月的执行路线图。问题不在于‘该不该’而在于‘最优路径是什么’。”辅助功能润色25%为主基调添加色彩。接上例如果辅助功能是Ni如ENTJ则会补充“你的Ni辅助让你看到了这个项目三年后的清晰图景正是这个愿景在驱动Te去制定计划。但小心别让愿景的美妙掩盖了计划中某个季度的现金流风险。”劣势功能警示5%提供独特的反向洞察。接上例劣势功能是Fi如ENTJ“你的Fi劣势在提醒你这份事业和你内心真正的热情一致吗还是只是为了证明自己Te-Ni的组合能帮你成功但只有处理好Fi成功才会带来满足感而非空虚。”注意事项编写解读模板时切忌直接罗列功能定义。一定要场景化、具体化。不要说“因为你有Se所以你注重体验”而要说“你的Se功能让你无法忍受纸上谈兵。关于‘要不要去旅行’这个问题你的身体可能比大脑更早给出答案——想想上次你置身于新鲜风景中的那种鲜活感那就是Se在说话。”4. 部署与应用不止于娱乐的扩展场景原项目作为OpenClaw技能安装后可以在聊天中直接调用。但它的潜力远不止于此。我们可以将其核心引擎剥离应用到更多有趣的场景中。4.1 本地化部署与API化你可以用FlaskPython或ExpressNode.js快速搭建一个Web API。# Flask API 示例 from flask import Flask, request, jsonify app Flask(__name__) app.route(/api/fortune, methods[POST]) def get_fortune(): data request.json question data.get(question, ) user_context data.get(context, {}) # 可传入用户历史、性别等用于个性化 # 1. 抽取类型 drawn_type draw_mbti_type(question) # 2. 生成解读 reading generate_reading(question, drawn_type, user_context) # 3. 格式化输出 response { question: question, drawn_type: drawn_type[type], archetype: drawn_type[archetype], stack: → .join([f[function] for f in drawn_type[stack]]), answer: reading[verdict], # 如 Yes, but... reading: reading[full_text], advice: reading[practical_advice] # 可额外生成行动建议 } return jsonify(response)这样前端网页、App、聊天机器人就可以通过调用这个API来获取“占卜”结果实现灵活的集成。4.2 创意应用场景拓展团队头脑风暴与决策辅助工具在会议陷入僵局时随机抽取一个MBTI类型要求团队成员暂时用该类型的视角来重新陈述问题或提出方案。例如“现在我们全体假装自己是ESTP企业家用Se-Ti的视角这个市场机会的具体抓手是什么” 这能有效打破群体思维。角色扮演与写作灵感生成器作家或游戏设计师可以用它来生成角色对某个事件的反应。输入“你的角色目睹了一场背叛”然后抽取不同的类型得到截然不同的内心独白和行动倾向让人物立刻丰满起来。个性化内容推荐引擎的“冷启动”在新用户缺乏行为数据时可以引导其进行几次“MBTI占卜”互动通过他/她对不同解读的反应点赞、深入提问模糊地推断其偏好倾向是更认同理性分析还是情感共鸣作为初始推荐依据。自我反思与日记工具每天睡前问一个今日困扰让系统提供一个随机视角的解读。长期下来你会发现自己对同一类问题总是倾向于认同或排斥某几种类型的解读这本身就是深刻的自我认知过程。4.3 常见问题与排查实录在开发和玩转这类项目的过程中我踩过一些坑也总结了些经验Q1生成的解读感觉空洞、重复像在套模板A1这是初期最容易出现的问题。解决方案是丰富你的“语料库”和“逻辑链”。不要只写结论要写推理过程与其说“因为你是Ni所以你有远见”不如说“你的Ni功能像一台后台运行的预测算法它已经处理了过去六个月的所有行业简报、你老板的微表情、以及项目里的那些‘不对劲’的瞬间然后得出了一个结论。你现在感觉到的‘预感’就是Ni输出的结果。”引入多层逻辑结合辅助和劣势功能形成矛盾或张力。例如“你的主导Te说‘必须立刻优化这个流程’但你的劣势Fi却在角落小声问‘做这件事让我感觉自己是好的吗’ 这种内在冲突就是你现在犹豫的原因。”Q2随机抽取的结果用户总觉得不准或不喜欢怎么办A2教育用户并设置正确的预期。在交互开始前或结果页面上明确说明“提示本工具并非预测你的命运而是为你提供一个随机的、基于心理类型理论的思考视角。答案的价值不在于‘对错’而在于它能否打破你固有的思维模式带来新的启发。如果你不喜欢这个答案恰恰说明它可能触及了你未曾审视的盲区。”Q3如何让回答更具互动性和个性化A3可以在提问前增加简单的上下文收集。单选框“你当前更关心的是A. 职业发展 B. 人际关系 C. 个人成长 D. 纯粹好奇”情绪选择“你对这件事的感受更接近A. 充满期待 B. 焦虑不安 C. 困惑迷茫 D. 无所谓” 在生成解读时将这些上下文融入。例如如果用户选了“焦虑不安”在ISTJSi主导的解读中可以强调“你的Si功能在焦虑时会格外依赖过去的成功经验来寻求安全感。回想一下三年前那次让你同样不安的挑战最后是如何平稳度过的那个模式里是否有可复用的部分”Q4认知功能理论本身存在争议如何应对A4坦然承认。心理学模型本身就不是精密科学。可以在项目介绍或FAQ中注明“本工具基于荣格心理学派生的MBTI及认知功能理论该理论是理解人格差异的有趣视角之一但并非绝对真理。我们将其作为一种启发性的思维框架和娱乐工具而非严格的科学诊断。享受它带来的灵感碰撞但不必奉为圭臬。”5. 伦理边界与设计反思开发和使用这类融合了心理学与娱乐的工具必须时刻警惕伦理红线。绝对禁止用于心理诊断或治疗必须在所有显眼位置标注“仅供娱乐和启发思考”。不能声称或暗示其具有疗愈、诊断功能。对于表现出严重情绪困扰的用户应提供转向专业心理咨询的渠道提示。避免强化刻板印象解读应侧重于“认知过程”如何思考而非“人格标签”是什么人。避免使用“所有INTP都是书呆子”、“ESFJ都很八卦”这类绝对化、标签化的表述。强调“这是一种思考方式”而非“这是你的思考方式”。数据隐私如果在线部署明确告知用户问题内容是否被存储、用于何种用途如改进模型。最好提供匿名使用选项或像原项目一样完全在本地进行随机计算不记录任何数据。保持开放性开源项目的一大优势是社区贡献。可以鼓励用户为特定类型或功能提交更生动、更文化的解读模板让这个“透镜库”越来越丰富。这个项目的真正价值在于它用一种极客和好玩的方式普及了“认知多样性”的概念。它提醒我们任何一个复杂问题都存在多种自洽的解读框架。下次当你陷入思维困境时不妨手动玩一下这个游戏随机选一个MBTI类型查查它的功能栈然后试着用它的“第一性原理”来重新分析你的问题。你会发现答案本身或许不重要但切换视角的过程本身就是一种创造力的锻炼和认知的解放。这大概就是这个看似“不务正业”的开源项目带给我们的最正经的启示。