
1. 项目拆解一个看似简单却藏满细节的需求1.1 这个需求到底在解决什么问题我最近在做一个智能穿搭推荐的小项目核心需求一句话就能讲清楚输入当天天气、温度和出行目的系统自动推荐一套穿搭上衣、裤子、鞋子全配齐同时兼顾保暖和美观。听起来像是个“套公式”的玩具级应用但真正做下来我发现这个需求背后藏着一套特别典型的知识密集型推荐系统。它不是那种“数据喂进去模型吐出来”的黑盒方案能解决的而是需要把人对穿衣的常识和审美系统地拆解成可执行的规则。如果你也是个喜欢折腾工具产品的人你会发现类似的场景特别多比如闹钟响了不知道穿什么、出差前对着行李箱发呆、换季时打开衣柜全是衣服但就是不知道搭哪件。这些问题看起来是“懒”本质上是“信息过载决策疲劳”。今天的温度、湿度、风力这些客观数据和“今天要去见客户”“今天和对象约会”这种主观场景一叠加决策复杂度一下就上来了。这个项目就是要把这层复杂度接管过来让用户花三秒钟得到一个大概率不出错的方案。1.2 难点不只是温度匹配这里有个很容易踩的误区很多人第一时间想做的是“温度-衣物”映射表。比如10度穿卫衣5度穿羽绒服然后按温度给一件上衣配一条裤子一双鞋完事。但实际用过就知道这种方案根本没有可用性。第一个问题是温度本身不够。同样的15度晴天无风和大风阴雨体感完全不同同样的28度湿度80%和湿度40%穿法也不一样。所以天气数据不能只看气温体感温度、降雨、风速都得考虑进来。第二个问题是“出行目的”这个约束条件比温度更硬。同样是10度的天气你要是去晨跑穿羽绒服就是灾难你要是去参加婚礼穿运动裤也不合适。温度和天气决定的是“能不能保暖”出行目的却决定“穿出去像不像话”。这两个维度一旦冲突系统必须给出一个合理的取舍方案而不是简单粗暴地“哪边权重高听哪边的”。第三个问题也是审美层面的穿搭推荐要兼顾美观这个“美观”很主观但它也不是完全没规律。比如同属于保暖等级4的外套有羽绒服、羊毛大衣、厚夹克三个选项适合的场景完全不一样。如果是商务通勤羊毛大衣明显更合适如果是周末逛街厚夹克可能更符合轻松的氛围。所以规则库里每一个档位都得有多个候选并且能按场景做二次筛选。2. 方案选型规则引擎、机器学习还是大模型2.1 我为什么不首选大模型现在聊到智能推荐很多人第一反应是“上大模型”。我确实试过用LLM来做这件事给它一段天气和场景描述让它直接输出穿搭建议。效果怎么说呢单个建议看起来像模像样但真正落地时你会遇到三个麻烦。第一是稳定性。同一个温度和场景不同时间问它给出的衣服可能完全不同甚至会出现这次推荐短袖、下次推荐风衣这种离谱偏差。对于工具类产品用户最怕的就是“不稳定”今天用得好好的明天结果就漂了。第二是成本。每请求一次大模型都是有成本的就算用比较便宜的模型一个日活几千的小工具每天调用几千次月成本也上来了加上响应时间比本地规则慢不少。第三是可解释性。用户会问“为什么给我推荐这件”规则引擎可以清楚回答“因为今天体感温度8度湿度80%而且你选择了通勤所以推荐防风大衣高领毛衣”但大模型没法给你一个稳定可复现的推理链路。所以我最后的结论是大模型适合做“辅助生成文案”或者“解释推荐理由”不适合做核心决策引擎。核心决策还是得走可控、可解释、可调试的规则路径。2.2 规则引擎为什么是MVP阶段的最优解我最终选择的是典型的规则引擎方案把“天气-温度-场景”映射到“穿搭模板”再用一套冲突消解逻辑处理特殊情况。为什么这个是MVP最合适的选择首先是可控。每一件衣物、每一个场景、每一条规则都是我写的出问题的时候我能立刻定位是哪里逻辑不对不需要像机器学习模型那样去翻特征、调参数、看日志。其次是低成本。规则引擎不需要训练数据不需要GPU甚至连服务器都可以不用一个Python脚本放在定时任务里就能跑。如果用户量不大直接用免费的天气API就够了整个项目几乎零成本。再就是灵活。我今天想加一个新场景“爬山”只需要往规则库里加一组配置改代码的粒度非常小。如果哪天想支持用户自定义衣橱也只需要把“内置衣物库”替换成“用户的私有衣物库”核心规则完全不用动。我知道一定有人会问规则引擎上限不高以后想做好看了怎么办我的想法是先把规则框架跑通把用户反馈数据收集起来等积累到一定量级再把规则输出的结果作为训练信号去训练一个排序模型。规则引擎不是终点但它是通往终点的脚手架。3. 数据层设计温度不是唯一的“冷”指标3.1 天气数据源怎么选、字段怎么取这个项目的第一步是获取天气数据。我当时对比了几家天气API主要看中两个能力一是能不能拿到体感温度二是能不能拿到逐小时预报。我最后选了支持逐小时预报的免费方案因为穿搭推荐这种场景一天内不同时段出门的需求差异很大。早上8点出门上班和晚上8点出门约会虽然“今天”的温度曲线是同一条但实时温度和体感差别很大如果不看具体时段推荐就容易翻车。在字段选择上除了基本的气温我认为必须拿到的有四个体感温度、天气现象晴/雨/雪/多云等、相对湿度、风速风力。另外两个可以作为增强参考紫外线指数和空气质量。紫外线强的时候即使温度不高也要考虑防晒空气质量差的时候口罩和长袖的权重也要上升不过MVP阶段可以先不纳入核心规则。这里有个容易犯的低级错误直接用气温而不是体感温度去查推荐规则。气温是环境温度体感温度才是人体真正感觉到的冷暖。同样10度湿度90%加4级风体感可能只有5度按10度去推荐就会偏薄用户一出门就被劝退了。所以规则引擎的输入一律用体感温度这是一个非常重要的细节。3.2 体感温度、湿度和风速到底怎么影响穿搭体感温度各家API有各家算法如果拿不到可以用一个简单的近似公式做校正。我实测下来在春秋这种过渡季节下面这个简易校正的误差基本可以接受体感温度 ≈ 气温 - 风速修正 - 湿度修正冬季/ 湿度修正夏季风速修正大概是风速每增加10km/h体感温度下降约2-3度。湿度修正要看季节冬季湿度每增加20%体感温度大约下降1-2度夏季湿度每增加20%体感温度大约上升2-3度因为汗液蒸发变慢闷热感明显增强。这个校正公式的绝对精度不高但作为穿搭推荐的输入足够了。我更关心的是它对“分档”的影响25度和23度可能落在同一个穿搭档位但25度加上高湿度和4级风体感可能只有21度档位就变了。档位一变整套推荐就变。所以与其纠结“精确体感温度到底是多少”不如把精力放在“体感温度落在哪个温度档”这件事上。还有一个关键点雨雪天气在规则里应该单独设一个高优先级标签。即使体感温度只有8度如果下着大雨普通运动鞋肯定不行必须强制推荐防水鞋。这类“硬约束”不参与评分直接黑名单处理优先级最高。4. 规则库建模从“温度区间”到“场景化穿搭”4.1 温度分档5级的粒度刚刚好规则库的第一步是把体感温度分档。我经过反复调整最终采用了5档方案严寒低于0度、冷0-8度、凉8-15度、舒适15-22度、温暖22-28度、热28度以上。严格来说是6档但“热”和“温暖”在穿搭逻辑上差异比较大所以分开算。为什么不用更细的分档比如每2度一个档位因为衣物的保暖能力不是一个连续函数你不可能在“普通卫衣”和“加绒卫衣”之间做到精确到2度的无缝切换而且穿搭推荐本身就需要一定的容错空间。比如一件厚卫衣在12-16度都能穿上下浮动几度靠内搭调节就够了。所以分档太细只会让规则库膨胀维护成本上升用户感知却没有明显提升。每档对应的不是“一件上衣一条裤子一双鞋”而是一组可选的衣物组合。比如“凉8-15度”这一档上衣候选可以是针织开衫长袖T恤、卫衣、风衣薄T恤裤子候选直筒牛仔裤、休闲长裤、薄呢裤鞋子候选低帮板鞋、切尔西靴。到了具体场景再从候选里扣掉不符合约束的。4.2 出行目的如何影响推荐权重出行目的我看做一个“约束集合”每个目的都会给衣物打上几个标签要求。我初步定了这几类通勤、约会、运动、逛街、旅行、正式场合、居家。每一类都有三个维度的约束正式度、功能需求、风格倾向。通勤的正式度要求中等偏上风格要求“简洁干练”功能性需要“适合步行”所以高跟鞋和宽松沙滩裤会被直接淘汰乐福鞋、西装裤、衬衫风衣这类就特别匹配。运动的正式度要求很低功能需求强“透气、弹性、防滑”是硬指标所以运动鞋、卫裤、速干T恤是主力。约会的正式度中高风格倾向“精致、协调”对颜色搭配有更高要求品牌和质感权重会上升。这套约束体系的好处是“可组合”。比如通勤遇上雨雪那就在通勤的基础上叠加防水需求候选里只保留同时满足两个约束的衣物如果满足不了就按约束优先级逐级放宽。我的优先级是安全/功能 温度 场景正式度 风格美观。风雨天出门防滑防水的优先级一定高于好看。4.3 上衣、裤子、鞋子的分层规则怎么设计衣物之间是有搭配关系的不能每件独立推荐。我这边的做法是“先定外套再定内搭然后定下装最后定鞋子”每走一步都用前面已经确定的衣物来约束后面的选项。比如体感温度10度、场景是通勤。先确定外套候选是羊毛大衣、厚风衣、轻薄羽绒服。如果选了羊毛大衣风格偏商务内搭就应该选衬衫或高领毛衣不能选连帽卫衣因为卫衣的休闲感和羊毛大衣的正式度冲突。下装呢最好配直筒西裤或深色牛仔裤运动裤直接排除。鞋子方面大衣西裤的组合锁定了皮鞋或切尔西靴的选项运动鞋会让整套垮掉。这种“链式约束”比“每件独立推荐再拼起来”要靠谱得多。独立推荐的最大问题是容易出现“单件都对组合起来很怪”的情况。上衣是商务风裤子是运动风鞋子又是休闲风每件单独看都合适合在一起就是灾难。鞋子这一层还有个特殊规则舒适度兜底。不管天气多好、场景多正式如果推荐结果里鞋子不适合步行超过2公里就自动降级到“舒适优先”的候选。因为穿搭推荐一旦让用户走两步就脚疼那这个推荐就没有复购可言了。5. 核心实现一个能跑起来的穿搭推荐MVP5.1 数据流与整体架构我整个MVP的架构很简单没有上微服务就是一个Python脚本加上一个JSON规则库。数据流是先从天气API拉取当天逐小时天气把用户输入的出行时间对应的那一条数据取出来计算/获取体感温度然后根据体感温度确定温度档位再根据出行目的确定约束条件接着从衣物候选库里筛选项按链式约束逐层确定外套、内搭、下装、鞋子最后输出一套完整的穿搭建议和一句简短的解释文案。整个流程我用四个核心模块来组织weather.py负责天气获取和字段清洗rules.py负责加载规则库和约束匹配outfit.py负责链式推荐和冲突消解main.py负责拼装用户请求和格式化输出。规则库单独放在outfit_rules.json里改规则不用动代码这一点对于后续调优特别重要。5.2 关键代码示例与设计思路我挑了推荐核心的代码片段做了一些简化来展示整体思路。首先看规则库的结构{ temperature_bands: [ {id: cold, range: [0, 8], label: 冷}, {id: cool, range: [8, 15], label: 凉} ], occasions: { commute: { formality_min: 6, needs: [waterproof_if_rain, walkable], style: [minimal, business] } }, items: { wool_coat: { type: outerwear, warmth: 4, formality: 8, tags: [warm, business, elegant], styles: [minimal, classic] } } }然后是核心的推荐逻辑def recommend(weather, occasion_id): band get_temp_band(weather.feels_like) candidates filter_by_band(band) constraints build_constraints(occasion_id, weather) outerwear pick_best(candidates[outerwear], constraints, layerouter) inner pick_best( candidates[inner], constraints, layerinner, must_matchouterwear ) bottoms pick_best(candidates[bottoms], constraints, layerbottom) shoes pick_best(candidates[shoes], constraints, layershoes) return assemble_outfit(outerwear, inner, bottoms, shoes)这里最核心的是must_match这个参数。它确保内搭会去匹配已经选好的外套风格。在代码层面就是把外套的风格标签传进内搭的过滤条件比如外套风格是“business”内搭就只选“可以商务休闲搭配”的候选。5.3 效果验证与调优过程当我第一次把MVP跑起来推荐结果大致能看但离“可用”还有距离。我发现了几类典型问题逐个记录并调整了规则。第一是“过度保守”问题。规则库里如果对某些场景的约束太多筛选到最后可能只剩下一个候选甚至没有候选。比如“正式场合”要求正式度8以上再叠加“舒适度必须适合走路”候选直接变空。我的处理方式是给每个衣物增加一个“紧急兜底”标记当候选为空时先按优先级逐级放宽非核心约束实在没有就允许“正式度降一级”。第二是“搭配不协调”。第一版规则我没做链式约束结果出现过“正装皮鞋运动束脚裤”这种离谱组合。后来我认识到鞋子和下装的风格必须绑定不能由同一个场景约束独立决定。于是我把鞋子推荐改成“根据裤子的风格反推”牛仔裤对应休闲鞋西装裤对应皮鞋直筒工装裤对应靴子效果立刻改善。第三是“温差过渡”问题。天气预报的温度是从早到晚一条曲线用户如果深夜出门直接按“今天”的天气推荐会偏暖。这个可以用逐小时数据来解决用户输入出门时间取那个小时的数据。没有这一层的建议尽早把时间维度加到输入里因为“早晚温差大”的场景太普遍了不处理的话用户感受会很明显。6. 踩坑记录与排查技巧6.1 天气API的“预报温度”和“实时温度”到底用哪个这是我在开发中遇到的第一个大坑。有些天气API默认返回的是“今日最高最低气温”如果你直接拿它去算体感温度结果会偏很多。比如一天温差15度你拿最低温去推荐中午出门的人会觉得热死拿最高温去推荐早晚出门的人会冻傻。最终我采用的是“按用户出行时间取逐小时数据”的策略。用户在前端选择“早上8点出门”还是“晚上7点出门”后端就去对应小时的预报数据里取温度、湿度、风速和天气现象。如果API不支持逐小时数据那就只能做二段校正早晨和夜间用“最低温风速修正”午后用“最高温风速修正”但这个精度远不如逐小时方案。6.2 规则冲突时怎么排序才合理规则冲突是穿搭推荐里不可避免的。典型场景下大雨、温度6度、用户要去听音乐会。防水需求要求穿防滑鞋、带雨具而正式场合要求穿皮鞋。这两个需求在鞋子上直接冲突。我最终确定的冲突消解优先级是这样的先保证安全再保证不冷热再保证场景得体最后才是美观。所以下雨天去正式场合我会推荐“防水切尔西靴”这种靴子兼顾了正式感和防水性如果候选里没有这种东西就退而求其次推荐“正常皮鞋到达后换干燥袜子”这种策略性的方案同时在文案里给用户说明这个权衡过程。这里我要强调的是系统没有能力真正做到“十全十美”但你可以通过“推荐理由文案”让用户理解为什么这么推荐。用户能理解就不会觉得是系统傻了反而会觉得这个工具很聪明。6.3 用户反馈闭环让系统越用越准规则引擎有个先天不足——它只能按你写好的规则走无法自动适应个体差异。同样是怕冷的人有的女生15度就要穿羽绒服有的男生10度还穿单外套。这种个性化差异规则很难穷举必须靠反馈来补。我的方案是给系统加两个轻量级参数cold_tolerance怕冷系数和style_preference风格偏好。用户可以对推荐结果点“偏冷”“偏热”“不喜欢风格”系统会根据反馈调整这两个参数并在后续推荐里平移温度档位或过滤掉某些风格标签。比如一个用户连续三次在12度天气反馈“偏冷”系统就把他的温度档位向上平移一档本来12度属于“凉”平移到“冷”档推荐自然变厚。这个机制不复杂但非常实用让规则引擎也具备了基础的个性化能力。我还计划后续把用户反馈存下来攒够数据之后用排序模型替代一部分规则不过这属于二期工程了。7. 后续扩展这个项目还能怎么玩项目做到这里MVP已经稳定运行了但我个人还有几个特别想继续做的方向。第一个是衣橱数字化。现在的系统用的是“内置衣物库”推荐的衣服用户得自己去找类似的。如果用户把自己的衣橱拍照录入系统只能从现有衣物里搭配实用性会高很多。这个方向可以顺带做“缺件提醒”比如用户常常因为缺少某类鞋子导致搭配失败系统就提示“该添置一双深色切尔西靴了”。第二个是颜色协调算法。目前我用风格标签来做美观约束但颜色搭配只做了很粗的规则同色系搭配、中性色打底、主色不超过两个。更进阶的做法是把每件衣物抽象成“主色值辅助色值”用色相环上的夹角来判断是否协调。这个功能加进去美观维度会有质的提升。第三个是社交属性。穿搭本质上是有社交分享属性的做“今日穿搭打卡”功能用户可以把推荐结果和实际出门照片发出来其他人可以点赞和评论。这些互动数据也是绝佳的推荐训练素材可以对“到底什么穿搭在真实场景中好看”有更客观的判断。我在实际开发中还有一个体会穿搭推荐的核心难点其实不在技术而在领域知识的沉淀。你写规则的时候等于把“会穿衣服的人”的经验一点点翻译成代码。这个过程没有任何捷径唯一的办法是多观察、多问、多试错。我这套规则库已经迭代了十几个版本到现在仍然每周都会因为新的用户反馈做调整。如果你也想做这个方向我的建议是别一上来就追求复杂先用规则引擎跑通一个最小闭环再根据反馈逐步加维度。把保暖这个底线守住把美观这个上限做出来这个工具就已经超过了市面上大部分只会堆温度的“假穿搭软件”了。