Nomia


2026

面向中国数字游民的 AI 迁居决策顾问。不是城市数据库——是先建模你的画像(Nomad DNA),再做可解释城市匹配和反事实推理的私人顾问。

  • 项目:Nomia · AI 迁居决策助手(Web / AI Agent,个人项目)
  • 角色:产品定义 + AI UX + 交互设计 + 全栈实现
  • 技术栈:LangGraph.js · shadcn/ui + Tailwind v4 · Langfuse · Prompt 版本化 · AI Agent: ClaudeCode
  • 规模:5 Specialist + 1 Orchestrator · 4 个 HITL · 10 城精修数据
  • 状态:Demo 已上线

在线体验:nomia-web-gules.vercel.app

起步时在想的问题

市面上有 Nomad List,做了十年城市数据,排行榜 + 筛选器,很成熟。但它回答的是「哪里适合数字游民」——同一排行给所有人看。一个拿中国护照、月预算 $3000、远程写代码、对空气敏感的人,和一个拿欧盟护照、月预算 $6000、做设计、爱海边的人,看到的东西一模一样。换句话说,这不是真的「推荐」,这是列表。

中国数字游民做迁居决策,真实约束比欧美用户硬得多:护照怎么签、钱怎么付、网能不能上、183 天税务怎么算。这些不是一个筛选器能回答的——你需要一个理解你情况的人告诉你去哪、为什么、以及哪个别去。

  • 核心问题 · Nomad List「哪里适合数字游民?」 vs Nomia「以我的情况,下一站去哪?」
  • 逻辑 · City → User(排行 + 筛选器) vs User → City(先建模用户再推荐)
  • 核心资产 · 城市数据 vs 用户模型(Nomad DNA)
  • AI 角色 · 辅助查询 vs 决策 + 解释 + 反事实推演
  • 体验 · 工具 vs 顾问

数据不是护城河。Nomad List 有十年数据,但你的竞品不是它——你的竞品是那个用户心里有想法、但说不清楚的「我想搬去哪」。Nomad DNA + 可解释决策 + 反事实,才是数据库做不了的事。

架构:5 个 Specialist,一个 Orchestrator

LangGraph.js 把迁居决策拆了 5 个 Specialist,一个 Orchestrator 串起来,中间设了 4 个 HITL(人在回路)介入点。每个 Specialist 出结果都带来源,用户可以在关键节点确认或改。整条链路:访谈 → 画像建模 → 城市匹配 → 反事实推理 → 迁居执行。

  • interview · 对话式访谈,ask → extract → check_coverage 循环
  • dna · Nomad DNA 10 维人格建模与归一化 · HITL:DNA 确认
  • match · 全量 10 城评分 → 3 推荐 + 2 反推荐 + 解释 · HITL:Match 选城
  • counterfactual · 反事实推理(预算 / 停留时长 / 签证自由度)· HITL:CF 变量输入
  • relocation · 签证 / 第一周 / 税务并行生成 · HITL:方案确认

几个关键设计选择

① User → City,不是 City → User

Nomad DNA 是 Nomia 最核心的东西。访谈收集信号,归一成 10 个维度(预算、气候偏好、签证自由度、语言舒适度、网络依赖、社群需求等)。跟 Nomad List 那种黑盒筛选器不一样——用户能看到自己的画像,能改,能确认。系统基于画像推理,不是基于标签过滤。

  • 预算刚性 72 · 财务韧性 65 · 签证自由度需求 48
  • 工作时区依赖 80 · 网络依赖度 88 · 社交需求 45
  • 文化适应性 62 · 风险偏好 42 · 税务敏感度 70 · 气候偏好 68(暖 · 适中 · 怕雾霾)

DNA 不是系统的私有模型。用户确认节点可以改任何维度——画像始终是你的,系统只是在你的画像上推理。

② Explainable Match:每个分数带来源,敢说「别去」

Match 对全量 10 城评分排名,出 3 个推荐和 2 个反推荐。每条分数都带维度解释和来源——不是黑盒排行。反推荐不用说「别去 X」,而是「针对你的情况,胡志明市不太合适」,拆到具体维度(空气、签证、成本),说清楚哪不合适。

每条数据都带可追溯四元组:source_url / fetched_at / sample_size / confidence,标注 sourceType 区分可信度。Demo 期没接真实 API 的维度(网速、社群、文化、气候)诚实标 stub,不挂 Numbeo 成本页冒充。

  • official · 官方来源 · 泰国 eVisa 外交部链接
  • manual · 人工整理 · Numbeo + Wikipedia 生活成本
  • api · 真实 API(已接入)· AQICN 空气质量
  • stub · 临时占位 · 网速、文化、社群(未接真实 API)

③ Counterfactual:如果预算 +$1000 会怎样

这是 Nomad List 做不到的事。静态数据库只能展示现状,Nomia 能推演。用户改三个变量(预算、停留时长、签证自由度),系统重新算城市排名和分数,展示 before → after + delta。让用户在决策前试不同假设,不是凭直觉下注。

举例:如果月预算提到 $2,500,首选从胡志明市变成第比利斯——更高预算让欧洲型候选的成本惩罚明显变小。第比利斯 2→1(▲+12)、里斯本 4→2(▲+9)、胡志明市 1→3(▼−8)、清迈 3→5(▼−5)。

简单说就是:Nomad DNA(不是黑盒 filter)+ Explainable Match + 反推荐(带来源)+ Counterfactual 推演(动态,不是静态切面)。数据库做不了这套。

④ Onboarding:开场暗示 3 个问题,其他聊着补

最早的 onboarding 是很重的 12 维度完整访谈,用户答完才看到结果,体验像 AI 问卷。后来改成开场直接说「先告诉我你做什么工作、月预算多少、最不能让步的是什么」,但用户可以用自然语言回答,不需要按表单填。回头客更简单——localStorage 记了 5 个稳定字段(护照、常驻地、职业、工作底线、时区),新会话弹出「这次也一样吗?」确认卡,一键带入。

后端有个 quickProfileToDnaDraft 层,把已知的事实性信息(护照、预算范围、工作类型)先灌进 dnaDraft,interview coverage 检测到这些维度已覆盖就不重复问。旧的 12 维完整访谈保留了入口,作为「深度校准」模式。

追问围绕「排序校准」而不是「采集第 N 个维度」。每个追问说明它会影响哪类城市排序——避免 AI 味问卷。回头客有档案确认卡,不用每次都重问基本信息。

⑤ 中国税务:183 天用确定性算法,不交给 LLM

中国税务居住天数(183 天、6 年规则)是 Nomia 针对中国用户的强差异点。纯函数确定性算法算,不是 LLM——因为确定性算错比 LLM 幻觉更难发现,所以更要可追溯、可复现。税务免责声明由代码注入 Schema 的 disclaimer 字段,不靠 LLM 生成(模型升级会「忘记」加这条)。

⑥ 工程顺手做的一些事

  • LLMProvider 抽象层:业务代码绝不直接调厂商 SDK,走统一 Provider,可一夜切换 provider
  • Prompt 版本化:所有 prompt 是 .md 文件 + version.txt + fixtures,改 prompt 必跑 regression
  • Langfuse 自托管 trace:Demo 期手动 span,数据不出境
  • 数据可追溯:每个数据点带四元组,db 层 CHECK 强制 fetched_at / confidence 非空
  • 税务免责代码注入:免责声明由确定性代码注入,不靠 LLM 生成

App 流程:一张图看完整个产品

前面几个设计选择,落在产品上就是一套页面和状态流转。整个 App 画成了一张图——marketing 入口怎么进来、Advisor 单页对话流怎么走、全局导航 AppHeader 和 AdvisorSide 怎么搭、辅助页有哪些,一直到 Stage 状态机的完整转换表。这张图两个用途:交付给开发,自己也拿来回头查——用户路径有没有断、状态有没有漏。

完整的页面与状态流转图(含 Stage 状态机转换表)在 在线 Demo 里。

踩过的坑

挑几个印象深的。

① 自动跳转省了用户一步,也抢了他们的控制权

DNA 建模完成后有个自动重定向:1s setTimeout 直接把用户推到结果页。本意是少一步等待,Critique 打回来——「用户都没来得及看 DNA 草稿,你就替人家走了」。换到自己想一下:电脑突然自己跳页了,慌不慌?改成显式按钮「去确认你的画像 →」,草稿晾在那,让用户自己定什么时候点。自动跳转省 1 秒,但用户信任的代价 N 秒也补不回来。

AI 产品不能替用户拍板,哪怕那个决定看起来很小。用户的参与感是一种安全感——「跳转」还是「停留」,要用户自己说算。

② 泰国税务用了中国规则——还好 review 抓出来了

Review 发现泰国税务被错套成中国范式(183 天 + worldwide),实际是 180 天 + remittance basis(汇入制)。这是 Nomia 差异化王牌的硬伤。3 个 agent 并行 WebSearch 多源交叉校验抓出来,写了 migration 修,用真实调研报告重写了 10 城签证 / 税务 / 第一周清单。

差异化的数据必须多源交叉校验。确定性算法错了比 LLM 幻觉更难发现——因为它自信地给出错误数字,你一般不会觉得它有问题。

③ Coworking 用线性公式,区分度塌了

社群强度用 coworking 数量线性打分(count/80*100),结果大城市(曼谷 164、墨西哥城 229)全 cap 到 100,中等城市(30-50)只有 38-63,小城市(8-15)只有 10-19——区分度坍塌。改成 log10 压缩后,中等城市升到 78-87,小城市升到 48-60,区分度恢复。一行公式改动。

④「你说过」暴露了用户还没说过的话

重构里的一个 bug,但暴露的是一层设计问题。fast 入口快启题有预初始化的权衡题默认答案——用户还没看到匹配题,右侧「你说过」面板已经把默认答案当成用户的选择显示出来。等于系统替用户 claim 了从没说过的话。修正逻辑:只展示用户实际确认过的题。

审计追踪必须忠实于用户的实际输入。AI 界面上展示「用户说过什么」这一行为会反作用于用户的认知——他看到你记错了,他就不敢信你还记得什么。

AI 辅助构建:Nomia 设计规范

Nomia 的整套 UI 是在 Vibecoding 模式下由 AI 辅助逐步构建的。从 shadcn/ui 基础组件到 Nomia 特有的 ScoreMatrix、AntiRecommendationCard、HITLConfirmBar 等 11 个业务组件,整个设计系统也是 AI 协作的产物——配色阶梯、Surface Ladder、动效曲线、评分色阶,都是在对话中迭代出来的。

完整的设计规范(配色阶梯、Surface Ladder、动效曲线、评分色阶)在 在线 Demo 里。

最终交付了什么

核心闭环跑通了:访谈 → Nomad DNA 建模 → 10 城评分排名 + 反推荐 → What-if 反事实推理 → 迁居执行清单。5 个 Specialist 全部跑通,4 个 HITL 介入点,UI 经历了 4 轮重设计(从 5 步骤页变成单页顾问对话流)。

  • 10 座精修城市,每条数据带来源 / 采样量 / 置信度标注,Demo 期未接真实 API 的维度诚实标 stub
  • 4 轮 UI 重设计:5 步骤页 → 单页顾问对话流(artifact 卡 + HITL 内嵌),shadcn/ui + Tailwind v4
  • 工程基建:LLMProvider 抽象层抗锁定 / Prompt 版本化 + regression / Langfuse 自托管 trace / 数据可追溯四元组
  • 中国税务:183 天 / 6 年确定性算法 + 免责声明代码注入

Metadata

Last Updated
Dimensions
Characters